<!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>[175593] 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/175593">175593</a></dd>
<dt>Author</dt> <dd>mark.lam@apple.com</dd>
<dt>Date</dt> <dd>2014-11-04 17:19:37 -0800 (Tue, 04 Nov 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Rename checkMarkByte() to jumpIfIsRememberedOrInEden().
&lt;https://webkit.org/b/138369&gt;

Reviewed by Geoffrey Garen.

Write barriers are needed for GC Eden collections so that we can scan pointers
pointing from old generation objects to eden generation objects.  The barrier
currently checks the mark byte in a cell to see if we should skip adding the
cell to the GC remembered set.  The addition should be skipped if:

1. The cell is in the young generation.  It has no old to eden pointers by
   definition.
2. The cell is already in the remembered set.  While it is ok to add the cell
   to the GC remembered set more than once, it would be redundant.  Hence,
   we skip this as an optimization to avoid doing unnecessary work.

The barrier currently names this check as checkMarkByte().  We should rename it
to jumpIfIsRememberedOrInEden() to be clearer about its intent.

Similarly, Jump results of this check are currently named
ownerNotMarkedOrAlreadyRemembered.  This can be misinterpreted as the owner is
not marked or not already remembered.  We should rename it to
ownerIsRememberedOrInEden which is clearer about the intent of the
check.  What we are really checking for is that the cell is in the eden gen,
which is implied by it being &quot;not marked&quot;.

* dfg/DFGOSRExitCompilerCommon.cpp:
(JSC::DFG::osrWriteBarrier):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::writeBarrier):
* dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::writeBarrier):
* dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::writeBarrier):
* jit/AssemblyHelpers.h:
(JSC::AssemblyHelpers::jumpIfIsRememberedOrInEden):
(JSC::AssemblyHelpers::checkMarkByte): Deleted.
* jit/JITPropertyAccess.cpp:
(JSC::JIT::emitWriteBarrier):
* llint/LowLevelInterpreter.asm:
* llint/LowLevelInterpreter32_64.asm:
* llint/LowLevelInterpreter64.asm:
* runtime/JSCell.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGOSRExitCompilerCommoncpp">trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJITcpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.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="#trunkSourceJavaScriptCorejitAssemblyHelpersh">trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITPropertyAccesscpp">trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLowLevelInterpreterasm">trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLowLevelInterpreter32_64asm">trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLowLevelInterpreter64asm">trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSCellh">trunk/Source/JavaScriptCore/runtime/JSCell.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (175592 => 175593)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-11-05 01:08:47 UTC (rev 175592)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-11-05 01:19:37 UTC (rev 175593)
</span><span class="lines">@@ -1,3 +1,49 @@
</span><ins>+2014-11-04  Mark Lam  &lt;mark.lam@apple.com&gt;
+
+        Rename checkMarkByte() to jumpIfIsRememberedOrInEden().
+        &lt;https://webkit.org/b/138369&gt;
+
+        Reviewed by Geoffrey Garen.
+
+        Write barriers are needed for GC Eden collections so that we can scan pointers
+        pointing from old generation objects to eden generation objects.  The barrier
+        currently checks the mark byte in a cell to see if we should skip adding the
+        cell to the GC remembered set.  The addition should be skipped if:
+
+        1. The cell is in the young generation.  It has no old to eden pointers by
+           definition.
+        2. The cell is already in the remembered set.  While it is ok to add the cell
+           to the GC remembered set more than once, it would be redundant.  Hence,
+           we skip this as an optimization to avoid doing unnecessary work.
+
+        The barrier currently names this check as checkMarkByte().  We should rename it
+        to jumpIfIsRememberedOrInEden() to be clearer about its intent.
+
+        Similarly, Jump results of this check are currently named
+        ownerNotMarkedOrAlreadyRemembered.  This can be misinterpreted as the owner is
+        not marked or not already remembered.  We should rename it to
+        ownerIsRememberedOrInEden which is clearer about the intent of the
+        check.  What we are really checking for is that the cell is in the eden gen,
+        which is implied by it being &quot;not marked&quot;.
+
+        * dfg/DFGOSRExitCompilerCommon.cpp:
+        (JSC::DFG::osrWriteBarrier):
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::writeBarrier):
+        * dfg/DFGSpeculativeJIT32_64.cpp:
+        (JSC::DFG::SpeculativeJIT::writeBarrier):
+        * dfg/DFGSpeculativeJIT64.cpp:
+        (JSC::DFG::SpeculativeJIT::writeBarrier):
+        * jit/AssemblyHelpers.h:
+        (JSC::AssemblyHelpers::jumpIfIsRememberedOrInEden):
+        (JSC::AssemblyHelpers::checkMarkByte): Deleted.
+        * jit/JITPropertyAccess.cpp:
+        (JSC::JIT::emitWriteBarrier):
+        * llint/LowLevelInterpreter.asm:
+        * llint/LowLevelInterpreter32_64.asm:
+        * llint/LowLevelInterpreter64.asm:
+        * runtime/JSCell.h:
+
</ins><span class="cx"> 2014-11-04  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Pause on exceptions should show the actual exception
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGOSRExitCompilerCommoncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp (175592 => 175593)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp        2014-11-05 01:08:47 UTC (rev 175592)
+++ trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp        2014-11-05 01:19:37 UTC (rev 175593)
</span><span class="lines">@@ -248,7 +248,7 @@
</span><span class="cx"> #if ENABLE(GGC)
</span><span class="cx"> static void osrWriteBarrier(CCallHelpers&amp; jit, GPRReg owner, GPRReg scratch)
</span><span class="cx"> {
</span><del>-    AssemblyHelpers::Jump ownerNotMarkedOrAlreadyRemembered = jit.checkMarkByte(owner);
</del><ins>+    AssemblyHelpers::Jump ownerIsRememberedOrInEden = jit.jumpIfIsRememberedOrInEden(owner);
</ins><span class="cx"> 
</span><span class="cx">     // We need these extra slots because setupArgumentsWithExecState will use poke on x86.
</span><span class="cx"> #if CPU(X86)
</span><span class="lines">@@ -263,7 +263,7 @@
</span><span class="cx">     jit.addPtr(MacroAssembler::TrustedImm32(sizeof(void*) * 3), MacroAssembler::stackPointerRegister);
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    ownerNotMarkedOrAlreadyRemembered.link(&amp;jit);
</del><ins>+    ownerIsRememberedOrInEden.link(&amp;jit);
</ins><span class="cx"> }
</span><span class="cx"> #endif // ENABLE(GGC)
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJITcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp (175592 => 175593)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2014-11-05 01:08:47 UTC (rev 175592)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2014-11-05 01:19:37 UTC (rev 175593)
</span><span class="lines">@@ -5472,16 +5472,16 @@
</span><span class="cx">     if (Heap::isMarked(value))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(ownerGPR);
</del><ins>+    JITCompiler::Jump ownerIsRememberedOrInEden = m_jit.jumpIfIsRememberedOrInEden(ownerGPR);
</ins><span class="cx">     storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2);
</span><del>-    ownerNotMarkedOrAlreadyRemembered.link(&amp;m_jit);
</del><ins>+    ownerIsRememberedOrInEden.link(&amp;m_jit);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SpeculativeJIT::writeBarrier(GPRReg ownerGPR, GPRReg scratch1, GPRReg scratch2)
</span><span class="cx"> {
</span><del>-    JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(ownerGPR);
</del><ins>+    JITCompiler::Jump ownerIsRememberedOrInEden = m_jit.jumpIfIsRememberedOrInEden(ownerGPR);
</ins><span class="cx">     storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2);
</span><del>-    ownerNotMarkedOrAlreadyRemembered.link(&amp;m_jit);
</del><ins>+    ownerIsRememberedOrInEden.link(&amp;m_jit);
</ins><span class="cx"> }
</span><span class="cx"> #else
</span><span class="cx"> void SpeculativeJIT::compileStoreBarrier(Node* node)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp (175592 => 175593)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2014-11-05 01:08:47 UTC (rev 175592)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2014-11-05 01:19:37 UTC (rev 175593)
</span><span class="lines">@@ -4941,9 +4941,9 @@
</span><span class="cx">     if (!isKnownCell(valueUse.node()))
</span><span class="cx">         isNotCell = m_jit.branch32(JITCompiler::NotEqual, valueTagGPR, JITCompiler::TrustedImm32(JSValue::CellTag));
</span><span class="cx"> 
</span><del>-    JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(ownerGPR);
</del><ins>+    JITCompiler::Jump ownerIsRememberedOrInEden = m_jit.jumpIfIsRememberedOrInEden(ownerGPR);
</ins><span class="cx">     storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2);
</span><del>-    ownerNotMarkedOrAlreadyRemembered.link(&amp;m_jit);
</del><ins>+    ownerIsRememberedOrInEden.link(&amp;m_jit);
</ins><span class="cx"> 
</span><span class="cx">     if (!isKnownCell(valueUse.node()))
</span><span class="cx">         isNotCell.link(&amp;m_jit);
</span><span class="lines">@@ -4955,9 +4955,9 @@
</span><span class="cx">     if (!isKnownCell(valueUse.node()))
</span><span class="cx">         isNotCell = m_jit.branch32(JITCompiler::NotEqual, valueTagGPR, JITCompiler::TrustedImm32(JSValue::CellTag));
</span><span class="cx"> 
</span><del>-    JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(owner);
</del><ins>+    JITCompiler::Jump ownerIsRememberedOrInEden = m_jit.jumpIfIsRememberedOrInEden(owner);
</ins><span class="cx">     storeToWriteBarrierBuffer(owner, scratch1, scratch2);
</span><del>-    ownerNotMarkedOrAlreadyRemembered.link(&amp;m_jit);
</del><ins>+    ownerIsRememberedOrInEden.link(&amp;m_jit);
</ins><span class="cx"> 
</span><span class="cx">     if (!isKnownCell(valueUse.node()))
</span><span class="cx">         isNotCell.link(&amp;m_jit);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJIT64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp (175592 => 175593)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2014-11-05 01:08:47 UTC (rev 175592)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2014-11-05 01:19:37 UTC (rev 175593)
</span><span class="lines">@@ -5031,9 +5031,9 @@
</span><span class="cx">     if (!isKnownCell(valueUse.node()))
</span><span class="cx">         isNotCell = branchNotCell(JSValueRegs(valueGPR));
</span><span class="cx">     
</span><del>-    JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(ownerGPR);
</del><ins>+    JITCompiler::Jump ownerIsRememberedOrInEden = m_jit.jumpIfIsRememberedOrInEden(ownerGPR);
</ins><span class="cx">     storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2);
</span><del>-    ownerNotMarkedOrAlreadyRemembered.link(&amp;m_jit);
</del><ins>+    ownerIsRememberedOrInEden.link(&amp;m_jit);
</ins><span class="cx"> 
</span><span class="cx">     if (!isKnownCell(valueUse.node()))
</span><span class="cx">         isNotCell.link(&amp;m_jit);
</span><span class="lines">@@ -5045,9 +5045,9 @@
</span><span class="cx">     if (!isKnownCell(valueUse.node()))
</span><span class="cx">         isNotCell = branchNotCell(JSValueRegs(valueGPR));
</span><span class="cx">     
</span><del>-    JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = m_jit.checkMarkByte(owner);
</del><ins>+    JITCompiler::Jump ownerIsRememberedOrInEden = m_jit.jumpIfIsRememberedOrInEden(owner);
</ins><span class="cx">     storeToWriteBarrierBuffer(owner, scratch1, scratch2);
</span><del>-    ownerNotMarkedOrAlreadyRemembered.link(&amp;m_jit);
</del><ins>+    ownerIsRememberedOrInEden.link(&amp;m_jit);
</ins><span class="cx"> 
</span><span class="cx">     if (!isKnownCell(valueUse.node()))
</span><span class="cx">         isNotCell.link(&amp;m_jit);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitAssemblyHelpersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h (175592 => 175593)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h        2014-11-05 01:08:47 UTC (rev 175592)
+++ trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h        2014-11-05 01:19:37 UTC (rev 175593)
</span><span class="lines">@@ -665,12 +665,12 @@
</span><span class="cx"> 
</span><span class="cx">     static void emitStoreStructureWithTypeInfo(AssemblyHelpers&amp; jit, TrustedImmPtr structure, RegisterID dest);
</span><span class="cx"> 
</span><del>-    Jump checkMarkByte(GPRReg cell)
</del><ins>+    Jump jumpIfIsRememberedOrInEden(GPRReg cell)
</ins><span class="cx">     {
</span><span class="cx">         return branchTest8(MacroAssembler::NonZero, MacroAssembler::Address(cell, JSCell::gcDataOffset()));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    Jump checkMarkByte(JSCell* cell)
</del><ins>+    Jump jumpIfIsRememberedOrInEden(JSCell* cell)
</ins><span class="cx">     {
</span><span class="cx">         uint8_t* address = reinterpret_cast&lt;uint8_t*&gt;(cell) + JSCell::gcDataOffset();
</span><span class="cx">         return branchTest8(MacroAssembler::NonZero, MacroAssembler::AbsoluteAddress(address));
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITPropertyAccesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp (175592 => 175593)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp        2014-11-05 01:08:47 UTC (rev 175592)
+++ trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp        2014-11-05 01:19:37 UTC (rev 175593)
</span><span class="lines">@@ -828,9 +828,9 @@
</span><span class="cx">     if (mode == ShouldFilterBaseAndValue || mode == ShouldFilterBase)
</span><span class="cx">         ownerNotCell = branchTest64(NonZero, regT0, tagMaskRegister);
</span><span class="cx"> 
</span><del>-    Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(regT0);
</del><ins>+    Jump ownerIsRememberedOrInEden = jumpIfIsRememberedOrInEden(regT0);
</ins><span class="cx">     callOperation(operationUnconditionalWriteBarrier, regT0);
</span><del>-    ownerNotMarkedOrAlreadyRemembered.link(this);
</del><ins>+    ownerIsRememberedOrInEden.link(this);
</ins><span class="cx"> 
</span><span class="cx">     if (mode == ShouldFilterBaseAndValue || mode == ShouldFilterBase)
</span><span class="cx">         ownerNotCell.link(this);
</span><span class="lines">@@ -878,9 +878,9 @@
</span><span class="cx">     if (mode == ShouldFilterBase || mode == ShouldFilterBaseAndValue)
</span><span class="cx">         ownerNotCell = branch32(NotEqual, regT0, TrustedImm32(JSValue::CellTag));
</span><span class="cx"> 
</span><del>-    Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(regT1);
</del><ins>+    Jump ownerIsRememberedOrInEden = jumpIfIsRememberedOrInEden(regT1);
</ins><span class="cx">     callOperation(operationUnconditionalWriteBarrier, regT1);
</span><del>-    ownerNotMarkedOrAlreadyRemembered.link(this);
</del><ins>+    ownerIsRememberedOrInEden.link(this);
</ins><span class="cx"> 
</span><span class="cx">     if (mode == ShouldFilterBase || mode == ShouldFilterBaseAndValue)
</span><span class="cx">         ownerNotCell.link(this);
</span><span class="lines">@@ -919,9 +919,9 @@
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(GGC)
</span><span class="cx">     if (!MarkedBlock::blockFor(owner)-&gt;isMarked(owner)) {
</span><del>-        Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(owner);
</del><ins>+        Jump ownerIsRememberedOrInEden = jumpIfIsRememberedOrInEden(owner);
</ins><span class="cx">         callOperation(operationUnconditionalWriteBarrier, owner);
</span><del>-        ownerNotMarkedOrAlreadyRemembered.link(this);
</del><ins>+        ownerIsRememberedOrInEden.link(this);
</ins><span class="cx">     } else
</span><span class="cx">         callOperation(operationUnconditionalWriteBarrier, owner);
</span><span class="cx"> #else
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpreterasm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm (175592 => 175593)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2014-11-05 01:08:47 UTC (rev 175592)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2014-11-05 01:19:37 UTC (rev 175593)
</span><span class="lines">@@ -509,7 +509,7 @@
</span><span class="cx">     loadb JSCell::m_indexingType[cell], indexingType
</span><span class="cx"> end
</span><span class="cx"> 
</span><del>-macro checkMarkByte(cell, scratch1, scratch2, continuation)
</del><ins>+macro skipIfIsRememberedOrInEden(cell, scratch1, scratch2, continuation)
</ins><span class="cx">     loadb JSCell::m_gcData[cell], scratch1
</span><span class="cx">     continuation(scratch1)
</span><span class="cx"> end
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpreter32_64asm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm (175592 => 175593)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm        2014-11-05 01:08:47 UTC (rev 175592)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm        2014-11-05 01:19:37 UTC (rev 175593)
</span><span class="lines">@@ -569,7 +569,7 @@
</span><span class="cx">     if GGC
</span><span class="cx">         loadisFromInstruction(cellOperand, t1)
</span><span class="cx">         loadConstantOrVariablePayload(t1, CellTag, t2, .writeBarrierDone)
</span><del>-        checkMarkByte(t2, t1, t3, 
</del><ins>+        skipIfIsRememberedOrInEden(t2, t1, t3, 
</ins><span class="cx">             macro(gcData)
</span><span class="cx">                 btbnz gcData, .writeBarrierDone
</span><span class="cx">                 push cfr, PC
</span><span class="lines">@@ -603,7 +603,7 @@
</span><span class="cx">     
</span><span class="cx">         loadp CodeBlock[cfr], t3
</span><span class="cx">         loadp CodeBlock::m_globalObject[t3], t3
</span><del>-        checkMarkByte(t3, t1, t2,
</del><ins>+        skipIfIsRememberedOrInEden(t3, t1, t2,
</ins><span class="cx">             macro(gcData)
</span><span class="cx">                 btbnz gcData, .writeBarrierDone
</span><span class="cx">                 push cfr, PC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpreter64asm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm (175592 => 175593)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2014-11-05 01:08:47 UTC (rev 175592)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2014-11-05 01:19:37 UTC (rev 175593)
</span><span class="lines">@@ -443,7 +443,7 @@
</span><span class="cx">     if GGC
</span><span class="cx">         loadisFromInstruction(cellOperand, t1)
</span><span class="cx">         loadConstantOrVariableCell(t1, t2, .writeBarrierDone)
</span><del>-        checkMarkByte(t2, t1, t3, 
</del><ins>+        skipIfIsRememberedOrInEden(t2, t1, t3, 
</ins><span class="cx">             macro(gcData)
</span><span class="cx">                 btbnz gcData, .writeBarrierDone
</span><span class="cx">                 push PB, PC
</span><span class="lines">@@ -474,7 +474,7 @@
</span><span class="cx">     
</span><span class="cx">         loadp CodeBlock[cfr], t3
</span><span class="cx">         loadp CodeBlock::m_globalObject[t3], t3
</span><del>-        checkMarkByte(t3, t1, t2,
</del><ins>+        skipIfIsRememberedOrInEden(t3, t1, t2,
</ins><span class="cx">             macro(gcData)
</span><span class="cx">                 btbnz gcData, .writeBarrierDone
</span><span class="cx">                 push PB, PC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCellh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCell.h (175592 => 175593)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCell.h        2014-11-05 01:08:47 UTC (rev 175592)
+++ trunk/Source/JavaScriptCore/runtime/JSCell.h        2014-11-05 01:19:37 UTC (rev 175593)
</span><span class="lines">@@ -147,9 +147,14 @@
</span><span class="cx">     JSValue fastGetOwnProperty(VM&amp;, Structure&amp;, PropertyName);
</span><span class="cx"> 
</span><span class="cx">     enum GCData : uint8_t {
</span><del>-        Marked = 0,
-        NotMarked = 1,
-        MarkedAndRemembered = 2,
</del><ins>+        Marked = 0, // The object has survived a GC and is in the old gen.
+        NotMarked = 1, // The object is new and in the eden gen.
+        MarkedAndRemembered = 2, // The object is in the GC's remembered set.
+
+        // The object being in the GC's remembered set implies that it is also
+        // Marked. This is because objects are only added to the remembered sets
+        // by write barriers, and write barriers are only interested in old gen
+        // objects that point to potential eden gen objects.
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     void setMarked() { m_gcData = Marked; }
</span></span></pre>
</div>
</div>

</body>
</html>