<!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>[185930] 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/185930">185930</a></dd>
<dt>Author</dt> <dd>msaboff@apple.com</dd>
<dt>Date</dt> <dd>2015-06-24 15:37:30 -0700 (Wed, 24 Jun 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>Refactor CallLinkInfo from a struct to a class
https://bugs.webkit.org/show_bug.cgi?id=146292
Rubber stamped by Filip Pizlo.
Refactored CallLinkInfo from a struct to a class with proper accessors and made all the
data elements private.
Done in preparation for fixing https://bugs.webkit.org/show_bug.cgi?id=146285.
* bytecode/CallLinkInfo.cpp:
(JSC::CallLinkInfo::clearStub):
(JSC::CallLinkInfo::unlink):
(JSC::CallLinkInfo::visitWeak):
* bytecode/CallLinkInfo.h:
(JSC::CallLinkInfo::callTypeFor):
(JSC::CallLinkInfo::CallLinkInfo):
(JSC::CallLinkInfo::~CallLinkInfo):
(JSC::CallLinkInfo::specializationKindFor):
(JSC::CallLinkInfo::specializationKind):
(JSC::CallLinkInfo::isLinked):
(JSC::CallLinkInfo::setUpCall):
(JSC::CallLinkInfo::setCallLocations):
(JSC::CallLinkInfo::setUpCallFromFTL):
(JSC::CallLinkInfo::callReturnLocation):
(JSC::CallLinkInfo::hotPathBegin):
(JSC::CallLinkInfo::hotPathOther):
(JSC::CallLinkInfo::setCallee):
(JSC::CallLinkInfo::clearCallee):
(JSC::CallLinkInfo::callee):
(JSC::CallLinkInfo::setLastSeenCallee):
(JSC::CallLinkInfo::clearLastSeenCallee):
(JSC::CallLinkInfo::lastSeenCallee):
(JSC::CallLinkInfo::haveLastSeenCallee):
(JSC::CallLinkInfo::setStub):
(JSC::CallLinkInfo::stub):
(JSC::CallLinkInfo::seenOnce):
(JSC::CallLinkInfo::clearSeen):
(JSC::CallLinkInfo::setSeen):
(JSC::CallLinkInfo::hasSeenClosure):
(JSC::CallLinkInfo::setHasSeenClosure):
(JSC::CallLinkInfo::clearedByGC):
(JSC::CallLinkInfo::setCallType):
(JSC::CallLinkInfo::callType):
(JSC::CallLinkInfo::addressOfMaxNumArguments):
(JSC::CallLinkInfo::maxNumArguments):
(JSC::CallLinkInfo::offsetOfSlowPathCount):
(JSC::CallLinkInfo::setCalleeGPR):
(JSC::CallLinkInfo::calleeGPR):
(JSC::CallLinkInfo::slowPathCount):
(JSC::CallLinkInfo::setCodeOrigin):
(JSC::CallLinkInfo::codeOrigin):
(JSC::getCallLinkInfoCodeOrigin):
* bytecode/CallLinkStatus.cpp:
(JSC::CallLinkStatus::computeFor):
(JSC::CallLinkStatus::computeFromCallLinkInfo):
(JSC::CallLinkStatus::computeDFGStatuses):
* bytecode/CallLinkStatus.h:
* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::printCallOp):
(JSC::CodeBlock::getCallLinkInfoForBytecodeIndex):
* dfg/DFGJITCompiler.cpp:
(JSC::DFG::JITCompiler::link):
* dfg/DFGOSRExitCompilerCommon.cpp:
(JSC::DFG::reifyInlinedCallFrames):
* dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::emitCall):
* dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::emitCall):
* ftl/FTLJSCallBase.cpp:
(JSC::FTL::JSCallBase::link):
* jit/AccessorCallJITStubRoutine.h:
* jit/JIT.cpp:
(JSC::JIT::privateCompile):
* jit/JIT.h:
* jit/JITCall.cpp:
(JSC::JIT::compileSetupVarargsFrame):
(JSC::JIT::compileOpCall):
* jit/JITCall32_64.cpp:
(JSC::JIT::compileSetupVarargsFrame):
(JSC::JIT::compileOpCall):
* jit/JITOperations.cpp:
* jit/PolymorphicCallStubRoutine.cpp:
(JSC::PolymorphicCallNode::unlink):
(JSC::PolymorphicCallNode::clearCallLinkInfo):
* jit/PolymorphicCallStubRoutine.h:
* jit/Repatch.cpp:
(JSC::generateByIdStub):
(JSC::linkSlowFor):
(JSC::linkFor):
(JSC::revertCall):
(JSC::unlinkFor):
(JSC::linkPolymorphicCall):
* jit/ThunkGenerators.cpp:
(JSC::virtualForThunkGenerator):</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCallLinkInfocpp">trunk/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCallLinkInfoh">trunk/Source/JavaScriptCore/bytecode/CallLinkInfo.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCallLinkStatuscpp">trunk/Source/JavaScriptCore/bytecode/CallLinkStatus.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCallLinkStatush">trunk/Source/JavaScriptCore/bytecode/CallLinkStatus.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCodeBlockcpp">trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGJITCompilercpp">trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGOSRExitCompilerCommoncpp">trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp</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="#trunkSourceJavaScriptCoreftlFTLJSCallBasecpp">trunk/Source/JavaScriptCore/ftl/FTLJSCallBase.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitAccessorCallJITStubRoutineh">trunk/Source/JavaScriptCore/jit/AccessorCallJITStubRoutine.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITcpp">trunk/Source/JavaScriptCore/jit/JIT.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITh">trunk/Source/JavaScriptCore/jit/JIT.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITCallcpp">trunk/Source/JavaScriptCore/jit/JITCall.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITCall32_64cpp">trunk/Source/JavaScriptCore/jit/JITCall32_64.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITOperationscpp">trunk/Source/JavaScriptCore/jit/JITOperations.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitPolymorphicCallStubRoutinecpp">trunk/Source/JavaScriptCore/jit/PolymorphicCallStubRoutine.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitPolymorphicCallStubRoutineh">trunk/Source/JavaScriptCore/jit/PolymorphicCallStubRoutine.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitRepatchcpp">trunk/Source/JavaScriptCore/jit/Repatch.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitThunkGeneratorscpp">trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -1,3 +1,101 @@
</span><ins>+2015-06-24 Michael Saboff <msaboff@apple.com>
+
+ Refactor CallLinkInfo from a struct to a class
+ https://bugs.webkit.org/show_bug.cgi?id=146292
+
+ Rubber stamped by Filip Pizlo.
+
+ Refactored CallLinkInfo from a struct to a class with proper accessors and made all the
+ data elements private.
+
+ Done in preparation for fixing https://bugs.webkit.org/show_bug.cgi?id=146285.
+
+ * bytecode/CallLinkInfo.cpp:
+ (JSC::CallLinkInfo::clearStub):
+ (JSC::CallLinkInfo::unlink):
+ (JSC::CallLinkInfo::visitWeak):
+ * bytecode/CallLinkInfo.h:
+ (JSC::CallLinkInfo::callTypeFor):
+ (JSC::CallLinkInfo::CallLinkInfo):
+ (JSC::CallLinkInfo::~CallLinkInfo):
+ (JSC::CallLinkInfo::specializationKindFor):
+ (JSC::CallLinkInfo::specializationKind):
+ (JSC::CallLinkInfo::isLinked):
+ (JSC::CallLinkInfo::setUpCall):
+ (JSC::CallLinkInfo::setCallLocations):
+ (JSC::CallLinkInfo::setUpCallFromFTL):
+ (JSC::CallLinkInfo::callReturnLocation):
+ (JSC::CallLinkInfo::hotPathBegin):
+ (JSC::CallLinkInfo::hotPathOther):
+ (JSC::CallLinkInfo::setCallee):
+ (JSC::CallLinkInfo::clearCallee):
+ (JSC::CallLinkInfo::callee):
+ (JSC::CallLinkInfo::setLastSeenCallee):
+ (JSC::CallLinkInfo::clearLastSeenCallee):
+ (JSC::CallLinkInfo::lastSeenCallee):
+ (JSC::CallLinkInfo::haveLastSeenCallee):
+ (JSC::CallLinkInfo::setStub):
+ (JSC::CallLinkInfo::stub):
+ (JSC::CallLinkInfo::seenOnce):
+ (JSC::CallLinkInfo::clearSeen):
+ (JSC::CallLinkInfo::setSeen):
+ (JSC::CallLinkInfo::hasSeenClosure):
+ (JSC::CallLinkInfo::setHasSeenClosure):
+ (JSC::CallLinkInfo::clearedByGC):
+ (JSC::CallLinkInfo::setCallType):
+ (JSC::CallLinkInfo::callType):
+ (JSC::CallLinkInfo::addressOfMaxNumArguments):
+ (JSC::CallLinkInfo::maxNumArguments):
+ (JSC::CallLinkInfo::offsetOfSlowPathCount):
+ (JSC::CallLinkInfo::setCalleeGPR):
+ (JSC::CallLinkInfo::calleeGPR):
+ (JSC::CallLinkInfo::slowPathCount):
+ (JSC::CallLinkInfo::setCodeOrigin):
+ (JSC::CallLinkInfo::codeOrigin):
+ (JSC::getCallLinkInfoCodeOrigin):
+ * bytecode/CallLinkStatus.cpp:
+ (JSC::CallLinkStatus::computeFor):
+ (JSC::CallLinkStatus::computeFromCallLinkInfo):
+ (JSC::CallLinkStatus::computeDFGStatuses):
+ * bytecode/CallLinkStatus.h:
+ * bytecode/CodeBlock.cpp:
+ (JSC::CodeBlock::printCallOp):
+ (JSC::CodeBlock::getCallLinkInfoForBytecodeIndex):
+ * dfg/DFGJITCompiler.cpp:
+ (JSC::DFG::JITCompiler::link):
+ * dfg/DFGOSRExitCompilerCommon.cpp:
+ (JSC::DFG::reifyInlinedCallFrames):
+ * dfg/DFGSpeculativeJIT32_64.cpp:
+ (JSC::DFG::SpeculativeJIT::emitCall):
+ * dfg/DFGSpeculativeJIT64.cpp:
+ (JSC::DFG::SpeculativeJIT::emitCall):
+ * ftl/FTLJSCallBase.cpp:
+ (JSC::FTL::JSCallBase::link):
+ * jit/AccessorCallJITStubRoutine.h:
+ * jit/JIT.cpp:
+ (JSC::JIT::privateCompile):
+ * jit/JIT.h:
+ * jit/JITCall.cpp:
+ (JSC::JIT::compileSetupVarargsFrame):
+ (JSC::JIT::compileOpCall):
+ * jit/JITCall32_64.cpp:
+ (JSC::JIT::compileSetupVarargsFrame):
+ (JSC::JIT::compileOpCall):
+ * jit/JITOperations.cpp:
+ * jit/PolymorphicCallStubRoutine.cpp:
+ (JSC::PolymorphicCallNode::unlink):
+ (JSC::PolymorphicCallNode::clearCallLinkInfo):
+ * jit/PolymorphicCallStubRoutine.h:
+ * jit/Repatch.cpp:
+ (JSC::generateByIdStub):
+ (JSC::linkSlowFor):
+ (JSC::linkFor):
+ (JSC::revertCall):
+ (JSC::unlinkFor):
+ (JSC::linkPolymorphicCall):
+ * jit/ThunkGenerators.cpp:
+ (JSC::virtualForThunkGenerator):
+
</ins><span class="cx"> 2015-06-24 Doug Russell <d_russell@apple.com>
</span><span class="cx">
</span><span class="cx"> Bug 146177 - AX: AXObjectCache should try to use an unignored accessibilityObject
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCallLinkInfocpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -37,6 +37,14 @@
</span><span class="cx"> #if ENABLE(JIT)
</span><span class="cx"> namespace JSC {
</span><span class="cx">
</span><ins>+void CallLinkInfo::clearStub()
+{
+ if (!stub())
+ return;
+
+ m_stub.clear();
+}
+
</ins><span class="cx"> void CallLinkInfo::unlink(RepatchBuffer& repatchBuffer)
</span><span class="cx"> {
</span><span class="cx"> if (!isLinked()) {
</span><span class="lines">@@ -48,8 +56,8 @@
</span><span class="cx">
</span><span class="cx"> unlinkFor(
</span><span class="cx"> repatchBuffer, *this,
</span><del>- (callType == Construct || callType == ConstructVarargs)? CodeForConstruct : CodeForCall,
- isFTL ? MustPreserveRegisters : RegisterPreservationNotRequired);
</del><ins>+ (m_callType == Construct || m_callType == ConstructVarargs)? CodeForConstruct : CodeForCall,
+ m_isFTL ? MustPreserveRegisters : RegisterPreservationNotRequired);
</ins><span class="cx">
</span><span class="cx"> // It will be on a list if the callee has a code block.
</span><span class="cx"> if (isOnList())
</span><span class="lines">@@ -60,38 +68,38 @@
</span><span class="cx"> {
</span><span class="cx"> auto handleSpecificCallee = [&] (JSFunction* callee) {
</span><span class="cx"> if (Heap::isMarked(callee->executable()))
</span><del>- hasSeenClosure = true;
</del><ins>+ m_hasSeenClosure = true;
</ins><span class="cx"> else
</span><del>- clearedByGC = true;
</del><ins>+ m_clearedByGC = true;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> if (isLinked()) {
</span><del>- if (stub) {
- if (!stub->visitWeak(repatchBuffer)) {
</del><ins>+ if (stub()) {
+ if (!stub()->visitWeak(repatchBuffer)) {
</ins><span class="cx"> if (Options::verboseOSR()) {
</span><span class="cx"> dataLog(
</span><span class="cx"> "Clearing closure call from ", *repatchBuffer.codeBlock(), " to ",
</span><del>- listDump(stub->variants()), ", stub routine ", RawPointer(stub.get()),
</del><ins>+ listDump(stub()->variants()), ", stub routine ", RawPointer(stub()),
</ins><span class="cx"> ".\n");
</span><span class="cx"> }
</span><span class="cx"> unlink(repatchBuffer);
</span><del>- clearedByGC = true;
</del><ins>+ m_clearedByGC = true;
</ins><span class="cx"> }
</span><del>- } else if (!Heap::isMarked(callee.get())) {
</del><ins>+ } else if (!Heap::isMarked(m_callee.get())) {
</ins><span class="cx"> if (Options::verboseOSR()) {
</span><span class="cx"> dataLog(
</span><span class="cx"> "Clearing call from ", *repatchBuffer.codeBlock(), " to ",
</span><del>- RawPointer(callee.get()), " (",
- callee.get()->executable()->hashFor(specializationKind()),
</del><ins>+ RawPointer(m_callee.get()), " (",
+ m_callee.get()->executable()->hashFor(specializationKind()),
</ins><span class="cx"> ").\n");
</span><span class="cx"> }
</span><del>- handleSpecificCallee(callee.get());
</del><ins>+ handleSpecificCallee(m_callee.get());
</ins><span class="cx"> unlink(repatchBuffer);
</span><span class="cx"> }
</span><span class="cx"> }
</span><del>- if (!!lastSeenCallee && !Heap::isMarked(lastSeenCallee.get())) {
- handleSpecificCallee(lastSeenCallee.get());
- lastSeenCallee.clear();
</del><ins>+ if (haveLastSeenCallee() && !Heap::isMarked(lastSeenCallee())) {
+ handleSpecificCallee(lastSeenCallee());
+ clearLastSeenCallee();
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCallLinkInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CallLinkInfo.h (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CallLinkInfo.h        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/bytecode/CallLinkInfo.h        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -41,7 +41,8 @@
</span><span class="cx">
</span><span class="cx"> class RepatchBuffer;
</span><span class="cx">
</span><del>-struct CallLinkInfo : public BasicRawSentinelNode<CallLinkInfo> {
</del><ins>+class CallLinkInfo : public BasicRawSentinelNode<CallLinkInfo> {
+public:
</ins><span class="cx"> enum CallType { None, Call, CallVarargs, Construct, ConstructVarargs };
</span><span class="cx"> static CallType callTypeFor(OpcodeID opcodeID)
</span><span class="cx"> {
</span><span class="lines">@@ -56,21 +57,23 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> CallLinkInfo()
</span><del>- : isFTL(false)
- , hasSeenShouldRepatch(false)
- , hasSeenClosure(false)
- , clearedByGC(false)
- , callType(None)
- , maxNumArguments(0)
- , slowPathCount(0)
</del><ins>+ : m_isFTL(false)
+ , m_hasSeenShouldRepatch(false)
+ , m_hasSeenClosure(false)
+ , m_clearedByGC(false)
+ , m_callType(None)
+ , m_maxNumArguments(0)
+ , m_slowPathCount(0)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> ~CallLinkInfo()
</span><span class="cx"> {
</span><del>- if (stub)
- stub->clearCallNodesFor(this);
</del><ins>+ if (stub())
+ m_stub->clearCallNodesFor(this);
</ins><span class="cx">
</span><ins>+ clearStub();
+
</ins><span class="cx"> if (isOnList())
</span><span class="cx"> remove();
</span><span class="cx"> }
</span><span class="lines">@@ -81,46 +84,207 @@
</span><span class="cx"> }
</span><span class="cx"> CodeSpecializationKind specializationKind() const
</span><span class="cx"> {
</span><del>- return specializationKindFor(static_cast<CallType>(callType));
</del><ins>+ return specializationKindFor(static_cast<CallType>(m_callType));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- CodeLocationNearCall callReturnLocation;
- CodeLocationDataLabelPtr hotPathBegin;
- CodeLocationNearCall hotPathOther;
- JITWriteBarrier<JSFunction> callee;
- WriteBarrier<JSFunction> lastSeenCallee;
- RefPtr<PolymorphicCallStubRoutine> stub;
- bool isFTL : 1;
- bool hasSeenShouldRepatch : 1;
- bool hasSeenClosure : 1;
- bool clearedByGC : 1;
- unsigned callType : 4; // CallType
- unsigned calleeGPR : 8;
- uint8_t maxNumArguments; // Only used for varargs calls.
- uint32_t slowPathCount;
- CodeOrigin codeOrigin;
-
- bool isLinked() { return stub || callee; }
</del><ins>+ bool isLinked() { return m_stub || m_callee; }
</ins><span class="cx"> void unlink(RepatchBuffer&);
</span><span class="cx">
</span><ins>+ void setUpCall(CallType callType, CodeOrigin codeOrigin, unsigned calleeGPR)
+ {
+ m_callType = callType;
+ m_codeOrigin = codeOrigin;
+ m_calleeGPR = calleeGPR;
+ }
+
+ void setCallLocations(CodeLocationNearCall callReturnLocation, CodeLocationDataLabelPtr hotPathBegin,
+ CodeLocationNearCall hotPathOther)
+ {
+ m_callReturnLocation = callReturnLocation;
+ m_hotPathBegin = hotPathBegin;
+ m_hotPathOther = hotPathOther;
+ }
+
+ void setUpCallFromFTL(CallType callType, CodeOrigin codeOrigin,
+ CodeLocationNearCall callReturnLocation, CodeLocationDataLabelPtr hotPathBegin,
+ CodeLocationNearCall hotPathOther, unsigned calleeGPR)
+ {
+ m_isFTL = true;
+ m_callType = callType;
+ m_codeOrigin = codeOrigin;
+ m_callReturnLocation = callReturnLocation;
+ m_hotPathBegin = hotPathBegin;
+ m_hotPathOther = hotPathOther;
+ m_calleeGPR = calleeGPR;
+ }
+
+ CodeLocationNearCall callReturnLocation()
+ {
+ return m_callReturnLocation;
+ }
+
+ CodeLocationDataLabelPtr hotPathBegin()
+ {
+ return m_hotPathBegin;
+ }
+
+ CodeLocationNearCall hotPathOther()
+ {
+ return m_hotPathOther;
+ }
+
+ void setCallee(VM& vm, CodeLocationDataLabelPtr location, JSCell* owner, JSFunction* callee)
+ {
+ m_callee.set(vm, location, owner, callee);
+ }
+
+ void clearCallee()
+ {
+ m_callee.clear();
+ }
+
+ JSFunction* callee()
+ {
+ return m_callee.get();
+ }
+
+ void setLastSeenCallee(VM& vm, const JSCell* owner, JSFunction* callee)
+ {
+ m_lastSeenCallee.set(vm, owner, callee);
+ }
+
+ void clearLastSeenCallee()
+ {
+ m_lastSeenCallee.clear();
+ }
+
+ JSFunction* lastSeenCallee()
+ {
+ return m_lastSeenCallee.get();
+ }
+
+ bool haveLastSeenCallee()
+ {
+ return !!m_lastSeenCallee;
+ }
+
+ void setStub(PassRefPtr<PolymorphicCallStubRoutine> newStub)
+ {
+ m_stub = newStub;
+ }
+
+ void clearStub();
+
+ PolymorphicCallStubRoutine* stub()
+ {
+ return m_stub.get();
+ }
+
</ins><span class="cx"> bool seenOnce()
</span><span class="cx"> {
</span><del>- return hasSeenShouldRepatch;
</del><ins>+ return m_hasSeenShouldRepatch;
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+ void clearSeen()
+ {
+ m_hasSeenShouldRepatch = false;
+ }
+
</ins><span class="cx"> void setSeen()
</span><span class="cx"> {
</span><del>- hasSeenShouldRepatch = true;
</del><ins>+ m_hasSeenShouldRepatch = true;
</ins><span class="cx"> }
</span><del>-
</del><ins>+
+ bool hasSeenClosure()
+ {
+ return m_hasSeenClosure;
+ }
+
+ void setHasSeenClosure()
+ {
+ m_hasSeenClosure = true;
+ }
+
+ bool clearedByGC()
+ {
+ return m_clearedByGC;
+ }
+
+ void setCallType(CallType callType)
+ {
+ m_callType = callType;
+ }
+
+ CallType callType()
+ {
+ return static_cast<CallType>(m_callType);
+ }
+
+ uint8_t* addressOfMaxNumArguments()
+ {
+ return &m_maxNumArguments;
+ }
+
+ uint8_t maxNumArguments()
+ {
+ return m_maxNumArguments;
+ }
+
+ static ptrdiff_t offsetOfSlowPathCount()
+ {
+ return OBJECT_OFFSETOF(CallLinkInfo, m_slowPathCount);
+ }
+
+ void setCalleeGPR(unsigned calleeGPR)
+ {
+ m_calleeGPR = calleeGPR;
+ }
+
+ unsigned calleeGPR()
+ {
+ return m_calleeGPR;
+ }
+
+ uint32_t slowPathCount()
+ {
+ return m_slowPathCount;
+ }
+
+ void setCodeOrigin(CodeOrigin codeOrigin)
+ {
+ m_codeOrigin = codeOrigin;
+ }
+
+ CodeOrigin codeOrigin()
+ {
+ return m_codeOrigin;
+ }
+
</ins><span class="cx"> void visitWeak(RepatchBuffer&);
</span><del>-
</del><ins>+
</ins><span class="cx"> static CallLinkInfo& dummy();
</span><ins>+
+private:
+ CodeLocationNearCall m_callReturnLocation;
+ CodeLocationDataLabelPtr m_hotPathBegin;
+ CodeLocationNearCall m_hotPathOther;
+ JITWriteBarrier<JSFunction> m_callee;
+ WriteBarrier<JSFunction> m_lastSeenCallee;
+ RefPtr<PolymorphicCallStubRoutine> m_stub;
+ bool m_isFTL : 1;
+ bool m_hasSeenShouldRepatch : 1;
+ bool m_hasSeenClosure : 1;
+ bool m_clearedByGC : 1;
+ unsigned m_callType : 4; // CallType
+ unsigned m_calleeGPR : 8;
+ uint8_t m_maxNumArguments; // Only used for varargs calls.
+ uint32_t m_slowPathCount;
+ CodeOrigin m_codeOrigin;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> inline CodeOrigin getCallLinkInfoCodeOrigin(CallLinkInfo& callLinkInfo)
</span><span class="cx"> {
</span><del>- return callLinkInfo.codeOrigin;
</del><ins>+ return callLinkInfo.codeOrigin();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> typedef HashMap<CodeOrigin, CallLinkInfo*, CodeOriginApproximateHash> CallLinkInfoMap;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCallLinkStatuscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CallLinkStatus.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CallLinkStatus.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/bytecode/CallLinkStatus.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -128,14 +128,14 @@
</span><span class="cx"> UNUSED_PARAM(profiledBlock);
</span><span class="cx">
</span><span class="cx"> CallLinkStatus result = computeFromCallLinkInfo(locker, callLinkInfo);
</span><del>- result.m_maxNumArguments = callLinkInfo.maxNumArguments;
</del><ins>+ result.m_maxNumArguments = callLinkInfo.maxNumArguments();
</ins><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> CallLinkStatus CallLinkStatus::computeFromCallLinkInfo(
</span><span class="cx"> const ConcurrentJITLocker&, CallLinkInfo& callLinkInfo)
</span><span class="cx"> {
</span><del>- if (callLinkInfo.clearedByGC)
</del><ins>+ if (callLinkInfo.clearedByGC())
</ins><span class="cx"> return takesSlowPath();
</span><span class="cx">
</span><span class="cx"> // Note that despite requiring that the locker is held, this code is racy with respect
</span><span class="lines">@@ -155,7 +155,7 @@
</span><span class="cx"> // until next GC even if the CallLinkInfo is concurrently cleared. Also, the variants list is
</span><span class="cx"> // never mutated after the PolymorphicCallStubRoutine is instantiated. We have some conservative
</span><span class="cx"> // fencing in place to make sure that we see the variants list after construction.
</span><del>- if (PolymorphicCallStubRoutine* stub = callLinkInfo.stub.get()) {
</del><ins>+ if (PolymorphicCallStubRoutine* stub = callLinkInfo.stub()) {
</ins><span class="cx"> WTF::loadLoadFence();
</span><span class="cx">
</span><span class="cx"> CallEdgeList edges = stub->edges();
</span><span class="lines">@@ -174,7 +174,7 @@
</span><span class="cx"> RELEASE_ASSERT(edges.first().count() >= edges.last().count());
</span><span class="cx">
</span><span class="cx"> double totalCallsToKnown = 0;
</span><del>- double totalCallsToUnknown = callLinkInfo.slowPathCount;
</del><ins>+ double totalCallsToUnknown = callLinkInfo.slowPathCount();
</ins><span class="cx"> CallVariantList variants;
</span><span class="cx"> for (size_t i = 0; i < edges.size(); ++i) {
</span><span class="cx"> CallEdge edge = edges[i];
</span><span class="lines">@@ -212,14 +212,14 @@
</span><span class="cx">
</span><span class="cx"> CallLinkStatus result;
</span><span class="cx">
</span><del>- if (JSFunction* target = callLinkInfo.lastSeenCallee.get()) {
</del><ins>+ if (JSFunction* target = callLinkInfo.lastSeenCallee()) {
</ins><span class="cx"> CallVariant variant(target);
</span><del>- if (callLinkInfo.hasSeenClosure)
</del><ins>+ if (callLinkInfo.hasSeenClosure())
</ins><span class="cx"> variant = variant.despecifiedClosure();
</span><span class="cx"> result.m_variants.append(variant);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- result.m_couldTakeSlowPath = !!callLinkInfo.slowPathCount;
</del><ins>+ result.m_couldTakeSlowPath = !!callLinkInfo.slowPathCount();
</ins><span class="cx">
</span><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="lines">@@ -246,7 +246,7 @@
</span><span class="cx"> CodeBlock* baselineCodeBlock = dfgCodeBlock->alternative();
</span><span class="cx"> for (auto iter = dfgCodeBlock->callLinkInfosBegin(); !!iter; ++iter) {
</span><span class="cx"> CallLinkInfo& info = **iter;
</span><del>- CodeOrigin codeOrigin = info.codeOrigin;
</del><ins>+ CodeOrigin codeOrigin = info.codeOrigin();
</ins><span class="cx">
</span><span class="cx"> // Check if we had already previously made a terrible mistake in the FTL for this
</span><span class="cx"> // code origin. Note that this is approximate because we could have a monovariant
</span><span class="lines">@@ -266,7 +266,7 @@
</span><span class="cx">
</span><span class="cx"> {
</span><span class="cx"> ConcurrentJITLocker locker(dfgCodeBlock->m_lock);
</span><del>- map.add(info.codeOrigin, computeFor(locker, dfgCodeBlock, info, exitSiteData));
</del><ins>+ map.add(info.codeOrigin(), computeFor(locker, dfgCodeBlock, info, exitSiteData));
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx"> #else
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCallLinkStatush"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CallLinkStatus.h (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CallLinkStatus.h        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/bytecode/CallLinkStatus.h        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx"> class InternalFunction;
</span><span class="cx"> class JSFunction;
</span><span class="cx"> class Structure;
</span><del>-struct CallLinkInfo;
</del><ins>+class CallLinkInfo;
</ins><span class="cx">
</span><span class="cx"> class CallLinkStatus {
</span><span class="cx"> public:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -528,7 +528,7 @@
</span><span class="cx"> }
</span><span class="cx"> #if ENABLE(JIT)
</span><span class="cx"> if (CallLinkInfo* info = map.get(CodeOrigin(location))) {
</span><del>- JSFunction* target = info->lastSeenCallee.get();
</del><ins>+ JSFunction* target = info->lastSeenCallee();
</ins><span class="cx"> if (target)
</span><span class="cx"> out.printf(" jit(%p, exec %p)", target, target->executable());
</span><span class="cx"> }
</span><span class="lines">@@ -2776,7 +2776,7 @@
</span><span class="cx"> CallLinkInfo* CodeBlock::getCallLinkInfoForBytecodeIndex(unsigned index)
</span><span class="cx"> {
</span><span class="cx"> for (auto iter = m_callLinkInfos.begin(); !!iter; ++iter) {
</span><del>- if ((*iter)->codeOrigin == CodeOrigin(index))
</del><ins>+ if ((*iter)->codeOrigin() == CodeOrigin(index))
</ins><span class="cx"> return *iter;
</span><span class="cx"> }
</span><span class="cx"> return nullptr;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGJITCompilercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -248,9 +248,9 @@
</span><span class="cx"> info.specializationKind(),
</span><span class="cx"> RegisterPreservationNotRequired);
</span><span class="cx"> linkBuffer.link(record.m_slowCall, FunctionPtr(m_vm->getCTIStub(generator).code().executableAddress()));
</span><del>- info.callReturnLocation = linkBuffer.locationOfNearCall(record.m_slowCall);
- info.hotPathBegin = linkBuffer.locationOf(record.m_targetToCheck);
- info.hotPathOther = linkBuffer.locationOfNearCall(record.m_fastCall);
</del><ins>+ info.setCallLocations(linkBuffer.locationOfNearCall(record.m_slowCall),
+ linkBuffer.locationOf(record.m_targetToCheck),
+ linkBuffer.locationOfNearCall(record.m_fastCall));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> MacroAssemblerCodeRef osrExitThunk = vm()->getCTIStub(osrExitGenerationThunkGenerator);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGOSRExitCompilerCommoncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -158,7 +158,7 @@
</span><span class="cx"> baselineCodeBlockForCaller->getCallLinkInfoForBytecodeIndex(callBytecodeIndex);
</span><span class="cx"> RELEASE_ASSERT(callLinkInfo);
</span><span class="cx">
</span><del>- jumpTarget = callLinkInfo->callReturnLocation.executableAddress();
</del><ins>+ jumpTarget = callLinkInfo->callReturnLocation().executableAddress();
</ins><span class="cx"> break;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -829,9 +829,7 @@
</span><span class="cx">
</span><span class="cx"> jsValueResult(resultTagGPR, resultPayloadGPR, node, DataFormatJS, UseChildrenCalledExplicitly);
</span><span class="cx">
</span><del>- info->callType = callType;
- info->codeOrigin = node->origin.semantic;
- info->calleeGPR = calleePayloadGPR;
</del><ins>+ info->setUpCall(callType, node->origin.semantic, calleePayloadGPR);
</ins><span class="cx"> m_jit.addJSCall(fastCall, slowCall, targetToCheck, info);
</span><span class="cx">
</span><span class="cx"> // If we were varargs, then after the calls are done, we need to reestablish our stack pointer.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJIT64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -792,10 +792,7 @@
</span><span class="cx">
</span><span class="cx"> jsValueResult(resultGPR, m_currentNode, DataFormatJS, UseChildrenCalledExplicitly);
</span><span class="cx">
</span><del>- callLinkInfo->callType = callType;
- callLinkInfo->codeOrigin = m_currentNode->origin.semantic;
- callLinkInfo->calleeGPR = calleeGPR;
-
</del><ins>+ callLinkInfo->setUpCall(callType, m_currentNode->origin.semantic, calleeGPR);
</ins><span class="cx"> m_jit.addJSCall(fastCall, slowCall, targetToCheck, callLinkInfo);
</span><span class="cx">
</span><span class="cx"> // If we were varargs, then after the calls are done, we need to reestablish our stack pointer.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLJSCallBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLJSCallBase.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLJSCallBase.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/ftl/FTLJSCallBase.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -74,14 +74,10 @@
</span><span class="cx">
</span><span class="cx"> linkBuffer.link(
</span><span class="cx"> m_slowCall, FunctionPtr(vm.getCTIStub(generator).code().executableAddress()));
</span><del>-
- m_callLinkInfo->isFTL = true;
- m_callLinkInfo->callType = m_type;
- m_callLinkInfo->codeOrigin = m_origin;
- m_callLinkInfo->callReturnLocation = linkBuffer.locationOfNearCall(m_slowCall);
- m_callLinkInfo->hotPathBegin = linkBuffer.locationOf(m_targetToCheck);
- m_callLinkInfo->hotPathOther = linkBuffer.locationOfNearCall(m_fastCall);
- m_callLinkInfo->calleeGPR = GPRInfo::regT0;
</del><ins>+
+ m_callLinkInfo->setUpCallFromFTL(m_type, m_origin, linkBuffer.locationOfNearCall(m_slowCall),
+ linkBuffer.locationOf(m_targetToCheck), linkBuffer.locationOfNearCall(m_fastCall),
+ GPRInfo::regT0);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> } } // namespace JSC::FTL
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitAccessorCallJITStubRoutineh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/AccessorCallJITStubRoutine.h (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/AccessorCallJITStubRoutine.h        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/jit/AccessorCallJITStubRoutine.h        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx">
</span><span class="cx"> namespace JSC {
</span><span class="cx">
</span><del>-struct CallLinkInfo;
</del><ins>+class CallLinkInfo;
</ins><span class="cx">
</span><span class="cx"> // JIT stub routine for use by JavaScript accessors. These will be making a JS
</span><span class="cx"> // call that requires inline caching.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JIT.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JIT.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/jit/JIT.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -678,9 +678,9 @@
</span><span class="cx"> for (unsigned i = 0; i < m_callCompilationInfo.size(); ++i) {
</span><span class="cx"> CallCompilationInfo& compilationInfo = m_callCompilationInfo[i];
</span><span class="cx"> CallLinkInfo& info = *compilationInfo.callLinkInfo;
</span><del>- info.callReturnLocation = patchBuffer.locationOfNearCall(compilationInfo.callReturnLocation);
- info.hotPathBegin = patchBuffer.locationOf(compilationInfo.hotPathBegin);
- info.hotPathOther = patchBuffer.locationOfNearCall(compilationInfo.hotPathOther);
</del><ins>+ info.setCallLocations(patchBuffer.locationOfNearCall(compilationInfo.callReturnLocation),
+ patchBuffer.locationOf(compilationInfo.hotPathBegin),
+ patchBuffer.locationOfNearCall(compilationInfo.hotPathOther));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> CompactJITCodeMap::Encoder jitCodeMapEncoder;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JIT.h (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JIT.h        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/jit/JIT.h        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -52,6 +52,7 @@
</span><span class="cx"> namespace JSC {
</span><span class="cx">
</span><span class="cx"> class ArrayAllocationProfile;
</span><ins>+ class CallLinkInfo;
</ins><span class="cx"> class CodeBlock;
</span><span class="cx"> class FunctionExecutable;
</span><span class="cx"> class JIT;
</span><span class="lines">@@ -63,7 +64,6 @@
</span><span class="cx"> class Register;
</span><span class="cx"> class StructureChain;
</span><span class="cx">
</span><del>- struct CallLinkInfo;
</del><span class="cx"> struct Instruction;
</span><span class="cx"> struct OperandTypes;
</span><span class="cx"> struct PolymorphicAccessStructureList;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITCallcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITCall.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITCall.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/jit/JITCall.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -72,12 +72,12 @@
</span><span class="cx">
</span><span class="cx"> // Profile the argument count.
</span><span class="cx"> load32(Address(regT1, JSStack::ArgumentCount * static_cast<int>(sizeof(Register)) + PayloadOffset), regT2);
</span><del>- load8(&info->maxNumArguments, regT0);
</del><ins>+ load8(info->addressOfMaxNumArguments(), regT0);
</ins><span class="cx"> Jump notBiggest = branch32(Above, regT0, regT2);
</span><span class="cx"> Jump notSaturated = branch32(BelowOrEqual, regT2, TrustedImm32(255));
</span><span class="cx"> move(TrustedImm32(255), regT2);
</span><span class="cx"> notSaturated.link(this);
</span><del>- store8(regT2, &info->maxNumArguments);
</del><ins>+ store8(regT2, info->addressOfMaxNumArguments());
</ins><span class="cx"> notBiggest.link(this);
</span><span class="cx">
</span><span class="cx"> // Initialize 'this'.
</span><span class="lines">@@ -178,9 +178,7 @@
</span><span class="cx"> addSlowCase(slowCase);
</span><span class="cx">
</span><span class="cx"> ASSERT(m_callCompilationInfo.size() == callLinkInfoIndex);
</span><del>- info->callType = CallLinkInfo::callTypeFor(opcodeID);
- info->codeOrigin = CodeOrigin(m_bytecodeOffset);
- info->calleeGPR = regT0;
</del><ins>+ info->setUpCall(CallLinkInfo::callTypeFor(opcodeID), CodeOrigin(m_bytecodeOffset), regT0);
</ins><span class="cx"> m_callCompilationInfo.append(CallCompilationInfo());
</span><span class="cx"> m_callCompilationInfo[callLinkInfoIndex].hotPathBegin = addressOfLinkedFunctionCheck;
</span><span class="cx"> m_callCompilationInfo[callLinkInfoIndex].callLinkInfo = info;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITCall32_64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITCall32_64.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITCall32_64.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/jit/JITCall32_64.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -132,12 +132,12 @@
</span><span class="cx">
</span><span class="cx"> // Profile the argument count.
</span><span class="cx"> load32(Address(regT1, JSStack::ArgumentCount * static_cast<int>(sizeof(Register)) + PayloadOffset), regT2);
</span><del>- load8(&info->maxNumArguments, regT0);
</del><ins>+ load8(info->addressOfMaxNumArguments(), regT0);
</ins><span class="cx"> Jump notBiggest = branch32(Above, regT0, regT2);
</span><span class="cx"> Jump notSaturated = branch32(BelowOrEqual, regT2, TrustedImm32(255));
</span><span class="cx"> move(TrustedImm32(255), regT2);
</span><span class="cx"> notSaturated.link(this);
</span><del>- store8(regT2, &info->maxNumArguments);
</del><ins>+ store8(regT2, info->addressOfMaxNumArguments());
</ins><span class="cx"> notBiggest.link(this);
</span><span class="cx">
</span><span class="cx"> // Initialize 'this'.
</span><span class="lines">@@ -243,9 +243,7 @@
</span><span class="cx"> addSlowCase(slowCase);
</span><span class="cx">
</span><span class="cx"> ASSERT(m_callCompilationInfo.size() == callLinkInfoIndex);
</span><del>- info->callType = CallLinkInfo::callTypeFor(opcodeID);
- info->codeOrigin = CodeOrigin(m_bytecodeOffset);
- info->calleeGPR = regT0;
</del><ins>+ info->setUpCall(CallLinkInfo::callTypeFor(opcodeID), CodeOrigin(m_bytecodeOffset), regT0);
</ins><span class="cx"> m_callCompilationInfo.append(CallCompilationInfo());
</span><span class="cx"> m_callCompilationInfo[callLinkInfoIndex].hotPathBegin = addressOfLinkedFunctionCheck;
</span><span class="cx"> m_callCompilationInfo[callLinkInfoIndex].callLinkInfo = info;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITOperationscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITOperations.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITOperations.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/jit/JITOperations.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -795,7 +795,7 @@
</span><span class="cx"> }
</span><span class="cx"> codeBlock = functionExecutable->codeBlockFor(kind);
</span><span class="cx"> ArityCheckMode arity;
</span><del>- if (execCallee->argumentCountIncludingThis() < static_cast<size_t>(codeBlock->numParameters()) || callLinkInfo->callType == CallLinkInfo::CallVarargs || callLinkInfo->callType == CallLinkInfo::ConstructVarargs)
</del><ins>+ if (execCallee->argumentCountIncludingThis() < static_cast<size_t>(codeBlock->numParameters()) || callLinkInfo->callType() == CallLinkInfo::CallVarargs || callLinkInfo->callType() == CallLinkInfo::ConstructVarargs)
</ins><span class="cx"> arity = MustCheckArity;
</span><span class="cx"> else
</span><span class="cx"> arity = ArityCheckNotRequired;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitPolymorphicCallStubRoutinecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/PolymorphicCallStubRoutine.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/PolymorphicCallStubRoutine.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/jit/PolymorphicCallStubRoutine.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -45,7 +45,7 @@
</span><span class="cx"> {
</span><span class="cx"> if (m_callLinkInfo) {
</span><span class="cx"> if (Options::showDisassembly())
</span><del>- dataLog("Unlinking polymorphic call at ", m_callLinkInfo->callReturnLocation, ", ", m_callLinkInfo->codeOrigin, "\n");
</del><ins>+ dataLog("Unlinking polymorphic call at ", m_callLinkInfo->callReturnLocation(), ", ", m_callLinkInfo->codeOrigin(), "\n");
</ins><span class="cx">
</span><span class="cx"> m_callLinkInfo->unlink(repatchBuffer);
</span><span class="cx"> }
</span><span class="lines">@@ -57,7 +57,7 @@
</span><span class="cx"> void PolymorphicCallNode::clearCallLinkInfo()
</span><span class="cx"> {
</span><span class="cx"> if (Options::showDisassembly())
</span><del>- dataLog("Clearing call link info for polymorphic call at ", m_callLinkInfo->callReturnLocation, ", ", m_callLinkInfo->codeOrigin, "\n");
</del><ins>+ dataLog("Clearing call link info for polymorphic call at ", m_callLinkInfo->callReturnLocation(), ", ", m_callLinkInfo->codeOrigin(), "\n");
</ins><span class="cx">
</span><span class="cx"> m_callLinkInfo = nullptr;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitPolymorphicCallStubRoutineh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/PolymorphicCallStubRoutine.h (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/PolymorphicCallStubRoutine.h        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/jit/PolymorphicCallStubRoutine.h        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -38,7 +38,7 @@
</span><span class="cx">
</span><span class="cx"> namespace JSC {
</span><span class="cx">
</span><del>-struct CallLinkInfo;
</del><ins>+class CallLinkInfo;
</ins><span class="cx">
</span><span class="cx"> class PolymorphicCallNode : public BasicRawSentinelNode<PolymorphicCallNode> {
</span><span class="cx"> WTF_MAKE_NONCOPYABLE(PolymorphicCallNode);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitRepatchcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/Repatch.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/Repatch.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/jit/Repatch.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -448,9 +448,7 @@
</span><span class="cx"> // shrink it after.
</span><span class="cx">
</span><span class="cx"> callLinkInfo = std::make_unique<CallLinkInfo>();
</span><del>- callLinkInfo->callType = CallLinkInfo::Call;
- callLinkInfo->codeOrigin = stubInfo.codeOrigin;
- callLinkInfo->calleeGPR = loadedValueGPR;
</del><ins>+ callLinkInfo->setUpCall(CallLinkInfo::Call, stubInfo.codeOrigin, loadedValueGPR);
</ins><span class="cx">
</span><span class="cx"> MacroAssembler::JumpList done;
</span><span class="cx">
</span><span class="lines">@@ -584,9 +582,9 @@
</span><span class="cx"> patchBuffer.link(operationCall, custom);
</span><span class="cx"> patchBuffer.link(handlerCall, lookupExceptionHandler);
</span><span class="cx"> } else if (kind == CallGetter || kind == CallSetter) {
</span><del>- callLinkInfo->hotPathOther = patchBuffer.locationOfNearCall(fastPathCall);
- callLinkInfo->hotPathBegin = patchBuffer.locationOf(addressOfLinkFunctionCheck);
- callLinkInfo->callReturnLocation = patchBuffer.locationOfNearCall(slowPathCall);
</del><ins>+ callLinkInfo->setCallLocations(patchBuffer.locationOfNearCall(slowPathCall),
+ patchBuffer.locationOf(addressOfLinkFunctionCheck),
+ patchBuffer.locationOfNearCall(fastPathCall));
</ins><span class="cx">
</span><span class="cx"> ThunkGenerator generator = linkThunkGeneratorFor(
</span><span class="cx"> CodeForCall, RegisterPreservationNotRequired);
</span><span class="lines">@@ -1606,7 +1604,7 @@
</span><span class="cx"> RepatchBuffer& repatchBuffer, VM* vm, CallLinkInfo& callLinkInfo, ThunkGenerator generator)
</span><span class="cx"> {
</span><span class="cx"> repatchBuffer.relink(
</span><del>- callLinkInfo.callReturnLocation, vm->getCTIStub(generator).code());
</del><ins>+ callLinkInfo.callReturnLocation(), vm->getCTIStub(generator).code());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static void linkSlowFor(
</span><span class="lines">@@ -1621,7 +1619,7 @@
</span><span class="cx"> JSFunction* callee, MacroAssemblerCodePtr codePtr, CodeSpecializationKind kind,
</span><span class="cx"> RegisterPreservationMode registers)
</span><span class="cx"> {
</span><del>- ASSERT(!callLinkInfo.stub);
</del><ins>+ ASSERT(!callLinkInfo.stub());
</ins><span class="cx">
</span><span class="cx"> CodeBlock* callerCodeBlock = exec->callerFrame()->codeBlock();
</span><span class="cx">
</span><span class="lines">@@ -1630,11 +1628,11 @@
</span><span class="cx"> RepatchBuffer repatchBuffer(callerCodeBlock);
</span><span class="cx">
</span><span class="cx"> ASSERT(!callLinkInfo.isLinked());
</span><del>- callLinkInfo.callee.set(exec->callerFrame()->vm(), callLinkInfo.hotPathBegin, callerCodeBlock->ownerExecutable(), callee);
- callLinkInfo.lastSeenCallee.set(exec->callerFrame()->vm(), callerCodeBlock->ownerExecutable(), callee);
</del><ins>+ callLinkInfo.setCallee(exec->callerFrame()->vm(), callLinkInfo.hotPathBegin(), callerCodeBlock->ownerExecutable(), callee);
+ callLinkInfo.setLastSeenCallee(exec->callerFrame()->vm(), callerCodeBlock->ownerExecutable(), callee);
</ins><span class="cx"> if (shouldShowDisassemblyFor(callerCodeBlock))
</span><del>- dataLog("Linking call in ", *callerCodeBlock, " at ", callLinkInfo.codeOrigin, " to ", pointerDump(calleeCodeBlock), ", entrypoint at ", codePtr, "\n");
- repatchBuffer.relink(callLinkInfo.hotPathOther, codePtr);
</del><ins>+ dataLog("Linking call in ", *callerCodeBlock, " at ", callLinkInfo.codeOrigin(), " to ", pointerDump(calleeCodeBlock), ", entrypoint at ", codePtr, "\n");
+ repatchBuffer.relink(callLinkInfo.hotPathOther(), codePtr);
</ins><span class="cx">
</span><span class="cx"> if (calleeCodeBlock)
</span><span class="cx"> calleeCodeBlock->linkIncomingCall(exec->callerFrame(), &callLinkInfo);
</span><span class="lines">@@ -1665,12 +1663,12 @@
</span><span class="cx"> RepatchBuffer& repatchBuffer, VM* vm, CallLinkInfo& callLinkInfo, ThunkGenerator generator)
</span><span class="cx"> {
</span><span class="cx"> repatchBuffer.revertJumpReplacementToBranchPtrWithPatch(
</span><del>- RepatchBuffer::startOfBranchPtrWithPatchOnRegister(callLinkInfo.hotPathBegin),
- static_cast<MacroAssembler::RegisterID>(callLinkInfo.calleeGPR), 0);
</del><ins>+ RepatchBuffer::startOfBranchPtrWithPatchOnRegister(callLinkInfo.hotPathBegin()),
+ static_cast<MacroAssembler::RegisterID>(callLinkInfo.calleeGPR()), 0);
</ins><span class="cx"> linkSlowFor(repatchBuffer, vm, callLinkInfo, generator);
</span><del>- callLinkInfo.hasSeenShouldRepatch = false;
- callLinkInfo.callee.clear();
- callLinkInfo.stub.clear();
</del><ins>+ callLinkInfo.clearSeen();
+ callLinkInfo.clearCallee();
+ callLinkInfo.clearStub();
</ins><span class="cx"> if (callLinkInfo.isOnList())
</span><span class="cx"> callLinkInfo.remove();
</span><span class="cx"> }
</span><span class="lines">@@ -1680,7 +1678,7 @@
</span><span class="cx"> CodeSpecializationKind kind, RegisterPreservationMode registers)
</span><span class="cx"> {
</span><span class="cx"> if (Options::showDisassembly())
</span><del>- dataLog("Unlinking call from ", callLinkInfo.callReturnLocation, " in request from ", pointerDump(repatchBuffer.codeBlock()), "\n");
</del><ins>+ dataLog("Unlinking call from ", callLinkInfo.callReturnLocation(), " in request from ", pointerDump(repatchBuffer.codeBlock()), "\n");
</ins><span class="cx">
</span><span class="cx"> revertCall(
</span><span class="cx"> repatchBuffer, repatchBuffer.codeBlock()->vm(), callLinkInfo,
</span><span class="lines">@@ -1726,9 +1724,9 @@
</span><span class="cx"> VM* vm = callerCodeBlock->vm();
</span><span class="cx">
</span><span class="cx"> CallVariantList list;
</span><del>- if (PolymorphicCallStubRoutine* stub = callLinkInfo.stub.get())
</del><ins>+ if (PolymorphicCallStubRoutine* stub = callLinkInfo.stub())
</ins><span class="cx"> list = stub->variants();
</span><del>- else if (JSFunction* oldCallee = callLinkInfo.callee.get())
</del><ins>+ else if (JSFunction* oldCallee = callLinkInfo.callee())
</ins><span class="cx"> list = CallVariantList{ CallVariant(oldCallee) };
</span><span class="cx">
</span><span class="cx"> list = variantListWithVariant(list, newVariant);
</span><span class="lines">@@ -1746,7 +1744,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> if (isClosureCall)
</span><del>- callLinkInfo.hasSeenClosure = true;
</del><ins>+ callLinkInfo.setHasSeenClosure();
</ins><span class="cx">
</span><span class="cx"> Vector<PolymorphicCallCase> callCases;
</span><span class="cx">
</span><span class="lines">@@ -1760,7 +1758,7 @@
</span><span class="cx">
</span><span class="cx"> // If we cannot handle a callee, assume that it's better for this whole thing to be a
</span><span class="cx"> // virtual call.
</span><del>- if (exec->argumentCountIncludingThis() < static_cast<size_t>(codeBlock->numParameters()) || callLinkInfo.callType == CallLinkInfo::CallVarargs || callLinkInfo.callType == CallLinkInfo::ConstructVarargs) {
</del><ins>+ if (exec->argumentCountIncludingThis() < static_cast<size_t>(codeBlock->numParameters()) || callLinkInfo.callType() == CallLinkInfo::CallVarargs || callLinkInfo.callType() == CallLinkInfo::ConstructVarargs) {
</ins><span class="cx"> linkVirtualFor(exec, callLinkInfo, CodeForCall, registers);
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="lines">@@ -1780,7 +1778,7 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- GPRReg calleeGPR = static_cast<GPRReg>(callLinkInfo.calleeGPR);
</del><ins>+ GPRReg calleeGPR = static_cast<GPRReg>(callLinkInfo.calleeGPR());
</ins><span class="cx">
</span><span class="cx"> CCallHelpers stubJit(vm, callerCodeBlock);
</span><span class="cx">
</span><span class="lines">@@ -1895,7 +1893,7 @@
</span><span class="cx"> stubJit.move(CCallHelpers::TrustedImm32(JSValue::CellTag), GPRInfo::regT1);
</span><span class="cx"> #endif
</span><span class="cx"> stubJit.move(CCallHelpers::TrustedImmPtr(&callLinkInfo), GPRInfo::regT2);
</span><del>- stubJit.move(CCallHelpers::TrustedImmPtr(callLinkInfo.callReturnLocation.executableAddress()), GPRInfo::regT4);
</del><ins>+ stubJit.move(CCallHelpers::TrustedImmPtr(callLinkInfo.callReturnLocation().executableAddress()), GPRInfo::regT4);
</ins><span class="cx">
</span><span class="cx"> stubJit.restoreReturnAddressBeforeReturn(GPRInfo::regT4);
</span><span class="cx"> AssemblyHelpers::Jump slow = stubJit.jump();
</span><span class="lines">@@ -1912,16 +1910,16 @@
</span><span class="cx"> callToCodePtr.call, FunctionPtr(callToCodePtr.codePtr.executableAddress()));
</span><span class="cx"> }
</span><span class="cx"> if (JITCode::isOptimizingJIT(callerCodeBlock->jitType()))
</span><del>- patchBuffer.link(done, callLinkInfo.callReturnLocation.labelAtOffset(0));
</del><ins>+ patchBuffer.link(done, callLinkInfo.callReturnLocation().labelAtOffset(0));
</ins><span class="cx"> else
</span><del>- patchBuffer.link(done, callLinkInfo.hotPathOther.labelAtOffset(0));
</del><ins>+ patchBuffer.link(done, callLinkInfo.hotPathOther().labelAtOffset(0));
</ins><span class="cx"> patchBuffer.link(slow, CodeLocationLabel(vm->getCTIStub(linkPolymorphicCallThunkGeneratorFor(registers)).code()));
</span><span class="cx">
</span><span class="cx"> RefPtr<PolymorphicCallStubRoutine> stubRoutine = adoptRef(new PolymorphicCallStubRoutine(
</span><span class="cx"> FINALIZE_CODE_FOR(
</span><span class="cx"> callerCodeBlock, patchBuffer,
</span><span class="cx"> ("Polymorphic call stub for %s, return point %p, targets %s",
</span><del>- toCString(*callerCodeBlock).data(), callLinkInfo.callReturnLocation.labelAtOffset(0).executableAddress(),
</del><ins>+ toCString(*callerCodeBlock).data(), callLinkInfo.callReturnLocation().labelAtOffset(0).executableAddress(),
</ins><span class="cx"> toCString(listDump(callCases)).data())),
</span><span class="cx"> *vm, callerCodeBlock->ownerExecutable(), exec->callerFrame(), callLinkInfo, callCases,
</span><span class="cx"> WTF::move(fastCounts)));
</span><span class="lines">@@ -1929,14 +1927,14 @@
</span><span class="cx"> RepatchBuffer repatchBuffer(callerCodeBlock);
</span><span class="cx">
</span><span class="cx"> repatchBuffer.replaceWithJump(
</span><del>- RepatchBuffer::startOfBranchPtrWithPatchOnRegister(callLinkInfo.hotPathBegin),
</del><ins>+ RepatchBuffer::startOfBranchPtrWithPatchOnRegister(callLinkInfo.hotPathBegin()),
</ins><span class="cx"> CodeLocationLabel(stubRoutine->code().code()));
</span><span class="cx"> // This is weird. The original slow path should no longer be reachable.
</span><span class="cx"> linkSlowFor(repatchBuffer, vm, callLinkInfo, CodeForCall, registers);
</span><span class="cx">
</span><span class="cx"> // If there had been a previous stub routine, that one will die as soon as the GC runs and sees
</span><span class="cx"> // that it's no longer on stack.
</span><del>- callLinkInfo.stub = stubRoutine.release();
</del><ins>+ callLinkInfo.setStub(stubRoutine.release());
</ins><span class="cx">
</span><span class="cx"> // The call link info no longer has a call cache apart from the jump to the polymorphic call
</span><span class="cx"> // stub.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitThunkGeneratorscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp (185929 => 185930)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp        2015-06-24 22:36:07 UTC (rev 185929)
+++ trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp        2015-06-24 22:37:30 UTC (rev 185930)
</span><span class="lines">@@ -177,7 +177,7 @@
</span><span class="cx"> // slow path execution for the profiler.
</span><span class="cx"> jit.add32(
</span><span class="cx"> CCallHelpers::TrustedImm32(1),
</span><del>- CCallHelpers::Address(GPRInfo::regT2, OBJECT_OFFSETOF(CallLinkInfo, slowPathCount)));
</del><ins>+ CCallHelpers::Address(GPRInfo::regT2, CallLinkInfo::offsetOfSlowPathCount()));
</ins><span class="cx">
</span><span class="cx"> // FIXME: we should have a story for eliminating these checks. In many cases,
</span><span class="cx"> // the DFG knows that the value is definitely a cell, or definitely a function.
</span></span></pre>
</div>
</div>
</body>
</html>