]> 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 0da930f173f13f4a3e1b8c04d666a8c041a71ad5..c2f13d8c3729ae5ab7bd39db74e345883e4c8672 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
+ *  Copyright (C) 2006, 2008, 2012 Apple Inc. All rights reserved.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Library General Public
 #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(JSGlobalData* globalData)
-            : m_data(PropertyNameArrayData::create())
-            , m_globalData(globalData)
-            , m_shouldCache(true)
-        {
-        }
-
-        PropertyNameArray(ExecState* exec)
-            : m_data(PropertyNameArrayData::create())
-            , m_globalData(&exec->globalData())
-            , m_shouldCache(true)
-        {
+// 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());
         }
+        if (!m_set.add(identifier).isNewEntry)
+            return;
+    }
 
-        JSGlobalData* globalData() { return m_globalData; }
-
-        void add(const Identifier& identifier) { add(identifier.impl()); }
-        void add(StringImpl*);
-        void addKnownUnique(StringImpl* identifier) { m_data->propertyNameVector().append(Identifier(m_globalData, 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(); }
-
-    private:
-        typedef HashSet<StringImpl*, PtrHash<StringImpl*> > IdentifierSet;
-
-        RefPtr<PropertyNameArrayData> m_data;
-        IdentifierSet m_set;
-        JSGlobalData* m_globalData;
-        bool m_shouldCache;
-    };
+    addKnownUnique(identifier);
+}
 
 } // namespace JSC