<!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>[164630] trunk</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/164630">164630</a></dd>
<dt>Author</dt> <dd>oliver@apple.com</dd>
<dt>Date</dt> <dd>2014-02-24 22:59:38 -0800 (Mon, 24 Feb 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Spread operator has a bad time when applied to call function
https://bugs.webkit.org/show_bug.cgi?id=128853

Reviewed by Geoffrey Garen.

Source/JavaScriptCore:

Follow on from the previous patch the added an extra slot to
op_call_varargs (and _call, _call_eval, _construct).  We now
use the slot as an offset to in effect act as a 'slice' on
the spread subject.  This allows us to automatically retain
all our existing argument and array optimisatons.  Most of
this patch is simply threading the offset around.

* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::dumpBytecode):
* bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::emitCall):
(JSC::BytecodeGenerator::emitCallVarargs):
* bytecompiler/BytecodeGenerator.h:
* bytecompiler/NodesCodegen.cpp:
(JSC::getArgumentByVal):
(JSC::CallFunctionCallDotNode::emitBytecode):
(JSC::ApplyFunctionCallDotNode::emitBytecode):
* interpreter/Interpreter.cpp:
(JSC::sizeFrameForVarargs):
(JSC::loadVarargs):
* interpreter/Interpreter.h:
* jit/CCallHelpers.h:
(JSC::CCallHelpers::setupArgumentsWithExecState):
* jit/JIT.h:
* jit/JITCall.cpp:
(JSC::JIT::compileLoadVarargs):
* jit/JITInlines.h:
(JSC::JIT::callOperation):
* jit/JITOperations.cpp:
* jit/JITOperations.h:
* llint/LLIntSlowPaths.cpp:
(JSC::LLInt::LLINT_SLOW_PATH_DECL):
* runtime/Arguments.cpp:
(JSC::Arguments::copyToArguments):
* runtime/Arguments.h:
* runtime/JSArray.cpp:
(JSC::JSArray::copyToArguments):
* runtime/JSArray.h:

LayoutTests:

Test case all the things!

