<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[159276] trunk/Source/JavaScriptCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/159276">159276</a></dd>
<dt>Author</dt> <dd>msaboff@apple.com</dd>
<dt>Date</dt> <dd>2013-11-13 23:39:30 -0800 (Wed, 13 Nov 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>Change callToJavaScript thunk into an offline assembled stub
https://bugs.webkit.org/show_bug.cgi?id=124251

Reviewed by Geoffrey Garen.

Changed callToJavaScript and throwNotCaught into stubs generated by the offline assembler.
Added popCalleeSaves and pushCalleeSaves pseudo ops to the offline assembler to handle
the saving and restoring of callee save registers.  Fixed callFrameRegister differences
between arm traditional (<a href="http://trac.webkit.org/projects/webkit/changeset/11">r11</a>) and arm Thumb2 (<a href="http://trac.webkit.org/projects/webkit/changeset/7">r7</a>) in GPRInfo.h.  Also fixed implementation
of pop &amp; push in arm.rb.

Since the offline assembler and therefore the LLInt don't work on Windows, the Windows stubs
are handled as inline assembly in JITStubsX86.h and JITStubsMSVC64.asm.

* dfg/DFGDriver.cpp:
(JSC::DFG::compileImpl):
* jit/GPRInfo.h:
(JSC::GPRInfo::toIndex):
(JSC::GPRInfo::debugName):
* jit/JITCode.cpp:
(JSC::JITCode::execute):
* jit/JITExceptions.cpp:
(JSC::genericUnwind):
* jit/JITStubs.h:
* jit/JITStubsMSVC64.asm:
* jit/JITStubsX86.h:
* jit/ThunkGenerators.cpp:
* jit/ThunkGenerators.h:
* llint/LLIntThunks.h:
* llint/LowLevelInterpreter.asm:
* llint/LowLevelInterpreter32_64.asm:
* llint/LowLevelInterpreter64.asm:
* offlineasm/arm.rb:
* offlineasm/arm64.rb:
* offlineasm/instructions.rb:
* offlineasm/mips.rb:
* offlineasm/registers.rb:
* offlineasm/sh4.rb:
* offlineasm/x86.rb:
* runtime/VM.cpp:
(JSC::VM::VM):
* runtime/VM.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGDrivercpp">trunk/Source/JavaScriptCore/dfg/DFGDriver.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitGPRInfoh">trunk/Source/JavaScriptCore/jit/GPRInfo.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITCodecpp">trunk/Source/JavaScriptCore/jit/JITCode.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITExceptionscpp">trunk/Source/JavaScriptCore/jit/JITExceptions.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITStubsh">trunk/Source/JavaScriptCore/jit/JITStubs.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITStubsMSVC64asm">trunk/Source/JavaScriptCore/jit/JITStubsMSVC64.asm</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITStubsX86h">trunk/Source/JavaScriptCore/jit/JITStubsX86.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitThunkGeneratorscpp">trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitThunkGeneratorsh">trunk/Source/JavaScriptCore/jit/ThunkGenerators.h</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLLIntThunksh">trunk/Source/JavaScriptCore/llint/LLIntThunks.h</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLowLevelInterpreterasm">trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLowLevelInterpreter32_64asm">trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLowLevelInterpreter64asm">trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmarmrb">trunk/Source/JavaScriptCore/offlineasm/arm.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmarm64rb">trunk/Source/JavaScriptCore/offlineasm/arm64.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasminstructionsrb">trunk/Source/JavaScriptCore/offlineasm/instructions.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmmipsrb">trunk/Source/JavaScriptCore/offlineasm/mips.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmregistersrb">trunk/Source/JavaScriptCore/offlineasm/registers.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmsh4rb">trunk/Source/JavaScriptCore/offlineasm/sh4.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmx86rb">trunk/Source/JavaScriptCore/offlineasm/x86.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeVMcpp">trunk/Source/JavaScriptCore/runtime/VM.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeVMh">trunk/Source/JavaScriptCore/runtime/VM.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/ChangeLog        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -1,3 +1,48 @@
</span><ins>+2013-11-13  Michael Saboff  &lt;msaboff@apple.com&gt;
+
+        Change callToJavaScript thunk into an offline assembled stub
+        https://bugs.webkit.org/show_bug.cgi?id=124251
+
+        Reviewed by Geoffrey Garen.
+
+        Changed callToJavaScript and throwNotCaught into stubs generated by the offline assembler.
+        Added popCalleeSaves and pushCalleeSaves pseudo ops to the offline assembler to handle
+        the saving and restoring of callee save registers.  Fixed callFrameRegister differences
+        between arm traditional (r11) and arm Thumb2 (r7) in GPRInfo.h.  Also fixed implementation
+        of pop &amp; push in arm.rb.
+
+        Since the offline assembler and therefore the LLInt don't work on Windows, the Windows stubs
+        are handled as inline assembly in JITStubsX86.h and JITStubsMSVC64.asm.
+
+        * dfg/DFGDriver.cpp:
+        (JSC::DFG::compileImpl):
+        * jit/GPRInfo.h:
+        (JSC::GPRInfo::toIndex):
+        (JSC::GPRInfo::debugName):
+        * jit/JITCode.cpp:
+        (JSC::JITCode::execute):
+        * jit/JITExceptions.cpp:
+        (JSC::genericUnwind):
+        * jit/JITStubs.h:
+        * jit/JITStubsMSVC64.asm:
+        * jit/JITStubsX86.h:
+        * jit/ThunkGenerators.cpp:
+        * jit/ThunkGenerators.h:
+        * llint/LLIntThunks.h:
+        * llint/LowLevelInterpreter.asm:
+        * llint/LowLevelInterpreter32_64.asm:
+        * llint/LowLevelInterpreter64.asm:
+        * offlineasm/arm.rb:
+        * offlineasm/arm64.rb:
+        * offlineasm/instructions.rb:
+        * offlineasm/mips.rb:
+        * offlineasm/registers.rb:
+        * offlineasm/sh4.rb:
+        * offlineasm/x86.rb:
+        * runtime/VM.cpp:
+        (JSC::VM::VM):
+        * runtime/VM.h:
+
</ins><span class="cx"> 2013-11-13  Andy Estes  &lt;aestes@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix the ARM64 build after recent JavaScriptCore changes
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGDrivercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGDriver.cpp (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGDriver.cpp        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/dfg/DFGDriver.cpp        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -78,8 +78,6 @@
</span><span class="cx">     
</span><span class="cx">     // Make sure that any stubs that the DFG is going to use are initialized. We want to
</span><span class="cx">     // make sure that all JIT code generation does finalization on the main thread.
</span><del>-    vm.getCTIStub(callToJavaScript);
-    vm.getCTIStub(throwNotCaught);
</del><span class="cx">     vm.getCTIStub(osrExitGenerationThunkGenerator);
</span><span class="cx">     vm.getCTIStub(throwExceptionFromCallSlowPathGenerator);
</span><span class="cx">     vm.getCTIStub(linkCallThunkGenerator);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitGPRInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/GPRInfo.h (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/GPRInfo.h        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/jit/GPRInfo.h        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -460,7 +460,11 @@
</span><span class="cx">     static const GPRReg regT4 = ARMRegisters::r8;
</span><span class="cx">     static const GPRReg regT5 = ARMRegisters::r9;
</span><span class="cx">     static const GPRReg regT6 = ARMRegisters::r10;
</span><del>-    static const GPRReg regT7 = ARMRegisters::r5;
</del><ins>+#if CPU(ARM_THUMB2)
+    static const GPRReg regT7 = ARMRegisters::r11;
+#else 
+    static const GPRReg regT7 = ARMRegisters::r7;
+#endif
</ins><span class="cx">     static const GPRReg regT8 = ARMRegisters::r3;
</span><span class="cx">     // These registers match the baseline JIT.
</span><span class="cx">     static const GPRReg cachedResultRegister = regT0;
</span><span class="lines">@@ -488,8 +492,13 @@
</span><span class="cx">     static unsigned toIndex(GPRReg reg)
</span><span class="cx">     {
</span><span class="cx">         ASSERT(reg != InvalidGPRReg);
</span><del>-        ASSERT(reg &lt; 16);
-        static const unsigned indexForRegister[16] = { 0, 1, 2, 8, 3, 7, InvalidIndex, InvalidIndex, 4, 5, 6, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex };
</del><ins>+        ASSERT(static_cast&lt;int&gt;(reg) &lt; 16);
+        static const unsigned indexForRegister[16] =
+#if CPU(ARM_THUMB2)
+            { 0, 1, 2, 8, 3, 9, InvalidIndex, InvalidIndex, 4, 5, 6, 7, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex };
+#else
+            { 0, 1, 2, 8, 3, 9, InvalidIndex, 7, 4, 5, 6, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex };
+#endif
</ins><span class="cx">         unsigned result = indexForRegister[reg];
</span><span class="cx">         ASSERT(result != InvalidIndex);
</span><span class="cx">         return result;
</span><span class="lines">@@ -498,7 +507,7 @@
</span><span class="cx">     static const char* debugName(GPRReg reg)
</span><span class="cx">     {
</span><span class="cx">         ASSERT(reg != InvalidGPRReg);
</span><del>-        ASSERT(reg &lt; 16);
</del><ins>+        ASSERT(static_cast&lt;int&gt;(reg) &lt; 16);
</ins><span class="cx">         static const char* nameForRegister[16] = {
</span><span class="cx">             &quot;r0&quot;, &quot;r1&quot;, &quot;r2&quot;, &quot;r3&quot;,
</span><span class="cx">             &quot;r4&quot;, &quot;r5&quot;, &quot;r6&quot;, &quot;r7&quot;,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITCodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITCode.cpp (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITCode.cpp        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/jit/JITCode.cpp        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -26,8 +26,8 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;JITCode.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;LLIntThunks.h&quot;
</ins><span class="cx"> #include &quot;Operations.h&quot;
</span><del>-#include &quot;ThunkGenerators.h&quot;
</del><span class="cx"> #include &lt;wtf/PrintStream.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="lines">@@ -46,7 +46,7 @@
</span><span class="cx"> {
</span><span class="cx">     UNUSED_PARAM(stack);
</span><span class="cx"> 
</span><del>-    JSValue result = JSValue::decode(vm-&gt;callJavaScriptJITFunction(executableAddress(), callFrame));
</del><ins>+    JSValue result = JSValue::decode(callToJavaScript(executableAddress(), callFrame));
</ins><span class="cx">     return vm-&gt;exception() ? jsNull() : result;
</span><span class="cx"> }
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITExceptionscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITExceptions.cpp (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITExceptions.cpp        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/jit/JITExceptions.cpp        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -30,7 +30,9 @@
</span><span class="cx"> #include &quot;CallFrameInlines.h&quot;
</span><span class="cx"> #include &quot;CodeBlock.h&quot;
</span><span class="cx"> #include &quot;Interpreter.h&quot;
</span><ins>+#include &quot;JITStubs.h&quot;
</ins><span class="cx"> #include &quot;JSCJSValue.h&quot;
</span><ins>+#include &quot;LLIntThunks.h&quot;
</ins><span class="cx"> #include &quot;VM.h&quot;
</span><span class="cx"> #include &quot;Operations.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -49,7 +51,7 @@
</span><span class="cx">         catchPCForInterpreter = &amp;callFrame-&gt;codeBlock()-&gt;instructions()[handler-&gt;target];
</span><span class="cx">         catchRoutine = ExecutableBase::catchRoutineFor(handler, catchPCForInterpreter);
</span><span class="cx">     } else
</span><del>-        catchRoutine = vm-&gt;getCTIStub(throwNotCaught).code().executableAddress();
</del><ins>+        catchRoutine = FunctionPtr(LLInt::getCodePtr(returnFromJavaScript)).value();
</ins><span class="cx">     
</span><span class="cx">     vm-&gt;callFrameForThrow = callFrame;
</span><span class="cx">     vm-&gt;targetMachinePCForThrow = catchRoutine;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITStubsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITStubs.h (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITStubs.h        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/jit/JITStubs.h        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -30,10 +30,21 @@
</span><span class="cx"> #ifndef JITStubs_h
</span><span class="cx"> #define JITStubs_h
</span><span class="cx"> 
</span><ins>+#include &quot;JSCJSValue.h&quot;
+
</ins><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(JIT)
</span><span class="cx"> 
</span><ins>+#if OS(WINDOWS)
+class ExecState;
+
+extern &quot;C&quot; {
+    EncodedJSValue callToJavaScript(void*, ExecState*);
+    void returnFromJavaScript();
+}
+#endif
+
</ins><span class="cx"> #if USE(MASM_PROBE)
</span><span class="cx"> extern &quot;C&quot; void ctiMasmProbeTrampoline();
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITStubsMSVC64asm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITStubsMSVC64.asm (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITStubsMSVC64.asm        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/jit/JITStubsMSVC64.asm        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -25,10 +25,54 @@
</span><span class="cx"> 
</span><span class="cx"> EXTERN getHostCallReturnValueWithExecState : near
</span><span class="cx"> 
</span><ins>+PUBLIC callToJavaScript
+PUBLIC returnFromJavaScript
</ins><span class="cx"> PUBLIC getHostCallReturnValue
</span><span class="cx"> 
</span><span class="cx"> _TEXT   SEGMENT
</span><span class="cx"> 
</span><ins>+callToJavaScript PROC
+    push rbp
+    mov rbp, rax ; Save previous frame pointer
+    mov rbp, rsp
+    push r12
+    push r13
+    push r14
+    push r15
+    push rbx
+
+    ; JIT operations can use up to 6 args (4 in registers and 2 on the stack).
+    ; In addition, X86_64 ABI specifies that the worse case stack alignment
+    ; requirement is 32 bytes. Based on these factors, we need to pad the stack
+    ; an additional 28h bytes.
+    sub rsp, 28h
+    mov rbp, rdx
+    mov r11, qword ptr[rbp] ; Put the previous frame pointer in the sentinel call frame above us
+    mov qword ptr[r11], rax
+    mov r14, 0FFFF000000000000h
+    mov r15, 0FFFF000000000002h
+    call rcx
+    add rsp, 28h
+    pop rbx
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rbp
+    ret
+callToJavaScript ENDP
+
+returnFromJavaScript PROC
+    add rsp, 28h
+    pop rbx
+    pop r15
+    pop r14
+    pop r13
+    pop r12
+    pop rbp
+    ret
+returnFromJavaScript ENDP
+        
</ins><span class="cx"> getHostCallReturnValue PROC
</span><span class="cx">     sub r13, 40
</span><span class="cx">     mov r13, rdi
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITStubsX86h"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITStubsX86.h (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITStubsX86.h        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/jit/JITStubsX86.h        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -200,6 +200,50 @@
</span><span class="cx"> 
</span><span class="cx"> #endif // COMPILER(GCC)
</span><span class="cx"> 
</span><ins>+#if COMPILER(MSVC)
+
+extern &quot;C&quot; {
+
+    // FIXME: Since Windows doesn't use the LLInt, we have inline stubs here.
+    // Until the LLInt is changed to support Windows, these stub needs to be updated.
+    __declspec(naked) EncodedJSValue callToJavaScript(void* code, ExecState*)
+    {
+        __asm {
+            push ebp;
+            mov eax, ebp;
+            mov ebp, esp;
+            push esi;
+            push edi;
+            push ebx;
+            sub esp, 0x1c;
+            mov ebp, [esp + 0x34];
+            mov ebx, [ebp];
+            mov [ebx], eax;
+            call [esp + 0x30];
+            add esp, 0x1c;
+            pop ebx;
+            pop edi;
+            pop esi;
+            pop ebp;
+            ret;
+        }
+    }
+
+    __declspec(naked) void returnFromJavaScript()
+    {
+        __asm {
+            add esp, 0x1c;
+            pop ebx;
+            pop edi;
+            pop esi;
+            pop ebp;
+            ret;
+        }
+    }
+}
+
+#endif // COMPILER(MSVC)
+
</ins><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span><span class="cx"> #endif // JITStubsX86_h
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitThunkGeneratorscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -56,277 +56,6 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void returnFromJavaScript(CCallHelpers&amp; jit)
-{
-#if CPU(X86_64)
-#if OS(WINDOWS)
-    // JIT operations can use up to 6 args (4 in registers and 2 on the stack).
-    // In addition, X86_64 ABI specifies that the worse case stack alignment
-    // requirement is 32 bytes. Based on these factors, we need to pad the stack
-    // and additional 40 bytes.
-#   define EXTRA_STACK_SIZE              40
-    jit.addPtr(CCallHelpers::TrustedImm32(8), X86Registers::esp);
-#else
-    // We don't need extra stack space for out-going args, but we need to align the
-    // stack to 32 byte alignment, therefore add 8 bytes to the stack.
-#   define EXTRA_STACK_SIZE              8
-    jit.addPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), X86Registers::esp);
-#endif
-
-    jit.pop(X86Registers::ebx);
-    jit.pop(X86Registers::r15);
-    jit.pop(X86Registers::r14);
-    jit.pop(X86Registers::r13);
-    jit.pop(X86Registers::r12);
-    jit.pop(X86Registers::ebp);
-#elif CPU(X86)
-    // JIT Operation can use up to 6 arguments right now. So, we need to
-    // reserve space in this stack frame for the out-going args. To ensure that
-    // the stack remains aligned on an 16 byte boundary, we round the padding up
-    // by 28 bytes.
-#   define EXTRA_STACK_SIZE 28
-
-    jit.addPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), X86Registers::esp);
-
-    jit.pop(X86Registers::ebx);
-    jit.pop(X86Registers::edi);
-    jit.pop(X86Registers::esi);
-    jit.pop(X86Registers::ebp);
-#elif CPU(ARM_TRADITIONAL)
-    // JIT Operation can use up to 6 arguments right now. So, we need to
-    // reserve space in this stack frame for the out-going args. We need to
-    // add space for 16 more bytes.
-#   define EXTRA_STACK_SIZE              16
-
-    jit.addPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), ARMRegisters::sp);
-
-    jit.pop(ARMRegisters::lr);
-    jit.pop(ARMRegisters::r11);
-    jit.pop(ARMRegisters::r10);
-    jit.pop(ARMRegisters::r9);
-    jit.pop(ARMRegisters::r8);
-    jit.pop(ARMRegisters::r6);
-    jit.pop(ARMRegisters::r5);
-    jit.pop(ARMRegisters::r4);
-#elif CPU(ARM_THUMB2)
-    // JIT Operation can use up to 6 arguments right now. So, we need to
-    // reserve space in this stack frame for the out-going args. To ensure that
-    // the stack remains aligned on an 16 byte boundary, we round the padding up
-    // by 28 bytes.
-#   define EXTRA_STACK_SIZE              28
-
-    jit.addPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), ARMRegisters::sp);
-    jit.pop(ARMRegisters::r11);
-    jit.pop(ARMRegisters::r10);
-    jit.pop(ARMRegisters::r9);
-    jit.pop(ARMRegisters::r8);
-    jit.pop(ARMRegisters::r7);
-    jit.pop(ARMRegisters::r6);
-    jit.pop(ARMRegisters::r5);
-    jit.pop(ARMRegisters::r4);
-    jit.pop(ARMRegisters::lr);
-#elif CPU(ARM64)
-    jit.pop(ARM64Registers::x28);
-    jit.pop(ARM64Registers::x27);
-    jit.pop(ARM64Registers::x26);
-    jit.pop(ARM64Registers::x25);
-    jit.pop(ARM64Registers::x24);
-    jit.pop(ARM64Registers::x23);
-    jit.pop(ARM64Registers::x22);
-    jit.pop(ARM64Registers::x21);
-    jit.pop(ARM64Registers::x20);
-    jit.pop(ARM64Registers::x19);
-    jit.pop(ARM64Registers::lr);
-#elif CPU(MIPS)
-#   define PRESERVED_GP_OFFSET         60
-#   define PRESERVED_S0_OFFSET         64
-#   define PRESERVED_S1_OFFSET         68
-#   define PRESERVED_S2_OFFSET         72
-#   define PRESERVED_S3_OFFSET         76
-#   define PRESERVED_S4_OFFSET         80
-#   define PRESERVED_RETURN_ADDRESS_OFFSET 84
-#   define PRESERVED_FP_OFFSET         88
-#   define STACK_LENGTH               112
-
-    jit.loadPtr(CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S0_OFFSET), MIPSRegisters::s0);
-    jit.loadPtr(CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S1_OFFSET), MIPSRegisters::s1);
-    jit.loadPtr(CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S2_OFFSET), MIPSRegisters::s2);
-    jit.loadPtr(CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S3_OFFSET), MIPSRegisters::s3);
-    jit.loadPtr(CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S4_OFFSET), MIPSRegisters::s4);
-    jit.loadPtr(CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_RETURN_ADDRESS_OFFSET), MIPSRegisters::ra);
-    jit.loadPtr(CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_FP_OFFSET), MIPSRegisters::fp);
-    jit.addPtr(CCallHelpers::TrustedImm32(STACK_LENGTH), MIPSRegisters::sp);
-#elif CPU(SH4)
-#   define EXTRA_STACK_SIZE 20
-
-    jit.addPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), SH4Registers::sp);
-    jit.pop(SH4Registers::r8);
-    jit.pop(SH4Registers::r9);
-    jit.pop(SH4Registers::r10);
-    jit.pop(SH4Registers::r11);
-    jit.pop(SH4Registers::r13);
-    jit.pop(SH4Registers::pr);
-    jit.pop(SH4Registers::fp);
-#endif
-
-    jit.ret();
-}
-
-MacroAssemblerCodeRef callToJavaScript(VM* vm)
-{
-    // The signature of the code generated is EncodedJSValue callToJavaScript(void* code, CallFrame*)
-
-    CCallHelpers jit(vm);
-
-#if CPU(X86_64)
-#if OS(WINDOWS)
-    // Dump register parameters to their home address
-    jit.storePtr(X86Registers::r9, CCallHelpers::Address(X86Registers::esp, 0x20));
-    jit.storePtr(X86Registers::r8, CCallHelpers::Address(X86Registers::esp, 0x18));
-    jit.storePtr(X86Registers::edx, CCallHelpers::Address(X86Registers::esp, 0x10));
-    jit.storePtr(X86Registers::ecx, CCallHelpers::Address(X86Registers::esp, 0x8));
-#endif // OS(WINDOWS)
-    jit.push(X86Registers::ebp);
-    jit.move(X86Registers::ebp, GPRInfo::nonArgGPR0);
-    jit.move(X86Registers::esp, X86Registers::ebp);
-    jit.push(X86Registers::r12);
-    jit.push(X86Registers::r13);
-    jit.push(X86Registers::r14);
-    jit.push(X86Registers::r15);
-    jit.push(X86Registers::ebx);
-
-    jit.subPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), X86Registers::esp);
-
-#   define CALLFRAME_SRC_REG GPRInfo::argumentGPR1
-#   define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0
-#elif CPU(X86)
-    jit.push(X86Registers::ebp);
-    jit.move(X86Registers::ebp, GPRInfo::nonArgGPR0);
-    jit.move(X86Registers::esp, X86Registers::ebp);
-    jit.push(X86Registers::esi);
-    jit.push(X86Registers::edi);
-    jit.push(X86Registers::ebx);
-
-    jit.subPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), X86Registers::esp);
-
-    jit.load32(CCallHelpers::Address(X86Registers::esp, EXTRA_STACK_SIZE + 24), GPRInfo::callFrameRegister);
-
-#   define CALLFRAME_SRC_REG GPRInfo::callFrameRegister
-#   define CALL_CODE jit.call(CCallHelpers::Address(X86Registers::esp, EXTRA_STACK_SIZE + 20))
-#   define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0
-#elif CPU(ARM_TRADITIONAL)
-    jit.push(ARMRegisters::r4);
-    jit.push(ARMRegisters::r5);
-    jit.push(ARMRegisters::r6);
-    jit.push(ARMRegisters::r8);
-    jit.push(ARMRegisters::r9);
-    jit.push(ARMRegisters::r10);
-    jit.push(ARMRegisters::r11);
-    jit.push(ARMRegisters::lr);
-    jit.move(ARMRegisters::r11, GPRInfo::nonArgGPR0);
-    jit.subPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), ARMRegisters::sp);
-
-#   define CALLFRAME_SRC_REG GPRInfo::argumentGPR1
-#   define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0
-#elif CPU(ARM_THUMB2)
-    jit.push(ARMRegisters::lr);
-    jit.push(ARMRegisters::r4);
-    jit.push(ARMRegisters::r5);
-    jit.push(ARMRegisters::r6);
-    jit.push(ARMRegisters::r7);
-    jit.push(ARMRegisters::r8);
-    jit.push(ARMRegisters::r9);
-    jit.push(ARMRegisters::r10);
-    jit.push(ARMRegisters::r11);
-    jit.move(ARMRegisters::r7, GPRInfo::nonArgGPR0);
-    jit.subPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), ARMRegisters::sp);
-
-#   define CALLFRAME_SRC_REG GPRInfo::argumentGPR1
-#   define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0
-#elif CPU(ARM64)
-    jit.push(ARM64Registers::lr);
-    jit.push(ARM64Registers::x19);
-    jit.push(ARM64Registers::x20);
-    jit.push(ARM64Registers::x21);
-    jit.push(ARM64Registers::x22);
-    jit.push(ARM64Registers::x23);
-    jit.push(ARM64Registers::x24);
-    jit.push(ARM64Registers::x25);
-    jit.push(ARM64Registers::x26);
-    jit.push(ARM64Registers::x27);
-    jit.push(ARM64Registers::x28);
-    jit.push(ARM64Registers::x29);
-    jit.move(ARM64Registers::x29, GPRInfo::nonArgGPR0);
-
-#   define CALLFRAME_SRC_REG GPRInfo::argumentGPR1
-#   define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0
-#elif CPU(MIPS)
-    jit.subPtr(CCallHelpers::TrustedImm32(STACK_LENGTH), MIPSRegisters::sp);
-    jit.storePtr(MIPSRegisters::fp, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_FP_OFFSET));
-    jit.storePtr(MIPSRegisters::ra, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_RETURN_ADDRESS_OFFSET));
-    jit.storePtr(MIPSRegisters::s4, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S4_OFFSET));
-    jit.storePtr(MIPSRegisters::s3, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S3_OFFSET));
-    jit.storePtr(MIPSRegisters::s2, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S2_OFFSET));
-    jit.storePtr(MIPSRegisters::s1, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S1_OFFSET));
-    jit.storePtr(MIPSRegisters::s0, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S0_OFFSET));
-#if WTF_MIPS_PIC
-    jit.storePtr(MIPSRegisters::gp, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_GP_OFFSET));
-#endif
-    jit.move(MIPSRegisters::fp, GPRInfo::nonArgGPR0);
-
-#   define CALLFRAME_SRC_REG GPRInfo::argumentGPR1
-#   define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0
-#elif CPU(SH4)
-    jit.push(SH4Registers::fp);
-    jit.push(SH4Registers::pr);
-    jit.push(SH4Registers::r13);
-    jit.push(SH4Registers::r11);
-    jit.push(SH4Registers::r10);
-    jit.push(SH4Registers::r9);
-    jit.push(SH4Registers::r8);
-    jit.subPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), SH4Registers::sp);
-    jit.move(SH4Registers::fp, GPRInfo::nonArgGPR0);
-
-#   define CALLFRAME_SRC_REG GPRInfo::argumentGPR1
-#   define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0
-#endif
-
-    if (CALLFRAME_SRC_REG != GPRInfo::callFrameRegister)
-        jit.move(CALLFRAME_SRC_REG, GPRInfo::callFrameRegister);
-    jit.loadPtr(CCallHelpers::Address(GPRInfo::callFrameRegister), GPRInfo::nonArgGPR1);
-    jit.storePtr(PREVIOUS_CALLFRAME_REG, CCallHelpers::Address(GPRInfo::nonArgGPR1));
-
-#if USE(JSVALUE64)
-    jit.move(CCallHelpers::TrustedImm64(0xffff000000000000L), GPRInfo::tagTypeNumberRegister);
-    jit.move(CCallHelpers::TrustedImm64(0xffff000000000002L), GPRInfo::tagMaskRegister);
-#endif
-
-#if defined(CALL_CODE)
-    CALL_CODE;
-#else
-    jit.call(GPRInfo::argumentGPR0);
-#endif
-
-#undef CALLFRAME_SRC_REG
-#undef CALL_CODE
-#undef PREVIOUS_CALLFRAME_REG
-
-    returnFromJavaScript(jit);
-
-    LinkBuffer patchBuffer(*vm, &amp;jit, GLOBAL_THUNK_ID);
-    return FINALIZE_CODE(patchBuffer, (&quot;Call to JavaScript thunk&quot;));
-}
-
-MacroAssemblerCodeRef throwNotCaught(VM* vm)
-{
-    CCallHelpers jit(vm);
-
-    returnFromJavaScript(jit);
-
-    LinkBuffer patchBuffer(*vm, &amp;jit, GLOBAL_THUNK_ID);
-    return FINALIZE_CODE(patchBuffer, (&quot;Uncaught throw thunk&quot;));
-}
-
</del><span class="cx"> // We will jump here if the JIT code tries to make a call, but the
</span><span class="cx"> // linking helper (C++ code) decides to throw an exception instead.
</span><span class="cx"> MacroAssemblerCodeRef throwExceptionFromCallSlowPathGenerator(VM* vm)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitThunkGeneratorsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/ThunkGenerators.h (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/ThunkGenerators.h        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/jit/ThunkGenerators.h        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -31,9 +31,6 @@
</span><span class="cx"> #if ENABLE(JIT)
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-MacroAssemblerCodeRef callToJavaScript(VM*);
-MacroAssemblerCodeRef throwNotCaught(VM*);
-
</del><span class="cx"> MacroAssemblerCodeRef throwExceptionFromCallSlowPathGenerator(VM*);
</span><span class="cx"> 
</span><span class="cx"> MacroAssemblerCodeRef linkCallThunkGenerator(VM*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLLIntThunksh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LLIntThunks.h (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LLIntThunks.h        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/llint/LLIntThunks.h        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -34,8 +34,14 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><ins>+class ExecState;
</ins><span class="cx"> class VM;
</span><span class="cx"> 
</span><ins>+extern &quot;C&quot; {
+    EncodedJSValue callToJavaScript(void*, ExecState*);
+    void returnFromJavaScript();
+}
+
</ins><span class="cx"> namespace LLInt {
</span><span class="cx"> 
</span><span class="cx"> MacroAssemblerCodeRef functionForCallEntryThunkGenerator(VM*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpreterasm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -421,6 +421,12 @@
</span><span class="cx">     ret
</span><span class="cx"> end
</span><span class="cx"> 
</span><ins>+# stub to call into JavaScript
+# EncodedJSValue callToJavaScript(void* code, Register* topOfStack)
+# Note, if this stub or one of it's related macros is changed, make the
+# equivalent changes in jit/JITStubsX86.h and/or jit/JITStubsMSVC64.asm
+_callToJavaScript:
+    doCallToJavaScript()
</ins><span class="cx"> 
</span><span class="cx"> # Indicate the beginning of LLInt.
</span><span class="cx"> _llint_begin:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpreter32_64asm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -149,6 +149,80 @@
</span><span class="cx">     move t1, cfr
</span><span class="cx"> end
</span><span class="cx"> 
</span><ins>+macro functionPrologue(extraStackSpace)
+    if X86
+        push cfr
+        move sp, cfr
+    end
+    pushCalleeSaves
+    if ARM or ARMv7 or ARMv7_TRADITIONAL or MIPS
+        push cfr
+        push lr
+    end
+    subp extraStackSpace, sp
+end
+
+macro functionEpilogue(extraStackSpace)
+    addp extraStackSpace, sp
+    if ARM or ARMv7 or ARMv7_TRADITIONAL or MIPS
+        pop lr
+        pop cfr
+    end
+    popCalleeSaves
+    if X86
+        pop cfr
+    end
+end
+
+macro doCallToJavaScript()
+    if X86
+        const extraStackSpace = 28
+        const previousCFR = t0
+        const entry = t5
+        const newCallFrame = t4
+    elsif ARM or ARMv7_TRADITIONAL
+        const extraStackSpace = 16
+        const previousCFR = t3  
+        const entry = a0
+        const newCallFrame = a1
+    elsif ARMv7
+        const extraStackSpace = 28
+        const previousCFR = t3  
+        const entry = a0
+        const newCallFrame = a1
+    elsif MIPS
+        const extraStackSpace = 20
+        const previousCFR = t2  
+        const entry = a0
+        const newCallFrame = a1
+    elsif SH4
+        const extraStackSpace = 20
+        const previousCFR = t3  
+        const entry = a0
+        const newCallFrame = a1
+    end
+
+    if X86
+        move cfr, previousCFR
+    end
+    functionPrologue(extraStackSpace)
+    if X86
+        loadp extraStackSpace+20[sp], entry
+        loadp extraStackSpace+24[sp], newCallFrame
+    else
+        move cfr, previousCFR
+    end
+
+    move newCallFrame, cfr
+    loadp [cfr], newCallFrame
+    storep previousCFR, [newCallFrame]
+    call entry
+
+_returnFromJavaScript:
+    functionEpilogue(extraStackSpace)
+    ret
+end
+
</ins><span class="cx"> # Debugging operation if you'd like to print an operand in the instruction stream. fromWhere
</span><span class="cx"> # should be an immediate integer - any integer you like; use it to identify the place you're
</span><span class="cx"> # debugging from. operand should likewise be an immediate, and should identify the operand
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpreter64asm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -88,6 +88,61 @@
</span><span class="cx">     end
</span><span class="cx"> end
</span><span class="cx"> 
</span><ins>+macro functionPrologue(extraStackSpace)
+    if X86_64
+        push cfr
+        move sp, cfr
+    elsif ARM64
+        push lr
+    end
+    pushCalleeSaves
+    if X86_64
+        subp extraStackSpace, sp
+    elsif ARM64
+        push cfr
+    end
+end
+
+macro functionEpilogue(extraStackSpace)
+    if X86_64
+        addp extraStackSpace, sp
+    end
+    popCalleeSaves
+    if X86_64
+        pop cfr
+    elsif ARM64
+        pop lr
+    end
+end
+
+macro doCallToJavaScript()
+    if X86_64
+        const extraStackSpace = 8
+        const previousCFR = t0
+        const entry = t5
+        const newCallFrame = t4
+    elsif ARM64
+        const extraStackSpace = 0
+        const previousCFR = t4  
+        const entry = a0
+        const newCallFrame = a1
+    end
+
+    move cfr, previousCFR
+    functionPrologue(extraStackSpace)
+
+    move newCallFrame, cfr
+    loadp [cfr], newCallFrame
+    storep previousCFR, [newCallFrame]
+    move 0xffff000000000000, csr1
+    addp 2, csr1, csr2
+    call entry
+
+_returnFromJavaScript:
+    functionEpilogue(extraStackSpace)
+    ret
+end
+
</ins><span class="cx"> macro prepareStateForCCall()
</span><span class="cx">     leap [PB, PC, 8], PC
</span><span class="cx">     move PB, t3
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasmarmrb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/arm.rb (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/arm.rb        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/offlineasm/arm.rb        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -97,7 +97,9 @@
</span><span class="cx">         when &quot;t3&quot;
</span><span class="cx">             &quot;r4&quot;
</span><span class="cx">         when &quot;t4&quot;
</span><del>-            &quot;r10&quot;
</del><ins>+            &quot;r8&quot;
+        when &quot;t5&quot;
+            &quot;r9&quot;
</ins><span class="cx">         when &quot;cfr&quot;
</span><span class="cx">             isARMv7 ?  &quot;r7&quot; : &quot;r11&quot;
</span><span class="cx">         when &quot;lr&quot;
</span><span class="lines">@@ -451,9 +453,21 @@
</span><span class="cx">             # FIXME: either support this or remove it.
</span><span class="cx">             raise &quot;ARM does not support this opcode yet, #{codeOrigin}&quot;
</span><span class="cx">         when &quot;pop&quot;
</span><del>-            $asm.puts &quot;pop #{operands[0].armOperand}&quot;
</del><ins>+            $asm.puts &quot;pop { #{operands[0].armOperand} }&quot;
</ins><span class="cx">         when &quot;push&quot;
</span><del>-            $asm.puts &quot;push #{operands[0].armOperand}&quot;
</del><ins>+            $asm.puts &quot;push { #{operands[0].armOperand} }&quot;
+        when &quot;popCalleeSaves&quot;
+            if isARMv7
+                $asm.puts &quot;pop {r4-r6, r8-r11}&quot;                
+            else
+                $asm.puts &quot;pop {r4-r10}&quot;
+            end
+        when &quot;pushCalleeSaves&quot;
+            if isARMv7
+                $asm.puts &quot;push {r4-r6, r8-r11}&quot;
+            else
+                $asm.puts &quot;push {r4-r10}&quot;
+            end
</ins><span class="cx">         when &quot;move&quot;
</span><span class="cx">             if operands[0].immediate?
</span><span class="cx">                 armMoveImmediate(operands[0].value, operands[1])
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasmarm64rb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/arm64.rb (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/arm64.rb        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/offlineasm/arm64.rb        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -38,7 +38,8 @@
</span><span class="cx"> #
</span><span class="cx"> #  x0  =&gt; return value, cached result, first argument, t0, a0, r0
</span><span class="cx"> #  x1  =&gt; t1, a1, r1
</span><del>-#  x2  =&gt; t2
</del><ins>+#  x2  =&gt; t2, a2
+#  x3  =&gt; a3
</ins><span class="cx"> #  x9  =&gt; (nonArgGPR1 in baseline)
</span><span class="cx"> # x10  =&gt; t4 (unused in baseline)
</span><span class="cx"> # x11  =&gt; t5 (unused in baseline)
</span><span class="lines">@@ -47,10 +48,9 @@
</span><span class="cx"> # x16  =&gt; scratch
</span><span class="cx"> # x17  =&gt; scratch
</span><span class="cx"> # x23  =&gt; t3
</span><del>-# x25  =&gt; cfr
-# x26  =&gt; timeout check (i.e. not touched by LLInt)
</del><span class="cx"> # x27  =&gt; csr1 (tagTypeNumber)
</span><span class="cx"> # x28  =&gt; csr2 (tagMask)
</span><ins>+# x29  =&gt; cfr
</ins><span class="cx"> #  sp  =&gt; sp
</span><span class="cx"> #  lr  =&gt; lr
</span><span class="cx"> #
</span><span class="lines">@@ -106,8 +106,10 @@
</span><span class="cx">             arm64GPRName('x0', kind)
</span><span class="cx">         when 't1', 'a1', 'r1'
</span><span class="cx">             arm64GPRName('x1', kind)
</span><del>-        when 't2'
</del><ins>+        when 't2', 'a2'
</ins><span class="cx">             arm64GPRName('x2', kind)
</span><ins>+        when 'a3'
+            arm64GPRName('x3', kind)
</ins><span class="cx">         when 't3'
</span><span class="cx">             arm64GPRName('x23', kind)
</span><span class="cx">         when 't4'
</span><span class="lines">@@ -567,6 +569,28 @@
</span><span class="cx">             emitARM64Unflipped(&quot;pop&quot;, operands, :ptr)
</span><span class="cx">         when &quot;push&quot;
</span><span class="cx">             emitARM64Unflipped(&quot;push&quot;, operands, :ptr)
</span><ins>+        when &quot;popCalleeSaves&quot;
+            emitARM64Unflipped(&quot;pop&quot;, &quot;x28&quot;, :ptr)
+            emitARM64Unflipped(&quot;pop&quot;, &quot;x27&quot;, :ptr)
+            emitARM64Unflipped(&quot;pop&quot;, &quot;x26&quot;, :ptr)
+            emitARM64Unflipped(&quot;pop&quot;, &quot;x25&quot;, :ptr)
+            emitARM64Unflipped(&quot;pop&quot;, &quot;x24&quot;, :ptr)
+            emitARM64Unflipped(&quot;pop&quot;, &quot;x23&quot;, :ptr)
+            emitARM64Unflipped(&quot;pop&quot;, &quot;x22&quot;, :ptr)
+            emitARM64Unflipped(&quot;pop&quot;, &quot;x21&quot;, :ptr)
+            emitARM64Unflipped(&quot;pop&quot;, &quot;x20&quot;, :ptr)
+            emitARM64Unflipped(&quot;pop&quot;, &quot;x19&quot;, :ptr)
+        when &quot;pushCalleeSaves&quot;
+            emitARM64Unflipped(&quot;push&quot;, &quot;x19&quot;, :ptr)
+            emitARM64Unflipped(&quot;push&quot;, &quot;x20&quot;, :ptr)
+            emitARM64Unflipped(&quot;push&quot;, &quot;x21&quot;, :ptr)
+            emitARM64Unflipped(&quot;push&quot;, &quot;x22&quot;, :ptr)
+            emitARM64Unflipped(&quot;push&quot;, &quot;x23&quot;, :ptr)
+            emitARM64Unflipped(&quot;push&quot;, &quot;x24&quot;, :ptr)
+            emitARM64Unflipped(&quot;push&quot;, &quot;x25&quot;, :ptr)
+            emitARM64Unflipped(&quot;push&quot;, &quot;x26&quot;, :ptr)
+            emitARM64Unflipped(&quot;push&quot;, &quot;x27&quot;, :ptr)
+            emitARM64Unflipped(&quot;push&quot;, &quot;x28&quot;, :ptr)
</ins><span class="cx">         when &quot;move&quot;
</span><span class="cx">             if operands[0].immediate?
</span><span class="cx">                 emitARM64MoveImmediate(operands[0].value, operands[1])
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasminstructionsrb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/instructions.rb (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/instructions.rb        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/offlineasm/instructions.rb        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -249,6 +249,8 @@
</span><span class="cx">      &quot;bnz&quot;,
</span><span class="cx">      &quot;leai&quot;,
</span><span class="cx">      &quot;leap&quot;,
</span><ins>+     &quot;pushCalleeSaves&quot;,
+     &quot;popCalleeSaves&quot;
</ins><span class="cx">     ]
</span><span class="cx"> 
</span><span class="cx"> X86_INSTRUCTIONS =
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasmmipsrb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/mips.rb (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/mips.rb        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/offlineasm/mips.rb        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -82,6 +82,10 @@
</span><span class="cx">             &quot;$a0&quot;
</span><span class="cx">         when &quot;a1&quot;
</span><span class="cx">             &quot;$a1&quot;
</span><ins>+        when &quot;a2&quot;
+            &quot;$a2&quot;
+        when &quot;a3&quot;
+            &quot;$a3&quot;
</ins><span class="cx">         when &quot;r0&quot;, &quot;t0&quot;
</span><span class="cx">             &quot;$v0&quot;
</span><span class="cx">         when &quot;r1&quot;, &quot;t1&quot;
</span><span class="lines">@@ -792,6 +796,20 @@
</span><span class="cx">         when &quot;push&quot;
</span><span class="cx">             $asm.puts &quot;addiu $sp, $sp, -4&quot;
</span><span class="cx">             $asm.puts &quot;sw #{operands[0].mipsOperand}, 0($sp)&quot;
</span><ins>+        when &quot;popCalleeSaves&quot;
+            $asm.puts &quot;lw $16, 0($sp)&quot;
+            $asm.puts &quot;lw $17, 4($sp)&quot;
+            $asm.puts &quot;lw $18, 8($sp)&quot;
+            $asm.puts &quot;lw $19, 12($sp)&quot;
+            $asm.puts &quot;lw $20, 16($sp)&quot;
+            $asm.puts &quot;addiu $sp, $sp, 20&quot;
+        when &quot;pushCalleeSaves&quot;
+            $asm.puts &quot;addiu $sp, $sp, -20&quot;
+            $asm.puts &quot;sw $20, 16($sp)&quot;
+            $asm.puts &quot;sw $19, 12($sp)&quot;
+            $asm.puts &quot;sw $18, 8($sp)&quot;
+            $asm.puts &quot;sw $17, 4($sp)&quot;
+            $asm.puts &quot;sw $16, 0($sp)&quot;
</ins><span class="cx">         when &quot;move&quot;, &quot;sxi2p&quot;, &quot;zxi2p&quot;
</span><span class="cx">             if operands[0].is_a? Immediate
</span><span class="cx">                 mipsMoveImmediate(operands[0].value, operands[1])
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasmregistersrb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/registers.rb (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/registers.rb        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/offlineasm/registers.rb        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -30,19 +30,21 @@
</span><span class="cx">      &quot;t2&quot;,
</span><span class="cx">      &quot;t3&quot;,
</span><span class="cx">      &quot;t4&quot;,
</span><ins>+     &quot;t5&quot;,
</ins><span class="cx">      &quot;cfr&quot;,
</span><span class="cx">      &quot;a0&quot;,
</span><span class="cx">      &quot;a1&quot;,
</span><ins>+     &quot;a2&quot;,
+     &quot;a3&quot;,
</ins><span class="cx">      &quot;r0&quot;,
</span><span class="cx">      &quot;r1&quot;,
</span><span class="cx">      &quot;sp&quot;,
</span><span class="cx">      &quot;lr&quot;,
</span><span class="cx">      
</span><span class="cx">      # 64-bit only registers:
</span><del>-     &quot;t5&quot;,
-     &quot;t6&quot;,  # r10
-     &quot;csr1&quot;,  # r14, tag type number register
-     &quot;csr2&quot;   # r15, tag mask register
</del><ins>+     &quot;t6&quot;,
+     &quot;csr1&quot;,  # tag type number register
+     &quot;csr2&quot;   # tag mask register
</ins><span class="cx">     ]
</span><span class="cx"> 
</span><span class="cx"> FPRS =
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasmsh4rb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/sh4.rb (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/sh4.rb        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/offlineasm/sh4.rb        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -61,6 +61,10 @@
</span><span class="cx">             &quot;r4&quot;
</span><span class="cx">         when &quot;a1&quot;
</span><span class="cx">             &quot;r5&quot;
</span><ins>+        when &quot;a2&quot;
+            &quot;r6&quot;
+        when &quot;a3&quot;
+            &quot;r7&quot;
</ins><span class="cx">         when &quot;t0&quot;
</span><span class="cx">             &quot;r0&quot;
</span><span class="cx">         when &quot;t1&quot;
</span><span class="lines">@@ -70,7 +74,9 @@
</span><span class="cx">         when &quot;t3&quot;
</span><span class="cx">             &quot;r10&quot;
</span><span class="cx">         when &quot;t4&quot;
</span><del>-            &quot;r6&quot;
</del><ins>+            &quot;r4&quot;
+        when &quot;t5&quot;
+            &quot;r5&quot;
</ins><span class="cx">         when &quot;cfr&quot;
</span><span class="cx">             &quot;r14&quot;
</span><span class="cx">         when &quot;sp&quot;
</span><span class="lines">@@ -905,6 +911,22 @@
</span><span class="cx">             $asm.puts &quot;lds #{sh4Operands(operands)}, pr&quot;
</span><span class="cx">         when &quot;stspr&quot;
</span><span class="cx">             $asm.puts &quot;sts pr, #{sh4Operands(operands)}&quot;
</span><ins>+        when &quot;popCalleeSaves&quot;
+            $asm.puts &quot;mov.l @r15+, r8&quot;
+            $asm.puts &quot;mov.l @r15+, r9&quot;
+            $asm.puts &quot;mov.l @r15+, r10&quot;
+            $asm.puts &quot;mov.l @r15+, r11&quot;
+            $asm.puts &quot;mov.l @r15+, r13&quot;
+            $asm.puts &quot;lds.l @r15+,pr&quot;
+            $asm.puts &quot;mov.l @r15+, fp&quot;
+        when &quot;pushCalleeSaves&quot;
+            $asm.puts &quot;mov.l fp, @-r15&quot;
+            $asm.puts &quot;sts.l pr, @-r15&quot;
+            $asm.puts &quot;mov.l r13, @-r15&quot;
+            $asm.puts &quot;mov.l r11, @-r15&quot;
+            $asm.puts &quot;mov.l r10, @-r15&quot;
+            $asm.puts &quot;mov.l r9, @-r15&quot;
+            $asm.puts &quot;mov.l r8, @-r15&quot;
</ins><span class="cx">         when &quot;break&quot;
</span><span class="cx">             # This special opcode always generates an illegal instruction exception.
</span><span class="cx">             $asm.puts &quot;.word 0xfffd&quot;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasmx86rb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/x86.rb (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/x86.rb        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/offlineasm/x86.rb        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -74,11 +74,11 @@
</span><span class="cx"> class RegisterID
</span><span class="cx">     def supports8BitOnX86
</span><span class="cx">         case name
</span><del>-        when &quot;t0&quot;, &quot;a0&quot;, &quot;r0&quot;, &quot;t1&quot;, &quot;a1&quot;, &quot;r1&quot;, &quot;t2&quot;, &quot;t3&quot;
</del><ins>+        when &quot;t0&quot;, &quot;a0&quot;, &quot;r0&quot;, &quot;t1&quot;, &quot;a1&quot;, &quot;r1&quot;, &quot;t2&quot;, &quot;t3&quot;, &quot;t4&quot;, &quot;t5&quot;
</ins><span class="cx">             true
</span><span class="cx">         when &quot;cfr&quot;, &quot;ttnr&quot;, &quot;tmr&quot;
</span><span class="cx">             false
</span><del>-        when &quot;t4&quot;, &quot;t5&quot;
</del><ins>+        when &quot;t6&quot;
</ins><span class="cx">             isX64
</span><span class="cx">         else
</span><span class="cx">             raise
</span><span class="lines">@@ -204,7 +204,6 @@
</span><span class="cx">                 raise
</span><span class="cx">             end
</span><span class="cx">         when &quot;t5&quot;
</span><del>-            raise &quot;Cannot use #{name} in 32-bit X86 at #{codeOriginString}&quot; unless isX64
</del><span class="cx">             case kind
</span><span class="cx">             when :byte
</span><span class="cx">                 &quot;%dil&quot;
</span><span class="lines">@@ -213,9 +212,9 @@
</span><span class="cx">             when :int
</span><span class="cx">                 &quot;%edi&quot;
</span><span class="cx">             when :ptr
</span><del>-                &quot;%rdi&quot;
</del><ins>+                isX64 ? &quot;%rdi&quot; : &quot;%edi&quot;
</ins><span class="cx">             when :quad
</span><del>-                &quot;%rdi&quot;
</del><ins>+                isX64 ? &quot;%rdi&quot; : raise
</ins><span class="cx">             end
</span><span class="cx">         when &quot;t6&quot;
</span><span class="cx">             raise &quot;Cannot use #{name} in 32-bit X86 at #{codeOriginString}&quot; unless isX64
</span><span class="lines">@@ -982,6 +981,30 @@
</span><span class="cx">             $asm.puts &quot;pop #{operands[0].x86Operand(:ptr)}&quot;
</span><span class="cx">         when &quot;push&quot;
</span><span class="cx">             $asm.puts &quot;push #{operands[0].x86Operand(:ptr)}&quot;
</span><ins>+        when &quot;popCalleeSaves&quot;
+            if isX64
+                $asm.puts &quot;pop %rbx&quot;
+                $asm.puts &quot;pop %r15&quot;
+                $asm.puts &quot;pop %r14&quot;
+                $asm.puts &quot;pop %r13&quot;
+                $asm.puts &quot;pop %r12&quot;
+            else
+                $asm.puts &quot;pop %ebx&quot;
+                $asm.puts &quot;pop %edi&quot;
+                $asm.puts &quot;pop %esi&quot;
+            end
+        when &quot;pushCalleeSaves&quot;
+            if isX64
+                $asm.puts &quot;push %r12&quot;
+                $asm.puts &quot;push %r13&quot;
+                $asm.puts &quot;push %r14&quot;
+                $asm.puts &quot;push %r15&quot;
+                $asm.puts &quot;push %rbx&quot;
+            else
+                $asm.puts &quot;push %esi&quot;
+                $asm.puts &quot;push %edi&quot;
+                $asm.puts &quot;push %ebx&quot;
+            end
</ins><span class="cx">         when &quot;move&quot;
</span><span class="cx">             handleMove
</span><span class="cx">         when &quot;sxi2q&quot;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.cpp (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.cpp        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/runtime/VM.cpp        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -257,8 +257,6 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(JIT)
</span><span class="cx">     jitStubs = adoptPtr(new JITThunks());
</span><del>-
-    callJavaScriptJITFunction = reinterpret_cast&lt;CallJavaScriptJITFunction&gt;(getCTIStub(callToJavaScript).code().executableAddress());
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(FTL_JIT)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.h (159275 => 159276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.h        2013-11-14 05:46:10 UTC (rev 159275)
+++ trunk/Source/JavaScriptCore/runtime/VM.h        2013-11-14 07:39:30 UTC (rev 159276)
</span><span class="lines">@@ -329,10 +329,6 @@
</span><span class="cx">             return jitStubs-&gt;ctiStub(this, generator);
</span><span class="cx">         }
</span><span class="cx">         NativeExecutable* getHostFunction(NativeFunction, Intrinsic);
</span><del>-
-        typedef EncodedJSValue(*CallJavaScriptJITFunction)(void *, ExecState*);
-
-        CallJavaScriptJITFunction callJavaScriptJITFunction;
</del><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(FTL_JIT)
</span><span class="cx">         std::unique_ptr&lt;FTL::Thunks&gt; ftlThunks;
</span></span></pre>
</div>
</div>

</body>
</html>