X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/93a3786624b2768d89bfa27e46598dc64e2fb70a..81345200c95645a1b0d2635520f96ad55dfde63f:/runtime/Identifier.cpp diff --git a/runtime/Identifier.cpp b/runtime/Identifier.cpp index ad61b49..32d408e 100644 --- a/runtime/Identifier.cpp +++ b/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) +PassRef 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; + return *vm->smallStrings.singleCharacterStringRep(c[0]); - 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 addedString.release(); + return *AtomicString::add(c); } -PassRefPtr Identifier::add(ExecState* exec, const char* c) +PassRef Identifier::add(ExecState* exec, const char* c) { return add(&exec->vm(), c); } -PassRefPtr Identifier::add8(VM* vm, const UChar* s, int length) +PassRef 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; -} + return *StringImpl::empty(); -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; -} - -PassRefPtr Identifier::addSlowCase(ExecState* exec, StringImpl* r) -{ - return addSlowCase(&exec->vm(), r); + return *AtomicString::add(s, length); } Identifier Identifier::from(ExecState* exec, unsigned value) @@ -185,24 +99,24 @@ Identifier Identifier::from(VM* vm, double value) #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