X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/runtime/SmallStrings.h diff --git a/runtime/SmallStrings.h b/runtime/SmallStrings.h index e609c50..909bae1 100644 --- a/runtime/SmallStrings.h +++ b/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,9 +26,9 @@ #ifndef SmallStrings_h #define SmallStrings_h -#include "UString.h" -#include -#include +#include "TypeofType.h" +#include "WriteBarrier.h" +#include #define JSC_COMMON_STRINGS_EACH_NAME(macro) \ macro(boolean) \ @@ -39,69 +39,105 @@ macro(object) \ macro(undefined) \ macro(string) \ + macro(symbol) \ macro(true) +namespace WTF { +class StringImpl; +} + namespace JSC { - class HeapRootVisitor; - class JSGlobalData; - class JSString; - class SmallStringsStorage; - class SlotVisitor; - - static const unsigned maxSingleCharacterString = 0xFF; - - class SmallStrings { - WTF_MAKE_NONCOPYABLE(SmallStrings); - public: - SmallStrings(); - ~SmallStrings(); - - JSString* emptyString(JSGlobalData* globalData) - { - if (!m_emptyString) - createEmptyString(globalData); - return m_emptyString; - } +class HeapRootVisitor; +class VM; +class JSString; +class SmallStringsStorage; +class SlotVisitor; - JSString* singleCharacterString(JSGlobalData* globalData, unsigned char character) - { - if (!m_singleCharacterStrings[character]) - createSingleCharacterString(globalData, character); - return m_singleCharacterStrings[character]; - } +static const unsigned maxSingleCharacterString = 0xFF; + +class SmallStrings { + WTF_MAKE_NONCOPYABLE(SmallStrings); +public: + SmallStrings(); + ~SmallStrings(); + + JSString* emptyString() + { + return m_emptyString; + } - JS_EXPORT_PRIVATE 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&); #define JSC_COMMON_STRINGS_ACCESSOR_DEFINITION(name) \ - JSString* name##String(JSGlobalData* globalData) const \ - { \ - if (!m_##name) \ - initialize(globalData, m_##name, #name); \ - 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* 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(JSGlobalData*); - JS_EXPORT_PRIVATE void createSingleCharacterString(JSGlobalData*, unsigned char); + JS_EXPORT_PRIVATE void createEmptyString(VM*); + JS_EXPORT_PRIVATE void createSingleCharacterString(VM*, unsigned char); - void initialize(JSGlobalData* globalData, JSString*& string, const char* value) const; + void initialize(VM*, JSString*&, const char* value); - JSString* m_emptyString; -#define JSC_COMMON_STRINGS_ATTRIBUTE_DECLARATION(name) mutable JSString* m_##name; - JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_DECLARATION) + JSString* m_emptyString; +#define JSC_COMMON_STRINGS_ATTRIBUTE_DECLARATION(name) JSString* m_##name; + JSC_COMMON_STRINGS_EACH_NAME(JSC_COMMON_STRINGS_ATTRIBUTE_DECLARATION) #undef JSC_COMMON_STRINGS_ATTRIBUTE_DECLARATION - JSString* m_singleCharacterStrings[singleCharacterStringCount]; - OwnPtr m_storage; - }; + JSString* m_nullObjectString; + JSString* m_undefinedObjectString; + JSString* m_singleCharacterStrings[singleCharacterStringCount]; + std::unique_ptr m_storage; + bool m_needsToBeVisited; +}; } // namespace JSC