diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/runtime/PropertyNameArray.h | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/runtime/PropertyNameArray.h')
-rw-r--r-- | Source/JavaScriptCore/runtime/PropertyNameArray.h | 201 |
1 files changed, 80 insertions, 121 deletions
diff --git a/Source/JavaScriptCore/runtime/PropertyNameArray.h b/Source/JavaScriptCore/runtime/PropertyNameArray.h index 14f6f785c..bfbddaa60 100644 --- a/Source/JavaScriptCore/runtime/PropertyNameArray.h +++ b/Source/JavaScriptCore/runtime/PropertyNameArray.h @@ -27,129 +27,88 @@ #include <wtf/Vector.h> namespace JSC { + + class Structure; + class StructureChain; -// FIXME: Rename to PropertyNameArray. -class PropertyNameArrayData : public RefCounted<PropertyNameArrayData> { -public: - typedef Vector<Identifier, 20> PropertyNameVector; - - static Ref<PropertyNameArrayData> create() { return adoptRef(*new PropertyNameArrayData); } - - PropertyNameVector& propertyNameVector() { return m_propertyNameVector; } - -private: - PropertyNameArrayData() - { - } - - PropertyNameVector m_propertyNameVector; -}; - -// FIXME: Rename to PropertyNameArrayBuilder. -class PropertyNameArray { -public: - PropertyNameArray(VM* vm, PropertyNameMode mode) - : m_data(PropertyNameArrayData::create()) - , m_vm(vm) - , m_mode(mode) - { - } - - PropertyNameArray(ExecState* exec, PropertyNameMode mode) - : PropertyNameArray(&exec->vm(), mode) - { - } - - VM* vm() { return m_vm; } - - void add(uint32_t index) - { - add(Identifier::from(m_vm, index)); - } - - void add(const Identifier&); - void add(UniquedStringImpl*); - void addKnownUnique(UniquedStringImpl*); - - Identifier& operator[](unsigned i) { return m_data->propertyNameVector()[i]; } - const Identifier& operator[](unsigned i) const { return m_data->propertyNameVector()[i]; } - - void setData(PassRefPtr<PropertyNameArrayData> data) { m_data = data; } - PropertyNameArrayData* data() { return m_data.get(); } - PassRefPtr<PropertyNameArrayData> releaseData() { return m_data.release(); } - - // FIXME: Remove these functions. - bool canAddKnownUniqueForStructure() const { return m_data->propertyNameVector().isEmpty(); } - typedef PropertyNameArrayData::PropertyNameVector::const_iterator const_iterator; - size_t size() const { return m_data->propertyNameVector().size(); } - const_iterator begin() const { return m_data->propertyNameVector().begin(); } - const_iterator end() const { return m_data->propertyNameVector().end(); } - - PropertyNameMode mode() const { return m_mode; } - bool includeSymbolProperties() const; - bool includeStringProperties() const; - -private: - bool isUidMatchedToTypeMode(UniquedStringImpl* identifier); - - RefPtr<PropertyNameArrayData> m_data; - HashSet<UniquedStringImpl*> m_set; - VM* m_vm; - PropertyNameMode m_mode; -}; - -ALWAYS_INLINE void PropertyNameArray::add(const Identifier& identifier) -{ - add(identifier.impl()); -} - -ALWAYS_INLINE void PropertyNameArray::addKnownUnique(UniquedStringImpl* identifier) -{ - if (!isUidMatchedToTypeMode(identifier)) - return; - m_data->propertyNameVector().append(Identifier::fromUid(m_vm, identifier)); -} - -ALWAYS_INLINE void PropertyNameArray::add(UniquedStringImpl* identifier) -{ - static const unsigned setThreshold = 20; - - ASSERT(identifier); - - if (!isUidMatchedToTypeMode(identifier)) - return; - - if (size() < setThreshold) { - if (m_data->propertyNameVector().contains(identifier)) - return; - } else { - if (m_set.isEmpty()) { - for (Identifier& name : m_data->propertyNameVector()) - m_set.add(name.impl()); + // FIXME: Rename to PropertyNameArray. + class PropertyNameArrayData : public RefCounted<PropertyNameArrayData> { + public: + typedef Vector<Identifier, 20> PropertyNameVector; + + static PassRefPtr<PropertyNameArrayData> create() { return adoptRef(new PropertyNameArrayData); } + + PropertyNameVector& propertyNameVector() { return m_propertyNameVector; } + + private: + PropertyNameArrayData() + { + } + + PropertyNameVector m_propertyNameVector; + }; + + // FIXME: Rename to PropertyNameArrayBuilder. + class PropertyNameArray { + public: + PropertyNameArray(VM* vm) + : m_data(PropertyNameArrayData::create()) + , m_vm(vm) + , m_numCacheableSlots(0) + , m_baseObject(0) + { } - if (!m_set.add(identifier).isNewEntry) - return; - } - - addKnownUnique(identifier); -} - -ALWAYS_INLINE bool PropertyNameArray::isUidMatchedToTypeMode(UniquedStringImpl* identifier) -{ - if (identifier->isSymbol()) - return includeSymbolProperties(); - return includeStringProperties(); -} - -ALWAYS_INLINE bool PropertyNameArray::includeSymbolProperties() const -{ - return static_cast<std::underlying_type<PropertyNameMode>::type>(m_mode) & static_cast<std::underlying_type<PropertyNameMode>::type>(PropertyNameMode::Symbols); -} - -ALWAYS_INLINE bool PropertyNameArray::includeStringProperties() const -{ - return static_cast<std::underlying_type<PropertyNameMode>::type>(m_mode) & static_cast<std::underlying_type<PropertyNameMode>::type>(PropertyNameMode::Strings); -} + + PropertyNameArray(ExecState* exec) + : m_data(PropertyNameArrayData::create()) + , m_vm(&exec->vm()) + , m_numCacheableSlots(0) + , m_baseObject(0) + { + } + + VM* vm() { return m_vm; } + + void add(const Identifier& identifier) { add(identifier.impl()); } + JS_EXPORT_PRIVATE void add(StringImpl*); + void addKnownUnique(StringImpl* identifier) { m_data->propertyNameVector().append(Identifier(m_vm, identifier)); } + + Identifier& operator[](unsigned i) { return m_data->propertyNameVector()[i]; } + const Identifier& operator[](unsigned i) const { return m_data->propertyNameVector()[i]; } + + void setData(PassRefPtr<PropertyNameArrayData> data) { m_data = data; } + PropertyNameArrayData* data() { return m_data.get(); } + PassRefPtr<PropertyNameArrayData> releaseData() { return m_data.release(); } + + // FIXME: Remove these functions. + typedef PropertyNameArrayData::PropertyNameVector::const_iterator const_iterator; + size_t size() const { return m_data->propertyNameVector().size(); } + const_iterator begin() const { return m_data->propertyNameVector().begin(); } + const_iterator end() const { return m_data->propertyNameVector().end(); } + + size_t numCacheableSlots() const { return m_numCacheableSlots; } + void setNumCacheableSlotsForObject(JSObject* object, size_t numCacheableSlots) + { + if (object != m_baseObject) + return; + m_numCacheableSlots = numCacheableSlots; + } + void setBaseObject(JSObject* object) + { + if (m_baseObject) + return; + m_baseObject = object; + } + + private: + typedef HashSet<StringImpl*, PtrHash<StringImpl*>> IdentifierSet; + + RefPtr<PropertyNameArrayData> m_data; + IdentifierSet m_set; + VM* m_vm; + size_t m_numCacheableSlots; + JSObject* m_baseObject; + }; } // namespace JSC |