X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174..ef99ff287df9046eb88937225e0554eabb00e33c:/runtime/SmallStrings.cpp diff --git a/runtime/SmallStrings.cpp b/runtime/SmallStrings.cpp index f50f73d..a4bdb0c 100644 --- a/runtime/SmallStrings.cpp +++ b/runtime/SmallStrings.cpp @@ -29,18 +29,13 @@ #include "HeapRootVisitor.h" #include "JSGlobalObject.h" #include "JSString.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: @@ -63,7 +58,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] = AtomicString::add(PassRefPtr(StringImpl::createSubstringSharingImpl(baseString, i, 1)).get()); } } @@ -72,6 +67,8 @@ 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_nullObjectString(nullptr) + , m_undefinedObjectString(nullptr) { COMPILE_ASSERT(singleCharacterStringCount == sizeof(m_singleCharacterStrings) / sizeof(m_singleCharacterStrings[0]), IsNumCharactersConstInSyncWithClassUsage); @@ -79,32 +76,46 @@ SmallStrings::SmallStrings() m_singleCharacterStrings[i] = 0; } -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_nullObjectString, "[object Null]"); + initialize(&vm, m_undefinedObjectString, "[object Undefined]"); } -void SmallStrings::finalizeSmallStrings() +void SmallStrings::visitStrongReferences(SlotVisitor& visitor) +{ + 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_nullObjectString); + visitor.appendUnbarrieredPointer(&m_undefinedObjectString); +} + +SmallStrings::~SmallStrings() { - finalize(m_emptyString); - for (unsigned i = 0; i < singleCharacterStringCount; ++i) - finalize(m_singleCharacterStrings[i]); -#define JSC_COMMON_STRINGS_ATTRIBUTE_FINALIZE(name) finalize(m_##name); - JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_FINALIZE) -#undef JSC_COMMON_STRINGS_ATTRIBUTE_FINALIZE } -void SmallStrings::createEmptyString(JSGlobalData* globalData) +void SmallStrings::createEmptyString(VM* vm) { ASSERT(!m_emptyString); - m_emptyString = JSString::createHasOtherOwner(*globalData, StringImpl::empty()); + m_emptyString = JSString::createHasOtherOwner(*vm, StringImpl::empty()); } -void SmallStrings::createSingleCharacterString(JSGlobalData* globalData, unsigned char character) +void SmallStrings::createSingleCharacterString(VM* vm, unsigned char character) { if (!m_storage) m_storage = adoptPtr(new SmallStringsStorage); ASSERT(!m_singleCharacterStrings[character]); - m_singleCharacterStrings[character] = JSString::createHasOtherOwner(*globalData, PassRefPtr(m_storage->rep(character))); + m_singleCharacterStrings[character] = JSString::createHasOtherOwner(*vm, PassRefPtr(m_storage->rep(character))); } StringImpl* SmallStrings::singleCharacterStringRep(unsigned char character) @@ -114,9 +125,9 @@ StringImpl* SmallStrings::singleCharacterStringRep(unsigned char character) return m_storage->rep(character); } -void SmallStrings::initialize(JSGlobalData* globalData, JSString*& string, const char* value) const +void SmallStrings::initialize(VM* vm, JSString*& string, const char* value) const { - string = JSString::create(*globalData, StringImpl::create(value)); + string = JSString::create(*vm, StringImpl::create(value)); } } // namespace JSC