Structure::m_enumerationCache should be moved to StructureRareData
authormhahnenberg@apple.com <mhahnenberg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 2 Feb 2013 03:57:42 +0000 (03:57 +0000)
committermhahnenberg@apple.com <mhahnenberg@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 2 Feb 2013 03:57:42 +0000 (03:57 +0000)
https://bugs.webkit.org/show_bug.cgi?id=108723

Reviewed by Oliver Hunt.

m_enumerationCache is only used by objects whose properties are iterated over, so not every Structure needs this
field and it can therefore be moved safely to StructureRareData to help with memory savings.

* runtime/JSPropertyNameIterator.h:
(JSPropertyNameIterator):
(JSC::Register::propertyNameIterator):
(JSC::StructureRareData::enumerationCache): Add to JSPropertyNameIterator.h so that it can see the correct type.
(JSC::StructureRareData::setEnumerationCache): Ditto.
* runtime/Structure.cpp:
(JSC::Structure::addPropertyWithoutTransition): Use the enumerationCache() getter rather than accessing the field.
(JSC::Structure::removePropertyWithoutTransition): Ditto.
(JSC::Structure::visitChildren): We no longer have to worry about marking the m_enumerationCache field.
* runtime/Structure.h:
(JSC::Structure::setEnumerationCache): Move the old accessors back since we don't have to have any knowledge of
the JSPropertyNameIterator type.
(JSC::Structure::enumerationCache): Ditto.
* runtime/StructureRareData.cpp:
(JSC::StructureRareData::visitChildren): Mark the new m_enumerationCache field.
* runtime/StructureRareData.h: Add new functions/fields.
(StructureRareData):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@141681 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/JSPropertyNameIterator.h
Source/JavaScriptCore/runtime/Structure.cpp
Source/JavaScriptCore/runtime/Structure.h
Source/JavaScriptCore/runtime/StructureRareData.cpp
Source/JavaScriptCore/runtime/StructureRareData.h

index eac607e..671bea6 100644 (file)
@@ -1,3 +1,31 @@
+2013-02-01  Mark Hahnenberg  <mhahnenberg@apple.com>
+
+        Structure::m_enumerationCache should be moved to StructureRareData
+        https://bugs.webkit.org/show_bug.cgi?id=108723
+
+        Reviewed by Oliver Hunt.
+
+        m_enumerationCache is only used by objects whose properties are iterated over, so not every Structure needs this 
+        field and it can therefore be moved safely to StructureRareData to help with memory savings.
+
+        * runtime/JSPropertyNameIterator.h:
+        (JSPropertyNameIterator):
+        (JSC::Register::propertyNameIterator):
+        (JSC::StructureRareData::enumerationCache): Add to JSPropertyNameIterator.h so that it can see the correct type.
+        (JSC::StructureRareData::setEnumerationCache): Ditto.
+        * runtime/Structure.cpp:
+        (JSC::Structure::addPropertyWithoutTransition): Use the enumerationCache() getter rather than accessing the field.
+        (JSC::Structure::removePropertyWithoutTransition): Ditto.
+        (JSC::Structure::visitChildren): We no longer have to worry about marking the m_enumerationCache field.
+        * runtime/Structure.h: 
+        (JSC::Structure::setEnumerationCache): Move the old accessors back since we don't have to have any knowledge of 
+        the JSPropertyNameIterator type.
+        (JSC::Structure::enumerationCache): Ditto.
+        * runtime/StructureRareData.cpp:
+        (JSC::StructureRareData::visitChildren): Mark the new m_enumerationCache field.
+        * runtime/StructureRareData.h: Add new functions/fields.
+        (StructureRareData):
+
 2013-02-01  Roger Fong  <roger_fong@apple.com>
 
         Unreviewed. JavaScriptCore VS2010 project cleanup.
index e59a5c6..0990232 100644 (file)
@@ -73,7 +73,7 @@ namespace JSC {
         void setCachedPrototypeChain(JSGlobalData& globalData, StructureChain* cachedPrototypeChain) { m_cachedPrototypeChain.set(globalData, this, cachedPrototypeChain); }
         StructureChain* cachedPrototypeChain() { return m_cachedPrototypeChain.get(); }
         
-        static const ClassInfo s_info;
+        static JS_EXPORTDATA const ClassInfo s_info;
 
     protected:
         void finishCreation(ExecState* exec, PropertyNameArrayData* propertyNameArrayData, JSObject* object)
@@ -98,20 +98,19 @@ namespace JSC {
         OwnArrayPtr<WriteBarrier<Unknown> > m_jsStrings;
     };
 
-    inline void Structure::setEnumerationCache(JSGlobalData& globalData, JSPropertyNameIterator* enumerationCache)
+    ALWAYS_INLINE JSPropertyNameIterator* Register::propertyNameIterator() const
     {
-        ASSERT(!isDictionary());
-        m_enumerationCache.set(globalData, this, enumerationCache);
+        return jsCast<JSPropertyNameIterator*>(jsValue().asCell());
     }
 
-    inline JSPropertyNameIterator* Structure::enumerationCache()
+    inline JSPropertyNameIterator* StructureRareData::enumerationCache()
     {
         return m_enumerationCache.get();
     }
-
-    ALWAYS_INLINE JSPropertyNameIterator* Register::propertyNameIterator() const
+    
+    inline void StructureRareData::setEnumerationCache(JSGlobalData& globalData, const Structure* owner, JSPropertyNameIterator* value)
     {
-        return jsCast<JSPropertyNameIterator*>(jsValue().asCell());
+        m_enumerationCache.set(globalData, owner, value);
     }
 
 } // namespace JSC
