Fix codegen for slow script dialog.
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 9 Sep 2008 04:43:25 +0000 (04:43 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 9 Sep 2008 04:43:25 +0000 (04:43 +0000)
Reviewed by Mark Rowe

Correct error in timeout logic where execution tick count would
be reset to incorrect value due to incorrect offset and indirection.
Codegen for the slow script dialog was factored out into a separate
method (emitSlowScriptCheck) rather than having multiple copies of
the same code.  Also added calls to generate slow script checks
for loop_if_less and loop_if_true opcodes.

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

JavaScriptCore/ChangeLog
JavaScriptCore/VM/CTI.cpp
JavaScriptCore/VM/CTI.h

index 50603cd..ef75b9b 100644 (file)
@@ -1,3 +1,20 @@
+2008-09-08  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Mark Rowe.
+
+        Correct error in timeout logic where execution tick count would
+        be reset to incorrect value due to incorrect offset and indirection.
+        Codegen for the slow script dialog was factored out into a separate
+        method (emitSlowScriptCheck) rather than having multiple copies of
+        the same code.  Also added calls to generate slow script checks
+        for loop_if_less and loop_if_true opcodes.
+
+        * VM/CTI.cpp:
+        (JSC::CTI::emitSlowScriptCheck):
+        (JSC::CTI::privateCompileMainPass):
+        (JSC::CTI::privateCompileSlowCases):
+        * VM/CTI.h:
+
 2008-09-08  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
 
         Reviewed by Maciej Stachowiak.
index 07c9a94..173a1d1 100644 (file)
@@ -442,6 +442,19 @@ void CTI::compileOpCall(Instruction* instruction, unsigned i, CompileOpCallType
     emitPutResult(instruction[i + 1].u.operand);
 }
 
+void CTI::emitSlowScriptCheck(unsigned opcodeIndex)
+{
+    m_jit.emitSubl_i8r(1, MacroAssembler::esi);
+    MacroAssembler::JmpSrc skipTimeout = m_jit.emitUnlinkedJne();
+    emitCall(opcodeIndex, Machine::cti_timeout_check);
+
+    emitGetCTIParam(CTI_ARGS_exec, MacroAssembler::ecx);
+    m_jit.emitMovl_mr(OBJECT_OFFSET(ExecState, m_globalData), MacroAssembler::ecx, MacroAssembler::ecx);
+    m_jit.emitMovl_mr(OBJECT_OFFSET(JSGlobalData, machine), MacroAssembler::ecx, MacroAssembler::ecx);
+    m_jit.emitMovl_mr(OBJECT_OFFSET(Machine, m_ticksUntilNextTimeoutCheck), MacroAssembler::ecx, MacroAssembler::esi);
+    m_jit.link(skipTimeout, m_jit.label());
+}
+
 void CTI::privateCompileMainPass()
 {
     Instruction* instruction = m_codeBlock->instructions.begin();
@@ -529,14 +542,7 @@ void CTI::privateCompileMainPass()
             break;
         }
         case op_loop: {
-            m_jit.emitSubl_i8r(1, MacroAssembler::esi);
-            MacroAssembler::JmpSrc skipTimeout = m_jit.emitUnlinkedJne();
-            emitCall(i, Machine::cti_timeout_check);
-
-            emitGetCTIParam(CTI_ARGS_exec, MacroAssembler::ecx);
-            m_jit.emitMovl_mr(OBJECT_OFFSET(ExecState, m_globalData) + OBJECT_OFFSET(JSGlobalData, machine), MacroAssembler::ecx, MacroAssembler::ecx);
-            m_jit.emitMovl_mr(OBJECT_OFFSET(Machine, m_ticksUntilNextTimeoutCheck), MacroAssembler::ecx, MacroAssembler::esi);
-            m_jit.link(skipTimeout, m_jit.label());
+            emitSlowScriptCheck(i);
 
             unsigned target = instruction[i + 1].u.operand;
             m_jmpTable.append(JmpTable(m_jit.emitUnlinkedJmp(), i + 1 + target));
@@ -544,14 +550,7 @@ void CTI::privateCompileMainPass()
             break;
         }
         case op_loop_if_less: {
-            m_jit.emitSubl_i8r(1, MacroAssembler::esi);
-            MacroAssembler::JmpSrc skipTimeout = m_jit.emitUnlinkedJne();
-            emitCall(i, Machine::cti_timeout_check);
-
-            emitGetCTIParam(CTI_ARGS_exec, MacroAssembler::ecx);
-            m_jit.emitMovl_mr(OBJECT_OFFSET(ExecState, m_globalData) + OBJECT_OFFSET(JSGlobalData, machine), MacroAssembler::ecx, MacroAssembler::ecx);
-            m_jit.emitMovl_mr(OBJECT_OFFSET(Machine, m_ticksUntilNextTimeoutCheck), MacroAssembler::ecx, MacroAssembler::esi);
-            m_jit.link(skipTimeout, m_jit.label());
+            emitSlowScriptCheck(i);
 
             unsigned target = instruction[i + 3].u.operand;
             JSValue* src2imm = getConstantImmediateNumericArg(instruction[i + 2].u.operand);
@@ -749,14 +748,7 @@ void CTI::privateCompileMainPass()
         }
         CTI_COMPILE_BINARY_OP(op_lesseq)
         case op_loop_if_true: {
-            m_jit.emitSubl_i8r(1, MacroAssembler::esi);
-            MacroAssembler::JmpSrc skipTimeout = m_jit.emitUnlinkedJne();
-            emitCall(i, Machine::cti_timeout_check);
-
-            emitGetCTIParam(CTI_ARGS_exec, MacroAssembler::ecx);
-            m_jit.emitMovl_mr(OBJECT_OFFSET(ExecState, m_globalData) + OBJECT_OFFSET(JSGlobalData, machine), MacroAssembler::ecx, MacroAssembler::ecx);
-            m_jit.emitMovl_mr(OBJECT_OFFSET(Machine, m_ticksUntilNextTimeoutCheck), MacroAssembler::ecx, MacroAssembler::esi);
-            m_jit.link(skipTimeout, m_jit.label());
+            emitSlowScriptCheck(i);
 
             unsigned target = instruction[i + 2].u.operand;
             emitGetArg(instruction[i + 1].u.operand, MacroAssembler::eax);
@@ -1370,6 +1362,8 @@ void CTI::privateCompileSlowCases()
             break;
         }
         case op_loop_if_less: {
+            emitSlowScriptCheck(i);
+
             unsigned target = instruction[i + 3].u.operand;
             JSValue* src2imm = getConstantImmediateNumericArg(instruction[i + 2].u.operand);
             if (src2imm) {
@@ -1418,6 +1412,8 @@ void CTI::privateCompileSlowCases()
             break;
         }
         case op_loop_if_true: {
+            emitSlowScriptCheck(i);
+
             m_jit.link(iter->from, m_jit.label());
             emitPutArg(MacroAssembler::eax, 0);
             emitCall(i, Machine::cti_op_jtrue);
index fca57fe..d1dec7f 100644 (file)
@@ -330,6 +330,7 @@ namespace JSC {
         void emitCall(unsigned opcodeIndex, CTIHelper_v);
         void emitCall(unsigned opcodeIndex, CTIHelper_s);
 
+        void emitSlowScriptCheck(unsigned opcodeIndex);
 #ifndef NDEBUG
         void printOpcodeOperandTypes(unsigned src1, unsigned src2);
 #endif