diff options
Diffstat (limited to 'Source/JavaScriptCore/runtime/SmallStrings.h')
-rw-r--r-- | Source/JavaScriptCore/runtime/SmallStrings.h | 124 |
1 files changed, 78 insertions, 46 deletions
diff --git a/Source/JavaScriptCore/runtime/SmallStrings.h b/Source/JavaScriptCore/runtime/SmallStrings.h index f00043021..b90394edb 100644 --- a/Source/JavaScriptCore/runtime/SmallStrings.h +++ b/Source/JavaScriptCore/runtime/SmallStrings.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008, 2009 Apple Inc. All Rights Reserved. + * Copyright (C) 2008, 2009, 2015 Apple Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,11 +26,9 @@ #ifndef SmallStrings_h #define SmallStrings_h +#include "TypeofType.h" #include "WriteBarrier.h" - -#include <wtf/FixedArray.h> #include <wtf/Noncopyable.h> -#include <wtf/OwnPtr.h> #define JSC_COMMON_STRINGS_EACH_NAME(macro) \ macro(boolean) \ @@ -41,6 +39,7 @@ macro(object) \ macro(undefined) \ macro(string) \ + macro(symbol) \ macro(true) namespace WTF { @@ -49,64 +48,97 @@ class StringImpl; namespace JSC { - class HeapRootVisitor; - class VM; - class JSString; - class SmallStringsStorage; - class SlotVisitor; - - static const unsigned maxSingleCharacterString = 0xFF; +class VM; +class JSString; +class SmallStringsStorage; +class SlotVisitor; - class SmallStrings { - WTF_MAKE_NONCOPYABLE(SmallStrings); - public: - SmallStrings(); - ~SmallStrings(); +static const unsigned maxSingleCharacterString = 0xFF; - JSString* emptyString() - { - return m_emptyString; - } +class SmallStrings { + WTF_MAKE_NONCOPYABLE(SmallStrings); +public: + SmallStrings(); + ~SmallStrings(); - JSString* singleCharacterString(VM* vm, unsigned char character) - { - if (!m_singleCharacterStrings[character]) - createSingleCharacterString(vm, character); - return m_singleCharacterStrings[character]; - } + JSString* emptyString() + { + return m_emptyString; + } - JS_EXPORT_PRIVATE WTF::StringImpl* singleCharacterStringRep(unsigned char character); + JSString* singleCharacterString(unsigned char character) + { + return m_singleCharacterStrings[character]; + } - void finalizeSmallStrings(); + JS_EXPORT_PRIVATE WTF::StringImpl* singleCharacterStringRep(unsigned char character); - JSString** singleCharacterStrings() { return &m_singleCharacterStrings[0]; } + JSString** singleCharacterStrings() { return &m_singleCharacterStrings[0]; } - void initializeCommonStrings(VM&); - void visitStrongReferences(SlotVisitor&); + void initializeCommonStrings(VM&); + void visitStrongReferences(SlotVisitor&); #define JSC_COMMON_STRINGS_ACCESSOR_DEFINITION(name) \ - JSString* name##String() const \ - { \ - return m_##name; \ - } - JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ACCESSOR_DEFINITION) + JSString* name##String() const \ + { \ + return m_##name; \ + } + JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ACCESSOR_DEFINITION) #undef JSC_COMMON_STRINGS_ACCESSOR_DEFINITION + + JSString* typeString(TypeofType type) const + { + switch (type) { + case TypeofType::Undefined: + return undefinedString(); + case TypeofType::Boolean: + return booleanString(); + case TypeofType::Number: + return numberString(); + case TypeofType::String: + return stringString(); + case TypeofType::Symbol: + return symbolString(); + case TypeofType::Object: + return objectString(); + case TypeofType::Function: + return functionString(); + } + + RELEASE_ASSERT_NOT_REACHED(); + return nullptr; + } + + JSString* objectStringStart() const { return m_objectStringStart; } + JSString* nullObjectString() const { return m_nullObjectString; } + JSString* undefinedObjectString() const { return m_undefinedObjectString; } + + bool needsToBeVisited(HeapOperation collectionType) const + { + if (collectionType == FullCollection) + return true; + return m_needsToBeVisited; + } - private: - static const unsigned singleCharacterStringCount = maxSingleCharacterString + 1; +private: + static const unsigned singleCharacterStringCount = maxSingleCharacterString + 1; - JS_EXPORT_PRIVATE void createEmptyString(VM*); - JS_EXPORT_PRIVATE void createSingleCharacterString(VM*, unsigned char); + void createEmptyString(VM*); + void createSingleCharacterString(VM*, unsigned char); - void initialize(VM* vm, JSString*& string, const char* value) const; + void initialize(VM*, JSString*&, const char* value); - JSString* m_emptyString; + JSString* m_emptyString; #define JSC_COMMON_STRINGS_ATTRIBUTE_DECLARATION(name) JSString* m_##name; - JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_DECLARATION) + JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_DECLARATION) #undef JSC_COMMON_STRINGS_ATTRIBUTE_DECLARATION - JSString* m_singleCharacterStrings[singleCharacterStringCount]; - OwnPtr<SmallStringsStorage> m_storage; - }; + JSString* m_objectStringStart; + JSString* m_nullObjectString; + JSString* m_undefinedObjectString; + JSString* m_singleCharacterStrings[singleCharacterStringCount]; + std::unique_ptr<SmallStringsStorage> m_storage; + bool m_needsToBeVisited; +}; } // namespace JSC |