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/SmallStrings.cpp | 45 ++++++++++++++------------ 1 file changed, 24 insertions(+), 21 deletions(-) (limited to 'Source/JavaScriptCore/runtime/SmallStrings.cpp') diff --git a/Source/JavaScriptCore/runtime/SmallStrings.cpp b/Source/JavaScriptCore/runtime/SmallStrings.cpp index 5f35cca5e..947518607 100644 --- a/Source/JavaScriptCore/runtime/SmallStrings.cpp +++ b/Source/JavaScriptCore/runtime/SmallStrings.cpp @@ -29,20 +29,12 @@ #include "HeapRootVisitor.h" #include "JSGlobalObject.h" #include "JSString.h" -#include "Operations.h" +#include "JSCInlines.h" #include -#include #include namespace JSC { -static inline void finalize(JSString*& string) -{ - if (!string || Heap::isMarked(string)) - return; - string = 0; -} - class SmallStringsStorage { WTF_MAKE_NONCOPYABLE(SmallStringsStorage); WTF_MAKE_FAST_ALLOCATED; public: @@ -65,7 +57,7 @@ SmallStringsStorage::SmallStringsStorage() RefPtr baseString = StringImpl::createUninitialized(singleCharacterStringCount, characterBuffer); for (unsigned i = 0; i < singleCharacterStringCount; ++i) { characterBuffer[i] = i; - m_reps[i] = StringImpl::create(baseString, i, 1); + m_reps[i] = AtomicStringImpl::add(PassRefPtr(StringImpl::createSubstringSharingImpl(baseString, i, 1)).get()); } } @@ -74,6 +66,10 @@ SmallStrings::SmallStrings() #define JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE(name) , m_##name(0) JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE) #undef JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE + , m_objectStringStart(nullptr) + , m_nullObjectString(nullptr) + , m_undefinedObjectString(nullptr) + , m_needsToBeVisited(true) { COMPILE_ASSERT(singleCharacterStringCount == sizeof(m_singleCharacterStrings) / sizeof(m_singleCharacterStrings[0]), IsNumCharactersConstInSyncWithClassUsage); @@ -84,54 +80,61 @@ SmallStrings::SmallStrings() void SmallStrings::initializeCommonStrings(VM& vm) { createEmptyString(&vm); + for (unsigned i = 0; i <= maxSingleCharacterString; ++i) + createSingleCharacterString(&vm, i); #define JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE(name) initialize(&vm, m_##name, #name); JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE) #undef JSC_COMMON_STRINGS_ATTRIBUTE_INITIALIZE + initialize(&vm, m_objectStringStart, "[object "); + initialize(&vm, m_nullObjectString, "[object Null]"); + initialize(&vm, m_undefinedObjectString, "[object Undefined]"); } void SmallStrings::visitStrongReferences(SlotVisitor& visitor) { + m_needsToBeVisited = false; visitor.appendUnbarrieredPointer(&m_emptyString); + for (unsigned i = 0; i <= maxSingleCharacterString; ++i) + visitor.appendUnbarrieredPointer(m_singleCharacterStrings + i); #define JSC_COMMON_STRINGS_ATTRIBUTE_VISIT(name) visitor.appendUnbarrieredPointer(&m_##name); JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_VISIT) #undef JSC_COMMON_STRINGS_ATTRIBUTE_VISIT + visitor.appendUnbarrieredPointer(&m_objectStringStart); + visitor.appendUnbarrieredPointer(&m_nullObjectString); + visitor.appendUnbarrieredPointer(&m_undefinedObjectString); } SmallStrings::~SmallStrings() { } -void SmallStrings::finalizeSmallStrings() -{ - finalize(m_emptyString); - for (unsigned i = 0; i < singleCharacterStringCount; ++i) - finalize(m_singleCharacterStrings[i]); -} - void SmallStrings::createEmptyString(VM* vm) { ASSERT(!m_emptyString); m_emptyString = JSString::createHasOtherOwner(*vm, StringImpl::empty()); + ASSERT(m_needsToBeVisited); } void SmallStrings::createSingleCharacterString(VM* vm, unsigned char character) { if (!m_storage) - m_storage = adoptPtr(new SmallStringsStorage); + m_storage = std::make_unique(); ASSERT(!m_singleCharacterStrings[character]); m_singleCharacterStrings[character] = JSString::createHasOtherOwner(*vm, PassRefPtr(m_storage->rep(character))); + ASSERT(m_needsToBeVisited); } StringImpl* SmallStrings::singleCharacterStringRep(unsigned char character) { if (!m_storage) - m_storage = adoptPtr(new SmallStringsStorage); + m_storage = std::make_unique(); return m_storage->rep(character); } -void SmallStrings::initialize(VM* vm, JSString*& string, const char* value) const +void SmallStrings::initialize(VM* vm, JSString*& string, const char* value) { - string = JSString::create(*vm, StringImpl::create(value)); + string = JSString::create(*vm, Identifier::fromString(vm, value).impl()); + ASSERT(m_needsToBeVisited); } } // namespace JSC -- cgit v1.2.1