index 4184e7f..8650a7f 100644 (file)
@@ -645,7 +645,7 @@ Structure* Structure::flattenDictionaryStructure(JSGlobalData& globalData, JSObj
 
 PropertyOffset Structure::addPropertyWithoutTransition(JSGlobalData& globalData, PropertyName propertyName, unsigned attributes, JSCell* specificValue)
 {
-    ASSERT(!m_enumerationCache);
+    ASSERT(!enumerationCache());
 
     if (m_specificFunctionThrashCount == maxSpecificFunctionThrashCount)
         specificValue = 0;
@@ -660,7 +660,7 @@ PropertyOffset Structure::addPropertyWithoutTransition(JSGlobalData& globalData,
 PropertyOffset Structure::removePropertyWithoutTransition(JSGlobalData& globalData, PropertyName propertyName)
 {
     ASSERT(isUncacheableDictionary());
-    ASSERT(!m_enumerationCache);
+    ASSERT(!enumerationCache());
 
     materializePropertyMapIfNecessaryForPinning(globalData);
 
@@ -859,7 +859,6 @@ void Structure::visitChildren(JSCell* cell, SlotVisitor& visitor)
     }
     visitor.append(&thisObject->m_previousOrRareData);
     visitor.append(&thisObject->m_specificValueInPrevious);
-    visitor.append(&thisObject->m_enumerationCache);
     if (thisObject->m_propertyTable) {
         PropertyTable::iterator end = thisObject->m_propertyTable->end();
         for (PropertyTable::iterator ptr = thisObject->m_propertyTable->begin(); ptr != end; ++ptr)
index 9aaa613..d37ad5c 100644 (file)
@@ -476,8 +476,6 @@ namespace JSC {
 
         StructureTransitionTable m_transitionTable;
 
-        WriteBarrier<JSPropertyNameIterator> m_enumerationCache;
-
         OwnPtr<PropertyTable> m_propertyTable;
 
         mutable InlineWatchpointSet m_transitionWatchpointSet;
@@ -584,6 +582,21 @@ namespace JSC {
         return false;
     }
 
+    inline void Structure::setEnumerationCache(JSGlobalData& globalData, JSPropertyNameIterator* enumerationCache)
+    {
+        ASSERT(!isDictionary());
+        if (!typeInfo().structureHasRareData())
+            allocateRareData(globalData);
+        rareData()->setEnumerationCache(globalData, this, enumerationCache);
+    }
+
+    inline JSPropertyNameIterator* Structure::enumerationCache()
+    {
+        if (!typeInfo().structureHasRareData())
+            return 0;
+        return rareData()->enumerationCache();
+    }
+
 } // namespace JSC
 
 #endif // Structure_h
index 4775edb..221a68d 100644 (file)
@@ -79,6 +79,7 @@ void StructureRareData::visitChildren(JSCell* cell, SlotVisitor& visitor)
     JSCell::visitChildren(thisObject, visitor);
     visitor.append(&thisObject->m_previous);
     visitor.append(&thisObject->m_objectToStringValue);
+    visitor.append(&thisObject->m_enumerationCache);
 }
 
 } // namespace JSC
index c02ba87..00b0793 100644 (file)
@@ -32,6 +32,7 @@
 
 namespace JSC {
 
+class JSPropertyNameIterator;
 class Structure;
 
 class StructureRareData : public JSCell {
@@ -51,6 +52,9 @@ public:
     JSString* objectToStringValue() const;
     void setObjectToStringValue(JSGlobalData&, const JSCell* owner, JSString* value);
 
+    JSPropertyNameIterator* enumerationCache();
+    void setEnumerationCache(JSGlobalData&, const Structure* owner, JSPropertyNameIterator* value);
+
     static JS_EXPORTDATA const ClassInfo s_info;
 
 private:
@@ -61,6 +65,7 @@ private:
 
     WriteBarrier<Structure> m_previous;
     WriteBarrier<JSString> m_objectToStringValue;
+    WriteBarrier<JSPropertyNameIterator> m_enumerationCache;
 };
 
 } // namespace JSC