diff options
author | Konstantin Tokarev <annulen@yandex.ru> | 2016-08-25 19:20:41 +0300 |
---|---|---|
committer | Konstantin Tokarev <annulen@yandex.ru> | 2017-02-02 12:30:55 +0000 |
commit | 6882a04fb36642862b11efe514251d32070c3d65 (patch) | |
tree | b7959826000b061fd5ccc7512035c7478742f7b0 /Source/JavaScriptCore/runtime/PropertyNameArray.h | |
parent | ab6df191029eeeb0b0f16f127d553265659f739e (diff) | |
download | qtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz |
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f
Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/JavaScriptCore/runtime/PropertyNameArray.h')
-rw-r--r-- | Source/JavaScriptCore/runtime/PropertyNameArray.h | 202 |
1 files changed, 121 insertions, 81 deletions
diff --git a/Source/JavaScriptCore/runtime/PropertyNameArray.h b/Source/JavaScriptCore/runtime/PropertyNameArray.h index 96f1d0afa..14f6f785c 100644 --- a/Source/JavaScriptCore/runtime/PropertyNameArray.h +++ b/Source/JavaScriptCore/runtime/PropertyNameArray.h @@ -24,92 +24,132 @@ #include "CallFrame.h" #include "Identifier.h" #include <wtf/HashSet.h> -#include <wtf/OwnArrayPtr.h> #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 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) - { +// 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()); } - - 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; - }; + 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); +} } // namespace JSC |