<!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>[188764] 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/188764">188764</a></dd>
<dt>Author</dt> <dd>saambarati1@gmail.com</dd>
<dt>Date</dt> <dd>2015-08-21 12:11:36 -0700 (Fri, 21 Aug 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>DFG callOperations should not implicitly emit an exception check. At callOperation call sites, we should explicitly emit exception checks
https://bugs.webkit.org/show_bug.cgi?id=147988

Reviewed by Geoffrey Garen.

This is in preparation for the DFG being able to handle exceptions. 
To do this, we need more control over when we emit exception checks.
Specifically, we want to be able to silentFill before emitting an exception check.
This patch does that. This patch also allows us to easily see which
operations do and do not emit exception checks. Finding this information
out before was a pain.

* assembler/AbortReason.h:
* dfg/DFGArrayifySlowPathGenerator.h:
* dfg/DFGCallArrayAllocatorSlowPathGenerator.h:
* dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h:
* dfg/DFGJITCompiler.h:
(JSC::DFG::JITCompiler::appendCall):
(JSC::DFG::JITCompiler::exceptionCheck):
* dfg/DFGSaneStringGetByValSlowPathGenerator.h:
* dfg/DFGSlowPathGenerator.h:
(JSC::DFG::CallSlowPathGenerator::CallSlowPathGenerator):
(JSC::DFG::CallSlowPathGenerator::tearDown):
(JSC::DFG::CallResultAndNoArgumentsSlowPathGenerator::CallResultAndNoArgumentsSlowPathGenerator):
(JSC::DFG::CallResultAndOneArgumentSlowPathGenerator::CallResultAndOneArgumentSlowPathGenerator):
(JSC::DFG::CallResultAndTwoArgumentsSlowPathGenerator::CallResultAndTwoArgumentsSlowPathGenerator):
(JSC::DFG::CallResultAndThreeArgumentsSlowPathGenerator::CallResultAndThreeArgumentsSlowPathGenerator):
(JSC::DFG::CallResultAndFourArgumentsSlowPathGenerator::CallResultAndFourArgumentsSlowPathGenerator):
(JSC::DFG::CallResultAndFiveArgumentsSlowPathGenerator::CallResultAndFiveArgumentsSlowPathGenerator):
(JSC::DFG::slowPathCall):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::compileIn):
(JSC::DFG::SpeculativeJIT::compileCurrentBlock):
(JSC::DFG::SpeculativeJIT::compileValueToInt32):
(JSC::DFG::SpeculativeJIT::compileArithRound):
(JSC::DFG::SpeculativeJIT::compileNewFunction):
(JSC::DFG::SpeculativeJIT::compileCreateActivation):
(JSC::DFG::SpeculativeJIT::compileCreateScopedArguments):
(JSC::DFG::SpeculativeJIT::compileCreateClonedArguments):
(JSC::DFG::SpeculativeJIT::compileNotifyWrite):
(JSC::DFG::SpeculativeJIT::compileRegExpExec):
(JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage):
(JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage):
(JSC::DFG::SpeculativeJIT::compileToStringOrCallStringConstructorOnCell):
(JSC::DFG::SpeculativeJIT::emitSwitchImm):
(JSC::DFG::SpeculativeJIT::emitSwitchStringOnString):
* dfg/DFGSpeculativeJIT.h:
(JSC::DFG::SpeculativeJIT::callOperation):
(JSC::DFG::SpeculativeJIT::callOperationWithCallFrameRollbackOnException):
(JSC::DFG::SpeculativeJIT::prepareForExternalCall):
(JSC::DFG::SpeculativeJIT::appendCall):
(JSC::DFG::SpeculativeJIT::appendCallWithCallFrameRollbackOnException):
(JSC::DFG::SpeculativeJIT::appendCallWithCallFrameRollbackOnExceptionSetResult):
(JSC::DFG::SpeculativeJIT::appendCallSetResult):
(JSC::DFG::SpeculativeJIT::appendCallWithExceptionCheck): Deleted.
(JSC::DFG::SpeculativeJIT::appendCallWithExceptionCheckSetResult): Deleted.
* dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch):
(JSC::DFG::CompareAndBoxBooleanSlowPathGenerator::CompareAndBoxBooleanSlowPathGenerator):
(JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompare):
(JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq):
(JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq):
(JSC::DFG::SpeculativeJIT::emitCall):
(JSC::DFG::SpeculativeJIT::compileLogicalNot):
(JSC::DFG::SpeculativeJIT::compile):
* dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch):
(JSC::DFG::CompareAndBoxBooleanSlowPathGenerator::CompareAndBoxBooleanSlowPathGenerator):
(JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompare):
(JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq):
(JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq):
(JSC::DFG::SpeculativeJIT::emitCall):
(JSC::DFG::SpeculativeJIT::compileLogicalNot):
(JSC::DFG::SpeculativeJIT::compile):
* ftl/FTLIntrinsicRepository.h:
* ftl/FTLLowerDFGToLLVM.cpp:
(JSC::FTL::DFG::LowerDFGToLLVM::callCheck):
* jit/AssemblyHelpers.cpp:
(JSC::AssemblyHelpers::jitAssertArgumentCountSane):
(JSC::AssemblyHelpers::jitAssertNoException):
(JSC::AssemblyHelpers::callExceptionFuzz):
(JSC::AssemblyHelpers::emitExceptionCheck):
* jit/AssemblyHelpers.h:
(JSC::AssemblyHelpers::jitAssertIsInt32):
(JSC::AssemblyHelpers::jitAssertIsJSInt32):
(JSC::AssemblyHelpers::jitAssertIsNull):
(JSC::AssemblyHelpers::jitAssertTagsInPlace):
(JSC::AssemblyHelpers::jitAssertArgumentCountSane):
(JSC::AssemblyHelpers::jitAssertNoException):
* jit/JITOperations.cpp:
* jit/JITOperations.h:
* runtime/VM.h:
(JSC::VM::scratchBufferForSize):
(JSC::VM::exceptionFuzzingBuffer):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreassemblerAbortReasonh">trunk/Source/JavaScriptCore/assembler/AbortReason.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGArrayifySlowPathGeneratorh">trunk/Source/JavaScriptCore/dfg/DFGArrayifySlowPathGenerator.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGCallArrayAllocatorSlowPathGeneratorh">trunk/Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGCallCreateDirectArgumentsSlowPathGeneratorh">trunk/Source/JavaScriptCore/dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGJITCompilerh">trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSaneStringGetByValSlowPathGeneratorh">trunk/Source/JavaScriptCore/dfg/DFGSaneStringGetByValSlowPathGenerator.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSlowPathGeneratorh">trunk/Source/JavaScriptCore/dfg/DFGSlowPathGenerator.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJITcpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJITh">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJIT64cpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLIntrinsicRepositoryh">trunk/Source/JavaScriptCore/ftl/FTLIntrinsicRepository.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLLowerDFGToLLVMcpp">trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitAssemblyHelperscpp">trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitAssemblyHelpersh">trunk/Source/JavaScriptCore/jit/AssemblyHelpers.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="#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 (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -1,3 +1,100 @@
</span><ins>+2015-08-21  Saam barati  &lt;sbarati@apple.com&gt;
+
+        DFG callOperations should not implicitly emit an exception check. At callOperation call sites, we should explicitly emit exception checks
+        https://bugs.webkit.org/show_bug.cgi?id=147988
+
+        Reviewed by Geoffrey Garen.
+
+        This is in preparation for the DFG being able to handle exceptions. 
+        To do this, we need more control over when we emit exception checks.
+        Specifically, we want to be able to silentFill before emitting an exception check.
+        This patch does that. This patch also allows us to easily see which
+        operations do and do not emit exception checks. Finding this information
+        out before was a pain.
+
+        * assembler/AbortReason.h:
+        * dfg/DFGArrayifySlowPathGenerator.h:
+        * dfg/DFGCallArrayAllocatorSlowPathGenerator.h:
+        * dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h:
+        * dfg/DFGJITCompiler.h:
+        (JSC::DFG::JITCompiler::appendCall):
+        (JSC::DFG::JITCompiler::exceptionCheck):
+        * dfg/DFGSaneStringGetByValSlowPathGenerator.h:
+        * dfg/DFGSlowPathGenerator.h:
+        (JSC::DFG::CallSlowPathGenerator::CallSlowPathGenerator):
+        (JSC::DFG::CallSlowPathGenerator::tearDown):
+        (JSC::DFG::CallResultAndNoArgumentsSlowPathGenerator::CallResultAndNoArgumentsSlowPathGenerator):
+        (JSC::DFG::CallResultAndOneArgumentSlowPathGenerator::CallResultAndOneArgumentSlowPathGenerator):
+        (JSC::DFG::CallResultAndTwoArgumentsSlowPathGenerator::CallResultAndTwoArgumentsSlowPathGenerator):
+        (JSC::DFG::CallResultAndThreeArgumentsSlowPathGenerator::CallResultAndThreeArgumentsSlowPathGenerator):
+        (JSC::DFG::CallResultAndFourArgumentsSlowPathGenerator::CallResultAndFourArgumentsSlowPathGenerator):
+        (JSC::DFG::CallResultAndFiveArgumentsSlowPathGenerator::CallResultAndFiveArgumentsSlowPathGenerator):
+        (JSC::DFG::slowPathCall):
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::compileIn):
+        (JSC::DFG::SpeculativeJIT::compileCurrentBlock):
+        (JSC::DFG::SpeculativeJIT::compileValueToInt32):
+        (JSC::DFG::SpeculativeJIT::compileArithRound):
+        (JSC::DFG::SpeculativeJIT::compileNewFunction):
+        (JSC::DFG::SpeculativeJIT::compileCreateActivation):
+        (JSC::DFG::SpeculativeJIT::compileCreateScopedArguments):
+        (JSC::DFG::SpeculativeJIT::compileCreateClonedArguments):
+        (JSC::DFG::SpeculativeJIT::compileNotifyWrite):
+        (JSC::DFG::SpeculativeJIT::compileRegExpExec):
+        (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage):
+        (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage):
+        (JSC::DFG::SpeculativeJIT::compileToStringOrCallStringConstructorOnCell):
+        (JSC::DFG::SpeculativeJIT::emitSwitchImm):
+        (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString):
+        * dfg/DFGSpeculativeJIT.h:
+        (JSC::DFG::SpeculativeJIT::callOperation):
+        (JSC::DFG::SpeculativeJIT::callOperationWithCallFrameRollbackOnException):
+        (JSC::DFG::SpeculativeJIT::prepareForExternalCall):
+        (JSC::DFG::SpeculativeJIT::appendCall):
+        (JSC::DFG::SpeculativeJIT::appendCallWithCallFrameRollbackOnException):
+        (JSC::DFG::SpeculativeJIT::appendCallWithCallFrameRollbackOnExceptionSetResult):
+        (JSC::DFG::SpeculativeJIT::appendCallSetResult):
+        (JSC::DFG::SpeculativeJIT::appendCallWithExceptionCheck): Deleted.
+        (JSC::DFG::SpeculativeJIT::appendCallWithExceptionCheckSetResult): Deleted.
+        * dfg/DFGSpeculativeJIT32_64.cpp:
+        (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch):
+        (JSC::DFG::CompareAndBoxBooleanSlowPathGenerator::CompareAndBoxBooleanSlowPathGenerator):
+        (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompare):
+        (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq):
+        (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq):
+        (JSC::DFG::SpeculativeJIT::emitCall):
+        (JSC::DFG::SpeculativeJIT::compileLogicalNot):
+        (JSC::DFG::SpeculativeJIT::compile):
+        * dfg/DFGSpeculativeJIT64.cpp:
+        (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch):
+        (JSC::DFG::CompareAndBoxBooleanSlowPathGenerator::CompareAndBoxBooleanSlowPathGenerator):
+        (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompare):
+        (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq):
+        (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq):
+        (JSC::DFG::SpeculativeJIT::emitCall):
+        (JSC::DFG::SpeculativeJIT::compileLogicalNot):
+        (JSC::DFG::SpeculativeJIT::compile):
+        * ftl/FTLIntrinsicRepository.h:
+        * ftl/FTLLowerDFGToLLVM.cpp:
+        (JSC::FTL::DFG::LowerDFGToLLVM::callCheck):
+        * jit/AssemblyHelpers.cpp:
+        (JSC::AssemblyHelpers::jitAssertArgumentCountSane):
+        (JSC::AssemblyHelpers::jitAssertNoException):
+        (JSC::AssemblyHelpers::callExceptionFuzz):
+        (JSC::AssemblyHelpers::emitExceptionCheck):
+        * jit/AssemblyHelpers.h:
+        (JSC::AssemblyHelpers::jitAssertIsInt32):
+        (JSC::AssemblyHelpers::jitAssertIsJSInt32):
+        (JSC::AssemblyHelpers::jitAssertIsNull):
+        (JSC::AssemblyHelpers::jitAssertTagsInPlace):
+        (JSC::AssemblyHelpers::jitAssertArgumentCountSane):
+        (JSC::AssemblyHelpers::jitAssertNoException):
+        * jit/JITOperations.cpp:
+        * jit/JITOperations.h:
+        * runtime/VM.h:
+        (JSC::VM::scratchBufferForSize):
+        (JSC::VM::exceptionFuzzingBuffer):
+
</ins><span class="cx"> 2015-08-21  Geoffrey Garen  &lt;ggaren@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r188714): RELEASE_ASSERT in JSC::Heap::incrementDeferralDepth() opening Web Inspector on daringfireball.net
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreassemblerAbortReasonh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/assembler/AbortReason.h (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/assembler/AbortReason.h        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/assembler/AbortReason.h        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -62,6 +62,7 @@
</span><span class="cx">     JITGetByValResultIsNotEmpty                       = 250,
</span><span class="cx">     JITNotSupported                                   = 260,
</span><span class="cx">     JITOffsetIsNotOutOfLine                           = 270,
</span><ins>+    JITUncoughtExceptionAfterCall                     = 275,
</ins><span class="cx">     JITUnreasonableLoopHintJumpTarget                 = 280,
</span><span class="cx">     RPWUnreasonableJumpTarget                         = 290,
</span><span class="cx">     RepatchIneffectiveWatchpoint                      = 300,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGArrayifySlowPathGeneratorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGArrayifySlowPathGenerator.h (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGArrayifySlowPathGenerator.h        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/dfg/DFGArrayifySlowPathGenerator.h        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -113,6 +113,7 @@
</span><span class="cx">         }
</span><span class="cx">         for (unsigned i = m_plans.size(); i--;)
</span><span class="cx">             jit-&gt;silentFill(m_plans[i], GPRInfo::regT0);
</span><ins>+        jit-&gt;m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         if (m_op == ArrayifyToStructure) {
</span><span class="cx">             ASSERT(m_structure);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGCallArrayAllocatorSlowPathGeneratorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -61,6 +61,7 @@
</span><span class="cx">         GPRReg canTrample = SpeculativeJIT::pickCanTrample(m_resultGPR);
</span><span class="cx">         for (unsigned i = m_plans.size(); i--;)
</span><span class="cx">             jit-&gt;silentFill(m_plans[i], canTrample);
</span><ins>+        jit-&gt;m_jit.exceptionCheck();
</ins><span class="cx">         jit-&gt;m_jit.loadPtr(MacroAssembler::Address(m_resultGPR, JSObject::butterflyOffset()), m_storageGPR);
</span><span class="cx">         jumpTo(jit);
</span><span class="cx">     }
</span><span class="lines">@@ -106,6 +107,7 @@
</span><span class="cx">         GPRReg canTrample = SpeculativeJIT::pickCanTrample(m_resultGPR);
</span><span class="cx">         for (unsigned i = m_plans.size(); i--;)
</span><span class="cx">             jit-&gt;silentFill(m_plans[i], canTrample);
</span><ins>+        jit-&gt;m_jit.exceptionCheck();
</ins><span class="cx">         jumpTo(jit);
</span><span class="cx">     }
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGCallCreateDirectArgumentsSlowPathGeneratorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -62,6 +62,7 @@
</span><span class="cx">         GPRReg canTrample = SpeculativeJIT::pickCanTrample(m_resultGPR);
</span><span class="cx">         for (unsigned i = m_plans.size(); i--;)
</span><span class="cx">             jit-&gt;silentFill(m_plans[i], canTrample);
</span><ins>+        jit-&gt;m_jit.exceptionCheck();
</ins><span class="cx">         jit-&gt;m_jit.loadPtr(
</span><span class="cx">             MacroAssembler::Address(m_resultGPR, DirectArguments::offsetOfLength()), m_lengthGPR);
</span><span class="cx">         jumpTo(jit);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGJITCompilerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.h (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.h        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.h        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -165,11 +165,6 @@
</span><span class="cx">         return functionCall;
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    void exceptionCheck(Jump jumpToHandler)
-    {
-        m_exceptionChecks.append(jumpToHandler);
-    }
-    
</del><span class="cx">     void exceptionCheck()
</span><span class="cx">     {
</span><span class="cx">         m_exceptionChecks.append(emitExceptionCheck());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSaneStringGetByValSlowPathGeneratorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSaneStringGetByValSlowPathGenerator.h (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSaneStringGetByValSlowPathGenerator.h        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/dfg/DFGSaneStringGetByValSlowPathGenerator.h        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -76,6 +76,7 @@
</span><span class="cx">         GPRReg canTrample = SpeculativeJIT::pickCanTrample(extractResult(m_resultRegs));
</span><span class="cx">         for (unsigned i = m_plans.size(); i--;)
</span><span class="cx">             jit-&gt;silentFill(m_plans[i], canTrample);
</span><ins>+        jit-&gt;m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         jumpTo(jit);
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSlowPathGeneratorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSlowPathGenerator.h (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSlowPathGenerator.h        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/dfg/DFGSlowPathGenerator.h        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -88,15 +88,21 @@
</span><span class="cx">     MacroAssembler::Label m_to;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+enum class ExceptionCheckRequirement {
+    CheckNeeded,
+    CheckNotNeeded
+};
+
</ins><span class="cx"> template&lt;typename JumpType, typename FunctionType, typename ResultType&gt;
</span><span class="cx"> class CallSlowPathGenerator : public JumpingSlowPathGenerator&lt;JumpType&gt; {
</span><span class="cx"> public:
</span><span class="cx">     CallSlowPathGenerator(
</span><span class="cx">         JumpType from, SpeculativeJIT* jit, FunctionType function,
</span><del>-        SpillRegistersMode spillMode, ResultType result)
</del><ins>+        SpillRegistersMode spillMode, ExceptionCheckRequirement requirement, ResultType result)
</ins><span class="cx">         : JumpingSlowPathGenerator&lt;JumpType&gt;(from, jit)
</span><span class="cx">         , m_function(function)
</span><span class="cx">         , m_spillMode(spillMode)
</span><ins>+        , m_exceptionCheckRequirement(requirement)
</ins><span class="cx">         , m_result(result)
</span><span class="cx">     {
</span><span class="cx">         if (m_spillMode == NeedToSpill)
</span><span class="lines">@@ -130,11 +136,14 @@
</span><span class="cx">             for (unsigned i = m_plans.size(); i--;)
</span><span class="cx">                 jit-&gt;silentFill(m_plans[i], canTrample);
</span><span class="cx">         }
</span><ins>+        if (m_exceptionCheckRequirement == ExceptionCheckRequirement::CheckNeeded)
+            jit-&gt;m_jit.exceptionCheck();
</ins><span class="cx">         this-&gt;jumpTo(jit);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     FunctionType m_function;
</span><span class="cx">     SpillRegistersMode m_spillMode;
</span><ins>+    ExceptionCheckRequirement m_exceptionCheckRequirement;
</ins><span class="cx">     ResultType m_result;
</span><span class="cx">     MacroAssembler::Call m_call;
</span><span class="cx">     Vector&lt;SilentRegisterSavePlan, 2&gt; m_plans;
</span><span class="lines">@@ -146,9 +155,9 @@
</span><span class="cx"> public:
</span><span class="cx">     CallResultAndNoArgumentsSlowPathGenerator(
</span><span class="cx">         JumpType from, SpeculativeJIT* jit, FunctionType function,
</span><del>-        SpillRegistersMode spillMode, ResultType result)
</del><ins>+        SpillRegistersMode spillMode, ExceptionCheckRequirement requirement, ResultType result)
</ins><span class="cx">         : CallSlowPathGenerator&lt;JumpType, FunctionType, ResultType&gt;(
</span><del>-            from, jit, function, spillMode, result)
</del><ins>+            from, jit, function, spillMode, requirement, result)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -169,9 +178,9 @@
</span><span class="cx"> public:
</span><span class="cx">     CallResultAndOneArgumentSlowPathGenerator(
</span><span class="cx">         JumpType from, SpeculativeJIT* jit, FunctionType function,
</span><del>-        SpillRegistersMode spillMode, ResultType result, ArgumentType1 argument1)
</del><ins>+        SpillRegistersMode spillMode, ExceptionCheckRequirement requirement, ResultType result, ArgumentType1 argument1)
</ins><span class="cx">         : CallSlowPathGenerator&lt;JumpType, FunctionType, ResultType&gt;(
</span><del>-            from, jit, function, spillMode, result)
</del><ins>+            from, jit, function, spillMode, requirement, result)
</ins><span class="cx">         , m_argument1(argument1)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="lines">@@ -195,10 +204,10 @@
</span><span class="cx"> public:
</span><span class="cx">     CallResultAndTwoArgumentsSlowPathGenerator(
</span><span class="cx">         JumpType from, SpeculativeJIT* jit, FunctionType function,
</span><del>-        SpillRegistersMode spillMode, ResultType result, ArgumentType1 argument1,
</del><ins>+        SpillRegistersMode spillMode, ExceptionCheckRequirement requirement, ResultType result, ArgumentType1 argument1,
</ins><span class="cx">         ArgumentType2 argument2)
</span><span class="cx">         : CallSlowPathGenerator&lt;JumpType, FunctionType, ResultType&gt;(
</span><del>-            from, jit, function, spillMode, result)
</del><ins>+            from, jit, function, spillMode, requirement, result)
</ins><span class="cx">         , m_argument1(argument1)
</span><span class="cx">         , m_argument2(argument2)
</span><span class="cx">     {
</span><span class="lines">@@ -224,10 +233,10 @@
</span><span class="cx"> public:
</span><span class="cx">     CallResultAndThreeArgumentsSlowPathGenerator(
</span><span class="cx">         JumpType from, SpeculativeJIT* jit, FunctionType function,
</span><del>-        SpillRegistersMode spillMode, ResultType result, ArgumentType1 argument1,
</del><ins>+        SpillRegistersMode spillMode, ExceptionCheckRequirement requirement, ResultType result, ArgumentType1 argument1,
</ins><span class="cx">         ArgumentType2 argument2, ArgumentType3 argument3)
</span><span class="cx">         : CallSlowPathGenerator&lt;JumpType, FunctionType, ResultType&gt;(
</span><del>-            from, jit, function, spillMode, result)
</del><ins>+            from, jit, function, spillMode, requirement, result)
</ins><span class="cx">         , m_argument1(argument1)
</span><span class="cx">         , m_argument2(argument2)
</span><span class="cx">         , m_argument3(argument3)
</span><span class="lines">@@ -259,10 +268,10 @@
</span><span class="cx"> public:
</span><span class="cx">     CallResultAndFourArgumentsSlowPathGenerator(
</span><span class="cx">         JumpType from, SpeculativeJIT* jit, FunctionType function,
</span><del>-        SpillRegistersMode spillMode, ResultType result, ArgumentType1 argument1,
</del><ins>+        SpillRegistersMode spillMode, ExceptionCheckRequirement requirement, ResultType result, ArgumentType1 argument1,
</ins><span class="cx">         ArgumentType2 argument2, ArgumentType3 argument3, ArgumentType4 argument4)
</span><span class="cx">         : CallSlowPathGenerator&lt;JumpType, FunctionType, ResultType&gt;(
</span><del>-            from, jit, function, spillMode, result)
</del><ins>+            from, jit, function, spillMode, requirement, result)
</ins><span class="cx">         , m_argument1(argument1)
</span><span class="cx">         , m_argument2(argument2)
</span><span class="cx">         , m_argument3(argument3)
</span><span class="lines">@@ -296,11 +305,11 @@
</span><span class="cx"> public:
</span><span class="cx">     CallResultAndFiveArgumentsSlowPathGenerator(
</span><span class="cx">         JumpType from, SpeculativeJIT* jit, FunctionType function,
</span><del>-        SpillRegistersMode spillMode, ResultType result, ArgumentType1 argument1,
</del><ins>+        SpillRegistersMode spillMode, ExceptionCheckRequirement requirement, ResultType result, ArgumentType1 argument1,
</ins><span class="cx">         ArgumentType2 argument2, ArgumentType3 argument3, ArgumentType4 argument4,
</span><span class="cx">         ArgumentType5 argument5)
</span><span class="cx">         : CallSlowPathGenerator&lt;JumpType, FunctionType, ResultType&gt;(
</span><del>-            from, jit, function, spillMode, result)
</del><ins>+            from, jit, function, spillMode, requirement, result)
</ins><span class="cx">         , m_argument1(argument1)
</span><span class="cx">         , m_argument2(argument2)
</span><span class="cx">         , m_argument3(argument3)
</span><span class="lines">@@ -330,10 +339,10 @@
</span><span class="cx"> template&lt;typename JumpType, typename FunctionType, typename ResultType&gt;
</span><span class="cx"> inline std::unique_ptr&lt;SlowPathGenerator&gt; slowPathCall(
</span><span class="cx">     JumpType from, SpeculativeJIT* jit, FunctionType function,
</span><del>-    ResultType result, SpillRegistersMode spillMode = NeedToSpill)
</del><ins>+    ResultType result, SpillRegistersMode spillMode = NeedToSpill, ExceptionCheckRequirement requirement = ExceptionCheckRequirement::CheckNeeded)
</ins><span class="cx"> {
</span><span class="cx">     return std::make_unique&lt;CallResultAndNoArgumentsSlowPathGenerator&lt;JumpType, FunctionType, ResultType&gt;&gt;(
</span><del>-        from, jit, function, spillMode, result);
</del><ins>+        from, jit, function, spillMode, requirement, result);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;
</span><span class="lines">@@ -342,10 +351,10 @@
</span><span class="cx"> inline std::unique_ptr&lt;SlowPathGenerator&gt; slowPathCall(
</span><span class="cx">     JumpType from, SpeculativeJIT* jit, FunctionType function,
</span><span class="cx">     ResultType result, ArgumentType1 argument1,
</span><del>-    SpillRegistersMode spillMode = NeedToSpill)
</del><ins>+    SpillRegistersMode spillMode = NeedToSpill, ExceptionCheckRequirement requirement = ExceptionCheckRequirement::CheckNeeded)
</ins><span class="cx"> {
</span><span class="cx">     return std::make_unique&lt;CallResultAndOneArgumentSlowPathGenerator&lt;JumpType, FunctionType, ResultType, ArgumentType1&gt;&gt;(
</span><del>-        from, jit, function, spillMode, result, argument1);
</del><ins>+        from, jit, function, spillMode, requirement, result, argument1);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;
</span><span class="lines">@@ -354,10 +363,10 @@
</span><span class="cx"> inline std::unique_ptr&lt;SlowPathGenerator&gt; slowPathCall(
</span><span class="cx">     JumpType from, SpeculativeJIT* jit, FunctionType function,
</span><span class="cx">     ResultType result, ArgumentType1 argument1, ArgumentType2 argument2,
</span><del>-    SpillRegistersMode spillMode = NeedToSpill)
</del><ins>+    SpillRegistersMode spillMode = NeedToSpill, ExceptionCheckRequirement requirement = ExceptionCheckRequirement::CheckNeeded)
</ins><span class="cx"> {
</span><span class="cx">     return std::make_unique&lt;CallResultAndTwoArgumentsSlowPathGenerator&lt;JumpType, FunctionType, ResultType, ArgumentType1, ArgumentType2&gt;&gt;(
</span><del>-        from, jit, function, spillMode, result, argument1, argument2);
</del><ins>+        from, jit, function, spillMode, requirement, result, argument1, argument2);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;
</span><span class="lines">@@ -366,10 +375,10 @@
</span><span class="cx"> inline std::unique_ptr&lt;SlowPathGenerator&gt; slowPathCall(
</span><span class="cx">     JumpType from, SpeculativeJIT* jit, FunctionType function,
</span><span class="cx">     ResultType result, ArgumentType1 argument1, ArgumentType2 argument2,
</span><del>-    ArgumentType3 argument3, SpillRegistersMode spillMode = NeedToSpill)
</del><ins>+    ArgumentType3 argument3, SpillRegistersMode spillMode = NeedToSpill, ExceptionCheckRequirement requirement = ExceptionCheckRequirement::CheckNeeded)
</ins><span class="cx"> {
</span><span class="cx">     return std::make_unique&lt;CallResultAndThreeArgumentsSlowPathGenerator&lt;JumpType, FunctionType, ResultType, ArgumentType1, ArgumentType2,
</span><del>-        ArgumentType3&gt;&gt;(from, jit, function, spillMode, result, argument1, argument2, argument3);
</del><ins>+        ArgumentType3&gt;&gt;(from, jit, function, spillMode, requirement, result, argument1, argument2, argument3);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;
</span><span class="lines">@@ -380,10 +389,10 @@
</span><span class="cx">     JumpType from, SpeculativeJIT* jit, FunctionType function,
</span><span class="cx">     ResultType result, ArgumentType1 argument1, ArgumentType2 argument2,
</span><span class="cx">     ArgumentType3 argument3, ArgumentType4 argument4,
</span><del>-    SpillRegistersMode spillMode = NeedToSpill)
</del><ins>+    SpillRegistersMode spillMode = NeedToSpill, ExceptionCheckRequirement requirement = ExceptionCheckRequirement::CheckNeeded)
</ins><span class="cx"> {
</span><span class="cx">     return std::make_unique&lt;CallResultAndFourArgumentsSlowPathGenerator&lt;JumpType, FunctionType, ResultType, ArgumentType1, ArgumentType2,
</span><del>-        ArgumentType3, ArgumentType4&gt;&gt;(from, jit, function, spillMode, result, argument1, argument2, argument3, argument4);
</del><ins>+        ArgumentType3, ArgumentType4&gt;&gt;(from, jit, function, spillMode, requirement, result, argument1, argument2, argument3, argument4);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;
</span><span class="lines">@@ -394,10 +403,10 @@
</span><span class="cx">     JumpType from, SpeculativeJIT* jit, FunctionType function,
</span><span class="cx">     ResultType result, ArgumentType1 argument1, ArgumentType2 argument2,
</span><span class="cx">     ArgumentType3 argument3, ArgumentType4 argument4, ArgumentType5 argument5,
</span><del>-    SpillRegistersMode spillMode = NeedToSpill)
</del><ins>+    SpillRegistersMode spillMode = NeedToSpill, ExceptionCheckRequirement requirement = ExceptionCheckRequirement::CheckNeeded)
</ins><span class="cx"> {
</span><span class="cx">     return std::make_unique&lt;CallResultAndFiveArgumentsSlowPathGenerator&lt;JumpType, FunctionType, ResultType, ArgumentType1, ArgumentType2,
</span><del>-        ArgumentType3, ArgumentType4, ArgumentType5&gt;&gt;(from, jit, function, spillMode, result, argument1, argument2, argument3,
</del><ins>+        ArgumentType3, ArgumentType4, ArgumentType5&gt;&gt;(from, jit, function, spillMode, requirement, result, argument1, argument2, argument3,
</ins><span class="cx">         argument4, argument5);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJITcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -993,6 +993,7 @@
</span><span class="cx">     callOperation(
</span><span class="cx">         operationGenericIn, extractResult(JSValueRegs::payloadOnly(resultGPR)),
</span><span class="cx">         baseGPR, regs);
</span><ins>+    m_jit.exceptionCheck();
</ins><span class="cx">     blessedBooleanResult(resultGPR, node, UseChildrenCalledExplicitly);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1501,6 +1502,8 @@
</span><span class="cx">             dataLog(&quot;\n&quot;);
</span><span class="cx">         }
</span><span class="cx">         
</span><ins>+        m_jit.jitAssertNoException();
+
</ins><span class="cx">         compile(m_currentNode);
</span><span class="cx">         
</span><span class="cx">         if (belongsInMinifiedGraph(m_currentNode-&gt;op()))
</span><span class="lines">@@ -1993,6 +1996,7 @@
</span><span class="cx">             silentSpillAllRegisters(resultGpr);
</span><span class="cx">             callOperation(toInt32, resultGpr, fpr);
</span><span class="cx">             silentFillAllRegisters(resultGpr);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx"> 
</span><span class="cx">             converted.append(m_jit.jump());
</span><span class="cx"> 
</span><span class="lines">@@ -2052,6 +2056,7 @@
</span><span class="cx">                 silentSpillAllRegisters(resultGpr);
</span><span class="cx">                 callOperation(toInt32, resultGpr, fpr);
</span><span class="cx">                 silentFillAllRegisters(resultGpr);
</span><ins>+                m_jit.exceptionCheck();
</ins><span class="cx"> 
</span><span class="cx">                 converted.append(m_jit.jump());
</span><span class="cx"> 
</span><span class="lines">@@ -3724,6 +3729,7 @@
</span><span class="cx">     FPRResult roundedResultAsDouble(this);
</span><span class="cx">     FPRReg resultFPR = roundedResultAsDouble.fpr();
</span><span class="cx">     callOperation(jsRound, resultFPR, valueFPR);
</span><ins>+    m_jit.exceptionCheck();
</ins><span class="cx">     if (producesInteger(node-&gt;arithRoundingMode())) {
</span><span class="cx">         GPRTemporary roundedResultAsInt32(this);
</span><span class="cx">         FPRTemporary scratch(this);
</span><span class="lines">@@ -4666,7 +4672,7 @@
</span><span class="cx">             callOperation(operationNewArrowFunction, resultGPR, scopeGPR, executable, thisValueGPR);
</span><span class="cx">         else
</span><span class="cx">             callOperation(operationNewFunction, resultGPR, scopeGPR, executable);
</span><del>-        
</del><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         cellResult(resultGPR, node);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="lines">@@ -4788,6 +4794,7 @@
</span><span class="cx">         callOperation(operationCreateActivationDirect,
</span><span class="cx">             resultGPR, structure, scopeGPR, table, TrustedImm32(initializationValue.tag()), TrustedImm32(initializationValue.payload()));
</span><span class="cx"> #endif
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         cellResult(resultGPR, node);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="lines">@@ -5038,7 +5045,8 @@
</span><span class="cx">         });
</span><span class="cx">     m_jit.setupArgument(0, [&amp;] (GPRReg destGPR) { m_jit.move(GPRInfo::callFrameRegister, destGPR); });
</span><span class="cx">     
</span><del>-    appendCallWithExceptionCheckSetResult(operationCreateScopedArguments, resultGPR);
</del><ins>+    appendCallSetResult(operationCreateScopedArguments, resultGPR);
+    m_jit.exceptionCheck();
</ins><span class="cx">     
</span><span class="cx">     cellResult(resultGPR, node);
</span><span class="cx"> }
</span><span class="lines">@@ -5065,7 +5073,8 @@
</span><span class="cx">         });
</span><span class="cx">     m_jit.setupArgument(0, [&amp;] (GPRReg destGPR) { m_jit.move(GPRInfo::callFrameRegister, destGPR); });
</span><span class="cx">     
</span><del>-    appendCallWithExceptionCheckSetResult(operationCreateClonedArguments, resultGPR);
</del><ins>+    appendCallSetResult(operationCreateClonedArguments, resultGPR);
+    m_jit.exceptionCheck();
</ins><span class="cx">     
</span><span class="cx">     cellResult(resultGPR, node);
</span><span class="cx"> }
</span><span class="lines">@@ -5080,7 +5089,7 @@
</span><span class="cx">         TrustedImm32(IsInvalidated));
</span><span class="cx">     
</span><span class="cx">     addSlowPathGenerator(
</span><del>-        slowPathCall(slowCase, this, operationNotifyWrite, NoResult, set));
</del><ins>+        slowPathCall(slowCase, this, operationNotifyWrite, NoResult, set, NeedToSpill, ExceptionCheckRequirement::CheckNotNeeded));
</ins><span class="cx">     
</span><span class="cx">     noResult(node);
</span><span class="cx"> }
</span><span class="lines">@@ -5112,6 +5121,7 @@
</span><span class="cx">     flushRegisters();
</span><span class="cx">     GPRFlushedCallResult result(this);
</span><span class="cx">     callOperation(operationRegExpTest, result.gpr(), baseGPR, argumentGPR);
</span><ins>+    m_jit.exceptionCheck();
</ins><span class="cx"> 
</span><span class="cx">     branchTest32(invert ? JITCompiler::Zero : JITCompiler::NonZero, result.gpr(), taken);
</span><span class="cx">     jump(notTaken);
</span><span class="lines">@@ -5247,6 +5257,7 @@
</span><span class="cx"> 
</span><span class="cx">         GPRFlushedCallResult result(this);
</span><span class="cx">         callOperation(operationReallocateButterflyToHavePropertyStorageWithInitialCapacity, result.gpr(), baseGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         storageResult(result.gpr(), node);
</span><span class="cx">         return;
</span><span class="lines">@@ -5290,6 +5301,7 @@
</span><span class="cx"> 
</span><span class="cx">         GPRFlushedCallResult result(this);
</span><span class="cx">         callOperation(operationReallocateButterflyToGrowPropertyStorage, result.gpr(), baseGPR, newSize / sizeof(JSValue));
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx"> 
</span><span class="cx">         storageResult(result.gpr(), node);
</span><span class="cx">         return;
</span><span class="lines">@@ -5397,6 +5409,7 @@
</span><span class="cx">             ASSERT(node-&gt;op() == CallStringConstructor);
</span><span class="cx">             callOperation(operationCallStringConstructorOnCell, resultGPR, op1GPR);
</span><span class="cx">         }
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         if (done.isSet())
</span><span class="cx">             done.link(&amp;m_jit);
</span><span class="cx">         cellResult(resultGPR, node);
</span><span class="lines">@@ -6019,6 +6032,7 @@
</span><span class="cx">         silentSpillAllRegisters(scratch);
</span><span class="cx">         callOperation(operationFindSwitchImmTargetForDouble, scratch, valueRegs, data-&gt;switchTableIndex);
</span><span class="cx">         silentFillAllRegisters(scratch);
</span><ins>+
</ins><span class="cx">         m_jit.jump(scratch);
</span><span class="cx"> #endif
</span><span class="cx">         noResult(node, UseChildrenCalledExplicitly);
</span><span class="lines">@@ -6278,6 +6292,7 @@
</span><span class="cx">         flushRegisters();
</span><span class="cx">         callOperation(
</span><span class="cx">             operationSwitchString, string, data-&gt;switchTableIndex, string);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         m_jit.jump(string);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="lines">@@ -6315,6 +6330,7 @@
</span><span class="cx">     silentSpillAllRegisters(string);
</span><span class="cx">     callOperation(operationSwitchString, string, data-&gt;switchTableIndex, string);
</span><span class="cx">     silentFillAllRegisters(string);
</span><ins>+    m_jit.exceptionCheck();
</ins><span class="cx">     m_jit.jump(string);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJITh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -891,239 +891,239 @@
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_E operation)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsExecState();
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_E operation, GPRReg result)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsExecState();
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EC operation, GPRReg result, GPRReg cell)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(cell);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EO operation, GPRReg result, GPRReg object)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(object);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EOS operation, GPRReg result, GPRReg object, size_t size)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(object, TrustedImmPtr(size));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EOZ operation, GPRReg result, GPRReg object, int32_t size)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(object, TrustedImmPtr(size));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EOZ operation, GPRReg result, GPRReg object, int32_t size)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(object, TrustedImmPtr(static_cast&lt;size_t&gt;(size)));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EPS operation, GPRReg result, GPRReg old, size_t size)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(old, TrustedImmPtr(size));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_ES operation, GPRReg result, size_t size)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(size));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_ESJss operation, GPRReg result, size_t index, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(index), arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_ESt operation, GPRReg result, Structure* structure)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EStZ operation, GPRReg result, Structure* structure, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EStZ operation, GPRReg result, Structure* structure, size_t arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), TrustedImm32(arg2));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EStZ operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EStPS operation, GPRReg result, Structure* structure, void* pointer, size_t size)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), TrustedImmPtr(pointer), TrustedImmPtr(size));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EStSS operation, GPRReg result, Structure* structure, size_t index, size_t size)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), TrustedImmPtr(index), TrustedImmPtr(size));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_E operation, GPRReg result)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsExecState();
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EC operation, GPRReg result, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EC operation, GPRReg result, JSCell* cell)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(cell));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_ECZ operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_ECZC operation, GPRReg result, GPRReg arg1, GPRReg arg2, GPRReg arg3)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, arg3);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EJscC operation, GPRReg result, GPRReg arg1, JSCell* cell)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(cell));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EIcf operation, GPRReg result, InlineCallFrame* inlineCallFrame)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(inlineCallFrame));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_ESt operation, GPRReg result, Structure* structure)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> #if USE(JSVALUE64)
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EStJscSymtabJ operation, GPRReg result, Structure* structure, GPRReg scope, SymbolTable* table, TrustedImm64 initialValue)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), scope, TrustedImmPtr(table), initialValue);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> #else
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EStJscSymtabJ operation, GPRReg result, Structure* structure, GPRReg scope, SymbolTable* table, TrustedImm32 tag, TrustedImm32 payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), scope, TrustedImmPtr(table), payload, tag);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EStZ operation, GPRReg result, Structure* structure, unsigned knownLength)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), TrustedImm32(knownLength));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EStZZ operation, GPRReg result, Structure* structure, unsigned knownLength, unsigned minCapacity)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), TrustedImm32(knownLength), TrustedImm32(minCapacity));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EStZ operation, GPRReg result, Structure* structure, GPRReg length)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), length);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EStZZ operation, GPRReg result, Structure* structure, GPRReg length, unsigned minCapacity)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), length, TrustedImm32(minCapacity));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EJssSt operation, GPRReg result, GPRReg arg1, Structure* structure)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(structure));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EJssJss operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EJssJssJss operation, GPRReg result, GPRReg arg1, GPRReg arg2, GPRReg arg3)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, arg3);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(S_JITOperation_ECC operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(S_JITOperation_EGC operation, GPRReg result, JSGlobalObject* globalObject, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(globalObject), arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EGC operation, GPRReg result, JSGlobalObject* globalObject, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(globalObject), arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(Jss_JITOperation_EZ operation, GPRReg result, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EC operation, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EC operation, JSCell* arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(arg1));
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_ECIcf operation, GPRReg arg1, InlineCallFrame* inlineCallFrame)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(inlineCallFrame));
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_ECCIcf operation, GPRReg arg1, GPRReg arg2, InlineCallFrame* inlineCallFrame)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(inlineCallFrame));
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_ECZ operation, GPRReg arg1, int arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImm32(arg2));
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_ECC operation, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_ECC operation, GPRReg arg1, JSCell* arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(arg2));
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_ECC operation, JSCell* arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(arg1), arg2);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperationWithCallFrameRollbackOnException(V_JITOperation_ECb operation, void* pointer)
</span><span class="lines">@@ -1140,7 +1140,7 @@
</span><span class="cx">     JITCompiler::Call callOperation(Z_JITOperation_EC operation, GPRReg result, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     template&lt;typename FunctionType&gt;
</span><span class="lines">@@ -1192,34 +1192,34 @@
</span><span class="cx">     JITCompiler::Call callOperation(T_JITOperation_EJss operation, GPRReg result, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EJscZ operation, GPRReg result, GPRReg arg1, int32_t arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImm32(arg2));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EZ operation, GPRReg result, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EZ operation, GPRReg result, int32_t arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImm32(arg1));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJscC operation, GPRReg result, GPRReg arg1, JSCell* cell)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(cell));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJscCJ operation, GPRReg result, GPRReg arg1, JSCell* cell, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(cell), arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EWs operation, WatchpointSet* watchpointSet)
</span><span class="lines">@@ -1232,12 +1232,12 @@
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_E operation, GPRReg result)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsExecState();
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EP operation, GPRReg result, void* pointer)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(pointer));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(Z_JITOperation_D operation, GPRReg result, FPRReg arg1)
</span><span class="cx">     {
</span><span class="lines">@@ -1259,102 +1259,102 @@
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EI operation, GPRReg result, UniquedStringImpl* uid)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(uid));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EA operation, GPRReg result, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EAZ operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJssZ operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EPS operation, GPRReg result, void* pointer, size_t size)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(pointer), TrustedImmPtr(size));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ESS operation, GPRReg result, int startConstant, int numConstants)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImm32(startConstant), TrustedImm32(numConstants));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EPP operation, GPRReg result, GPRReg arg1, void* pointer)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(pointer));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EC operation, GPRReg result, JSCell* cell)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(cell));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ECZ operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ESsiCI operation, GPRReg result, StructureStubInfo* stubInfo, GPRReg arg1, const UniquedStringImpl* uid)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(stubInfo), arg1, TrustedImmPtr(uid));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ESsiJI operation, GPRReg result, StructureStubInfo* stubInfo, GPRReg arg1, UniquedStringImpl* uid)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(stubInfo), arg1, TrustedImmPtr(uid));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EDA operation, GPRReg result, FPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJC operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJZ operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJA operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EP operation, GPRReg result, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EZ operation, GPRReg result, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EZ operation, GPRReg result, int32_t arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImm32(arg1));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EZZ operation, GPRReg result, int32_t arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImm32(arg1), arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EZIcfZ operation, GPRReg result, int32_t arg1, InlineCallFrame* inlineCallFrame, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImm32(arg1), TrustedImmPtr(inlineCallFrame), arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EJS operation, GPRReg result, GPRReg value, size_t index)
</span><span class="lines">@@ -1366,28 +1366,28 @@
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EStJ operation, GPRReg result, Structure* structure, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EJ operation, GPRReg result, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EJJC operation, GPRReg result, GPRReg arg1, GPRReg arg2, GPRReg arg3)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, arg3);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EJZ operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EJZC operation, GPRReg result, GPRReg arg1, GPRReg arg2, GPRReg arg3)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, arg3);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(S_JITOperation_J operation, GPRReg result, GPRReg arg1)
</span><span class="cx">     {
</span><span class="lines">@@ -1397,122 +1397,122 @@
</span><span class="cx">     JITCompiler::Call callOperation(S_JITOperation_EJ operation, GPRReg result, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJ operation, GPRReg result, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(S_JITOperation_EJJ operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EPP operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJJ operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJJ operation, GPRReg result, GPRReg arg1, MacroAssembler::TrustedImm32 imm)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, MacroAssembler::TrustedImm64(JSValue::encode(jsNumber(imm.m_value))));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJJ operation, GPRReg result, MacroAssembler::TrustedImm32 imm, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(MacroAssembler::TrustedImm64(JSValue::encode(jsNumber(imm.m_value))), arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ECC operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ECJ operation, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ECJ operation, GPRReg result, GPRReg arg1, JSValueRegs arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2.gpr());
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EOZD operation, GPRReg arg1, GPRReg arg2, FPRReg arg3)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, arg3);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EJ operation, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EJPP operation, GPRReg arg1, GPRReg arg2, void* pointer)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(pointer));
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_ESsiJJI operation, StructureStubInfo* stubInfo, GPRReg arg1, GPRReg arg2, UniquedStringImpl* uid)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(stubInfo), arg1, arg2, TrustedImmPtr(uid));
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EJJJ operation, GPRReg arg1, GPRReg arg2, GPRReg arg3)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, arg3);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EPZJ operation, GPRReg arg1, GPRReg arg2, GPRReg arg3)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, arg3);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EOZJ operation, GPRReg arg1, GPRReg arg2, GPRReg arg3)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, arg3);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_ECJJ operation, GPRReg arg1, GPRReg arg2, GPRReg arg3)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, arg3);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(D_JITOperation_EJ operation, FPRReg result, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(Z_JITOperation_EJZZ operation, GPRReg result, GPRReg arg1, unsigned arg2, unsigned arg3)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImm32(arg2), TrustedImm32(arg3));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(F_JITOperation_EFJZZ operation, GPRReg result, GPRReg arg1, GPRReg arg2, unsigned arg3, GPRReg arg4)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImm32(arg3), arg4);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(Z_JITOperation_EJZ operation, GPRReg result, GPRReg arg1, unsigned arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImm32(arg2));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EZJZZZ operation, unsigned arg1, GPRReg arg2, unsigned arg3, GPRReg arg4, unsigned arg5)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImm32(arg1), arg2, TrustedImm32(arg3), arg4, TrustedImm32(arg5));
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx"> #else // USE(JSVALUE32_64)
</span><span class="cx"> 
</span><span class="lines">@@ -1544,148 +1544,148 @@
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_E operation, GPRReg resultTag, GPRReg resultPayload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsExecState();
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EP operation, GPRReg resultTag, GPRReg resultPayload, void* pointer)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(pointer));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EPP operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1, void* pointer)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(pointer));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EP operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EI operation, GPRReg resultTag, GPRReg resultPayload, UniquedStringImpl* uid)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(uid));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EA operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EAZ operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJ operation, GPRReg resultPayload, GPRReg resultTag, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJC operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1Tag, GPRReg arg1Payload, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJssZ operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EPS operation, GPRReg resultTag, GPRReg resultPayload, void* pointer, size_t size)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(pointer), TrustedImmPtr(size));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ESS operation, GPRReg resultTag, GPRReg resultPayload, int startConstant, int numConstants)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImm32(startConstant), TrustedImm32(numConstants));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJP operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1Tag, GPRReg arg1Payload, void* pointer)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, TrustedImmPtr(pointer));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJP operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1Tag, GPRReg arg1Payload, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EC operation, GPRReg resultTag, GPRReg resultPayload, JSCell* cell)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(cell));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ECZ operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJscC operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1, JSCell* cell)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(cell));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJscCJ operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1, JSCell* cell, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(cell), arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ESsiCI operation, GPRReg resultTag, GPRReg resultPayload, StructureStubInfo* stubInfo, GPRReg arg1, const UniquedStringImpl* uid)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(stubInfo), arg1, TrustedImmPtr(uid));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ESsiJI operation, GPRReg resultTag, GPRReg resultPayload, StructureStubInfo* stubInfo, GPRReg arg1Tag, GPRReg arg1Payload, UniquedStringImpl* uid)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(stubInfo), arg1Payload, arg1Tag, TrustedImmPtr(uid));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ESsiJI operation, GPRReg resultTag, GPRReg resultPayload, StructureStubInfo* stubInfo, int32_t arg1Tag, GPRReg arg1Payload, UniquedStringImpl* uid)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(stubInfo), arg1Payload, TrustedImm32(arg1Tag), TrustedImmPtr(uid));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EDA operation, GPRReg resultTag, GPRReg resultPayload, FPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJA operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1Tag, GPRReg arg1Payload, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJA operation, GPRReg resultTag, GPRReg resultPayload, TrustedImm32 arg1Tag, GPRReg arg1Payload, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJ operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1Tag, GPRReg arg1Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EZ operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EZ operation, GPRReg resultTag, GPRReg resultPayload, int32_t arg1)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImm32(arg1));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EZIcfZ operation, GPRReg resultTag, GPRReg resultPayload, int32_t arg1, InlineCallFrame* inlineCallFrame, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImm32(arg1), TrustedImmPtr(inlineCallFrame), arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EZZ operation, GPRReg resultTag, GPRReg resultPayload, int32_t arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImm32(arg1), arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EJS operation, GPRReg result, JSValueRegs value, size_t index)
</span><span class="lines">@@ -1697,137 +1697,132 @@
</span><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EStJ operation, GPRReg result, Structure* structure, GPRReg arg2Tag, GPRReg arg2Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), arg2Payload, arg2Tag);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(C_JITOperation_EJ operation, GPRReg result, GPRReg arg1Tag, GPRReg arg1Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
-    }
-    JITCompiler::Call callOperation(S_JITOperation_J operation, GPRReg result, GPRReg arg1Tag, GPRReg arg1Payload)
-    {
-        m_jit.setupArguments(arg1Payload, arg1Tag);
</del><span class="cx">         return appendCallSetResult(operation, result);
</span><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(S_JITOperation_EJ operation, GPRReg result, GPRReg arg1Tag, GPRReg arg1Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(S_JITOperation_EJJ operation, GPRReg result, GPRReg arg1Tag, GPRReg arg1Payload, GPRReg arg2Tag, GPRReg arg2Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, SH4_32BIT_DUMMY_ARG arg2Payload, arg2Tag);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJJ operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1Tag, GPRReg arg1Payload, GPRReg arg2Tag, GPRReg arg2Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, SH4_32BIT_DUMMY_ARG arg2Payload, arg2Tag);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJJ operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1Tag, GPRReg arg1Payload, MacroAssembler::TrustedImm32 imm)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, SH4_32BIT_DUMMY_ARG imm, TrustedImm32(JSValue::Int32Tag));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_EJJ operation, GPRReg resultTag, GPRReg resultPayload, MacroAssembler::TrustedImm32 imm, GPRReg arg2Tag, GPRReg arg2Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG imm, TrustedImm32(JSValue::Int32Tag), SH4_32BIT_DUMMY_ARG arg2Payload, arg2Tag);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ECJ operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1, GPRReg arg2Tag, GPRReg arg2Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2Payload, arg2Tag);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ECJ operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1, GPRReg arg2Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2Payload, MacroAssembler::TrustedImm32(JSValue::CellTag));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ECJ operation, JSValueRegs result, GPRReg arg1, JSValueRegs arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2.payloadGPR(), arg2.tagGPR());
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result.payloadGPR(), result.tagGPR());
</del><ins>+        return appendCallSetResult(operation, result.payloadGPR(), result.tagGPR());
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(J_JITOperation_ECC operation, GPRReg resultTag, GPRReg resultPayload, GPRReg arg1, GPRReg arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, resultPayload, resultTag);
</del><ins>+        return appendCallSetResult(operation, resultPayload, resultTag);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EOZD operation, GPRReg arg1, GPRReg arg2, FPRReg arg3)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, EABI_32BIT_DUMMY_ARG arg3);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EJ operation, GPRReg arg1Tag, GPRReg arg1Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EJPP operation, GPRReg arg1Tag, GPRReg arg1Payload, GPRReg arg2, void* pointer)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, arg2, TrustedImmPtr(pointer));
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_ESsiJJI operation, StructureStubInfo* stubInfo, GPRReg arg1Tag, GPRReg arg1Payload, GPRReg arg2Payload, UniquedStringImpl* uid)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(stubInfo), arg1Payload, arg1Tag, arg2Payload, TrustedImm32(JSValue::CellTag), TrustedImmPtr(uid));
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_ECJJ operation, GPRReg arg1, GPRReg arg2Tag, GPRReg arg2Payload, GPRReg arg3Tag, GPRReg arg3Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2Payload, arg2Tag, arg3Payload, arg3Tag);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EPZJ operation, GPRReg arg1, GPRReg arg2, GPRReg arg3Tag, GPRReg arg3Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, EABI_32BIT_DUMMY_ARG SH4_32BIT_DUMMY_ARG arg3Payload, arg3Tag);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EOZJ operation, GPRReg arg1, GPRReg arg2, GPRReg arg3Tag, GPRReg arg3Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, EABI_32BIT_DUMMY_ARG SH4_32BIT_DUMMY_ARG arg3Payload, arg3Tag);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EOZJ operation, GPRReg arg1, GPRReg arg2, TrustedImm32 arg3Tag, GPRReg arg3Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2, EABI_32BIT_DUMMY_ARG SH4_32BIT_DUMMY_ARG arg3Payload, arg3Tag);
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(D_JITOperation_EJ operation, FPRReg result, GPRReg arg1Tag, GPRReg arg1Payload)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JITCompiler::Call callOperation(Z_JITOperation_EJZZ operation, GPRReg result, GPRReg arg1Tag, GPRReg arg1Payload, unsigned arg2, unsigned arg3)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG  arg1Payload, arg1Tag, TrustedImm32(arg2), TrustedImm32(arg3));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(F_JITOperation_EFJZZ operation, GPRReg result, GPRReg arg1, GPRReg arg2Tag, GPRReg arg2Payload, unsigned arg3, GPRReg arg4)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2Payload, arg2Tag, TrustedImm32(arg3), arg4);
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(Z_JITOperation_EJZ operation, GPRReg result, GPRReg arg1Tag, GPRReg arg1Payload, unsigned arg2)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, TrustedImm32(arg2));
</span><del>-        return appendCallWithExceptionCheckSetResult(operation, result);
</del><ins>+        return appendCallSetResult(operation, result);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call callOperation(V_JITOperation_EZJZZZ operation, unsigned arg1, GPRReg arg2Tag, GPRReg arg2Payload, unsigned arg3, GPRReg arg4, unsigned arg5)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImm32(arg1), arg2Payload, arg2Tag, TrustedImm32(arg3), arg4, TrustedImm32(arg5));
</span><del>-        return appendCallWithExceptionCheck(operation);
</del><ins>+        return appendCall(operation);
</ins><span class="cx">     }
</span><span class="cx"> #undef EABI_32BIT_DUMMY_ARG
</span><span class="cx"> #undef SH4_32BIT_DUMMY_ARG
</span><span class="lines">@@ -1899,30 +1894,19 @@
</span><span class="cx">     void prepareForExternalCall() { }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    // These methods add call instructions, with optional exception checks &amp; setting results.
-    JITCompiler::Call appendCallWithExceptionCheck(const FunctionPtr&amp; function)
</del><ins>+    // These methods add call instructions, optionally setting results, and optionally rolling back the call frame on an exception.
+    JITCompiler::Call appendCall(const FunctionPtr&amp; function)
</ins><span class="cx">     {
</span><span class="cx">         prepareForExternalCall();
</span><span class="cx">         m_jit.emitStoreCodeOrigin(m_currentNode-&gt;origin.semantic);
</span><del>-        JITCompiler::Call call = m_jit.appendCall(function);
-        m_jit.exceptionCheck();
-        return call;
</del><ins>+        return m_jit.appendCall(function);
</ins><span class="cx">     }
</span><span class="cx">     JITCompiler::Call appendCallWithCallFrameRollbackOnException(const FunctionPtr&amp; function)
</span><span class="cx">     {
</span><del>-        prepareForExternalCall();
-        m_jit.emitStoreCodeOrigin(m_currentNode-&gt;origin.semantic);
-        JITCompiler::Call call = m_jit.appendCall(function);
</del><ins>+        JITCompiler::Call call = appendCall(function);
</ins><span class="cx">         m_jit.exceptionCheckWithCallFrameRollback();
</span><span class="cx">         return call;
</span><span class="cx">     }
</span><del>-    JITCompiler::Call appendCallWithExceptionCheckSetResult(const FunctionPtr&amp; function, GPRReg result)
-    {
-        JITCompiler::Call call = appendCallWithExceptionCheck(function);
-        if ((result != InvalidGPRReg) &amp;&amp; (result != GPRInfo::returnValueGPR))
-            m_jit.move(GPRInfo::returnValueGPR, result);
-        return call;
-    }
</del><span class="cx">     JITCompiler::Call appendCallWithCallFrameRollbackOnExceptionSetResult(const FunctionPtr&amp; function, GPRReg result)
</span><span class="cx">     {
</span><span class="cx">         JITCompiler::Call call = appendCallWithCallFrameRollbackOnException(function);
</span><span class="lines">@@ -1932,35 +1916,18 @@
</span><span class="cx">     }
</span><span class="cx">     JITCompiler::Call appendCallSetResult(const FunctionPtr&amp; function, GPRReg result)
</span><span class="cx">     {
</span><del>-        prepareForExternalCall();
-        m_jit.emitStoreCodeOrigin(m_currentNode-&gt;origin.semantic);
-        JITCompiler::Call call = m_jit.appendCall(function);
</del><ins>+        JITCompiler::Call call = appendCall(function);
</ins><span class="cx">         if (result != InvalidGPRReg)
</span><span class="cx">             m_jit.move(GPRInfo::returnValueGPR, result);
</span><span class="cx">         return call;
</span><span class="cx">     }
</span><del>-    JITCompiler::Call appendCall(const FunctionPtr&amp; function)
</del><ins>+    JITCompiler::Call appendCallSetResult(const FunctionPtr&amp; function, GPRReg result1, GPRReg result2)
</ins><span class="cx">     {
</span><del>-        prepareForExternalCall();
-        m_jit.emitStoreCodeOrigin(m_currentNode-&gt;origin.semantic);
-        return m_jit.appendCall(function);
-    }
-    JITCompiler::Call appendCallWithExceptionCheckSetResult(const FunctionPtr&amp; function, GPRReg result1, GPRReg result2)
-    {
-        JITCompiler::Call call = appendCallWithExceptionCheck(function);
</del><ins>+        JITCompiler::Call call = appendCall(function);
</ins><span class="cx">         m_jit.setupResults(result1, result2);
</span><span class="cx">         return call;
</span><span class="cx">     }
</span><span class="cx"> #if CPU(X86)
</span><del>-    JITCompiler::Call appendCallWithExceptionCheckSetResult(const FunctionPtr&amp; function, FPRReg result)
-    {
-        JITCompiler::Call call = appendCallWithExceptionCheck(function);
-        if (result != InvalidFPRReg) {
-            m_jit.assembler().fstpl(0, JITCompiler::stackPointerRegister);
-            m_jit.loadDouble(JITCompiler::stackPointerRegister, result);
-        }
-        return call;
-    }
</del><span class="cx">     JITCompiler::Call appendCallSetResult(const FunctionPtr&amp; function, FPRReg result)
</span><span class="cx">     {
</span><span class="cx">         JITCompiler::Call call = appendCall(function);
</span><span class="lines">@@ -1971,13 +1938,6 @@
</span><span class="cx">         return call;
</span><span class="cx">     }
</span><span class="cx"> #elif CPU(ARM) &amp;&amp; !CPU(ARM_HARDFP)
</span><del>-    JITCompiler::Call appendCallWithExceptionCheckSetResult(const FunctionPtr&amp; function, FPRReg result)
-    {
-        JITCompiler::Call call = appendCallWithExceptionCheck(function);
-        if (result != InvalidFPRReg)
-            m_jit.assembler().vmov(result, GPRInfo::returnValueGPR, GPRInfo::returnValueGPR2);
-        return call;
-    }
</del><span class="cx">     JITCompiler::Call appendCallSetResult(const FunctionPtr&amp; function, FPRReg result)
</span><span class="cx">     {
</span><span class="cx">         JITCompiler::Call call = appendCall(function);
</span><span class="lines">@@ -1986,13 +1946,6 @@
</span><span class="cx">         return call;
</span><span class="cx">     }
</span><span class="cx"> #else // CPU(X86_64) || (CPU(ARM) &amp;&amp; CPU(ARM_HARDFP)) || CPU(ARM64) || CPU(MIPS) || CPU(SH4)
</span><del>-    JITCompiler::Call appendCallWithExceptionCheckSetResult(const FunctionPtr&amp; function, FPRReg result)
-    {
-        JITCompiler::Call call = appendCallWithExceptionCheck(function);
-        if (result != InvalidFPRReg)
-            m_jit.moveDouble(FPRInfo::returnValueFPR, result);
-        return call;
-    }
</del><span class="cx">     JITCompiler::Call appendCallSetResult(const FunctionPtr&amp; function, FPRReg result)
</span><span class="cx">     {
</span><span class="cx">         JITCompiler::Call call = appendCall(function);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -387,6 +387,7 @@
</span><span class="cx"> 
</span><span class="cx">         flushRegisters();
</span><span class="cx">         callOperation(helperFunction, resultGPR, arg1TagGPR, arg1PayloadGPR, arg2TagGPR, arg2PayloadGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx"> 
</span><span class="cx">         branchTest32(callResultCondition, resultGPR, taken);
</span><span class="cx">     } else {
</span><span class="lines">@@ -410,6 +411,7 @@
</span><span class="cx">     
</span><span class="cx">             silentSpillAllRegisters(resultGPR);
</span><span class="cx">             callOperation(helperFunction, resultGPR, arg1TagGPR, arg1PayloadGPR, arg2TagGPR, arg2PayloadGPR);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             silentFillAllRegisters(resultGPR);
</span><span class="cx">         
</span><span class="cx">             branchTest32(callResultCondition, resultGPR, taken);
</span><span class="lines">@@ -431,7 +433,7 @@
</span><span class="cx">         S_JITOperation_EJJ function, GPRReg result, GPRReg arg1Tag, GPRReg arg1Payload,
</span><span class="cx">         GPRReg arg2Tag, GPRReg arg2Payload)
</span><span class="cx">         : CallSlowPathGenerator&lt;JumpType, S_JITOperation_EJJ, GPRReg&gt;(
</span><del>-            from, jit, function, NeedToSpill, result)
</del><ins>+            from, jit, function, NeedToSpill, ExceptionCheckRequirement::CheckNeeded, result)
</ins><span class="cx">         , m_arg1Tag(arg1Tag)
</span><span class="cx">         , m_arg1Payload(arg1Payload)
</span><span class="cx">         , m_arg2Tag(arg2Tag)
</span><span class="lines">@@ -478,6 +480,7 @@
</span><span class="cx"> 
</span><span class="cx">         flushRegisters();
</span><span class="cx">         callOperation(helperFunction, resultPayloadGPR, arg1TagGPR, arg1PayloadGPR, arg2TagGPR, arg2PayloadGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         booleanResult(resultPayloadGPR, node, UseChildrenCalledExplicitly);
</span><span class="cx">     } else {
</span><span class="lines">@@ -538,6 +541,7 @@
</span><span class="cx">         
</span><span class="cx">         silentSpillAllRegisters(resultPayloadGPR);
</span><span class="cx">         callOperation(operationCompareStrictEqCell, resultPayloadGPR, arg1TagGPR, arg1PayloadGPR, arg2TagGPR, arg2PayloadGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         silentFillAllRegisters(resultPayloadGPR);
</span><span class="cx">         
</span><span class="cx">         branchTest32(invert ? JITCompiler::Zero : JITCompiler::NonZero, resultPayloadGPR, taken);
</span><span class="lines">@@ -546,6 +550,7 @@
</span><span class="cx"> 
</span><span class="cx">         silentSpillAllRegisters(resultPayloadGPR);
</span><span class="cx">         callOperation(operationCompareStrictEq, resultPayloadGPR, arg1TagGPR, arg1PayloadGPR, arg2TagGPR, arg2PayloadGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         silentFillAllRegisters(resultPayloadGPR);
</span><span class="cx">         
</span><span class="cx">         branchTest32(invert ? JITCompiler::Zero : JITCompiler::NonZero, resultPayloadGPR, taken);
</span><span class="lines">@@ -582,6 +587,7 @@
</span><span class="cx">         
</span><span class="cx">         silentSpillAllRegisters(resultPayloadGPR);
</span><span class="cx">         callOperation(operationCompareStrictEqCell, resultPayloadGPR, arg1TagGPR, arg1PayloadGPR, arg2TagGPR, arg2PayloadGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         silentFillAllRegisters(resultPayloadGPR);
</span><span class="cx">         
</span><span class="cx">         m_jit.andPtr(JITCompiler::TrustedImm32(1), resultPayloadGPR);
</span><span class="lines">@@ -593,6 +599,7 @@
</span><span class="cx">         silentSpillAllRegisters(resultPayloadGPR);
</span><span class="cx">         callOperation(operationCompareStrictEq, resultPayloadGPR, arg1TagGPR, arg1PayloadGPR, arg2TagGPR, arg2PayloadGPR);
</span><span class="cx">         silentFillAllRegisters(resultPayloadGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         m_jit.andPtr(JITCompiler::TrustedImm32(1), resultPayloadGPR);
</span><span class="cx">     }
</span><span class="lines">@@ -678,6 +685,7 @@
</span><span class="cx">             JITCompiler::Jump done = m_jit.jump();
</span><span class="cx">             slowCase.link(&amp;m_jit);
</span><span class="cx">             callOperation(operationThrowStackOverflowForVarargs);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             m_jit.abortWithReason(DFGVarargsThrowingPathDidNotThrow);
</span><span class="cx">             done.link(&amp;m_jit);
</span><span class="cx">             resultGPR = scratchGPR2;
</span><span class="lines">@@ -710,6 +718,7 @@
</span><span class="cx">             // Right now, arguments is in argumentsTagGPR/argumentsPayloadGPR and the register file is
</span><span class="cx">             // flushed.
</span><span class="cx">             callOperation(operationSizeFrameForVarargs, GPRInfo::returnValueGPR, argumentsTagGPR, argumentsPayloadGPR, numUsedStackSlots, data-&gt;firstVarArgOffset);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             
</span><span class="cx">             // Now we have the argument count of the callee frame, but we've lost the arguments operand.
</span><span class="cx">             // Reconstruct the arguments operand while preserving the callee frame.
</span><span class="lines">@@ -719,6 +728,7 @@
</span><span class="cx">             m_jit.addPtr(TrustedImm32(-(sizeof(CallerFrameAndPC) + WTF::roundUpToMultipleOf(stackAlignmentBytes(), 6 * sizeof(void*)))), scratchGPR1, JITCompiler::stackPointerRegister);
</span><span class="cx">             
</span><span class="cx">             callOperation(operationSetupVarargsFrame, GPRInfo::returnValueGPR, scratchGPR1, argumentsTagGPR, argumentsPayloadGPR, data-&gt;firstVarArgOffset, GPRInfo::returnValueGPR);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             resultGPR = GPRInfo::returnValueGPR;
</span><span class="cx">         }
</span><span class="cx">             
</span><span class="lines">@@ -1514,7 +1524,7 @@
</span><span class="cx">         addSlowPathGenerator(
</span><span class="cx">             slowPathCall(
</span><span class="cx">                 slowCase, this, operationConvertJSValueToBoolean, resultPayloadGPR, arg1TagGPR,
</span><del>-                arg1PayloadGPR));
</del><ins>+                arg1PayloadGPR, NeedToSpill, ExceptionCheckRequirement::CheckNotNeeded));
</ins><span class="cx">     
</span><span class="cx">         m_jit.xor32(TrustedImm32(1), resultPayloadGPR);
</span><span class="cx">         booleanResult(resultPayloadGPR, node, UseChildrenCalledExplicitly);
</span><span class="lines">@@ -2041,6 +2051,7 @@
</span><span class="cx">             callOperation(operationValueAddNotNumber, resultTag.gpr(), resultPayload.gpr(), op1TagGPR, op1PayloadGPR, op2TagGPR, op2PayloadGPR);
</span><span class="cx">         else
</span><span class="cx">             callOperation(operationValueAdd, resultTag.gpr(), resultPayload.gpr(), op1TagGPR, op1PayloadGPR, op2TagGPR, op2PayloadGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         jsValueResult(resultTag.gpr(), resultPayload.gpr(), node);
</span><span class="cx">         break;
</span><span class="lines">@@ -2337,6 +2348,7 @@
</span><span class="cx">             GPRFlushedCallResult2 resultTag(this);
</span><span class="cx">             GPRFlushedCallResult resultPayload(this);
</span><span class="cx">             callOperation(operationGetByValCell, resultTag.gpr(), resultPayload.gpr(), baseGPR, propertyTagGPR, propertyPayloadGPR);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             
</span><span class="cx">             jsValueResult(resultTag.gpr(), resultPayload.gpr(), node);
</span><span class="cx">             break;
</span><span class="lines">@@ -2604,6 +2616,7 @@
</span><span class="cx">                 callOperation(m_jit.codeBlock()-&gt;isStrictMode() ? operationPutByValDirectCellStrict : operationPutByValDirectCellNonStrict, baseGPR, propertyTagGPR, propertyPayloadGPR, valueTagGPR, valuePayloadGPR);
</span><span class="cx">             else
</span><span class="cx">                 callOperation(m_jit.codeBlock()-&gt;isStrictMode() ? operationPutByValCellStrict : operationPutByValCellNonStrict, baseGPR, propertyTagGPR, propertyPayloadGPR, valueTagGPR, valuePayloadGPR);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             
</span><span class="cx">             noResult(node);
</span><span class="cx">             alreadyHandled = true;
</span><span class="lines">@@ -2757,6 +2770,7 @@
</span><span class="cx">             flushRegisters();
</span><span class="cx">             GPRFlushedCallResult result(this);
</span><span class="cx">             callOperation(operationRegExpTest, result.gpr(), baseGPR, argumentGPR);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             
</span><span class="cx">             // Must use jsValueResult because otherwise we screw up register
</span><span class="cx">             // allocation, which thinks that this node has a result.
</span><span class="lines">@@ -2773,6 +2787,7 @@
</span><span class="cx">         GPRFlushedCallResult2 resultTag(this);
</span><span class="cx">         GPRFlushedCallResult resultPayload(this);
</span><span class="cx">         callOperation(operationRegExpExec, resultTag.gpr(), resultPayload.gpr(), baseGPR, argumentGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         jsValueResult(resultTag.gpr(), resultPayload.gpr(), node);
</span><span class="cx">         break;
</span><span class="lines">@@ -2787,6 +2802,7 @@
</span><span class="cx">         flushRegisters();
</span><span class="cx">         GPRFlushedCallResult result(this);
</span><span class="cx">         callOperation(operationRegExpTest, result.gpr(), baseGPR, argumentGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         // If we add a DataFormatBool, we should use it here.
</span><span class="cx">         booleanResult(result.gpr(), node);
</span><span class="lines">@@ -3207,6 +3223,7 @@
</span><span class="cx">                 ASSERT(op == CallStringConstructor);
</span><span class="cx">                 callOperation(operationCallStringConstructor, resultGPR, op1TagGPR, op1PayloadGPR);
</span><span class="cx">             }
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             if (done.isSet())
</span><span class="cx">                 done.link(&amp;m_jit);
</span><span class="cx">             cellResult(resultGPR, node);
</span><span class="lines">@@ -3301,6 +3318,7 @@
</span><span class="cx">             GPRFlushedCallResult result(this);
</span><span class="cx">             callOperation(
</span><span class="cx">                 operationNewEmptyArray, result.gpr(), globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(node-&gt;indexingType()));
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             cellResult(result.gpr(), node);
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -3378,6 +3396,7 @@
</span><span class="cx">         callOperation(
</span><span class="cx">             operationNewArray, result.gpr(), globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(node-&gt;indexingType()),
</span><span class="cx">             static_cast&lt;void*&gt;(buffer), node-&gt;numChildren());
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx"> 
</span><span class="cx">         if (scratchSize) {
</span><span class="cx">             GPRTemporary scratch(this);
</span><span class="lines">@@ -3458,6 +3477,7 @@
</span><span class="cx">         done.link(&amp;m_jit);
</span><span class="cx">         callOperation(
</span><span class="cx">             operationNewArrayWithSize, resultGPR, structureGPR, sizeGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         cellResult(resultGPR, node);
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -3503,6 +3523,7 @@
</span><span class="cx">         GPRFlushedCallResult result(this);
</span><span class="cx">         
</span><span class="cx">         callOperation(operationNewArrayBuffer, result.gpr(), globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(node-&gt;indexingType()), node-&gt;startConstant(), node-&gt;numConstants());
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         cellResult(result.gpr(), node);
</span><span class="cx">         break;
</span><span class="lines">@@ -3528,6 +3549,7 @@
</span><span class="cx">                 operationNewTypedArrayWithOneArgumentForType(node-&gt;typedArrayType()),
</span><span class="cx">                 resultGPR, globalObject-&gt;typedArrayStructure(node-&gt;typedArrayType()),
</span><span class="cx">                 argumentTagGPR, argumentPayloadGPR);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             
</span><span class="cx">             cellResult(resultGPR, node);
</span><span class="cx">             break;
</span><span class="lines">@@ -3545,6 +3567,7 @@
</span><span class="cx">         GPRFlushedCallResult2 resultTag(this);
</span><span class="cx">         
</span><span class="cx">         callOperation(operationNewRegexp, resultTag.gpr(), resultPayload.gpr(), m_jit.codeBlock()-&gt;regexp(node-&gt;regexpIndex()));
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         // FIXME: make the callOperation above explicitly return a cell result, or jitAssert the tag is a cell tag.
</span><span class="cx">         cellResult(resultPayload.gpr(), node);
</span><span class="lines">@@ -4242,6 +4265,7 @@
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">         callOperation(operationSizeOfVarargs, GPRInfo::returnValueGPR, argumentsTagGPR, argumentsPayloadGPR, data-&gt;offset);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         lock(GPRInfo::returnValueGPR);
</span><span class="cx">         {
</span><span class="lines">@@ -4271,6 +4295,7 @@
</span><span class="cx">         m_jit.store32(argCountIncludingThisGPR, JITCompiler::payloadFor(data-&gt;machineCount));
</span><span class="cx">         
</span><span class="cx">         callOperation(operationLoadVarargs, data-&gt;machineStart.offset(), argumentsTagGPR, argumentsPayloadGPR, data-&gt;offset, GPRInfo::returnValueGPR, data-&gt;mandatoryMinimum);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         noResult(node);
</span><span class="cx">         break;
</span><span class="lines">@@ -4346,6 +4371,7 @@
</span><span class="cx"> 
</span><span class="cx">         flushRegisters();
</span><span class="cx">         callOperation(operationHasGenericProperty, resultTagGPR, resultPayloadGPR, baseTagGPR, basePayloadGPR, property.gpr());
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         booleanResult(resultPayloadGPR, node);
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -4466,6 +4492,7 @@
</span><span class="cx">         flushRegisters();
</span><span class="cx">         m_jit.move(MacroAssembler::TrustedImm32(JSValue::CellTag), scratchGPR);
</span><span class="cx">         callOperation(operationGetByValCell, resultTagGPR, resultPayloadGPR, baseGPR, scratchGPR, propertyGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx"> #else
</span><span class="cx">         GPRTemporary resultPayload(this);
</span><span class="cx">         GPRTemporary resultTag(this);
</span><span class="lines">@@ -4529,6 +4556,7 @@
</span><span class="cx"> 
</span><span class="cx">         flushRegisters();
</span><span class="cx">         callOperation(operationGetPropertyEnumerator, resultGPR, base.gpr());
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         cellResult(resultGPR, node);
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -4572,6 +4600,7 @@
</span><span class="cx"> 
</span><span class="cx">         flushRegisters();
</span><span class="cx">         callOperation(operationToIndexString, resultGPR, index.gpr());
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         cellResult(resultGPR, node);
</span><span class="cx">         break;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJIT64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -339,6 +339,7 @@
</span><span class="cx">     
</span><span class="cx">         flushRegisters();
</span><span class="cx">         callOperation(helperFunction, resultGPR, arg1GPR, arg2GPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx"> 
</span><span class="cx">         branchTest32(callResultCondition, resultGPR, taken);
</span><span class="cx">     } else {
</span><span class="lines">@@ -363,6 +364,7 @@
</span><span class="cx">             silentSpillAllRegisters(resultGPR);
</span><span class="cx">             callOperation(helperFunction, resultGPR, arg1GPR, arg2GPR);
</span><span class="cx">             silentFillAllRegisters(resultGPR);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">             branchTest32(callResultCondition, resultGPR, taken);
</span><span class="cx">         }
</span><span class="lines">@@ -382,7 +384,7 @@
</span><span class="cx">         JumpType from, SpeculativeJIT* jit,
</span><span class="cx">         S_JITOperation_EJJ function, GPRReg result, GPRReg arg1, GPRReg arg2)
</span><span class="cx">         : CallSlowPathGenerator&lt;JumpType, S_JITOperation_EJJ, GPRReg&gt;(
</span><del>-            from, jit, function, NeedToSpill, result)
</del><ins>+            from, jit, function, NeedToSpill, ExceptionCheckRequirement::CheckNeeded, result)
</ins><span class="cx">         , m_arg1(arg1)
</span><span class="cx">         , m_arg2(arg2)
</span><span class="cx">     {
</span><span class="lines">@@ -422,6 +424,7 @@
</span><span class="cx">     
</span><span class="cx">         flushRegisters();
</span><span class="cx">         callOperation(helperFunction, resultGPR, arg1GPR, arg2GPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         m_jit.or32(TrustedImm32(ValueFalse), resultGPR);
</span><span class="cx">         jsValueResult(resultGPR, m_currentNode, DataFormatJSBoolean, UseChildrenCalledExplicitly);
</span><span class="lines">@@ -482,6 +485,7 @@
</span><span class="cx">         silentSpillAllRegisters(resultGPR);
</span><span class="cx">         callOperation(operationCompareStrictEqCell, resultGPR, arg1GPR, arg2GPR);
</span><span class="cx">         silentFillAllRegisters(resultGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         branchTest32(invert ? JITCompiler::Zero : JITCompiler::NonZero, resultGPR, taken);
</span><span class="cx">     } else {
</span><span class="lines">@@ -508,6 +512,7 @@
</span><span class="cx">         silentSpillAllRegisters(resultGPR);
</span><span class="cx">         callOperation(operationCompareStrictEq, resultGPR, arg1GPR, arg2GPR);
</span><span class="cx">         silentFillAllRegisters(resultGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         branchTest32(invert ? JITCompiler::Zero : JITCompiler::NonZero, resultGPR, taken);
</span><span class="cx">     }
</span><span class="lines">@@ -543,6 +548,7 @@
</span><span class="cx">         silentSpillAllRegisters(resultGPR);
</span><span class="cx">         callOperation(operationCompareStrictEqCell, resultGPR, arg1GPR, arg2GPR);
</span><span class="cx">         silentFillAllRegisters(resultGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         m_jit.and64(JITCompiler::TrustedImm32(1), resultGPR);
</span><span class="cx">         m_jit.or32(JITCompiler::TrustedImm32(ValueFalse), resultGPR);
</span><span class="lines">@@ -658,6 +664,7 @@
</span><span class="cx">             JITCompiler::Jump done = m_jit.jump();
</span><span class="cx">             slowCase.link(&amp;m_jit);
</span><span class="cx">             callOperation(operationThrowStackOverflowForVarargs);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             m_jit.abortWithReason(DFGVarargsThrowingPathDidNotThrow);
</span><span class="cx">             done.link(&amp;m_jit);
</span><span class="cx">             resultGPR = scratchGPR2;
</span><span class="lines">@@ -687,6 +694,7 @@
</span><span class="cx">             
</span><span class="cx">             // Right now, arguments is in argumentsGPR and the register file is flushed.
</span><span class="cx">             callOperation(operationSizeFrameForVarargs, GPRInfo::returnValueGPR, argumentsGPR, numUsedStackSlots, data-&gt;firstVarArgOffset);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             
</span><span class="cx">             // Now we have the argument count of the callee frame, but we've lost the arguments operand.
</span><span class="cx">             // Reconstruct the arguments operand while preserving the callee frame.
</span><span class="lines">@@ -696,6 +704,7 @@
</span><span class="cx">             m_jit.addPtr(TrustedImm32(-(sizeof(CallerFrameAndPC) + WTF::roundUpToMultipleOf(stackAlignmentBytes(), 5 * sizeof(void*)))), scratchGPR1, JITCompiler::stackPointerRegister);
</span><span class="cx">             
</span><span class="cx">             callOperation(operationSetupVarargsFrame, GPRInfo::returnValueGPR, scratchGPR1, argumentsGPR, data-&gt;firstVarArgOffset, GPRInfo::returnValueGPR);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             resultGPR = GPRInfo::returnValueGPR;
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="lines">@@ -1660,7 +1669,7 @@
</span><span class="cx">         JITCompiler::Jump slowCase = m_jit.branchTest64(JITCompiler::NonZero, resultGPR, TrustedImm32(static_cast&lt;int32_t&gt;(~1)));
</span><span class="cx">     
</span><span class="cx">         addSlowPathGenerator(
</span><del>-            slowPathCall(slowCase, this, operationConvertJSValueToBoolean, resultGPR, arg1GPR));
</del><ins>+            slowPathCall(slowCase, this, operationConvertJSValueToBoolean, resultGPR, arg1GPR, NeedToSpill, ExceptionCheckRequirement::CheckNotNeeded));
</ins><span class="cx">     
</span><span class="cx">         m_jit.xor64(TrustedImm32(static_cast&lt;int32_t&gt;(ValueTrue)), resultGPR);
</span><span class="cx">         jsValueResult(resultGPR, node, DataFormatJSBoolean, UseChildrenCalledExplicitly);
</span><span class="lines">@@ -2174,6 +2183,7 @@
</span><span class="cx">             callOperation(operationValueAddNotNumber, result.gpr(), op1GPR, op2GPR);
</span><span class="cx">         else
</span><span class="cx">             callOperation(operationValueAdd, result.gpr(), op1GPR, op2GPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         jsValueResult(result.gpr(), node);
</span><span class="cx">         break;
</span><span class="lines">@@ -2455,6 +2465,7 @@
</span><span class="cx">             flushRegisters();
</span><span class="cx">             GPRFlushedCallResult result(this);
</span><span class="cx">             callOperation(operationGetByVal, result.gpr(), baseGPR, propertyGPR);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             
</span><span class="cx">             jsValueResult(result.gpr(), node);
</span><span class="cx">             break;
</span><span class="lines">@@ -2674,6 +2685,7 @@
</span><span class="cx">                 callOperation(m_jit.isStrictModeFor(node-&gt;origin.semantic) ? operationPutByValDirectStrict : operationPutByValDirectNonStrict, arg1GPR, arg2GPR, arg3GPR);
</span><span class="cx">             else
</span><span class="cx">                 callOperation(m_jit.isStrictModeFor(node-&gt;origin.semantic) ? operationPutByValStrict : operationPutByValNonStrict, arg1GPR, arg2GPR, arg3GPR);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             
</span><span class="cx">             noResult(node);
</span><span class="cx">             alreadyHandled = true;
</span><span class="lines">@@ -2885,6 +2897,7 @@
</span><span class="cx">             flushRegisters();
</span><span class="cx">             GPRFlushedCallResult result(this);
</span><span class="cx">             callOperation(operationRegExpTest, result.gpr(), baseGPR, argumentGPR);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             
</span><span class="cx">             // Must use jsValueResult because otherwise we screw up register
</span><span class="cx">             // allocation, which thinks that this node has a result.
</span><span class="lines">@@ -2900,6 +2913,7 @@
</span><span class="cx">         flushRegisters();
</span><span class="cx">         GPRFlushedCallResult result(this);
</span><span class="cx">         callOperation(operationRegExpExec, result.gpr(), baseGPR, argumentGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         jsValueResult(result.gpr(), node);
</span><span class="cx">         break;
</span><span class="lines">@@ -2914,6 +2928,7 @@
</span><span class="cx">         flushRegisters();
</span><span class="cx">         GPRFlushedCallResult result(this);
</span><span class="cx">         callOperation(operationRegExpTest, result.gpr(), baseGPR, argumentGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         // If we add a DataFormatBool, we should use it here.
</span><span class="cx">         m_jit.or32(TrustedImm32(ValueFalse), result.gpr());
</span><span class="lines">@@ -3255,6 +3270,7 @@
</span><span class="cx">                 ASSERT(op == CallStringConstructor);
</span><span class="cx">                 callOperation(operationCallStringConstructor, resultGPR, op1GPR);
</span><span class="cx">             }
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             if (done.isSet())
</span><span class="cx">                 done.link(&amp;m_jit);
</span><span class="cx">             cellResult(resultGPR, node);
</span><span class="lines">@@ -3347,6 +3363,7 @@
</span><span class="cx">             flushRegisters();
</span><span class="cx">             GPRFlushedCallResult result(this);
</span><span class="cx">             callOperation(operationNewEmptyArray, result.gpr(), globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(node-&gt;indexingType()));
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             cellResult(result.gpr(), node);
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="lines">@@ -3429,6 +3446,7 @@
</span><span class="cx">         callOperation(
</span><span class="cx">             operationNewArray, result.gpr(), globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(node-&gt;indexingType()),
</span><span class="cx">             static_cast&lt;void*&gt;(buffer), node-&gt;numChildren());
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx"> 
</span><span class="cx">         if (scratchSize) {
</span><span class="cx">             GPRTemporary scratch(this);
</span><span class="lines">@@ -3506,6 +3524,7 @@
</span><span class="cx">         m_jit.move(TrustedImmPtr(globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(ArrayWithArrayStorage)), structureGPR);
</span><span class="cx">         done.link(&amp;m_jit);
</span><span class="cx">         callOperation(operationNewArrayWithSize, resultGPR, structureGPR, sizeGPR);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         cellResult(resultGPR, node);
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -3549,6 +3568,7 @@
</span><span class="cx">         GPRFlushedCallResult result(this);
</span><span class="cx">         
</span><span class="cx">         callOperation(operationNewArrayBuffer, result.gpr(), globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(node-&gt;indexingType()), node-&gt;startConstant(), node-&gt;numConstants());
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         cellResult(result.gpr(), node);
</span><span class="cx">         break;
</span><span class="lines">@@ -3573,6 +3593,7 @@
</span><span class="cx">                 operationNewTypedArrayWithOneArgumentForType(node-&gt;typedArrayType()),
</span><span class="cx">                 resultGPR, globalObject-&gt;typedArrayStructure(node-&gt;typedArrayType()),
</span><span class="cx">                 argumentGPR);
</span><ins>+            m_jit.exceptionCheck();
</ins><span class="cx">             
</span><span class="cx">             cellResult(resultGPR, node);
</span><span class="cx">             break;
</span><span class="lines">@@ -3589,6 +3610,7 @@
</span><span class="cx">         GPRFlushedCallResult result(this);
</span><span class="cx">         
</span><span class="cx">         callOperation(operationNewRegexp, result.gpr(), m_jit.codeBlock()-&gt;regexp(node-&gt;regexpIndex()));
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         cellResult(result.gpr(), node);
</span><span class="cx">         break;
</span><span class="lines">@@ -4242,6 +4264,7 @@
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">         callOperation(operationSizeOfVarargs, GPRInfo::returnValueGPR, argumentsGPR, data-&gt;offset);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         lock(GPRInfo::returnValueGPR);
</span><span class="cx">         {
</span><span class="lines">@@ -4270,6 +4293,7 @@
</span><span class="cx">         m_jit.store32(argCountIncludingThisGPR, JITCompiler::payloadFor(data-&gt;machineCount));
</span><span class="cx">         
</span><span class="cx">         callOperation(operationLoadVarargs, data-&gt;machineStart.offset(), argumentsGPR, data-&gt;offset, GPRInfo::returnValueGPR, data-&gt;mandatoryMinimum);
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         
</span><span class="cx">         noResult(node);
</span><span class="cx">         break;
</span><span class="lines">@@ -4385,6 +4409,7 @@
</span><span class="cx"> 
</span><span class="cx">         flushRegisters();
</span><span class="cx">         callOperation(operationHasGenericProperty, resultGPR, base.gpr(), property.gpr());
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         jsValueResult(resultGPR, node, DataFormatJSBoolean);
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -4552,6 +4577,7 @@
</span><span class="cx"> 
</span><span class="cx">         flushRegisters();
</span><span class="cx">         callOperation(operationGetPropertyEnumerator, resultGPR, base.gpr());
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         cellResult(resultGPR, node);
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -4591,6 +4617,7 @@
</span><span class="cx"> 
</span><span class="cx">         flushRegisters();
</span><span class="cx">         callOperation(operationToIndexString, resultGPR, index.gpr());
</span><ins>+        m_jit.exceptionCheck();
</ins><span class="cx">         cellResult(resultGPR, node);
</span><span class="cx">         break;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLIntrinsicRepositoryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLIntrinsicRepository.h (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLIntrinsicRepository.h        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/ftl/FTLIntrinsicRepository.h        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -115,6 +115,7 @@
</span><span class="cx">     macro(V_JITOperation_EZJZZZ, functionType(voidType, intPtr, int32, int64, int32, int32, int32)) \
</span><span class="cx">     macro(V_JITOperation_J, functionType(voidType, int64)) \
</span><span class="cx">     macro(V_JITOperation_Z, functionType(voidType, int32)) \
</span><ins>+    macro(V_JITOperation_E, functionType(voidType, intPtr)) \
</ins><span class="cx">     macro(Z_JITOperation_D, functionType(int32, doubleType)) \
</span><span class="cx">     macro(Z_JITOperation_EC, functionType(int32, intPtr, intPtr)) \
</span><span class="cx">     macro(Z_JITOperation_EGC, functionType(int32, intPtr, intPtr, intPtr)) \
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLLowerDFGToLLVMcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -8049,7 +8049,7 @@
</span><span class="cx">     void callCheck()
</span><span class="cx">     {
</span><span class="cx">         if (Options::enableExceptionFuzz())
</span><del>-            m_out.call(m_out.operation(operationExceptionFuzz));
</del><ins>+            m_out.call(m_out.operation(operationExceptionFuzz), m_callFrame);
</ins><span class="cx">         
</span><span class="cx">         LBasicBlock continuation = FTL_NEW_BLOCK(m_out, (&quot;Exception check continuation&quot;));
</span><span class="cx">         
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitAssemblyHelperscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -194,6 +194,19 @@
</span><span class="cx">     abortWithReason(AHInsaneArgumentCount);
</span><span class="cx">     ok.link(this);
</span><span class="cx"> }
</span><ins>+
+void AssemblyHelpers::jitAssertNoException()
+{
+    Jump noException;
+#if USE(JSVALUE64)
+    noException = branchTest64(Zero, AbsoluteAddress(vm()-&gt;addressOfException()));
+#elif USE(JSVALUE32_64)
+    noException = branch32(Equal, AbsoluteAddress(vm()-&gt;addressOfException()), TrustedImm32(0));
+#endif
+    abortWithReason(JITUncoughtExceptionAfterCall);
+    noException.link(this);
+}
+
</ins><span class="cx"> #endif // !ASSERT_DISABLED
</span><span class="cx"> 
</span><span class="cx"> void AssemblyHelpers::callExceptionFuzz()
</span><span class="lines">@@ -201,15 +214,40 @@
</span><span class="cx">     if (!Options::enableExceptionFuzz())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    ASSERT(stackAlignmentBytes() &gt;= sizeof(void*) * 2);
-    subPtr(TrustedImm32(stackAlignmentBytes()), stackPointerRegister);
-    poke(GPRInfo::returnValueGPR, 0);
-    poke(GPRInfo::returnValueGPR2, 1);
</del><ins>+    EncodedJSValue* buffer = vm()-&gt;exceptionFuzzingBuffer(sizeof(EncodedJSValue) * (GPRInfo::numberOfRegisters + FPRInfo::numberOfRegisters));
+
+    for (unsigned i = 0; i &lt; GPRInfo::numberOfRegisters; ++i) {
+#if USE(JSVALUE64)
+        store64(GPRInfo::toRegister(i), buffer + i);
+#else
+        store32(GPRInfo::toRegister(i), buffer + i);
+#endif
+    }
+    for (unsigned i = 0; i &lt; FPRInfo::numberOfRegisters; ++i) {
+        move(TrustedImmPtr(buffer + GPRInfo::numberOfRegisters + i), GPRInfo::regT0);
+        storeDouble(FPRInfo::toRegister(i), Address(GPRInfo::regT0));
+    }
+
+    // Set up one argument.
+#if CPU(X86)
+    poke(GPRInfo::callFrameRegister, 0);
+#else
+    move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
+#endif
</ins><span class="cx">     move(TrustedImmPtr(bitwise_cast&lt;void*&gt;(operationExceptionFuzz)), GPRInfo::nonPreservedNonReturnGPR);
</span><span class="cx">     call(GPRInfo::nonPreservedNonReturnGPR);
</span><del>-    peek(GPRInfo::returnValueGPR, 0);
-    peek(GPRInfo::returnValueGPR2, 1);
-    addPtr(TrustedImm32(stackAlignmentBytes()), stackPointerRegister);
</del><ins>+
+    for (unsigned i = 0; i &lt; FPRInfo::numberOfRegisters; ++i) {
+        move(TrustedImmPtr(buffer + GPRInfo::numberOfRegisters + i), GPRInfo::regT0);
+        loadDouble(Address(GPRInfo::regT0), FPRInfo::toRegister(i));
+    }
+    for (unsigned i = 0; i &lt; GPRInfo::numberOfRegisters; ++i) {
+#if USE(JSVALUE64)
+        load64(buffer + i, GPRInfo::toRegister(i));
+#else
+        load32(buffer + i, GPRInfo::toRegister(i));
+#endif
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> AssemblyHelpers::Jump AssemblyHelpers::emitExceptionCheck(ExceptionCheckKind kind, ExceptionJumpWidth width)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitAssemblyHelpersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -732,6 +732,7 @@
</span><span class="cx">     void jitAssertIsNull(GPRReg);
</span><span class="cx">     void jitAssertTagsInPlace();
</span><span class="cx">     void jitAssertArgumentCountSane();
</span><ins>+    void jitAssertNoException();
</ins><span class="cx"> #else
</span><span class="cx">     void jitAssertIsInt32(GPRReg) { }
</span><span class="cx">     void jitAssertIsJSInt32(GPRReg) { }
</span><span class="lines">@@ -742,6 +743,7 @@
</span><span class="cx">     void jitAssertIsNull(GPRReg) { }
</span><span class="cx">     void jitAssertTagsInPlace() { }
</span><span class="cx">     void jitAssertArgumentCountSane() { }
</span><ins>+    void jitAssertNoException() { }
</ins><span class="cx"> #endif
</span><span class="cx">     
</span><span class="cx">     void purifyNaN(FPRReg);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITOperationscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITOperations.cpp (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITOperations.cpp        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/jit/JITOperations.cpp        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -2014,10 +2014,11 @@
</span><span class="cx"> // ourselves to play some gnarly ABI tricks just to simplify the calling convention. This is
</span><span class="cx"> // particularly safe here since this is never called on the critical path - it's only for
</span><span class="cx"> // testing.
</span><del>-void JIT_OPERATION operationExceptionFuzz()
</del><ins>+void JIT_OPERATION operationExceptionFuzz(ExecState* exec)
</ins><span class="cx"> {
</span><ins>+    VM* vm = &amp;exec-&gt;vm();
+    NativeCallFrameTracer tracer(vm, exec);
</ins><span class="cx"> #if COMPILER(GCC_OR_CLANG)
</span><del>-    ExecState* exec = static_cast&lt;ExecState*&gt;(__builtin_frame_address(1));
</del><span class="cx">     void* returnPC = __builtin_return_address(0);
</span><span class="cx">     doExceptionFuzzing(exec, &quot;JITOperations&quot;, returnPC);
</span><span class="cx"> #endif // COMPILER(GCC_OR_CLANG)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITOperationsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITOperations.h (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITOperations.h        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/jit/JITOperations.h        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -343,7 +343,7 @@
</span><span class="cx"> 
</span><span class="cx"> void JIT_OPERATION operationInitGlobalConst(ExecState*, Instruction*);
</span><span class="cx"> 
</span><del>-void JIT_OPERATION operationExceptionFuzz();
</del><ins>+void JIT_OPERATION operationExceptionFuzz(ExecState*);
</ins><span class="cx"> 
</span><span class="cx"> EncodedJSValue JIT_OPERATION operationHasGenericProperty(ExecState*, EncodedJSValue, JSCell*);
</span><span class="cx"> EncodedJSValue JIT_OPERATION operationHasIndexedProperty(ExecState*, JSCell*, int32_t);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.h (188763 => 188764)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.h        2015-08-21 18:48:51 UTC (rev 188763)
+++ trunk/Source/JavaScriptCore/runtime/VM.h        2015-08-21 19:11:36 UTC (rev 188764)
</span><span class="lines">@@ -477,6 +477,14 @@
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    EncodedJSValue* exceptionFuzzingBuffer(size_t size)
+    {
+        ASSERT(Options::enableExceptionFuzz());
+        if (!m_exceptionFuzzBuffer)
+            m_exceptionFuzzBuffer = MallocPtr&lt;EncodedJSValue&gt;::malloc(size);
+        return m_exceptionFuzzBuffer.get();
+    }
+
</ins><span class="cx">     void gatherConservativeRoots(ConservativeRoots&amp;);
</span><span class="cx"> 
</span><span class="cx">     VMEntryScope* entryScope;
</span><span class="lines">@@ -612,6 +620,7 @@
</span><span class="cx">     std::unique_ptr&lt;ControlFlowProfiler&gt; m_controlFlowProfiler;
</span><span class="cx">     unsigned m_controlFlowProfilerEnabledCount;
</span><span class="cx">     Deque&lt;std::unique_ptr&lt;QueuedTask&gt;&gt; m_microtaskQueue;
</span><ins>+    MallocPtr&lt;EncodedJSValue&gt; m_exceptionFuzzBuffer;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(GC_VALIDATION)
</span></span></pre>
</div>
</div>

</body>
</html>