summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/PropertyNameArray.h
diff options
context:
space:
mode:
authorKonstantin Tokarev <annulen@yandex.ru>2016-08-25 19:20:41 +0300
committerKonstantin Tokarev <annulen@yandex.ru>2017-02-02 12:30:55 +0000
commit6882a04fb36642862b11efe514251d32070c3d65 (patch)
treeb7959826000b061fd5ccc7512035c7478742f7b0 /Source/JavaScriptCore/runtime/PropertyNameArray.h
parentab6df191029eeeb0b0f16f127d553265659f739e (diff)
downloadqtwebkit-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.h202
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