]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - runtime/PropertyNameArray.h
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / runtime / PropertyNameArray.h
index 96f1d0afa2ee2880e894850dce054a95234e1751..c2f13d8c3729ae5ab7bd39db74e345883e4c8672 100644 (file)
 #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)
-        {
-        }
-
-        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;
+// 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)
+        : m_data(PropertyNameArrayData::create())
+        , m_vm(vm)
+    {
+    }
+
+    PropertyNameArray(ExecState* exec)
+        : m_data(PropertyNameArrayData::create())
+        , m_vm(&exec->vm())
+    {
+    }
+
+    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(); }
+
+private:
+    RefPtr<PropertyNameArrayData> m_data;
+    HashSet<UniquedStringImpl*> m_set;
+    VM* m_vm;
+};
+
+ALWAYS_INLINE void PropertyNameArray::add(const Identifier& identifier)
+{
+    add(identifier.impl());
+}
+
+ALWAYS_INLINE void PropertyNameArray::addKnownUnique(UniquedStringImpl* identifier)
+{
+    m_data->propertyNameVector().append(Identifier::fromUid(m_vm, identifier));
+}
+
+ALWAYS_INLINE void PropertyNameArray::add(UniquedStringImpl* identifier)
+{
+    static const unsigned setThreshold = 20;
+
+    ASSERT(identifier);
+
+    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());
         }
-        void setBaseObject(JSObject* object)
-        {
-            if (m_baseObject)
-                return;
-            m_baseObject = object;
-        }
-
-    private:
-        typedef HashSet<StringImpl*, PtrHash<StringImpl*> > IdentifierSet;
+        if (!m_set.add(identifier).isNewEntry)
+            return;
+    }
 
-        RefPtr<PropertyNameArrayData> m_data;
-        IdentifierSet m_set;
-        VM* m_vm;
-        size_t m_numCacheableSlots;
-        JSObject* m_baseObject;
-    };
+    addKnownUnique(identifier);
+}
 
 } // namespace JSC