<!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>[165135] 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/165135">165135</a></dd>
<dt>Author</dt> <dd>mhahnenberg@apple.com</dd>
<dt>Date</dt> <dd>2014-03-05 15:33:21 -0800 (Wed, 05 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>JSCell::m_gcData should encode its information differently
https://bugs.webkit.org/show_bug.cgi?id=129741

Reviewed by Geoffrey Garen.

We want to keep track of three GC states for an object:

1. Not marked (which implies not in the remembered set)
2. Marked but not in the remembered set
3. Marked and in the remembered set
        
Currently we only indicate marked vs. not marked in JSCell::m_gcData. During a write 
barrier, we only want to take the slow path if the object being stored to is in state #2. 
We'd like to make the test for state #2 as fast as possible, which means making it a 
compare against 0.

* dfg/DFGOSRExitCompilerCommon.cpp:
(JSC::DFG::osrWriteBarrier):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::checkMarkByte):
(JSC::DFG::SpeculativeJIT::writeBarrier):
* dfg/DFGSpeculativeJIT.h:
* dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::writeBarrier):
* dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::writeBarrier):
* ftl/FTLLowerDFGToLLVM.cpp:
(JSC::FTL::LowerDFGToLLVM::allocateCell):
(JSC::FTL::LowerDFGToLLVM::emitStoreBarrier):
* heap/Heap.cpp:
(JSC::Heap::clearRememberedSet):
(JSC::Heap::addToRememberedSet):
* jit/AssemblyHelpers.h:
(JSC::AssemblyHelpers::checkMarkByte):
* jit/JIT.h:
* jit/JITPropertyAccess.cpp:
(JSC::JIT::checkMarkByte):
(JSC::JIT::emitWriteBarrier):
* jit/Repatch.cpp:
(JSC::writeBarrier):
* llint/LowLevelInterpreter.asm:
* llint/LowLevelInterpreter32_64.asm:
* llint/LowLevelInterpreter64.asm:
* runtime/JSCell.h:
(JSC::JSCell::mark):
(JSC::JSCell::remember):
(JSC::JSCell::forget):
(JSC::JSCell::isMarked):
(JSC::JSCell::isRemembered):
* runtime/JSCellInlines.h:
(JSC::JSCell::JSCell):
* runtime/StructureIDBlob.h:
(JSC::StructureIDBlob::StructureIDBlob):</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="#trunkSourceJavaScriptCoredfgDFGSpeculativeJITh">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJIT64cpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLLowerDFGToLLVMcpp">trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeapcpp">trunk/Source/JavaScriptCore/heap/Heap.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapSlotVisitorInlinesh">trunk/Source/JavaScriptCore/heap/SlotVisitorInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitAssemblyHelpersh">trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITh">trunk/Source/JavaScriptCore/jit/JIT.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITPropertyAccesscpp">trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitRepatchcpp">trunk/Source/JavaScriptCore/jit/Repatch.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>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSCellInlinesh">trunk/Source/JavaScriptCore/runtime/JSCellInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructureIDBlobh">trunk/Source/JavaScriptCore/runtime/StructureIDBlob.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -1,3 +1,59 @@
</span><ins>+2014-03-05  Mark Hahnenberg  &lt;mhahnenberg@apple.com&gt;
+
+        JSCell::m_gcData should encode its information differently
+        https://bugs.webkit.org/show_bug.cgi?id=129741
+
+        Reviewed by Geoffrey Garen.
+
+        We want to keep track of three GC states for an object:
+
+        1. Not marked (which implies not in the remembered set)
+        2. Marked but not in the remembered set
+        3. Marked and in the remembered set
+        
+        Currently we only indicate marked vs. not marked in JSCell::m_gcData. During a write 
+        barrier, we only want to take the slow path if the object being stored to is in state #2. 
+        We'd like to make the test for state #2 as fast as possible, which means making it a 
+        compare against 0.
+
+        * dfg/DFGOSRExitCompilerCommon.cpp:
+        (JSC::DFG::osrWriteBarrier):
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::checkMarkByte):
+        (JSC::DFG::SpeculativeJIT::writeBarrier):
+        * dfg/DFGSpeculativeJIT.h:
+        * dfg/DFGSpeculativeJIT32_64.cpp:
+        (JSC::DFG::SpeculativeJIT::writeBarrier):
+        * dfg/DFGSpeculativeJIT64.cpp:
+        (JSC::DFG::SpeculativeJIT::writeBarrier):
+        * ftl/FTLLowerDFGToLLVM.cpp:
+        (JSC::FTL::LowerDFGToLLVM::allocateCell):
+        (JSC::FTL::LowerDFGToLLVM::emitStoreBarrier):
+        * heap/Heap.cpp:
+        (JSC::Heap::clearRememberedSet):
+        (JSC::Heap::addToRememberedSet):
+        * jit/AssemblyHelpers.h:
+        (JSC::AssemblyHelpers::checkMarkByte):
+        * jit/JIT.h:
+        * jit/JITPropertyAccess.cpp:
+        (JSC::JIT::checkMarkByte):
+        (JSC::JIT::emitWriteBarrier):
+        * jit/Repatch.cpp:
+        (JSC::writeBarrier):
+        * llint/LowLevelInterpreter.asm:
+        * llint/LowLevelInterpreter32_64.asm:
+        * llint/LowLevelInterpreter64.asm:
+        * runtime/JSCell.h:
+        (JSC::JSCell::mark):
+        (JSC::JSCell::remember):
+        (JSC::JSCell::forget):
+        (JSC::JSCell::isMarked):
+        (JSC::JSCell::isRemembered):
+        * runtime/JSCellInlines.h:
+        (JSC::JSCell::JSCell):
+        * runtime/StructureIDBlob.h:
+        (JSC::StructureIDBlob::StructureIDBlob):
+
</ins><span class="cx"> 2014-03-05  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         More FTL ARM fixes
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGOSRExitCompilerCommoncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/dfg/DFGOSRExitCompilerCommon.cpp        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -164,7 +164,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 definitelyNotMarked = jit.genericWriteBarrier(owner);
</del><ins>+    AssemblyHelpers::Jump ownerNotMarkedOrAlreadyRemembered = jit.checkMarkByte(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">@@ -179,7 +179,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>-    definitelyNotMarked.link(&amp;jit);
</del><ins>+    ownerNotMarkedOrAlreadyRemembered.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 (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -5469,15 +5469,15 @@
</span><span class="cx">     noResult(node);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JITCompiler::Jump SpeculativeJIT::genericWriteBarrier(CCallHelpers&amp; jit, GPRReg owner)
</del><ins>+JITCompiler::Jump SpeculativeJIT::checkMarkByte(CCallHelpers&amp; jit, GPRReg owner)
</ins><span class="cx"> {
</span><del>-    return jit.branchTest8(MacroAssembler::Zero, MacroAssembler::Address(owner, JSCell::gcDataOffset()));
</del><ins>+    return jit.branchTest8(MacroAssembler::NonZero, MacroAssembler::Address(owner, JSCell::gcDataOffset()));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-JITCompiler::Jump SpeculativeJIT::genericWriteBarrier(CCallHelpers&amp; jit, JSCell* owner)
</del><ins>+JITCompiler::Jump SpeculativeJIT::checkMarkByte(CCallHelpers&amp; jit, JSCell* owner)
</ins><span class="cx"> {
</span><span class="cx">     uint8_t* address = reinterpret_cast&lt;uint8_t*&gt;(owner) + JSCell::gcDataOffset();
</span><del>-    return jit.branchTest8(MacroAssembler::Zero, MacroAssembler::AbsoluteAddress(address));
</del><ins>+    return jit.branchTest8(MacroAssembler::NonZero, MacroAssembler::AbsoluteAddress(address));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SpeculativeJIT::storeToWriteBarrierBuffer(GPRReg cell, GPRReg scratch1, GPRReg scratch2)
</span><span class="lines">@@ -5536,16 +5536,16 @@
</span><span class="cx">     if (Heap::isMarked(value))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    JITCompiler::Jump definitelyNotMarked = genericWriteBarrier(m_jit, ownerGPR);
</del><ins>+    JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(m_jit, ownerGPR);
</ins><span class="cx">     storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2);
</span><del>-    definitelyNotMarked.link(&amp;m_jit);
</del><ins>+    ownerNotMarkedOrAlreadyRemembered.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 definitelyNotMarked = genericWriteBarrier(m_jit, ownerGPR);
</del><ins>+    JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(m_jit, ownerGPR);
</ins><span class="cx">     storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2);
</span><del>-    definitelyNotMarked.link(&amp;m_jit);
</del><ins>+    ownerNotMarkedOrAlreadyRemembered.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="trunkSourceJavaScriptCoredfgDFGSpeculativeJITh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -296,8 +296,8 @@
</span><span class="cx">     void storeToWriteBarrierBuffer(GPRReg cell, GPRReg scratch1, GPRReg scratch2);
</span><span class="cx">     void storeToWriteBarrierBuffer(JSCell*, GPRReg scratch1, GPRReg scratch2);
</span><span class="cx"> 
</span><del>-    static JITCompiler::Jump genericWriteBarrier(CCallHelpers&amp; jit, GPRReg owner);
-    static JITCompiler::Jump genericWriteBarrier(CCallHelpers&amp; jit, JSCell* owner);
</del><ins>+    static JITCompiler::Jump checkMarkByte(CCallHelpers&amp; jit, GPRReg owner);
+    static JITCompiler::Jump checkMarkByte(CCallHelpers&amp; jit, JSCell* owner);
</ins><span class="cx">     void writeBarrier(GPRReg owner, GPRReg scratch1, GPRReg scratch2);
</span><span class="cx">     void writeBarrier(GPRReg owner, JSCell* value, GPRReg scratch1, GPRReg scratch2);
</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 (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -4709,9 +4709,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 definitelyNotMarked = genericWriteBarrier(m_jit, ownerGPR);
</del><ins>+    JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(m_jit, ownerGPR);
</ins><span class="cx">     storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2);
</span><del>-    definitelyNotMarked.link(&amp;m_jit);
</del><ins>+    ownerNotMarkedOrAlreadyRemembered.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">@@ -4723,9 +4723,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 definitelyNotMarked = genericWriteBarrier(m_jit, owner);
</del><ins>+    JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(m_jit, owner);
</ins><span class="cx">     storeToWriteBarrierBuffer(owner, scratch1, scratch2);
</span><del>-    definitelyNotMarked.link(&amp;m_jit);
</del><ins>+    ownerNotMarkedOrAlreadyRemembered.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 (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -5042,9 +5042,9 @@
</span><span class="cx">     if (!isKnownCell(valueUse.node()))
</span><span class="cx">         isNotCell = m_jit.branchTest64(JITCompiler::NonZero, valueGPR, GPRInfo::tagMaskRegister);
</span><span class="cx"> 
</span><del>-    JITCompiler::Jump definitelyNotMarked = genericWriteBarrier(m_jit, ownerGPR);
</del><ins>+    JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(m_jit, ownerGPR);
</ins><span class="cx">     storeToWriteBarrierBuffer(ownerGPR, scratch1, scratch2);
</span><del>-    definitelyNotMarked.link(&amp;m_jit);
</del><ins>+    ownerNotMarkedOrAlreadyRemembered.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">@@ -5056,9 +5056,9 @@
</span><span class="cx">     if (!isKnownCell(valueUse.node()))
</span><span class="cx">         isNotCell = m_jit.branchTest64(JITCompiler::NonZero, valueGPR, GPRInfo::tagMaskRegister);
</span><span class="cx"> 
</span><del>-    JITCompiler::Jump definitelyNotMarked = genericWriteBarrier(m_jit, owner);
</del><ins>+    JITCompiler::Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(m_jit, owner);
</ins><span class="cx">     storeToWriteBarrierBuffer(owner, scratch1, scratch2);
</span><del>-    definitelyNotMarked.link(&amp;m_jit);
</del><ins>+    ownerNotMarkedOrAlreadyRemembered.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="trunkSourceJavaScriptCoreftlFTLLowerDFGToLLVMcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -4082,7 +4082,7 @@
</span><span class="cx">         m_out.store8(m_out.constInt8(structure-&gt;indexingType()), result, m_heaps.JSCell_indexingType);
</span><span class="cx">         m_out.store8(m_out.constInt8(structure-&gt;typeInfo().type()), result, m_heaps.JSCell_typeInfoType);
</span><span class="cx">         m_out.store8(m_out.constInt8(structure-&gt;typeInfo().inlineTypeFlags()), result, m_heaps.JSCell_typeInfoFlags);
</span><del>-        m_out.store8(m_out.constInt8(0), result, m_heaps.JSCell_gcData);
</del><ins>+        m_out.store8(m_out.constInt8(JSCell::NotMarked), result, m_heaps.JSCell_gcData);
</ins><span class="cx">         
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><span class="lines">@@ -5404,16 +5404,16 @@
</span><span class="cx">     {
</span><span class="cx"> #if ENABLE(GGC)
</span><span class="cx">         LBasicBlock continuation = FTL_NEW_BLOCK(m_out, (&quot;Store barrier continuation&quot;));
</span><del>-        LBasicBlock isMarked = FTL_NEW_BLOCK(m_out, (&quot;Store barrier is marked block&quot;));
</del><ins>+        LBasicBlock isMarkedAndNotRemembered = FTL_NEW_BLOCK(m_out, (&quot;Store barrier is marked block&quot;));
</ins><span class="cx">         LBasicBlock bufferHasSpace = FTL_NEW_BLOCK(m_out, (&quot;Store barrier buffer is full&quot;));
</span><span class="cx">         LBasicBlock bufferIsFull = FTL_NEW_BLOCK(m_out, (&quot;Store barrier buffer is full&quot;));
</span><span class="cx"> 
</span><span class="cx">         // Check the mark byte. 
</span><span class="cx">         m_out.branch(
</span><del>-            m_out.isZero8(loadMarkByte(base)), usually(continuation), rarely(isMarked));
</del><ins>+            m_out.notZero8(loadMarkByte(base)), usually(continuation), rarely(isMarkedAndNotRemembered));
</ins><span class="cx"> 
</span><span class="cx">         // Append to the write barrier buffer.
</span><del>-        LBasicBlock lastNext = m_out.appendTo(isMarked, bufferHasSpace);
</del><ins>+        LBasicBlock lastNext = m_out.appendTo(isMarkedAndNotRemembered, bufferHasSpace);
</ins><span class="cx">         LValue currentBufferIndex = m_out.load32(m_out.absolute(&amp;vm().heap.writeBarrierBuffer().m_currentIndex));
</span><span class="cx">         LValue bufferCapacity = m_out.load32(m_out.absolute(&amp;vm().heap.writeBarrierBuffer().m_capacity));
</span><span class="cx">         m_out.branch(
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/Heap.cpp (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/Heap.cpp        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/heap/Heap.cpp        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -415,7 +415,7 @@
</span><span class="cx">     JSCell** registerRoots = stackRoots.roots();
</span><span class="cx">     for (size_t i = 0; i &lt; stackRootCount; i++) {
</span><span class="cx">         setMarked(registerRoots[i]);
</span><del>-        registerRoots[i]-&gt;mark();
</del><ins>+        registerRoots[i]-&gt;setMarked();
</ins><span class="cx">         roots.add(registerRoots[i]);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -668,8 +668,10 @@
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(GGC)
</span><span class="cx">     GCPHASE(ClearRememberedSet);
</span><del>-    for (auto* cell : rememberedSet)
</del><ins>+    for (auto* cell : rememberedSet) {
</ins><span class="cx">         MarkedBlock::blockFor(cell)-&gt;clearRemembered(cell);
</span><ins>+        const_cast&lt;JSCell*&gt;(cell)-&gt;setRemembered(false);
+    }
</ins><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(rememberedSet);
</span><span class="cx"> #endif
</span><span class="lines">@@ -826,6 +828,7 @@
</span><span class="cx">     if (isInRememberedSet(cell))
</span><span class="cx">         return;
</span><span class="cx">     MarkedBlock::blockFor(cell)-&gt;setRemembered(cell);
</span><ins>+    const_cast&lt;JSCell*&gt;(cell)-&gt;setRemembered(true);
</ins><span class="cx">     m_slotVisitor.unconditionallyAppend(const_cast&lt;JSCell*&gt;(cell));
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapSlotVisitorInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/SlotVisitorInlines.h (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/SlotVisitorInlines.h        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/heap/SlotVisitorInlines.h        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -113,7 +113,7 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    cell-&gt;mark();
</del><ins>+    cell-&gt;setMarked();
</ins><span class="cx">     m_bytesVisited += MarkedBlock::blockFor(cell)-&gt;cellSize();
</span><span class="cx">         
</span><span class="cx">     MARK_LOG_CHILD(*this, cell);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitAssemblyHelpersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -387,9 +387,9 @@
</span><span class="cx">     void jitAssertArgumentCountSane() { }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    Jump genericWriteBarrier(GPRReg owner)
</del><ins>+    Jump checkMarkByte(GPRReg owner)
</ins><span class="cx">     {
</span><del>-        return branchTest8(Zero, Address(owner, JSCell::gcDataOffset()));
</del><ins>+        return branchTest8(NonZero, Address(owner, JSCell::gcDataOffset()));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // These methods convert between doubles, and doubles boxed and JSValues.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JIT.h (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JIT.h        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/jit/JIT.h        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -314,8 +314,8 @@
</span><span class="cx">         enum WriteBarrierMode { UnconditionalWriteBarrier, ShouldFilterValue, ShouldFilterBaseAndValue };
</span><span class="cx">         // value register in write barrier is used before any scratch registers
</span><span class="cx">         // so may safely be the same as either of the scratch registers.
</span><del>-        Jump checkMarkWord(RegisterID owner);
-        Jump checkMarkWord(JSCell* owner);
</del><ins>+        Jump checkMarkByte(RegisterID owner);
+        Jump checkMarkByte(JSCell* owner);
</ins><span class="cx">         void emitWriteBarrier(unsigned owner, unsigned value, WriteBarrierMode);
</span><span class="cx">         void emitWriteBarrier(JSCell* owner, unsigned value, WriteBarrierMode);
</span><span class="cx">         void emitWriteBarrier(JSCell* owner);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITPropertyAccesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -879,15 +879,15 @@
</span><span class="cx"> 
</span><span class="cx"> #endif // USE(JSVALUE64)
</span><span class="cx"> 
</span><del>-JIT::Jump JIT::checkMarkWord(RegisterID owner)
</del><ins>+JIT::Jump JIT::checkMarkByte(RegisterID owner)
</ins><span class="cx"> {
</span><del>-    return branchTest8(Zero, Address(owner, JSCell::gcDataOffset()));
</del><ins>+    return branchTest8(NonZero, Address(owner, JSCell::gcDataOffset()));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-JIT::Jump JIT::checkMarkWord(JSCell* owner)
</del><ins>+JIT::Jump JIT::checkMarkByte(JSCell* owner)
</ins><span class="cx"> {
</span><span class="cx">     uint8_t* address = reinterpret_cast&lt;uint8_t*&gt;(owner) + JSCell::gcDataOffset();
</span><del>-    return branchTest8(Zero, AbsoluteAddress(address));
</del><ins>+    return branchTest8(NonZero, AbsoluteAddress(address));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if USE(JSVALUE64)
</span><span class="lines">@@ -904,9 +904,9 @@
</span><span class="cx">     if (mode == ShouldFilterBaseAndValue)
</span><span class="cx">         ownerNotCell = branchTest64(NonZero, regT0, tagMaskRegister);
</span><span class="cx"> 
</span><del>-    Jump ownerNotMarked = checkMarkWord(regT0);
</del><ins>+    Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(regT0);
</ins><span class="cx">     callOperation(operationUnconditionalWriteBarrier, regT0);
</span><del>-    ownerNotMarked.link(this);
</del><ins>+    ownerNotMarkedOrAlreadyRemembered.link(this);
</ins><span class="cx"> 
</span><span class="cx">     if (mode == ShouldFilterBaseAndValue)
</span><span class="cx">         ownerNotCell.link(this);
</span><span class="lines">@@ -953,9 +953,9 @@
</span><span class="cx">     if (mode == ShouldFilterBaseAndValue)
</span><span class="cx">         ownerNotCell = branch32(NotEqual, regT0, TrustedImm32(JSValue::CellTag));
</span><span class="cx"> 
</span><del>-    Jump ownerNotMarked = checkMarkWord(regT1);
</del><ins>+    Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(regT1);
</ins><span class="cx">     callOperation(operationUnconditionalWriteBarrier, regT1);
</span><del>-    ownerNotMarked.link(this);
</del><ins>+    ownerNotMarkedOrAlreadyRemembered.link(this);
</ins><span class="cx"> 
</span><span class="cx">     if (mode == ShouldFilterBaseAndValue)
</span><span class="cx">         ownerNotCell.link(this);
</span><span class="lines">@@ -993,9 +993,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 ownerNotMarked = checkMarkWord(owner);
</del><ins>+        Jump ownerNotMarkedOrAlreadyRemembered = checkMarkByte(owner);
</ins><span class="cx">         callOperation(operationUnconditionalWriteBarrier, owner);
</span><del>-        ownerNotMarked.link(this);
</del><ins>+        ownerNotMarkedOrAlreadyRemembered.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="trunkSourceJavaScriptCorejitRepatchcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/Repatch.cpp (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/Repatch.cpp        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/jit/Repatch.cpp        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -825,11 +825,11 @@
</span><span class="cx">     ASSERT(owner != scratch2);
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><del>-    MacroAssembler::Jump definitelyNotMarked = DFG::SpeculativeJIT::genericWriteBarrier(jit, owner);
</del><ins>+    MacroAssembler::Jump ownerNotMarkedOrAlreadyRemembered = DFG::SpeculativeJIT::checkMarkByte(jit, owner);
</ins><span class="cx"> #endif
</span><span class="cx">     MacroAssembler::Call call = storeToWriteBarrierBuffer(jit, owner, scratch1, scratch2, allocator);
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><del>-    definitelyNotMarked.link(&amp;jit);
</del><ins>+    ownerNotMarkedOrAlreadyRemembered.link(&amp;jit);
</ins><span class="cx"> #endif
</span><span class="cx">     return call;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpreterasm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -448,14 +448,7 @@
</span><span class="cx"> end
</span><span class="cx"> 
</span><span class="cx"> macro checkMarkByte(cell, scratch1, scratch2, continuation)
</span><del>-    move cell, scratch1
-    move cell, scratch2
-
-    andp MarkedBlockMask, scratch1
-    andp ~MarkedBlockMask, scratch2
-
-    rshiftp AtomNumberShift + BitMapWordShift, scratch2
-    loadb MarkedBlock::m_marks[scratch1, scratch2, 1], scratch1
</del><ins>+    loadb JSCell::m_gcData[cell], scratch1
</ins><span class="cx">     continuation(scratch1)
</span><span class="cx"> end
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpreter32_64asm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -543,8 +543,8 @@
</span><span class="cx">         loadisFromInstruction(cellOperand, t1)
</span><span class="cx">         loadConstantOrVariablePayload(t1, CellTag, t2, .writeBarrierDone)
</span><span class="cx">         checkMarkByte(t2, t1, t3, 
</span><del>-            macro(marked)
-                btbz marked, .writeBarrierDone
</del><ins>+            macro(gcData)
+                btbnz gcData, .writeBarrierDone
</ins><span class="cx">                 push cfr, PC
</span><span class="cx">                 # We make two extra slots because cCall2 will poke.
</span><span class="cx">                 subp 8, sp
</span><span class="lines">@@ -577,8 +577,8 @@
</span><span class="cx">         loadp CodeBlock[cfr], t3
</span><span class="cx">         loadp CodeBlock::m_globalObject[t3], t3
</span><span class="cx">         checkMarkByte(t3, t1, t2,
</span><del>-            macro(marked)
-                btbz marked, .writeBarrierDone
</del><ins>+            macro(gcData)
+                btbnz gcData, .writeBarrierDone
</ins><span class="cx">                 push cfr, PC
</span><span class="cx">                 # We make two extra slots because cCall2 will poke.
</span><span class="cx">                 subp 8, sp
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpreter64asm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -395,8 +395,8 @@
</span><span class="cx">         loadisFromInstruction(cellOperand, t1)
</span><span class="cx">         loadConstantOrVariableCell(t1, t2, .writeBarrierDone)
</span><span class="cx">         checkMarkByte(t2, t1, t3, 
</span><del>-            macro(marked)
-                btbz marked, .writeBarrierDone
</del><ins>+            macro(gcData)
+                btbnz gcData, .writeBarrierDone
</ins><span class="cx">                 push PB, PC
</span><span class="cx">                 cCall2Void(_llint_write_barrier_slow, cfr, t2)
</span><span class="cx">                 pop PC, PB
</span><span class="lines">@@ -426,8 +426,8 @@
</span><span class="cx">         loadp CodeBlock[cfr], t3
</span><span class="cx">         loadp CodeBlock::m_globalObject[t3], t3
</span><span class="cx">         checkMarkByte(t3, t1, t2,
</span><del>-            macro(marked)
-                btbz marked, .writeBarrierDone
</del><ins>+            macro(gcData)
+                btbnz gcData, .writeBarrierDone
</ins><span class="cx">                 push PB, PC
</span><span class="cx">                 cCall2Void(_llint_write_barrier_slow, cfr, t3)
</span><span class="cx">                 pop PC, PB
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCellh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCell.h (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCell.h        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/runtime/JSCell.h        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -142,9 +142,32 @@
</span><span class="cx"> 
</span><span class="cx">     JSValue fastGetOwnProperty(VM&amp;, const String&amp;);
</span><span class="cx"> 
</span><del>-    void mark() { m_gcData = 1; }
-    bool isMarked() const { return m_gcData; }
</del><ins>+    enum GCData : uint8_t {
+        Marked = 0,
+        NotMarked = 1,
+        MarkedAndRemembered = 2,
+    };
</ins><span class="cx"> 
</span><ins>+    void setMarked() { m_gcData = Marked; }
+    void setRemembered(bool remembered)
+    {
+        ASSERT(m_gcData == remembered ? Marked : MarkedAndRemembered);
+        m_gcData = remembered ? MarkedAndRemembered : Marked; 
+    }
+    bool isMarked() const
+    {
+        switch (m_gcData) {
+        case Marked:
+        case MarkedAndRemembered:
+            return true;
+        case NotMarked:
+            return false;
+        }
+        RELEASE_ASSERT_NOT_REACHED();
+        return false;
+    }
+    bool isRemembered() const { return m_gcData == MarkedAndRemembered; }
+
</ins><span class="cx">     static ptrdiff_t structureIDOffset()
</span><span class="cx">     {
</span><span class="cx">         return OBJECT_OFFSETOF(JSCell, m_structureID);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSCellInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSCellInlines.h (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSCellInlines.h        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/runtime/JSCellInlines.h        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -38,7 +38,7 @@
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> inline JSCell::JSCell(CreatingEarlyCellTag)
</span><del>-    : m_gcData(0)
</del><ins>+    : m_gcData(NotMarked)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!isCompilationThread());
</span><span class="cx"> }
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx">     , m_indexingType(structure-&gt;indexingType())
</span><span class="cx">     , m_type(structure-&gt;typeInfo().type())
</span><span class="cx">     , m_flags(structure-&gt;typeInfo().inlineTypeFlags())
</span><del>-    , m_gcData(0)
</del><ins>+    , m_gcData(NotMarked)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!isCompilationThread());
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructureIDBlobh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/StructureIDBlob.h (165134 => 165135)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/StructureIDBlob.h        2014-03-05 23:16:47 UTC (rev 165134)
+++ trunk/Source/JavaScriptCore/runtime/StructureIDBlob.h        2014-03-05 23:33:21 UTC (rev 165135)
</span><span class="lines">@@ -46,7 +46,7 @@
</span><span class="cx">         u.fields.indexingType = indexingType;
</span><span class="cx">         u.fields.type = typeInfo.type();
</span><span class="cx">         u.fields.inlineTypeFlags = typeInfo.inlineTypeFlags();
</span><del>-        u.fields.defaultGCData = 0;
</del><ins>+        u.fields.defaultGCData = JSCell::NotMarked;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void operator=(const StructureIDBlob&amp; other) { u.doubleWord = other.u.doubleWord; }
</span><span class="lines">@@ -79,7 +79,7 @@
</span><span class="cx">             IndexingType indexingType;
</span><span class="cx">             JSType type;
</span><span class="cx">             TypeInfo::InlineTypeFlags inlineTypeFlags;
</span><del>-            uint8_t defaultGCData;
</del><ins>+            JSCell::GCData defaultGCData;
</ins><span class="cx">         } fields;
</span><span class="cx">         struct {
</span><span class="cx">             int32_t word1;
</span></span></pre>
</div>
</div>

</body>
</html>