diff options
Diffstat (limited to 'Source/JavaScriptCore/runtime/SmallStrings.cpp')
-rw-r--r-- | Source/JavaScriptCore/runtime/SmallStrings.cpp | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/Source/JavaScriptCore/runtime/SmallStrings.cpp b/Source/JavaScriptCore/runtime/SmallStrings.cpp index ff304039c..60e21b6cf 100644 --- a/Source/JavaScriptCore/runtime/SmallStrings.cpp +++ b/Source/JavaScriptCore/runtime/SmallStrings.cpp @@ -26,12 +26,10 @@ #include "config.h" #include "SmallStrings.h" -#include "HeapRootVisitor.h" #include "JSGlobalObject.h" #include "JSString.h" -#include "Operations.h" +#include "JSCInlines.h" #include <wtf/Noncopyable.h> -#include <wtf/PassOwnPtr.h> #include <wtf/text/StringImpl.h> namespace JSC { @@ -41,9 +39,9 @@ class SmallStringsStorage { public: SmallStringsStorage(); - StringImpl* rep(unsigned char character) + StringImpl& rep(unsigned char character) { - return m_reps[character].get(); + return *m_reps[character].get(); } private: @@ -55,10 +53,10 @@ private: SmallStringsStorage::SmallStringsStorage() { LChar* characterBuffer = 0; - RefPtr<StringImpl> baseString = StringImpl::createUninitialized(singleCharacterStringCount, characterBuffer); + auto 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(StringImpl::createSubstringSharingImpl(baseString.get(), i, 1).ptr()); } } @@ -67,6 +65,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); @@ -82,16 +84,23 @@ void SmallStrings::initializeCommonStrings(VM& vm) #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) { - visitor.appendUnbarrieredPointer(&m_emptyString); + m_needsToBeVisited = false; + visitor.appendUnbarriered(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); + visitor.appendUnbarriered(m_singleCharacterStrings[i]); +#define JSC_COMMON_STRINGS_ATTRIBUTE_VISIT(name) visitor.appendUnbarriered(m_##name); JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_VISIT) #undef JSC_COMMON_STRINGS_ATTRIBUTE_VISIT + visitor.appendUnbarriered(m_objectStringStart); + visitor.appendUnbarriered(m_nullObjectString); + visitor.appendUnbarriered(m_undefinedObjectString); } SmallStrings::~SmallStrings() @@ -101,27 +110,30 @@ SmallStrings::~SmallStrings() void SmallStrings::createEmptyString(VM* vm) { ASSERT(!m_emptyString); - m_emptyString = JSString::createHasOtherOwner(*vm, StringImpl::empty()); + 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<SmallStringsStorage>(); ASSERT(!m_singleCharacterStrings[character]); - m_singleCharacterStrings[character] = JSString::createHasOtherOwner(*vm, PassRefPtr<StringImpl>(m_storage->rep(character))); + m_singleCharacterStrings[character] = JSString::createHasOtherOwner(*vm, m_storage->rep(character)); + ASSERT(m_needsToBeVisited); } -StringImpl* SmallStrings::singleCharacterStringRep(unsigned char character) +StringImpl& SmallStrings::singleCharacterStringRep(unsigned char character) { if (!m_storage) - m_storage = adoptPtr(new SmallStringsStorage); + m_storage = std::make_unique<SmallStringsStorage>(); 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, AtomicStringImpl::add(value).releaseNonNull()); + ASSERT(m_needsToBeVisited); } } // namespace JSC |