From 6882a04fb36642862b11efe514251d32070c3d65 Mon Sep 17 00:00:00 2001 From: Konstantin Tokarev Date: Thu, 25 Aug 2016 19:20:41 +0300 Subject: Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443) Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f Reviewed-by: Konstantin Tokarev --- Source/JavaScriptCore/runtime/Identifier.cpp | 124 +++++---------------------- 1 file changed, 23 insertions(+), 101 deletions(-) (limited to 'Source/JavaScriptCore/runtime/Identifier.cpp') diff --git a/Source/JavaScriptCore/runtime/Identifier.cpp b/Source/JavaScriptCore/runtime/Identifier.cpp index ad61b493a..d26d9567c 100644 --- a/Source/JavaScriptCore/runtime/Identifier.cpp +++ b/Source/JavaScriptCore/runtime/Identifier.cpp @@ -25,7 +25,7 @@ #include "JSObject.h" #include "JSScope.h" #include "NumericStrings.h" -#include "Operations.h" +#include "JSCInlines.h" #include #include #include @@ -38,119 +38,33 @@ using WTF::ThreadSpecific; namespace JSC { -IdentifierTable* createIdentifierTable() -{ - return new IdentifierTable; -} - -void deleteIdentifierTable(IdentifierTable* table) -{ - delete table; -} - -struct IdentifierASCIIStringTranslator { - static unsigned hash(const LChar* c) - { - return StringHasher::computeHashAndMaskTop8Bits(c); - } - - static bool equal(StringImpl* r, const LChar* s) - { - return Identifier::equal(r, s); - } - - static void translate(StringImpl*& location, const LChar* c, unsigned hash) - { - size_t length = strlen(reinterpret_cast(c)); - location = StringImpl::createFromLiteral(reinterpret_cast(c), length).leakRef(); - location->setHash(hash); - } -}; - -struct IdentifierLCharFromUCharTranslator { - static unsigned hash(const CharBuffer& buf) - { - return StringHasher::computeHashAndMaskTop8Bits(buf.s, buf.length); - } - - static bool equal(StringImpl* str, const CharBuffer& buf) - { - return Identifier::equal(str, buf.s, buf.length); - } - - static void translate(StringImpl*& location, const CharBuffer& buf, unsigned hash) - { - LChar* d; - StringImpl* r = StringImpl::createUninitialized(buf.length, d).leakRef(); - WTF::copyLCharsFromUCharSource(d, buf.s, buf.length); - r->setHash(hash); - location = r; - } -}; - -PassRefPtr Identifier::add(VM* vm, const char* c) +Ref Identifier::add(VM* vm, const char* c) { ASSERT(c); ASSERT(c[0]); if (!c[1]) - return add(vm, vm->smallStrings.singleCharacterStringRep(c[0])); - - IdentifierTable& identifierTable = *vm->identifierTable; - - HashSet::AddResult addResult = identifierTable.add(reinterpret_cast(c)); - - // If the string is newly-translated, then we need to adopt it. - // The boolean in the pair tells us if that is so. - RefPtr addedString = addResult.isNewEntry ? adoptRef(*addResult.iterator) : *addResult.iterator; + return *vm->smallStrings.singleCharacterStringRep(c[0]); - return addedString.release(); + return *AtomicStringImpl::add(c); } -PassRefPtr Identifier::add(ExecState* exec, const char* c) +Ref Identifier::add(ExecState* exec, const char* c) { return add(&exec->vm(), c); } -PassRefPtr Identifier::add8(VM* vm, const UChar* s, int length) +Ref Identifier::add8(VM* vm, const UChar* s, int length) { if (length == 1) { UChar c = s[0]; ASSERT(c <= 0xff); if (canUseSingleCharacterString(c)) - return add(vm, vm->smallStrings.singleCharacterStringRep(c)); + return *vm->smallStrings.singleCharacterStringRep(c); } - if (!length) - return StringImpl::empty(); - CharBuffer buf = { s, static_cast(length) }; - HashSet::AddResult addResult = vm->identifierTable->add, IdentifierLCharFromUCharTranslator >(buf); - - // If the string is newly-translated, then we need to adopt it. - // The boolean in the pair tells us if that is so. - return addResult.isNewEntry ? adoptRef(*addResult.iterator) : *addResult.iterator; -} - -PassRefPtr Identifier::addSlowCase(VM* vm, StringImpl* r) -{ - ASSERT(!r->isIdentifier()); - // The empty & null strings are static singletons, and static strings are handled - // in ::add() in the header, so we should never get here with a zero length string. - ASSERT(r->length()); - - if (r->length() == 1) { - UChar c = (*r)[0]; - if (c <= maxSingleCharacterString) - r = vm->smallStrings.singleCharacterStringRep(c); - if (r->isIdentifier()) - return r; - } - - return *vm->identifierTable->add(r).iterator; -} + return *StringImpl::empty(); -PassRefPtr Identifier::addSlowCase(ExecState* exec, StringImpl* r) -{ - return addSlowCase(&exec->vm(), r); + return *AtomicStringImpl::add(s, length); } Identifier Identifier::from(ExecState* exec, unsigned value) @@ -183,26 +97,34 @@ Identifier Identifier::from(VM* vm, double value) return Identifier(vm, vm->numericStrings.add(value)); } +void Identifier::dump(PrintStream& out) const +{ + if (impl()) + out.print(impl()); + else + out.print(""); +} + #ifndef NDEBUG -void Identifier::checkCurrentIdentifierTable(VM* vm) +void Identifier::checkCurrentAtomicStringTable(VM* vm) { // Check the identifier table accessible through the threadspecific matches the // vm's identifier table. - ASSERT_UNUSED(vm, vm->identifierTable == wtfThreadData().currentIdentifierTable()); + ASSERT_UNUSED(vm, vm->atomicStringTable() == wtfThreadData().atomicStringTable()); } -void Identifier::checkCurrentIdentifierTable(ExecState* exec) +void Identifier::checkCurrentAtomicStringTable(ExecState* exec) { - checkCurrentIdentifierTable(&exec->vm()); + checkCurrentAtomicStringTable(&exec->vm()); } #else // These only exists so that our exports are the same for debug and release builds. // This would be an RELEASE_ASSERT_NOT_REACHED(), but we're in NDEBUG only code here! -NO_RETURN_DUE_TO_CRASH void Identifier::checkCurrentIdentifierTable(VM*) { CRASH(); } -NO_RETURN_DUE_TO_CRASH void Identifier::checkCurrentIdentifierTable(ExecState*) { CRASH(); } +NO_RETURN_DUE_TO_CRASH void Identifier::checkCurrentAtomicStringTable(VM*) { CRASH(); } +NO_RETURN_DUE_TO_CRASH void Identifier::checkCurrentAtomicStringTable(ExecState*) { CRASH(); } #endif -- cgit v1.2.1