Remove m_subclassData from JSArray, move the attribute to subclass as needed
authorbenjamin@webkit.org <benjamin@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 18 Apr 2012 18:36:59 +0000 (18:36 +0000)
committerbenjamin@webkit.org <benjamin@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 18 Apr 2012 18:36:59 +0000 (18:36 +0000)
https://bugs.webkit.org/show_bug.cgi?id=84249

Patch by Benjamin Poulain <bpoulain@apple.com> on 2012-04-18
Reviewed by Geoffrey Garen.

Source/JavaScriptCore:

JSArray's m_subclassData is only used by WebCore's RuntimeArray. This patch moves
the attribute to RuntimeArray to avoid allocating memory for the pointer in the common
case.

This gives ~1% improvement in JSArray creation microbenchmark thanks to fewer allocations
of CopiedSpace.

* jit/JITInlineMethods.h:
(JSC::JIT::emitAllocateJSArray):
* runtime/JSArray.cpp:
(JSC::JSArray::JSArray):
* runtime/JSArray.h:

Source/WebCore:

* bridge/runtime_array.cpp:
(JSC::RuntimeArray::RuntimeArray):
(JSC::RuntimeArray::finishCreation):
* bridge/runtime_array.h:
(JSC::RuntimeArray::getLength):
(JSC::RuntimeArray::getConcreteArray):
(RuntimeArray):

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/jit/JITInlineMethods.h
Source/JavaScriptCore/runtime/JSArray.cpp
Source/JavaScriptCore/runtime/JSArray.h
Source/WebCore/ChangeLog
Source/WebCore/bridge/runtime_array.cpp
Source/WebCore/bridge/runtime_array.h

index 0472146..ba64bea 100644 (file)
@@ -1,5 +1,25 @@
 2012-04-18  Benjamin Poulain  <bpoulain@apple.com>
 
+        Remove m_subclassData from JSArray, move the attribute to subclass as needed
+        https://bugs.webkit.org/show_bug.cgi?id=84249
+
+        Reviewed by Geoffrey Garen.
+
+        JSArray's m_subclassData is only used by WebCore's RuntimeArray. This patch moves
+        the attribute to RuntimeArray to avoid allocating memory for the pointer in the common
+        case.
+
+        This gives ~1% improvement in JSArray creation microbenchmark thanks to fewer allocations
+        of CopiedSpace.
+
+        * jit/JITInlineMethods.h:
+        (JSC::JIT::emitAllocateJSArray):
+        * runtime/JSArray.cpp:
+        (JSC::JSArray::JSArray):
+        * runtime/JSArray.h:
+
+2012-04-18  Benjamin Poulain  <bpoulain@apple.com>
+
         replaceUsingStringSearch: delay the creation of the replace string until needed
         https://bugs.webkit.org/show_bug.cgi?id=83841
 
index 998d5ac..f2d0cef 100644 (file)
@@ -503,8 +503,7 @@ inline void JIT::emitAllocateJSArray(unsigned valuesRegister, unsigned length, R
     store32(Imm32(initialLength), Address(cellResult, JSArray::vectorLengthOffset()));
     store32(TrustedImm32(0), Address(cellResult, JSArray::indexBiasOffset()));
 
-    // Initialize the subclass data and the sparse value map.
-    storePtr(TrustedImmPtr(0), Address(cellResult, JSArray::subclassDataOffset()));
+    // Initialize the sparse value map.
     storePtr(TrustedImmPtr(0), Address(cellResult, JSArray::sparseValueMapOffset()));
 
         // Store the values we have.
index b741d73..2a919c3 100644 (file)
@@ -130,7 +130,6 @@ JSArray::JSArray(JSGlobalData& globalData, Structure* structure)
     , m_indexBias(0)
     , m_storage(0)
     , m_sparseValueMap(0)
-    , m_subclassData(0)
 {
 }
 
@@ -1810,16 +1809,6 @@ unsigned JSArray::compactForSorting(JSGlobalData& globalData)
     return numDefined;
 }
 
-void* JSArray::subclassData() const
-{
-    return m_subclassData;
-}
-
-void JSArray::setSubclassData(void* d)
-{
-    m_subclassData = d;
-}
-
 #if CHECK_ARRAY_CONSISTENCY
 
 void JSArray::checkConsistency(ConsistencyCheckType type)
index 98ee32e..7912537 100644 (file)
@@ -317,10 +317,8 @@ namespace JSC {
 
         // FIXME: Maybe SparseArrayValueMap should be put into its own JSCell?
         SparseArrayValueMap* m_sparseValueMap;
-        void* m_subclassData; // A JSArray subclass can use this to fill the vector lazily.
 
         static ptrdiff_t sparseValueMapOffset() { return OBJECT_OFFSETOF(JSArray, m_sparseValueMap); }
-        static ptrdiff_t subclassDataOffset() { return OBJECT_OFFSETOF(JSArray, m_subclassData); }
         static ptrdiff_t indexBiasOffset() { return OBJECT_OFFSETOF(JSArray, m_indexBias); }
     };
 
index f8d4ea4..fab697b 100644 (file)
@@ -1,3 +1,18 @@
+2012-04-18  Benjamin Poulain  <bpoulain@apple.com>
+
+        Remove m_subclassData from JSArray, move the attribute to subclass as needed
+        https://bugs.webkit.org/show_bug.cgi?id=84249
+
+        Reviewed by Geoffrey Garen.
+
+        * bridge/runtime_array.cpp:
+        (JSC::RuntimeArray::RuntimeArray):
+        (JSC::RuntimeArray::finishCreation):
+        * bridge/runtime_array.h:
+        (JSC::RuntimeArray::getLength):
+        (JSC::RuntimeArray::getConcreteArray):
+        (RuntimeArray):
+
 2012-04-18  Luiz Agostini  <luiz.agostini@palm.com>
 
         matchMedia() MediaQueryList not updating
index c15c7cb..f0c5080 100644 (file)
@@ -39,6 +39,7 @@ const ClassInfo RuntimeArray::s_info = { "RuntimeArray", &JSArray::s_info, 0, 0,
 
 RuntimeArray::RuntimeArray(ExecState* exec, Structure* structure)
     : JSArray(exec->globalData(), structure)
+    , m_array(0)
 {
 }
 
@@ -46,7 +47,7 @@ void RuntimeArray::finishCreation(JSGlobalData& globalData, Bindings::Array* arr
 {
     Base::finishCreation(globalData);
     ASSERT(inherits(&s_info));
-    setSubclassData(array);
+    m_array = array;
 }
 
 RuntimeArray::~RuntimeArray()
index c7bee52..2ea52b6 100644 (file)
@@ -60,9 +60,9 @@ public:
     static bool deleteProperty(JSCell*, ExecState*, const Identifier &propertyName);
     static bool deletePropertyByIndex(JSCell*, ExecState*, unsigned propertyName);
     
-    unsigned getLength() const { return getConcreteArray()->getLength(); }
+    unsigned getLength() const { return m_array->getLength(); }
     
-    Bindings::Array* getConcreteArray() const { return static_cast<BindingsArray*>(subclassData()); }
+    Bindings::Array* getConcreteArray() const { return m_array; }
 
     static const ClassInfo s_info;
 
@@ -85,6 +85,8 @@ private:
     RuntimeArray(ExecState*, Structure*);
     static JSValue lengthGetter(ExecState*, JSValue, const Identifier&);
     static JSValue indexGetter(ExecState*, JSValue, unsigned);
+
+    BindingsArray* m_array;
 };
     
 } // namespace JSC