* js/regress/call-spread-call-expected.txt: Added.
* js/regress/call-spread-call.html: Added.
* js/regress/script-tests/call-spread-call.js: Added.
(testFunction):
(test2):
(test3):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCodeBlockcpp">trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorcpp">trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorh">trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecompilerNodesCodegencpp">trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinterpreterInterpretercpp">trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinterpreterInterpreterh">trunk/Source/JavaScriptCore/interpreter/Interpreter.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitCCallHelpersh">trunk/Source/JavaScriptCore/jit/CCallHelpers.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITh">trunk/Source/JavaScriptCore/jit/JIT.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITCallcpp">trunk/Source/JavaScriptCore/jit/JITCall.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITCall32_64cpp">trunk/Source/JavaScriptCore/jit/JITCall32_64.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITInlinesh">trunk/Source/JavaScriptCore/jit/JITInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITOperationscpp">trunk/Source/JavaScriptCore/jit/JITOperations.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITOperationsh">trunk/Source/JavaScriptCore/jit/JITOperations.h</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLLIntSlowPathscpp">trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeArgumentscpp">trunk/Source/JavaScriptCore/runtime/Arguments.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeArgumentsh">trunk/Source/JavaScriptCore/runtime/Arguments.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSArraycpp">trunk/Source/JavaScriptCore/runtime/JSArray.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSArrayh">trunk/Source/JavaScriptCore/runtime/JSArray.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsjsregresscallspreadcallexpectedtxt">trunk/LayoutTests/js/regress/call-spread-call-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsregresscallspreadcallhtml">trunk/LayoutTests/js/regress/call-spread-call.html</a></li>
<li><a href="#trunkLayoutTestsjsregressscripttestscallspreadcalljs">trunk/LayoutTests/js/regress/script-tests/call-spread-call.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/LayoutTests/ChangeLog        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2014-02-24  Oliver Hunt  &lt;oliver@apple.com&gt;
+
+        Spread operator has a bad time when applied to call function
+        https://bugs.webkit.org/show_bug.cgi?id=128853
+
+        Reviewed by Geoffrey Garen.
+
+        Test case all the things!
+
+        * js/regress/call-spread-call-expected.txt: Added.
+        * js/regress/call-spread-call.html: Added.
+        * js/regress/script-tests/call-spread-call.js: Added.
+        (testFunction):
+        (test2):
+        (test3):
+
</ins><span class="cx"> 2014-02-24  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         FTL should do polymorphic PutById inlining
</span></span></pre></div>
<a id="trunkLayoutTestsjsregresscallspreadcallexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/regress/call-spread-call-expected.txt (0 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/regress/call-spread-call-expected.txt                                (rev 0)
+++ trunk/LayoutTests/js/regress/call-spread-call-expected.txt        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+JSRegress/call-spread-call
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS no exception thrown
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsjsregresscallspreadcallhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/regress/call-spread-call.html (0 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/regress/call-spread-call.html                                (rev 0)
+++ trunk/LayoutTests/js/regress/call-spread-call.html        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -0,0 +1,12 @@
</span><ins>+&lt;!DOCTYPE HTML PUBLIC &quot;-//IETF//DTD HTML//EN&quot;&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;script src=&quot;resources/regress-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;script-tests/call-spread-call.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/regress-post.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsjsregressscripttestscallspreadcalljs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/regress/script-tests/call-spread-call.js (0 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/regress/script-tests/call-spread-call.js                                (rev 0)
+++ trunk/LayoutTests/js/regress/script-tests/call-spread-call.js        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -0,0 +1,41 @@
</span><ins>+
+Function.prototype.c = Function.prototype.call;
+
+function testFunction(a, b)
+{
+    &quot;use strict&quot;
+    return this * 10000 + a * 1000 + b * 100 + arguments[2] * 10 + arguments.length;
+}
+
+var arrayArguments = [1, 2, 3, 4]
+
+for (var i = 0; i &lt; 15000; i++) {
+    var result1 = testFunction.call(...arrayArguments);
+    var result2 = testFunction.c(...arrayArguments);
+    if (result1 != result2) 
+        throw &quot;Call with spread array failed at iteration &quot; + i + &quot;: &quot; + result1 + &quot; vs &quot; + result2;
+}
+
+function test2() {
+    for (var i = 0; i &lt; 15000; i++) {
+        var result1 = testFunction.call(...arguments);
+        var result2 = testFunction.c(...arguments);
+        if (result1 != result2)
+           throw &quot;Call with spread arguments failed at iteration &quot; + i + &quot;: &quot; + result1 + &quot; vs &quot; + result2;
+    }
+}
+
+test2(1,2,3,4)
+
+
+function test3() {
+    aliasedArguments = arguments;
+    for (var i = 0; i &lt; 15000; i++) {
+        var result1 = testFunction.call(...aliasedArguments);
+        var result2 = testFunction.c(...aliasedArguments);
+        if (result1 != result2)
+           throw &quot;Call with spread arguments failed at iteration &quot; + i + &quot;: &quot; + result1 + &quot; vs &quot; + result2;
+    }
+}
+
+test3(1,2,3,4)
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -1,3 +1,49 @@
</span><ins>+2014-02-24  Oliver Hunt  &lt;oliver@apple.com&gt;
+
+        Spread operator has a bad time when applied to call function
+        https://bugs.webkit.org/show_bug.cgi?id=128853
+
+        Reviewed by Geoffrey Garen.
+
+        Follow on from the previous patch the added an extra slot to
+        op_call_varargs (and _call, _call_eval, _construct).  We now
+        use the slot as an offset to in effect act as a 'slice' on
+        the spread subject.  This allows us to automatically retain
+        all our existing argument and array optimisatons.  Most of
+        this patch is simply threading the offset around.
+
+        * bytecode/CodeBlock.cpp:
+        (JSC::CodeBlock::dumpBytecode):
+        * bytecompiler/BytecodeGenerator.cpp:
+        (JSC::BytecodeGenerator::emitCall):
+        (JSC::BytecodeGenerator::emitCallVarargs):
+        * bytecompiler/BytecodeGenerator.h:
+        * bytecompiler/NodesCodegen.cpp:
+        (JSC::getArgumentByVal):
+        (JSC::CallFunctionCallDotNode::emitBytecode):
+        (JSC::ApplyFunctionCallDotNode::emitBytecode):
+        * interpreter/Interpreter.cpp:
+        (JSC::sizeFrameForVarargs):
+        (JSC::loadVarargs):
+        * interpreter/Interpreter.h:
+        * jit/CCallHelpers.h:
+        (JSC::CCallHelpers::setupArgumentsWithExecState):
+        * jit/JIT.h:
+        * jit/JITCall.cpp:
+        (JSC::JIT::compileLoadVarargs):
+        * jit/JITInlines.h:
+        (JSC::JIT::callOperation):
+        * jit/JITOperations.cpp:
+        * jit/JITOperations.h:
+        * llint/LLIntSlowPaths.cpp:
+        (JSC::LLInt::LLINT_SLOW_PATH_DECL):
+        * runtime/Arguments.cpp:
+        (JSC::Arguments::copyToArguments):
+        * runtime/Arguments.h:
+        * runtime/JSArray.cpp:
+        (JSC::JSArray::copyToArguments):
+        * runtime/JSArray.h:
+
</ins><span class="cx"> 2014-02-24  Mark Lam  &lt;mark.lam@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Need to initialize VM stack data even when the VM is on an exclusive thread.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -1194,9 +1194,10 @@
</span><span class="cx">             int thisValue = (++it)-&gt;u.operand;
</span><span class="cx">             int arguments = (++it)-&gt;u.operand;
</span><span class="cx">             int firstFreeRegister = (++it)-&gt;u.operand;
</span><ins>+            int varArgOffset = (++it)-&gt;u.operand;
</ins><span class="cx">             ++it;
</span><span class="cx">             printLocationAndOp(out, exec, location, it, &quot;call_varargs&quot;);
</span><del>-            out.printf(&quot;%s, %s, %s, %s, %d&quot;, registerName(result).data(), registerName(callee).data(), registerName(thisValue).data(), registerName(arguments).data(), firstFreeRegister);
</del><ins>+            out.printf(&quot;%s, %s, %s, %s, %d, %d&quot;, registerName(result).data(), registerName(callee).data(), registerName(thisValue).data(), registerName(arguments).data(), firstFreeRegister, varArgOffset);
</ins><span class="cx">             dumpValueProfiling(out, it, hasPrintedProfiling);
</span><span class="cx">             break;
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -1730,8 +1730,13 @@
</span><span class="cx">         if (n &amp;&amp; n-&gt;m_expr-&gt;isSpreadExpression()) {
</span><span class="cx">             RELEASE_ASSERT(!n-&gt;m_next);
</span><span class="cx">             auto expression = static_cast&lt;SpreadExpressionNode*&gt;(n-&gt;m_expr)-&gt;expression();
</span><del>-            expression-&gt;emitBytecode(*this, callArguments.argumentRegister(0));
-            return emitCallVarargs(dst, func, callArguments.thisRegister(), callArguments.argumentRegister(0), newTemporary(), callArguments.profileHookRegister(), divot, divotStart, divotEnd);
</del><ins>+            RefPtr&lt;RegisterID&gt; argumentRegister;
+            if (expression-&gt;isResolveNode() &amp;&amp; willResolveToArguments(static_cast&lt;ResolveNode*&gt;(expression)-&gt;identifier()) &amp;&amp; !symbolTable().slowArguments())
+                argumentRegister = uncheckedRegisterForArguments();
+            else
+                argumentRegister = expression-&gt;emitBytecode(*this, callArguments.argumentRegister(0));
+            RefPtr&lt;RegisterID&gt; thisRegister = emitMove(newTemporary(), callArguments.thisRegister());
+            return emitCallVarargs(dst, func, callArguments.thisRegister(), argumentRegister.get(), newTemporary(), 0, callArguments.profileHookRegister(), divot, divotStart, divotEnd);
</ins><span class="cx">         }
</span><span class="cx">         for (; n; n = n-&gt;m_next)
</span><span class="cx">             emitNode(callArguments.argumentRegister(argument++), n);
</span><span class="lines">@@ -1781,7 +1786,7 @@
</span><span class="cx">     return dst;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RegisterID* BytecodeGenerator::emitCallVarargs(RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* arguments, RegisterID* firstFreeRegister, RegisterID* profileHookRegister, const JSTextPosition&amp; divot, const JSTextPosition&amp; divotStart, const JSTextPosition&amp; divotEnd)
</del><ins>+RegisterID* BytecodeGenerator::emitCallVarargs(RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* arguments, RegisterID* firstFreeRegister, int32_t firstVarArgOffset, RegisterID* profileHookRegister, const JSTextPosition&amp; divot, const JSTextPosition&amp; divotStart, const JSTextPosition&amp; divotEnd)
</ins><span class="cx"> {
</span><span class="cx">     if (m_shouldEmitProfileHooks) {
</span><span class="cx">         emitMove(profileHookRegister, func);
</span><span class="lines">@@ -1800,7 +1805,7 @@
</span><span class="cx">     instructions().append(thisRegister-&gt;index());
</span><span class="cx">     instructions().append(arguments-&gt;index());
</span><span class="cx">     instructions().append(firstFreeRegister-&gt;index());
</span><del>-    instructions().append(0);
</del><ins>+    instructions().append(firstVarArgOffset);
</ins><span class="cx">     instructions().append(arrayProfile);
</span><span class="cx">     instructions().append(profile);
</span><span class="cx">     if (m_shouldEmitProfileHooks) {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -383,7 +383,7 @@
</span><span class="cx">         ExpectedFunction expectedFunctionForIdentifier(const Identifier&amp;);
</span><span class="cx">         RegisterID* emitCall(RegisterID* dst, RegisterID* func, ExpectedFunction, CallArguments&amp;, const JSTextPosition&amp; divot, const JSTextPosition&amp; divotStart, const JSTextPosition&amp; divotEnd);
</span><span class="cx">         RegisterID* emitCallEval(RegisterID* dst, RegisterID* func, CallArguments&amp;, const JSTextPosition&amp; divot, const JSTextPosition&amp; divotStart, const JSTextPosition&amp; divotEnd);
</span><del>-        RegisterID* emitCallVarargs(RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* arguments, RegisterID* firstFreeRegister, RegisterID* profileHookRegister, const JSTextPosition&amp; divot, const JSTextPosition&amp; divotStart, const JSTextPosition&amp; divotEnd);
</del><ins>+        RegisterID* emitCallVarargs(RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* arguments, RegisterID* firstFreeRegister, int32_t firstVarArgOffset, RegisterID* profileHookRegister, const JSTextPosition&amp; divot, const JSTextPosition&amp; divotStart, const JSTextPosition&amp; divotEnd);
</ins><span class="cx"> 
</span><span class="cx">         void emitEnumeration(ThrowableExpressionData* enumerationNode, ExpressionNode* subjectNode, const std::function&lt;void(BytecodeGenerator&amp;, RegisterID*)&gt;&amp; callBack);
</span><span class="cx">         
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerNodesCodegencpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -529,20 +529,48 @@
</span><span class="cx">     return generator.emitCall(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static RegisterID* getArgumentByVal(BytecodeGenerator&amp; generator, ExpressionNode* base, RegisterID* property, RegisterID* dst, JSTextPosition divot, JSTextPosition divotStart, JSTextPosition divotEnd)
+{
+    if (base-&gt;isResolveNode()
+        &amp;&amp; generator.willResolveToArguments(static_cast&lt;ResolveNode*&gt;(base)-&gt;identifier())
+        &amp;&amp; !generator.symbolTable().slowArguments()) {
+        generator.emitExpressionInfo(divot, divotStart, divotEnd);
+        return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedRegisterForArguments(), property);
+    }
+    return nullptr;
+}
+
</ins><span class="cx"> RegisterID* CallFunctionCallDotNode::emitBytecode(BytecodeGenerator&amp; generator, RegisterID* dst)
</span><span class="cx"> {
</span><span class="cx">     RefPtr&lt;Label&gt; realCall = generator.newLabel();
</span><span class="cx">     RefPtr&lt;Label&gt; end = generator.newLabel();
</span><span class="cx">     RefPtr&lt;RegisterID&gt; base = generator.emitNode(m_base);
</span><span class="cx">     generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd());
</span><del>-    RefPtr&lt;RegisterID&gt; function = generator.emitGetById(generator.tempDestination(dst), base.get(), generator.propertyNames().call);
-    RefPtr&lt;RegisterID&gt; returnValue = generator.finalDestination(dst, function.get());
</del><ins>+    RefPtr&lt;RegisterID&gt; function;
</ins><span class="cx">     bool emitCallCheck = !generator.isBuiltinFunction();
</span><del>-    if (emitCallCheck)
</del><ins>+    if (emitCallCheck) {
+        function = generator.emitGetById(generator.tempDestination(dst), base.get(), generator.propertyNames().call);
</ins><span class="cx">         generator.emitJumpIfNotFunctionCall(function.get(), realCall.get());
</span><del>-
</del><ins>+    }
+    RefPtr&lt;RegisterID&gt; returnValue = generator.finalDestination(dst);
</ins><span class="cx">     {
</span><del>-        if (m_args-&gt;m_listNode &amp;&amp; m_args-&gt;m_listNode-&gt;m_expr) {
</del><ins>+        if (m_args-&gt;m_listNode &amp;&amp; m_args-&gt;m_listNode-&gt;m_expr &amp;&amp; m_args-&gt;m_listNode-&gt;m_expr-&gt;isSpreadExpression()) {
+            RefPtr&lt;RegisterID&gt; profileHookRegister;
+            if (generator.shouldEmitProfileHooks())
+                profileHookRegister = generator.newTemporary();
+            SpreadExpressionNode* spread = static_cast&lt;SpreadExpressionNode*&gt;(m_args-&gt;m_listNode-&gt;m_expr);
+            ExpressionNode* subject = spread-&gt;expression();
+            RefPtr&lt;RegisterID&gt; thisRegister = getArgumentByVal(generator, subject, generator.emitLoad(0, jsNumber(0)), 0, spread-&gt;divot(), spread-&gt;divotStart(), spread-&gt;divotEnd());
+            RefPtr&lt;RegisterID&gt; argumentsRegister;
+            if (thisRegister)
+                argumentsRegister = generator.uncheckedRegisterForArguments();
+            else {
+                argumentsRegister = generator.emitNode(subject);
+                generator.emitExpressionInfo(spread-&gt;divot(), spread-&gt;divotStart(), spread-&gt;divotEnd());
+                thisRegister = generator.emitGetByVal(generator.newTemporary(), argumentsRegister.get(), generator.emitLoad(0, jsNumber(0)));
+            }
+            generator.emitCallVarargs(returnValue.get(), base.get(), thisRegister.get(), argumentsRegister.get(), generator.newTemporary(), 1, profileHookRegister.get(), divot(), divotStart(), divotEnd());
+        } else if (m_args-&gt;m_listNode &amp;&amp; m_args-&gt;m_listNode-&gt;m_expr) {
</ins><span class="cx">             ArgumentListNode* oldList = m_args-&gt;m_listNode;
</span><span class="cx">             m_args-&gt;m_listNode = m_args-&gt;m_listNode-&gt;m_next;
</span><span class="cx"> 
</span><span class="lines">@@ -629,7 +657,7 @@
</span><span class="cx">         RefPtr&lt;RegisterID&gt; thisRegister = generator.emitNode(m_args-&gt;m_listNode-&gt;m_expr);
</span><span class="cx">         RefPtr&lt;RegisterID&gt; argsRegister;
</span><span class="cx">         ArgumentListNode* args = m_args-&gt;m_listNode-&gt;m_next;
</span><del>-        if (args-&gt;m_expr-&gt;isResolveNode() &amp;&amp; generator.willResolveToArguments(static_cast&lt;ResolveNode*&gt;(args-&gt;m_expr)-&gt;identifier()))
</del><ins>+        if (args-&gt;m_expr-&gt;isResolveNode() &amp;&amp; generator.willResolveToArguments(static_cast&lt;ResolveNode*&gt;(args-&gt;m_expr)-&gt;identifier()) &amp;&amp; !generator.symbolTable().slowArguments())
</ins><span class="cx">             argsRegister = generator.uncheckedRegisterForArguments();
</span><span class="cx">         else
</span><span class="cx">             argsRegister = generator.emitNode(args-&gt;m_expr);
</span><span class="lines">@@ -639,7 +667,7 @@
</span><span class="cx">         while ((args = args-&gt;m_next))
</span><span class="cx">             generator.emitNode(args-&gt;m_expr);
</span><span class="cx"> 
</span><del>-        generator.emitCallVarargs(returnValue.get(), realFunction.get(), thisRegister.get(), argsRegister.get(), generator.newTemporary(), profileHookRegister.get(), divot(), divotStart(), divotEnd());
</del><ins>+        generator.emitCallVarargs(returnValue.get(), realFunction.get(), thisRegister.get(), argsRegister.get(), generator.newTemporary(), 0, profileHookRegister.get(), divot(), divotStart(), divotEnd());
</ins><span class="cx">     }
</span><span class="cx">     if (emitCallCheck) {
</span><span class="cx">         generator.emitJump(end.get());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinterpreterInterpretercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -137,10 +137,10 @@
</span><span class="cx">     return interpreter-&gt;execute(eval, callFrame, thisValue, callerScopeChain);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-CallFrame* sizeFrameForVarargs(CallFrame* callFrame, JSStack* stack, JSValue arguments, int firstFreeRegister)
</del><ins>+CallFrame* sizeFrameForVarargs(CallFrame* callFrame, JSStack* stack, JSValue arguments, int firstFreeRegister, int32_t firstVarArgOffset)
</ins><span class="cx"> {
</span><span class="cx">     if (!arguments) { // f.apply(x, arguments), with arguments unmodified.
</span><del>-        unsigned argumentCountIncludingThis = callFrame-&gt;argumentCountIncludingThis();
</del><ins>+        unsigned argumentCountIncludingThis = callFrame-&gt;argumentCountIncludingThis() - firstVarArgOffset;
</ins><span class="cx">         unsigned paddedCalleeFrameOffset = WTF::roundUpToMultipleOf(stackAlignmentRegisters(), -firstFreeRegister + argumentCountIncludingThis + JSStack::CallFrameHeaderSize + 1);
</span><span class="cx">         CallFrame* newCallFrame = CallFrame::create(callFrame-&gt;registers() - paddedCalleeFrameOffset);
</span><span class="cx">         if (argumentCountIncludingThis &gt; Arguments::MaxArguments + 1 || !stack-&gt;ensureCapacityFor(newCallFrame-&gt;registers())) {
</span><span class="lines">@@ -168,7 +168,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (asObject(arguments)-&gt;classInfo() == Arguments::info()) {
</span><span class="cx">         Arguments* argsObject = asArguments(arguments);
</span><del>-        unsigned argCount = argsObject-&gt;length(callFrame);
</del><ins>+        unsigned argCount = argsObject-&gt;length(callFrame) - firstVarArgOffset;
</ins><span class="cx">         unsigned paddedCalleeFrameOffset = WTF::roundUpToMultipleOf(stackAlignmentRegisters(), -firstFreeRegister + CallFrame::offsetFor(argCount + 1));
</span><span class="cx">         CallFrame* newCallFrame = CallFrame::create(callFrame-&gt;registers() - paddedCalleeFrameOffset);
</span><span class="cx">         if (argCount &gt; Arguments::MaxArguments || !stack-&gt;ensureCapacityFor(newCallFrame-&gt;registers())) {
</span><span class="lines">@@ -180,7 +180,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (isJSArray(arguments)) {
</span><span class="cx">         JSArray* array = asArray(arguments);
</span><del>-        unsigned argCount = array-&gt;length();
</del><ins>+        unsigned argCount = array-&gt;length() - firstVarArgOffset;
</ins><span class="cx">         unsigned paddedCalleeFrameOffset = WTF::roundUpToMultipleOf(stackAlignmentRegisters(), -firstFreeRegister + CallFrame::offsetFor(argCount + 1));
</span><span class="cx">         CallFrame* newCallFrame = CallFrame::create(callFrame-&gt;registers() - paddedCalleeFrameOffset);
</span><span class="cx">         if (argCount &gt; Arguments::MaxArguments || !stack-&gt;ensureCapacityFor(newCallFrame-&gt;registers())) {
</span><span class="lines">@@ -191,7 +191,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JSObject* argObject = asObject(arguments);
</span><del>-    unsigned argCount = argObject-&gt;get(callFrame, callFrame-&gt;propertyNames().length).toUInt32(callFrame);
</del><ins>+    unsigned argCount = argObject-&gt;get(callFrame, callFrame-&gt;propertyNames().length).toUInt32(callFrame) - firstVarArgOffset;
</ins><span class="cx">     unsigned paddedCalleeFrameOffset = WTF::roundUpToMultipleOf(stackAlignmentRegisters(), -firstFreeRegister + CallFrame::offsetFor(argCount + 1));
</span><span class="cx">     CallFrame* newCallFrame = CallFrame::create(callFrame-&gt;registers() - paddedCalleeFrameOffset);
</span><span class="cx">     if (argCount &gt; Arguments::MaxArguments || !stack-&gt;ensureCapacityFor(newCallFrame-&gt;registers())) {
</span><span class="lines">@@ -201,15 +201,15 @@
</span><span class="cx">     return newCallFrame;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void loadVarargs(CallFrame* callFrame, CallFrame* newCallFrame, JSValue thisValue, JSValue arguments)
</del><ins>+void loadVarargs(CallFrame* callFrame, CallFrame* newCallFrame, JSValue thisValue, JSValue arguments, int32_t firstVarArgOffset)
</ins><span class="cx"> {
</span><span class="cx">     if (!arguments) { // f.apply(x, arguments), with arguments unmodified.
</span><del>-        unsigned argumentCountIncludingThis = callFrame-&gt;argumentCountIncludingThis();
</del><ins>+        unsigned argumentCountIncludingThis = callFrame-&gt;argumentCountIncludingThis() - firstVarArgOffset;
</ins><span class="cx"> 
</span><span class="cx">         newCallFrame-&gt;setArgumentCountIncludingThis(argumentCountIncludingThis);
</span><span class="cx">         newCallFrame-&gt;setThisValue(thisValue);
</span><del>-        for (size_t i = 0; i &lt; callFrame-&gt;argumentCount(); ++i)
-            newCallFrame-&gt;setArgument(i, callFrame-&gt;argumentAfterCapture(i));
</del><ins>+        for (size_t i = firstVarArgOffset; i &lt; callFrame-&gt;argumentCount(); ++i)
+            newCallFrame-&gt;setArgument(i - firstVarArgOffset, callFrame-&gt;argumentAfterCapture(i));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -221,28 +221,28 @@
</span><span class="cx">     
</span><span class="cx">     if (asObject(arguments)-&gt;classInfo() == Arguments::info()) {
</span><span class="cx">         Arguments* argsObject = asArguments(arguments);
</span><del>-        unsigned argCount = argsObject-&gt;length(callFrame);
</del><ins>+        unsigned argCount = argsObject-&gt;length(callFrame) - firstVarArgOffset;
</ins><span class="cx">         newCallFrame-&gt;setArgumentCountIncludingThis(argCount + 1);
</span><span class="cx">         newCallFrame-&gt;setThisValue(thisValue);
</span><del>-        argsObject-&gt;copyToArguments(callFrame, newCallFrame, argCount);
</del><ins>+        argsObject-&gt;copyToArguments(callFrame, newCallFrame, argCount, firstVarArgOffset);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     if (isJSArray(arguments)) {
</span><span class="cx">         JSArray* array = asArray(arguments);
</span><del>-        unsigned argCount = array-&gt;length();
</del><ins>+        unsigned argCount = array-&gt;length() - firstVarArgOffset;
</ins><span class="cx">         newCallFrame-&gt;setArgumentCountIncludingThis(argCount + 1);
</span><span class="cx">         newCallFrame-&gt;setThisValue(thisValue);
</span><del>-        array-&gt;copyToArguments(callFrame, newCallFrame, argCount);
</del><ins>+        array-&gt;copyToArguments(callFrame, newCallFrame, argCount, firstVarArgOffset);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     JSObject* argObject = asObject(arguments);
</span><del>-    unsigned argCount = argObject-&gt;get(callFrame, callFrame-&gt;propertyNames().length).toUInt32(callFrame);
</del><ins>+    unsigned argCount = argObject-&gt;get(callFrame, callFrame-&gt;propertyNames().length).toUInt32(callFrame) - firstVarArgOffset;
</ins><span class="cx">     newCallFrame-&gt;setArgumentCountIncludingThis(argCount + 1);
</span><span class="cx">     newCallFrame-&gt;setThisValue(thisValue);
</span><span class="cx">     for (size_t i = 0; i &lt; argCount; ++i) {
</span><del>-        newCallFrame-&gt;setArgument(i, asObject(arguments)-&gt;get(callFrame, i));
</del><ins>+        newCallFrame-&gt;setArgument(i, asObject(arguments)-&gt;get(callFrame, i + firstVarArgOffset));
</ins><span class="cx">         if (UNLIKELY(callFrame-&gt;vm().exception()))
</span><span class="cx">             return;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinterpreterInterpreterh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/interpreter/Interpreter.h (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/interpreter/Interpreter.h        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/interpreter/Interpreter.h        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -285,8 +285,8 @@
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     JSValue eval(CallFrame*);
</span><del>-    CallFrame* sizeFrameForVarargs(CallFrame*, JSStack*, JSValue, int);
-    void loadVarargs(CallFrame*, CallFrame*, JSValue, JSValue);
</del><ins>+    CallFrame* sizeFrameForVarargs(CallFrame*, JSStack*, JSValue, int, int32_t firstVarArgOffset);
+    void loadVarargs(CallFrame*, CallFrame*, JSValue, JSValue, int32_t firstVarArgOffset);
</ins><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span><span class="cx"> #endif // Interpreter_h
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitCCallHelpersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/CCallHelpers.h (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/CCallHelpers.h        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/jit/CCallHelpers.h        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -582,7 +582,7 @@
</span><span class="cx">         addCallArgument(arg4);
</span><span class="cx">         addCallArgument(arg5);
</span><span class="cx">     }
</span><del>-
</del><ins>+    
</ins><span class="cx">     ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5, GPRReg arg6)
</span><span class="cx">     {
</span><span class="cx">         resetCallArguments();
</span><span class="lines">@@ -594,6 +594,19 @@
</span><span class="cx">         addCallArgument(arg5);
</span><span class="cx">         addCallArgument(arg6);
</span><span class="cx">     }
</span><ins>+    
+    
+    ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5, TrustedImm32 arg6)
+    {
+        resetCallArguments();
+        addCallArgument(GPRInfo::callFrameRegister);
+        addCallArgument(arg1);
+        addCallArgument(arg2);
+        addCallArgument(arg3);
+        addCallArgument(arg4);
+        addCallArgument(arg5);
+        addCallArgument(arg6);
+    }
</ins><span class="cx"> 
</span><span class="cx">     ALWAYS_INLINE void setupArgumentsWithExecState(FPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="lines">@@ -1170,6 +1183,14 @@
</span><span class="cx">         move(arg3, GPRInfo::argumentGPR3);
</span><span class="cx">         move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
</span><span class="cx">     }
</span><ins>+    
+    ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImm32 arg2, TrustedImm32 arg3)
+    {
+        move(arg1, GPRInfo::argumentGPR1);
+        move(arg2, GPRInfo::argumentGPR2);
+        move(arg3, GPRInfo::argumentGPR3);
+        move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
+    }
</ins><span class="cx"> 
</span><span class="cx">     ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, TrustedImmPtr arg3)
</span><span class="cx">     {
</span><span class="lines">@@ -1576,6 +1597,13 @@
</span><span class="cx">         move(arg4, GPRInfo::argumentGPR4);
</span><span class="cx">         move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
</span><span class="cx">     }
</span><ins>+    
+    ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4)
+    {
+        setupThreeStubArgsGPR&lt;GPRInfo::argumentGPR1, GPRInfo::argumentGPR2, GPRInfo::argumentGPR3&gt;(arg1, arg2, arg3);
+        move(arg4, GPRInfo::argumentGPR4);
+        move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
+    }
</ins><span class="cx"> 
</span><span class="cx">     ALWAYS_INLINE void setupArguments(GPRReg arg1, TrustedImmPtr arg2, GPRReg arg3, GPRReg arg4, TrustedImmPtr arg5)
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JIT.h (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JIT.h        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/jit/JIT.h        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -665,7 +665,7 @@
</span><span class="cx">         MacroAssembler::Call callOperation(C_JITOperation_EO, GPRReg);
</span><span class="cx">         MacroAssembler::Call callOperation(C_JITOperation_ESt, Structure*);
</span><span class="cx">         MacroAssembler::Call callOperation(C_JITOperation_EZ, int32_t);
</span><del>-        MacroAssembler::Call callOperation(F_JITOperation_EJZ, GPRReg, int32_t);
</del><ins>+        MacroAssembler::Call callOperation(F_JITOperation_EJZZ, GPRReg, int32_t, int32_t);
</ins><span class="cx">         MacroAssembler::Call callOperation(J_JITOperation_E, int);
</span><span class="cx">         MacroAssembler::Call callOperation(J_JITOperation_EAapJ, int, ArrayAllocationProfile*, GPRReg);
</span><span class="cx">         MacroAssembler::Call callOperation(J_JITOperation_EAapJcpZ, int, ArrayAllocationProfile*, GPRReg, int32_t);
</span><span class="lines">@@ -707,7 +707,7 @@
</span><span class="cx"> #endif
</span><span class="cx">         MacroAssembler::Call callOperation(V_JITOperation_EJIdJJ, RegisterID, const Identifier*, RegisterID, RegisterID);
</span><span class="cx"> #if USE(JSVALUE64)
</span><del>-        MacroAssembler::Call callOperation(F_JITOperation_EFJJ, RegisterID, RegisterID, RegisterID);
</del><ins>+        MacroAssembler::Call callOperation(F_JITOperation_EFJJZ, RegisterID, RegisterID, RegisterID, int32_t);
</ins><span class="cx">         MacroAssembler::Call callOperation(V_JITOperation_ESsiJJI, StructureStubInfo*, RegisterID, RegisterID, StringImpl*);
</span><span class="cx"> #else
</span><span class="cx">         MacroAssembler::Call callOperation(V_JITOperation_ESsiJJI, StructureStubInfo*, RegisterID, RegisterID, RegisterID, RegisterID, StringImpl*);
</span><span class="lines">@@ -722,8 +722,8 @@
</span><span class="cx">         MacroAssembler::Call callOperationWithCallFrameRollbackOnException(V_JITOperation_ECb, CodeBlock*);
</span><span class="cx">         MacroAssembler::Call callOperationWithCallFrameRollbackOnException(Z_JITOperation_E);
</span><span class="cx"> #if USE(JSVALUE32_64)
</span><del>-        MacroAssembler::Call callOperation(F_JITOperation_EFJJ, RegisterID, RegisterID, RegisterID, RegisterID, RegisterID);
-        MacroAssembler::Call callOperation(F_JITOperation_EJZ, GPRReg, GPRReg, int32_t);
</del><ins>+        MacroAssembler::Call callOperation(F_JITOperation_EFJJZ, RegisterID, RegisterID, RegisterID, RegisterID, RegisterID, int32_t);
+        MacroAssembler::Call callOperation(F_JITOperation_EJZZ, GPRReg, GPRReg, int32_t, int32_t);
</ins><span class="cx">         MacroAssembler::Call callOperation(J_JITOperation_EAapJ, int, ArrayAllocationProfile*, GPRReg, GPRReg);
</span><span class="cx">         MacroAssembler::Call callOperation(J_JITOperation_EJ, int, GPRReg, GPRReg);
</span><span class="cx">         MacroAssembler::Call callOperation(J_JITOperation_EJIdc, int, GPRReg, GPRReg, const Identifier*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITCallcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITCall.cpp (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITCall.cpp        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/jit/JITCall.cpp        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -58,6 +58,7 @@
</span><span class="cx">     int thisValue = instruction[3].u.operand;
</span><span class="cx">     int arguments = instruction[4].u.operand;
</span><span class="cx">     int firstFreeRegister = instruction[5].u.operand;
</span><ins>+    int firstVarArgOffset = instruction[6].u.operand;
</ins><span class="cx"> 
</span><span class="cx">     JumpList slowCase;
</span><span class="cx">     JumpList end;
</span><span class="lines">@@ -70,6 +71,8 @@
</span><span class="cx">         slowCase.append(branch64(NotEqual, regT0, TrustedImm64(JSValue::encode(JSValue()))));
</span><span class="cx"> 
</span><span class="cx">         emitGetFromCallFrameHeader32(JSStack::ArgumentCount, regT0);
</span><ins>+        if (firstVarArgOffset)
+            sub32(TrustedImm32(firstVarArgOffset), regT0);
</ins><span class="cx">         slowCase.append(branch32(Above, regT0, TrustedImm32(Arguments::MaxArguments + 1)));
</span><span class="cx">         // regT0: argumentCountIncludingThis
</span><span class="cx">         move(regT0, regT1);
</span><span class="lines">@@ -99,7 +102,7 @@
</span><span class="cx">         // regT0: argumentCount
</span><span class="cx"> 
</span><span class="cx">         Label copyLoop = label();
</span><del>-        load64(BaseIndex(callFrameRegister, regT0, TimesEight, CallFrame::thisArgumentOffset() * static_cast&lt;int&gt;(sizeof(Register))), regT2);
</del><ins>+        load64(BaseIndex(callFrameRegister, regT0, TimesEight, (CallFrame::thisArgumentOffset() + firstVarArgOffset) * static_cast&lt;int&gt;(sizeof(Register))), regT2);
</ins><span class="cx">         store64(regT2, BaseIndex(regT1, regT0, TimesEight, CallFrame::thisArgumentOffset() * static_cast&lt;int&gt;(sizeof(Register))));
</span><span class="cx">         branchSub64(NonZero, TrustedImm32(1), regT0).linkTo(copyLoop, this);
</span><span class="cx"> 
</span><span class="lines">@@ -110,11 +113,11 @@
</span><span class="cx">         slowCase.link(this);
</span><span class="cx"> 
</span><span class="cx">     emitGetVirtualRegister(arguments, regT1);
</span><del>-    callOperation(operationSizeFrameForVarargs, regT1, firstFreeRegister);
</del><ins>+    callOperation(operationSizeFrameForVarargs, regT1, firstFreeRegister, firstVarArgOffset);
</ins><span class="cx">     move(returnValueGPR, stackPointerRegister);
</span><span class="cx">     emitGetVirtualRegister(thisValue, regT1);
</span><span class="cx">     emitGetVirtualRegister(arguments, regT2);
</span><del>-    callOperation(operationLoadVarargs, returnValueGPR, regT1, regT2);
</del><ins>+    callOperation(operationLoadVarargs, returnValueGPR, regT1, regT2, firstVarArgOffset);
</ins><span class="cx">     move(returnValueGPR, regT1);
</span><span class="cx"> 
</span><span class="cx">     if (canOptimize)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITCall32_64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITCall32_64.cpp (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITCall32_64.cpp        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/jit/JITCall32_64.cpp        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -131,6 +131,7 @@
</span><span class="cx">     int thisValue = instruction[3].u.operand;
</span><span class="cx">     int arguments = instruction[4].u.operand;
</span><span class="cx">     int firstFreeRegister = instruction[5].u.operand;
</span><ins>+    int firstVarArgOffset = instruction[6].u.operand;
</ins><span class="cx"> 
</span><span class="cx">     JumpList slowCase;
</span><span class="cx">     JumpList end;
</span><span class="lines">@@ -143,6 +144,8 @@
</span><span class="cx">         slowCase.append(branch32(NotEqual, regT1, TrustedImm32(JSValue::EmptyValueTag)));
</span><span class="cx"> 
</span><span class="cx">         load32(payloadFor(JSStack::ArgumentCount), regT2);
</span><ins>+        if (firstVarArgOffset)
+            sub32(TrustedImm32(firstVarArgOffset), regT2);
</ins><span class="cx">         slowCase.append(branch32(Above, regT2, TrustedImm32(Arguments::MaxArguments + 1)));
</span><span class="cx">         // regT2: argumentCountIncludingThis
</span><span class="cx"> 
</span><span class="lines">@@ -172,8 +175,8 @@
</span><span class="cx">         // regT2: argumentCount;
</span><span class="cx"> 
</span><span class="cx">         Label copyLoop = label();
</span><del>-        load32(BaseIndex(callFrameRegister, regT2, TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.payload) +(CallFrame::thisArgumentOffset() * static_cast&lt;int&gt;(sizeof(Register)))), regT0);
-        load32(BaseIndex(callFrameRegister, regT2, TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.tag) +(CallFrame::thisArgumentOffset() * static_cast&lt;int&gt;(sizeof(Register)))), regT1);
</del><ins>+        load32(BaseIndex(callFrameRegister, regT2, TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.payload) +((CallFrame::thisArgumentOffset() + firstVarArgOffset) * static_cast&lt;int&gt;(sizeof(Register)))), regT0);
+        load32(BaseIndex(callFrameRegister, regT2, TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.tag) +((CallFrame::thisArgumentOffset() + firstVarArgOffset) * static_cast&lt;int&gt;(sizeof(Register)))), regT1);
</ins><span class="cx">         store32(regT0, BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.payload) +(CallFrame::thisArgumentOffset() * static_cast&lt;int&gt;(sizeof(Register)))));
</span><span class="cx">         store32(regT1, BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.tag) +(CallFrame::thisArgumentOffset() * static_cast&lt;int&gt;(sizeof(Register)))));
</span><span class="cx">         branchSub32(NonZero, TrustedImm32(1), regT2).linkTo(copyLoop, this);
</span><span class="lines">@@ -185,11 +188,11 @@
</span><span class="cx">         slowCase.link(this);
</span><span class="cx"> 
</span><span class="cx">     emitLoad(arguments, regT1, regT0);
</span><del>-    callOperation(operationSizeFrameForVarargs, regT1, regT0, firstFreeRegister);
</del><ins>+    callOperation(operationSizeFrameForVarargs, regT1, regT0, firstFreeRegister, firstVarArgOffset);
</ins><span class="cx">     addPtr(TrustedImm32(-sizeof(CallerFrameAndPC)), returnValueGPR, stackPointerRegister);
</span><span class="cx">     emitLoad(thisValue, regT1, regT4);
</span><span class="cx">     emitLoad(arguments, regT3, regT2);
</span><del>-    callOperation(operationLoadVarargs, returnValueGPR, regT1, regT4, regT3, regT2);
</del><ins>+    callOperation(operationLoadVarargs, returnValueGPR, regT1, regT4, regT3, regT2, firstVarArgOffset);
</ins><span class="cx">     move(returnValueGPR, regT3);
</span><span class="cx"> 
</span><span class="cx">     if (canOptimize)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITInlines.h (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITInlines.h        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/jit/JITInlines.h        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -296,15 +296,15 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> #if USE(JSVALUE64)
</span><del>-ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(F_JITOperation_EJZ operation, GPRReg arg1, int32_t arg3)
</del><ins>+ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(F_JITOperation_EJZZ operation, GPRReg arg1, int32_t arg2, int32_t arg3)
</ins><span class="cx"> {
</span><del>-    setupArgumentsWithExecState(arg1, TrustedImm32(arg3));
</del><ins>+    setupArgumentsWithExecState(arg1, TrustedImm32(arg2), TrustedImm32(arg3));
</ins><span class="cx">     return appendCallWithExceptionCheck(operation);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(F_JITOperation_EFJJ operation, GPRReg arg1, GPRReg arg2, GPRReg arg3)
</del><ins>+ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(F_JITOperation_EFJJZ operation, GPRReg arg1, GPRReg arg2, GPRReg arg3, int32_t arg4)
</ins><span class="cx"> {
</span><del>-    setupArgumentsWithExecState(arg1, arg2, arg3);
</del><ins>+    setupArgumentsWithExecState(arg1, arg2, arg3, TrustedImm32(arg4));
</ins><span class="cx">     return appendCallWithExceptionCheck(operation);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -437,20 +437,20 @@
</span><span class="cx">     return appendCall(operation);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(F_JITOperation_EJZ operation, GPRReg arg1Tag, GPRReg arg1Payload, int32_t arg2)
</del><ins>+ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(F_JITOperation_EJZZ operation, GPRReg arg1Tag, GPRReg arg1Payload, int32_t arg2, int32_t arg3)
</ins><span class="cx"> {
</span><span class="cx"> #if CPU(SH4)
</span><span class="cx">     // We have to put arg3 in the 4th argument register (r7) as 64-bit value arg2 will be put on stack for sh4 architecure.
</span><del>-    setupArgumentsWithExecState(arg1Payload, arg1Tag, TrustedImm32(arg2));
</del><ins>+    setupArgumentsWithExecState(arg1Payload, arg1Tag, TrustedImm32(arg2), TrustedImm32(arg3));
</ins><span class="cx"> #else
</span><del>-    setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, TrustedImm32(arg2));
</del><ins>+    setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, TrustedImm32(arg2), TrustedImm32(arg3));
</ins><span class="cx"> #endif
</span><span class="cx">     return appendCallWithExceptionCheck(operation);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(F_JITOperation_EFJJ operation, GPRReg arg1, GPRReg arg2Tag, GPRReg arg2Payload, GPRReg arg3Tag, GPRReg arg3Payload)
</del><ins>+ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(F_JITOperation_EFJJZ operation, GPRReg arg1, GPRReg arg2Tag, GPRReg arg2Payload, GPRReg arg3Tag, GPRReg arg3Payload, int32_t arg4)
</ins><span class="cx"> {
</span><del>-    setupArgumentsWithExecState(arg1, arg2Payload, arg2Tag, arg3Payload, arg3Tag);
</del><ins>+    setupArgumentsWithExecState(arg1, arg2Payload, arg2Tag, arg3Payload, arg3Tag, TrustedImm32(arg4));
</ins><span class="cx">     return appendCallWithExceptionCheck(operation);
</span><span class="cx"> }
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITOperationscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITOperations.cpp (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITOperations.cpp        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/jit/JITOperations.cpp        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -1562,23 +1562,23 @@
</span><span class="cx">     return JSValue::encode(jsBoolean(result));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-CallFrame* JIT_OPERATION operationSizeFrameForVarargs(ExecState* exec, EncodedJSValue encodedArguments, int32_t firstFreeRegister)
</del><ins>+CallFrame* JIT_OPERATION operationSizeFrameForVarargs(ExecState* exec, EncodedJSValue encodedArguments, int32_t firstFreeRegister, int32_t firstVarArgOffset)
</ins><span class="cx"> {
</span><span class="cx">     VM&amp; vm = exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(&amp;vm, exec);
</span><span class="cx">     JSStack* stack = &amp;exec-&gt;interpreter()-&gt;stack();
</span><span class="cx">     JSValue arguments = JSValue::decode(encodedArguments);
</span><del>-    CallFrame* newCallFrame = sizeFrameForVarargs(exec, stack, arguments, firstFreeRegister);
</del><ins>+    CallFrame* newCallFrame = sizeFrameForVarargs(exec, stack, arguments, firstFreeRegister, firstVarArgOffset);
</ins><span class="cx">     return newCallFrame;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-CallFrame* JIT_OPERATION operationLoadVarargs(ExecState* exec, CallFrame* newCallFrame, EncodedJSValue encodedThis, EncodedJSValue encodedArguments)
</del><ins>+CallFrame* JIT_OPERATION operationLoadVarargs(ExecState* exec, CallFrame* newCallFrame, EncodedJSValue encodedThis, EncodedJSValue encodedArguments, int32_t firstVarArgOffset)
</ins><span class="cx"> {
</span><span class="cx">     VM&amp; vm = exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(&amp;vm, exec);
</span><span class="cx">     JSValue thisValue = JSValue::decode(encodedThis);
</span><span class="cx">     JSValue arguments = JSValue::decode(encodedArguments);
</span><del>-    loadVarargs(exec, newCallFrame, thisValue, arguments);
</del><ins>+    loadVarargs(exec, newCallFrame, thisValue, arguments, firstVarArgOffset);
</ins><span class="cx">     return newCallFrame;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITOperationsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITOperations.h (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITOperations.h        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/jit/JITOperations.h        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -82,8 +82,8 @@
</span><span class="cx">     Z: int32_t
</span><span class="cx"> */
</span><span class="cx"> 
</span><del>-typedef CallFrame* JIT_OPERATION (*F_JITOperation_EFJJ)(ExecState*, CallFrame*, EncodedJSValue, EncodedJSValue);
-typedef CallFrame* JIT_OPERATION (*F_JITOperation_EJZ)(ExecState*, EncodedJSValue, int32_t);
</del><ins>+typedef CallFrame* JIT_OPERATION (*F_JITOperation_EFJJZ)(ExecState*, CallFrame*, EncodedJSValue, EncodedJSValue, int32_t);
+typedef CallFrame* JIT_OPERATION (*F_JITOperation_EJZZ)(ExecState*, EncodedJSValue, int32_t, int32_t);
</ins><span class="cx"> typedef EncodedJSValue JIT_OPERATION (*J_JITOperation_E)(ExecState*);
</span><span class="cx"> typedef EncodedJSValue JIT_OPERATION (*J_JITOperation_EA)(ExecState*, JSArray*);
</span><span class="cx"> typedef EncodedJSValue JIT_OPERATION (*J_JITOperation_EAZ)(ExecState*, JSArray*, int32_t);
</span><span class="lines">@@ -275,8 +275,8 @@
</span><span class="cx"> EncodedJSValue JIT_OPERATION operationDeleteById(ExecState*, EncodedJSValue base, const Identifier*) WTF_INTERNAL;
</span><span class="cx"> JSCell* JIT_OPERATION operationGetPNames(ExecState*, JSObject*) WTF_INTERNAL;
</span><span class="cx"> EncodedJSValue JIT_OPERATION operationInstanceOf(ExecState*, EncodedJSValue, EncodedJSValue proto) WTF_INTERNAL;
</span><del>-CallFrame* JIT_OPERATION operationSizeFrameForVarargs(ExecState*, EncodedJSValue arguments, int32_t firstFreeRegister) WTF_INTERNAL;
-CallFrame* JIT_OPERATION operationLoadVarargs(ExecState*, CallFrame*, EncodedJSValue thisValue, EncodedJSValue arguments) WTF_INTERNAL;
</del><ins>+CallFrame* JIT_OPERATION operationSizeFrameForVarargs(ExecState*, EncodedJSValue arguments, int32_t firstFreeRegister, int32_t firstVarArgOffset) WTF_INTERNAL;
+CallFrame* JIT_OPERATION operationLoadVarargs(ExecState*, CallFrame*, EncodedJSValue thisValue, EncodedJSValue arguments, int32_t firstVarArgOffset) WTF_INTERNAL;
</ins><span class="cx"> EncodedJSValue JIT_OPERATION operationToObject(ExecState*, EncodedJSValue) WTF_INTERNAL;
</span><span class="cx"> 
</span><span class="cx"> char* JIT_OPERATION operationSwitchCharWithUnknownKeyType(ExecState*, EncodedJSValue key, size_t tableIndex) WTF_INTERNAL;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLLIntSlowPathscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -1156,7 +1156,7 @@
</span><span class="cx">     // - Set up a call frame while respecting the variable arguments.
</span><span class="cx">     
</span><span class="cx">     ExecState* execCallee = sizeFrameForVarargs(exec, &amp;vm.interpreter-&gt;stack(),
</span><del>-        LLINT_OP_C(4).jsValue(), pc[5].u.operand);
</del><ins>+        LLINT_OP_C(4).jsValue(), pc[5].u.operand, pc[6].u.operand);
</ins><span class="cx">     LLINT_CALL_CHECK_EXCEPTION(exec);
</span><span class="cx">     
</span><span class="cx">     vm.newCallFrameReturnValue = execCallee;
</span><span class="lines">@@ -1175,7 +1175,7 @@
</span><span class="cx">     
</span><span class="cx">     ExecState* execCallee = vm.newCallFrameReturnValue;
</span><span class="cx"> 
</span><del>-    loadVarargs(exec, execCallee, LLINT_OP_C(3).jsValue(), LLINT_OP_C(4).jsValue());
</del><ins>+    loadVarargs(exec, execCallee, LLINT_OP_C(3).jsValue(), LLINT_OP_C(4).jsValue(), pc[6].u.operand);
</ins><span class="cx">     LLINT_CALL_CHECK_EXCEPTION(exec);
</span><span class="cx">     
</span><span class="cx">     execCallee-&gt;uncheckedR(JSStack::Callee) = calleeAsValue;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeArgumentscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Arguments.cpp (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Arguments.cpp        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/runtime/Arguments.cpp        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -58,20 +58,22 @@
</span><span class="cx">     static_cast&lt;Arguments*&gt;(cell)-&gt;Arguments::~Arguments();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void Arguments::copyToArguments(ExecState* exec, CallFrame* callFrame, uint32_t length)
</del><ins>+void Arguments::copyToArguments(ExecState* exec, CallFrame* callFrame, uint32_t copyLength, int32_t firstVarArgOffset)
</ins><span class="cx"> {
</span><ins>+    uint32_t length = copyLength + firstVarArgOffset;
+
</ins><span class="cx">     if (UNLIKELY(m_overrodeLength)) {
</span><span class="cx">         length = min(get(exec, exec-&gt;propertyNames().length).toUInt32(exec), length);
</span><del>-        for (unsigned i = 0; i &lt; length; i++)
</del><ins>+        for (unsigned i = firstVarArgOffset; i &lt; length; i++)
</ins><span class="cx">             callFrame-&gt;setArgument(i, get(exec, i));
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     ASSERT(length == this-&gt;length(exec));
</span><del>-    for (size_t i = 0; i &lt; length; ++i) {
</del><ins>+    for (size_t i = firstVarArgOffset; i &lt; length; ++i) {
</ins><span class="cx">         if (JSValue value = tryGetArgument(i))
</span><del>-            callFrame-&gt;setArgument(i, value);
</del><ins>+            callFrame-&gt;setArgument(i - firstVarArgOffset, value);
</ins><span class="cx">         else
</span><del>-            callFrame-&gt;setArgument(i, get(exec, i));
</del><ins>+            callFrame-&gt;setArgument(i - firstVarArgOffset, get(exec, i));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeArgumentsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Arguments.h (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Arguments.h        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/runtime/Arguments.h        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -78,7 +78,7 @@
</span><span class="cx">         return m_numArguments; 
</span><span class="cx">     }
</span><span class="cx">         
</span><del>-    void copyToArguments(ExecState*, CallFrame*, uint32_t length);
</del><ins>+    void copyToArguments(ExecState*, CallFrame*, uint32_t copyLength, int32_t firstArgumentOffset);
</ins><span class="cx">     void tearOff(CallFrame*);
</span><span class="cx">     void tearOff(CallFrame*, InlineCallFrame*);
</span><span class="cx">     bool isTornOff() const { return m_registerArray.get(); }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSArraycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSArray.cpp (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSArray.cpp        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/runtime/JSArray.cpp        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -1540,12 +1540,12 @@
</span><span class="cx">         args.append(get(exec, i));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSArray::copyToArguments(ExecState* exec, CallFrame* callFrame, uint32_t length)
</del><ins>+void JSArray::copyToArguments(ExecState* exec, CallFrame* callFrame, uint32_t copyLength, int32_t firstVarArgOffset)
</ins><span class="cx"> {
</span><del>-    unsigned i = 0;
</del><ins>+    unsigned i = firstVarArgOffset;
</ins><span class="cx">     WriteBarrier&lt;Unknown&gt;* vector;
</span><span class="cx">     unsigned vectorEnd;
</span><del>-    
</del><ins>+    unsigned length = copyLength + firstVarArgOffset;
</ins><span class="cx">     ASSERT(length == this-&gt;length());
</span><span class="cx">     switch (structure()-&gt;indexingType()) {
</span><span class="cx">     case ArrayClass:
</span><span class="lines">@@ -1572,7 +1572,7 @@
</span><span class="cx">             double v = m_butterfly-&gt;contiguousDouble()[i];
</span><span class="cx">             if (v != v)
</span><span class="cx">                 break;
</span><del>-            callFrame-&gt;setArgument(i, JSValue(JSValue::EncodeAsDouble, v));
</del><ins>+            callFrame-&gt;setArgument(i - firstVarArgOffset, JSValue(JSValue::EncodeAsDouble, v));
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -1595,11 +1595,11 @@
</span><span class="cx">         WriteBarrier&lt;Unknown&gt;&amp; v = vector[i];
</span><span class="cx">         if (!v)
</span><span class="cx">             break;
</span><del>-        callFrame-&gt;setArgument(i, v.get());
</del><ins>+        callFrame-&gt;setArgument(i - firstVarArgOffset, v.get());
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     for (; i &lt; length; ++i)
</span><del>-        callFrame-&gt;setArgument(i, get(exec, i));
</del><ins>+        callFrame-&gt;setArgument(i - firstVarArgOffset, get(exec, i));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;IndexingType indexingType&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSArrayh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSArray.h (164629 => 164630)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSArray.h        2014-02-25 06:46:12 UTC (rev 164629)
+++ trunk/Source/JavaScriptCore/runtime/JSArray.h        2014-02-25 06:59:38 UTC (rev 164630)
</span><span class="lines">@@ -132,7 +132,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void fillArgList(ExecState*, MarkedArgumentBuffer&amp;);
</span><del>-    void copyToArguments(ExecState*, CallFrame*, uint32_t length);
</del><ins>+    void copyToArguments(ExecState*, CallFrame*, uint32_t length, int32_t firstVarArgOffset);
</ins><span class="cx"> 
</span><span class="cx">     static Structure* createStructure(VM&amp; vm, JSGlobalObject* globalObject, JSValue prototype, IndexingType indexingType)
</span><span class="cx">     {
</span></span></pre>
</div>
</div>

</body>
</html>