X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/4e4e5a6f2694187498445a6ac6f1634ce8141119..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/runtime/SmallStrings.h diff --git a/runtime/SmallStrings.h b/runtime/SmallStrings.h index bc337c9..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,51 +26,118 @@ #ifndef SmallStrings_h #define SmallStrings_h -#include "UString.h" -#include +#include "TypeofType.h" +#include "WriteBarrier.h" +#include + +#define JSC_COMMON_STRINGS_EACH_NAME(macro) \ + macro(boolean) \ + macro(false) \ + macro(function) \ + macro(number) \ + macro(null) \ + macro(object) \ + macro(undefined) \ + macro(string) \ + macro(symbol) \ + macro(true) + +namespace WTF { +class StringImpl; +} namespace JSC { - class JSGlobalData; - class JSString; - class MarkStack; - class SmallStringsStorage; - - class SmallStrings : public Noncopyable { - public: - SmallStrings(); - ~SmallStrings(); - - JSString* emptyString(JSGlobalData* globalData) - { - if (!m_emptyString) - createEmptyString(globalData); - return m_emptyString; - } - JSString* singleCharacterString(JSGlobalData* globalData, unsigned char character) - { - if (!m_singleCharacterStrings[character]) - createSingleCharacterString(globalData, character); - return m_singleCharacterStrings[character]; +class HeapRootVisitor; +class VM; +class JSString; +class SmallStringsStorage; +class SlotVisitor; + +static const unsigned maxSingleCharacterString = 0xFF; + +class SmallStrings { + WTF_MAKE_NONCOPYABLE(SmallStrings); +public: + SmallStrings(); + ~SmallStrings(); + + JSString* emptyString() + { + return m_emptyString; + } + + JSString* singleCharacterString(unsigned char character) + { + return m_singleCharacterStrings[character]; + } + + JS_EXPORT_PRIVATE WTF::StringImpl* singleCharacterStringRep(unsigned char character); + + JSString** singleCharacterStrings() { return &m_singleCharacterStrings[0]; } + + 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) +#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; + } - UString::Rep* singleCharacterStringRep(unsigned char character); +private: + static const unsigned singleCharacterStringCount = maxSingleCharacterString + 1; - void markChildren(MarkStack&); - void clear(); + JS_EXPORT_PRIVATE void createEmptyString(VM*); + JS_EXPORT_PRIVATE void createSingleCharacterString(VM*, unsigned char); - unsigned count() const; -#if ENABLE(JIT) - JSString** singleCharacterStrings() { return m_singleCharacterStrings; } -#endif - private: - void createEmptyString(JSGlobalData*); - void createSingleCharacterString(JSGlobalData*, unsigned char); + void initialize(VM*, JSString*&, const char* value); - JSString* m_emptyString; - JSString* m_singleCharacterStrings[0x100]; - OwnPtr m_storage; - }; + 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_nullObjectString; + JSString* m_undefinedObjectString; + JSString* m_singleCharacterStrings[singleCharacterStringCount]; + std::unique_ptr m_storage; + bool m_needsToBeVisited; +}; } // namespace JSC