Fixed <rdar://problem/7355025> Interpreter::privateExecute macro generates
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 17 Dec 2009 03:50:37 +0000 (03:50 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 17 Dec 2009 03:50:37 +0000 (03:50 +0000)
bloated code

Reviewed by Oliver Hunt.

This patch cuts Interpreter stack use by about a third.

* bytecode/Opcode.h: Changed Opcode to const void* to work with the
const static initiliazation we want to do in Interpreter::privateExecute.

* interpreter/Interpreter.cpp:
(JSC::Interpreter::Interpreter): Moved hashtable initialization here to
avoid polluting Interpreter::privateExecute's stack, and changed it from a
series of add() calls to one add() call in a loop, to cut down on code size.

(JSC::Interpreter::privateExecute): Changed a series of label computations
to a copy of a compile-time constant array to cut down on code size.

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

JavaScriptCore/ChangeLog
JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
JavaScriptCore/bytecode/Opcode.h
JavaScriptCore/interpreter/Interpreter.cpp

index 82df56f..78abf29 100644 (file)
@@ -1,3 +1,23 @@
+2009-12-16  Geoffrey Garen  <ggaren@apple.com>
+
+        Reviewed by Oliver Hunt.
+
+        Fixed <rdar://problem/7355025> Interpreter::privateExecute macro generates
+        bloated code
+        
+        This patch cuts Interpreter stack use by about a third.
+
+        * bytecode/Opcode.h: Changed Opcode to const void* to work with the
+        const static initiliazation we want to do in Interpreter::privateExecute.
+
+        * interpreter/Interpreter.cpp:
+        (JSC::Interpreter::Interpreter): Moved hashtable initialization here to
+        avoid polluting Interpreter::privateExecute's stack, and changed it from a
+        series of add() calls to one add() call in a loop, to cut down on code size.
+
+        (JSC::Interpreter::privateExecute): Changed a series of label computations
+        to a copy of a compile-time constant array to cut down on code size.
+
 2009-12-16  Mark Rowe  <mrowe@apple.com>
 
         Build fix.  Disable debug variants of WebKit frameworks.
index 6aaaf48..1c0b86c 100644 (file)
                        isa = XCBuildConfiguration;
                        baseConfigurationReference = 1C9051430BA9E8A70081E9D0 /* JavaScriptCore.xcconfig */;
                        buildSettings = {
-                               BUILD_VARIANTS = (
-                                       normal,
-                               );
+                               BUILD_VARIANTS = normal;
                        };
                        name = Production;
                };
index e88f051..b11113b 100644 (file)
@@ -196,7 +196,7 @@ namespace JSC {
     #undef VERIFY_OPCODE_ID
 
 #if HAVE(COMPUTED_GOTO)
-    typedef void* Opcode;
+    typedef const void* Opcode;
 #else
     typedef OpcodeID Opcode;
 #endif
index ed8bf5b..b8e7517 100644 (file)
@@ -321,7 +321,13 @@ Interpreter::Interpreter()
     : m_sampleEntryDepth(0)
     , m_reentryDepth(0)
 {
+#if HAVE(COMPUTED_GOTO)
     privateExecute(InitializeAndReturn, 0, 0, 0);
+
+    for (int i = 0; i < numOpcodeIDs; ++i)
+        m_opcodeIDTable.add(m_opcodeTable[i], static_cast<OpcodeID>(i));
+#endif // HAVE(COMPUTED_GOTO)
+
 #if ENABLE(OPCODE_SAMPLING)
     enableSampler();
 #endif
@@ -1081,16 +1087,13 @@ JSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFi
 {
     // One-time initialization of our address tables. We have to put this code
     // here because our labels are only in scope inside this function.
-    if (flag == InitializeAndReturn) {
+    if (UNLIKELY(flag == InitializeAndReturn)) {
         #if HAVE(COMPUTED_GOTO)
-            #define ADD_BYTECODE(id, length) m_opcodeTable[id] = &&id;
-                FOR_EACH_OPCODE_ID(ADD_BYTECODE);
-            #undef ADD_BYTECODE
-
-            #define ADD_OPCODE_ID(id, length) m_opcodeIDTable.add(&&id, id);
-                FOR_EACH_OPCODE_ID(ADD_OPCODE_ID);
-            #undef ADD_OPCODE_ID
-            ASSERT(m_opcodeIDTable.size() == numOpcodeIDs);
+            #define LIST_OPCODE_LABEL(id, length) &&id,
+                static Opcode labels[] = { FOR_EACH_OPCODE_ID(LIST_OPCODE_LABEL) };
+                for (size_t i = 0; i < sizeof(labels) / sizeof(Opcode); ++i)
+                    m_opcodeTable[i] = labels[i];
+            #undef LIST_OPCODE_LABEL
         #endif // HAVE(COMPUTED_GOTO)
         return JSValue();
     }