diff options
author | Konstantin Tokarev <annulen@yandex.ru> | 2016-08-25 19:20:41 +0300 |
---|---|---|
committer | Konstantin Tokarev <annulen@yandex.ru> | 2017-02-02 12:30:55 +0000 |
commit | 6882a04fb36642862b11efe514251d32070c3d65 (patch) | |
tree | b7959826000b061fd5ccc7512035c7478742f7b0 /Source/JavaScriptCore/runtime/Identifier.cpp | |
parent | ab6df191029eeeb0b0f16f127d553265659f739e (diff) | |
download | qtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz |
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f
Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/JavaScriptCore/runtime/Identifier.cpp')
-rw-r--r-- | Source/JavaScriptCore/runtime/Identifier.cpp | 124 |
1 files changed, 23 insertions, 101 deletions
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 <new> #include <string.h> #include <wtf/Assertions.h> @@ -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<const char*>(c)); - location = StringImpl::createFromLiteral(reinterpret_cast<const char*>(c), length).leakRef(); - location->setHash(hash); - } -}; - -struct IdentifierLCharFromUCharTranslator { - static unsigned hash(const CharBuffer<UChar>& buf) - { - return StringHasher::computeHashAndMaskTop8Bits(buf.s, buf.length); - } - - static bool equal(StringImpl* str, const CharBuffer<UChar>& buf) - { - return Identifier::equal(str, buf.s, buf.length); - } - - static void translate(StringImpl*& location, const CharBuffer<UChar>& 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<StringImpl> Identifier::add(VM* vm, const char* c) +Ref<StringImpl> 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<StringImpl*>::AddResult addResult = identifierTable.add<const LChar*, IdentifierASCIIStringTranslator>(reinterpret_cast<const LChar*>(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<StringImpl> addedString = addResult.isNewEntry ? adoptRef(*addResult.iterator) : *addResult.iterator; + return *vm->smallStrings.singleCharacterStringRep(c[0]); - return addedString.release(); + return *AtomicStringImpl::add(c); } -PassRefPtr<StringImpl> Identifier::add(ExecState* exec, const char* c) +Ref<StringImpl> Identifier::add(ExecState* exec, const char* c) { return add(&exec->vm(), c); } -PassRefPtr<StringImpl> Identifier::add8(VM* vm, const UChar* s, int length) +Ref<StringImpl> 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<UChar> buf = { s, static_cast<unsigned>(length) }; - HashSet<StringImpl*>::AddResult addResult = vm->identifierTable->add<CharBuffer<UChar>, 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<StringImpl> 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<StringImpl> 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("<null identifier>"); +} + #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 |