summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/PropertyNameArray.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/runtime/PropertyNameArray.h
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-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.h201
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