<!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  &lt;msaboff@apple.com&gt;
+
+        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  &lt;d_russell@apple.com&gt;
</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&amp; 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 = [&amp;] (JSFunction* callee) {
</span><span class="cx">         if (Heap::isMarked(callee-&gt;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-&gt;visitWeak(repatchBuffer)) {
</del><ins>+        if (stub()) {
+            if (!stub()-&gt;visitWeak(repatchBuffer)) {
</ins><span class="cx">                 if (Options::verboseOSR()) {
</span><span class="cx">                     dataLog(
</span><span class="cx">                         &quot;Clearing closure call from &quot;, *repatchBuffer.codeBlock(), &quot; to &quot;,
</span><del>-                        listDump(stub-&gt;variants()), &quot;, stub routine &quot;, RawPointer(stub.get()),
</del><ins>+                        listDump(stub()-&gt;variants()), &quot;, stub routine &quot;, RawPointer(stub()),
</ins><span class="cx">                         &quot;.\n&quot;);
</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">                     &quot;Clearing call from &quot;, *repatchBuffer.codeBlock(), &quot; to &quot;,
</span><del>-                    RawPointer(callee.get()), &quot; (&quot;,
-                    callee.get()-&gt;executable()-&gt;hashFor(specializationKind()),
</del><ins>+                    RawPointer(m_callee.get()), &quot; (&quot;,
+                    m_callee.get()-&gt;executable()-&gt;hashFor(specializationKind()),
</ins><span class="cx">                     &quot;).\n&quot;);
</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 &amp;&amp; !Heap::isMarked(lastSeenCallee.get())) {
-        handleSpecificCallee(lastSeenCallee.get());
-        lastSeenCallee.clear();
</del><ins>+    if (haveLastSeenCallee() &amp;&amp; !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&lt;CallLinkInfo&gt; {
</del><ins>+class CallLinkInfo : public BasicRawSentinelNode&lt;CallLinkInfo&gt; {
+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-&gt;clearCallNodesFor(this);
</del><ins>+        if (stub())
+            m_stub-&gt;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&lt;CallType&gt;(callType));
</del><ins>+        return specializationKindFor(static_cast&lt;CallType&gt;(m_callType));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    CodeLocationNearCall callReturnLocation;
-    CodeLocationDataLabelPtr hotPathBegin;
-    CodeLocationNearCall hotPathOther;
-    JITWriteBarrier&lt;JSFunction&gt; callee;
-    WriteBarrier&lt;JSFunction&gt; lastSeenCallee;
-    RefPtr&lt;PolymorphicCallStubRoutine&gt; 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&amp;);
</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&amp; 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&amp; 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&lt;PolymorphicCallStubRoutine&gt; 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&lt;CallType&gt;(m_callType);
+    }
+
+    uint8_t* addressOfMaxNumArguments()
+    {
+        return &amp;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&amp;);
</span><del>-    
</del><ins>+
</ins><span class="cx">     static CallLinkInfo&amp; dummy();
</span><ins>+
+private:
+    CodeLocationNearCall m_callReturnLocation;
+    CodeLocationDataLabelPtr m_hotPathBegin;
+    CodeLocationNearCall m_hotPathOther;
+    JITWriteBarrier&lt;JSFunction&gt; m_callee;
+    WriteBarrier&lt;JSFunction&gt; m_lastSeenCallee;
+    RefPtr&lt;PolymorphicCallStubRoutine&gt; 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&amp; 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&lt;CodeOrigin, CallLinkInfo*, CodeOriginApproximateHash&gt; 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&amp;, CallLinkInfo&amp; 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-&gt;edges();
</span><span class="lines">@@ -174,7 +174,7 @@
</span><span class="cx">         RELEASE_ASSERT(edges.first().count() &gt;= 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 &lt; 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-&gt;alternative();
</span><span class="cx">     for (auto iter = dfgCodeBlock-&gt;callLinkInfosBegin(); !!iter; ++iter) {
</span><span class="cx">         CallLinkInfo&amp; 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-&gt;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-&gt;lastSeenCallee.get();
</del><ins>+            JSFunction* target = info-&gt;lastSeenCallee();
</ins><span class="cx">             if (target)
</span><span class="cx">                 out.printf(&quot; jit(%p, exec %p)&quot;, target, target-&gt;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)-&gt;codeOrigin == CodeOrigin(index))
</del><ins>+        if ((*iter)-&gt;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-&gt;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()-&gt;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-&gt;getCallLinkInfoForBytecodeIndex(callBytecodeIndex);
</span><span class="cx">             RELEASE_ASSERT(callLinkInfo);
</span><span class="cx">             
</span><del>-            jumpTarget = callLinkInfo-&gt;callReturnLocation.executableAddress();
</del><ins>+            jumpTarget = callLinkInfo-&gt;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-&gt;callType = callType;
-    info-&gt;codeOrigin = node-&gt;origin.semantic;
-    info-&gt;calleeGPR = calleePayloadGPR;
</del><ins>+    info-&gt;setUpCall(callType, node-&gt;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-&gt;callType = callType;
-    callLinkInfo-&gt;codeOrigin = m_currentNode-&gt;origin.semantic;
-    callLinkInfo-&gt;calleeGPR = calleeGPR;
-    
</del><ins>+    callLinkInfo-&gt;setUpCall(callType, m_currentNode-&gt;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-&gt;isFTL = true;
-    m_callLinkInfo-&gt;callType = m_type;
-    m_callLinkInfo-&gt;codeOrigin = m_origin;
-    m_callLinkInfo-&gt;callReturnLocation = linkBuffer.locationOfNearCall(m_slowCall);
-    m_callLinkInfo-&gt;hotPathBegin = linkBuffer.locationOf(m_targetToCheck);
-    m_callLinkInfo-&gt;hotPathOther = linkBuffer.locationOfNearCall(m_fastCall);
-    m_callLinkInfo-&gt;calleeGPR = GPRInfo::regT0;
</del><ins>+
+    m_callLinkInfo-&gt;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 &lt; m_callCompilationInfo.size(); ++i) {
</span><span class="cx">         CallCompilationInfo&amp; compilationInfo = m_callCompilationInfo[i];
</span><span class="cx">         CallLinkInfo&amp; 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&lt;int&gt;(sizeof(Register)) + PayloadOffset), regT2);
</span><del>-    load8(&amp;info-&gt;maxNumArguments, regT0);
</del><ins>+    load8(info-&gt;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, &amp;info-&gt;maxNumArguments);
</del><ins>+    store8(regT2, info-&gt;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-&gt;callType = CallLinkInfo::callTypeFor(opcodeID);
-    info-&gt;codeOrigin = CodeOrigin(m_bytecodeOffset);
-    info-&gt;calleeGPR = regT0;
</del><ins>+    info-&gt;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&lt;int&gt;(sizeof(Register)) + PayloadOffset), regT2);
</span><del>-    load8(&amp;info-&gt;maxNumArguments, regT0);
</del><ins>+    load8(info-&gt;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, &amp;info-&gt;maxNumArguments);
</del><ins>+    store8(regT2, info-&gt;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-&gt;callType = CallLinkInfo::callTypeFor(opcodeID);
-    info-&gt;codeOrigin = CodeOrigin(m_bytecodeOffset);
-    info-&gt;calleeGPR = regT0;
</del><ins>+    info-&gt;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-&gt;codeBlockFor(kind);
</span><span class="cx">         ArityCheckMode arity;
</span><del>-        if (execCallee-&gt;argumentCountIncludingThis() &lt; static_cast&lt;size_t&gt;(codeBlock-&gt;numParameters()) || callLinkInfo-&gt;callType == CallLinkInfo::CallVarargs || callLinkInfo-&gt;callType == CallLinkInfo::ConstructVarargs)
</del><ins>+        if (execCallee-&gt;argumentCountIncludingThis() &lt; static_cast&lt;size_t&gt;(codeBlock-&gt;numParameters()) || callLinkInfo-&gt;callType() == CallLinkInfo::CallVarargs || callLinkInfo-&gt;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(&quot;Unlinking polymorphic call at &quot;, m_callLinkInfo-&gt;callReturnLocation, &quot;, &quot;, m_callLinkInfo-&gt;codeOrigin, &quot;\n&quot;);
</del><ins>+            dataLog(&quot;Unlinking polymorphic call at &quot;, m_callLinkInfo-&gt;callReturnLocation(), &quot;, &quot;, m_callLinkInfo-&gt;codeOrigin(), &quot;\n&quot;);
</ins><span class="cx"> 
</span><span class="cx">         m_callLinkInfo-&gt;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(&quot;Clearing call link info for polymorphic call at &quot;, m_callLinkInfo-&gt;callReturnLocation, &quot;, &quot;, m_callLinkInfo-&gt;codeOrigin, &quot;\n&quot;);
</del><ins>+        dataLog(&quot;Clearing call link info for polymorphic call at &quot;, m_callLinkInfo-&gt;callReturnLocation(), &quot;, &quot;, m_callLinkInfo-&gt;codeOrigin(), &quot;\n&quot;);
</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&lt;PolymorphicCallNode&gt; {
</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&lt;CallLinkInfo&gt;();
</span><del>-            callLinkInfo-&gt;callType = CallLinkInfo::Call;
-            callLinkInfo-&gt;codeOrigin = stubInfo.codeOrigin;
-            callLinkInfo-&gt;calleeGPR = loadedValueGPR;
</del><ins>+            callLinkInfo-&gt;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-&gt;hotPathOther = patchBuffer.locationOfNearCall(fastPathCall);
-        callLinkInfo-&gt;hotPathBegin = patchBuffer.locationOf(addressOfLinkFunctionCheck);
-        callLinkInfo-&gt;callReturnLocation = patchBuffer.locationOfNearCall(slowPathCall);
</del><ins>+        callLinkInfo-&gt;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&amp; repatchBuffer, VM* vm, CallLinkInfo&amp; callLinkInfo, ThunkGenerator generator)
</span><span class="cx"> {
</span><span class="cx">     repatchBuffer.relink(
</span><del>-        callLinkInfo.callReturnLocation, vm-&gt;getCTIStub(generator).code());
</del><ins>+        callLinkInfo.callReturnLocation(), vm-&gt;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-&gt;callerFrame()-&gt;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-&gt;callerFrame()-&gt;vm(), callLinkInfo.hotPathBegin, callerCodeBlock-&gt;ownerExecutable(), callee);
-    callLinkInfo.lastSeenCallee.set(exec-&gt;callerFrame()-&gt;vm(), callerCodeBlock-&gt;ownerExecutable(), callee);
</del><ins>+    callLinkInfo.setCallee(exec-&gt;callerFrame()-&gt;vm(), callLinkInfo.hotPathBegin(), callerCodeBlock-&gt;ownerExecutable(), callee);
+    callLinkInfo.setLastSeenCallee(exec-&gt;callerFrame()-&gt;vm(), callerCodeBlock-&gt;ownerExecutable(), callee);
</ins><span class="cx">     if (shouldShowDisassemblyFor(callerCodeBlock))
</span><del>-        dataLog(&quot;Linking call in &quot;, *callerCodeBlock, &quot; at &quot;, callLinkInfo.codeOrigin, &quot; to &quot;, pointerDump(calleeCodeBlock), &quot;, entrypoint at &quot;, codePtr, &quot;\n&quot;);
-    repatchBuffer.relink(callLinkInfo.hotPathOther, codePtr);
</del><ins>+        dataLog(&quot;Linking call in &quot;, *callerCodeBlock, &quot; at &quot;, callLinkInfo.codeOrigin(), &quot; to &quot;, pointerDump(calleeCodeBlock), &quot;, entrypoint at &quot;, codePtr, &quot;\n&quot;);
+    repatchBuffer.relink(callLinkInfo.hotPathOther(), codePtr);
</ins><span class="cx">     
</span><span class="cx">     if (calleeCodeBlock)
</span><span class="cx">         calleeCodeBlock-&gt;linkIncomingCall(exec-&gt;callerFrame(), &amp;callLinkInfo);
</span><span class="lines">@@ -1665,12 +1663,12 @@
</span><span class="cx">     RepatchBuffer&amp; repatchBuffer, VM* vm, CallLinkInfo&amp; callLinkInfo, ThunkGenerator generator)
</span><span class="cx"> {
</span><span class="cx">     repatchBuffer.revertJumpReplacementToBranchPtrWithPatch(
</span><del>-        RepatchBuffer::startOfBranchPtrWithPatchOnRegister(callLinkInfo.hotPathBegin),
-        static_cast&lt;MacroAssembler::RegisterID&gt;(callLinkInfo.calleeGPR), 0);
</del><ins>+        RepatchBuffer::startOfBranchPtrWithPatchOnRegister(callLinkInfo.hotPathBegin()),
+        static_cast&lt;MacroAssembler::RegisterID&gt;(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(&quot;Unlinking call from &quot;, callLinkInfo.callReturnLocation, &quot; in request from &quot;, pointerDump(repatchBuffer.codeBlock()), &quot;\n&quot;);
</del><ins>+        dataLog(&quot;Unlinking call from &quot;, callLinkInfo.callReturnLocation(), &quot; in request from &quot;, pointerDump(repatchBuffer.codeBlock()), &quot;\n&quot;);
</ins><span class="cx">     
</span><span class="cx">     revertCall(
</span><span class="cx">         repatchBuffer, repatchBuffer.codeBlock()-&gt;vm(), callLinkInfo,
</span><span class="lines">@@ -1726,9 +1724,9 @@
</span><span class="cx">     VM* vm = callerCodeBlock-&gt;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-&gt;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&lt;PolymorphicCallCase&gt; 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-&gt;argumentCountIncludingThis() &lt; static_cast&lt;size_t&gt;(codeBlock-&gt;numParameters()) || callLinkInfo.callType == CallLinkInfo::CallVarargs || callLinkInfo.callType == CallLinkInfo::ConstructVarargs) {
</del><ins>+            if (exec-&gt;argumentCountIncludingThis() &lt; static_cast&lt;size_t&gt;(codeBlock-&gt;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&lt;GPRReg&gt;(callLinkInfo.calleeGPR);
</del><ins>+    GPRReg calleeGPR = static_cast&lt;GPRReg&gt;(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(&amp;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-&gt;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-&gt;getCTIStub(linkPolymorphicCallThunkGeneratorFor(registers)).code()));
</span><span class="cx">     
</span><span class="cx">     RefPtr&lt;PolymorphicCallStubRoutine&gt; stubRoutine = adoptRef(new PolymorphicCallStubRoutine(
</span><span class="cx">         FINALIZE_CODE_FOR(
</span><span class="cx">             callerCodeBlock, patchBuffer,
</span><span class="cx">             (&quot;Polymorphic call stub for %s, return point %p, targets %s&quot;,
</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-&gt;ownerExecutable(), exec-&gt;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-&gt;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>