<!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>[170436] branches/ftlopt/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/170436">170436</a></dd>
<dt>Author</dt> <dd>mhahnenberg@apple.com</dd>
<dt>Date</dt> <dd>2014-06-25 14:15:37 -0700 (Wed, 25 Jun 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Structure bit fields should have a consistent format
https://bugs.webkit.org/show_bug.cgi?id=134307

Reviewed by Filip Pizlo.

Currently we use C-style bit fields for a number of member variables in Structure to save space. 
This makes it difficult to load these fields in the JIT. We should instead use our own bitfield 
format to make it easy to load and test these variables in JIT code.

* runtime/JSObject.cpp:
(JSC::JSObject::putDirectNonIndexAccessor):
(JSC::JSObject::reifyStaticFunctionsForDelete):
* runtime/Structure.cpp:
(JSC::StructureTransitionTable::contains):
(JSC::StructureTransitionTable::get):
(JSC::StructureTransitionTable::add):
(JSC::Structure::Structure):
(JSC::Structure::materializePropertyMap):
(JSC::Structure::addPropertyTransition):
(JSC::Structure::despecifyFunctionTransition):
(JSC::Structure::toDictionaryTransition):
(JSC::Structure::freezeTransition):
(JSC::Structure::preventExtensionsTransition):
(JSC::Structure::takePropertyTableOrCloneIfPinned):
(JSC::Structure::nonPropertyTransition):
(JSC::Structure::flattenDictionaryStructure):
(JSC::Structure::addPropertyWithoutTransition):
(JSC::Structure::pin):
(JSC::Structure::allocateRareData):
(JSC::Structure::cloneRareDataFrom):
(JSC::Structure::getConcurrently):
(JSC::Structure::putSpecificValue):
(JSC::Structure::getPropertyNamesFromStructure):
(JSC::Structure::visitChildren):
(JSC::Structure::checkConsistency):
* runtime/Structure.h:
(JSC::Structure::isExtensible):
(JSC::Structure::isDictionary):
(JSC::Structure::isUncacheableDictionary):
(JSC::Structure::propertyAccessesAreCacheable):
(JSC::Structure::previousID):
(JSC::Structure::setHasGetterSetterPropertiesWithProtoCheck):
(JSC::Structure::setContainsReadOnlyProperties):
(JSC::Structure::disableSpecificFunctionTracking):
(JSC::Structure::objectToStringValue):
(JSC::Structure::setObjectToStringValue):
(JSC::Structure::setPreviousID):
(JSC::Structure::clearPreviousID):
(JSC::Structure::previous):
(JSC::Structure::rareData):
(JSC::Structure::didTransition): Deleted.
(JSC::Structure::hasGetterSetterProperties): Deleted.
(JSC::Structure::hasReadOnlyOrGetterSetterPropertiesExcludingProto): Deleted.
(JSC::Structure::setHasGetterSetterProperties): Deleted.
(JSC::Structure::hasNonEnumerableProperties): Deleted.
(JSC::Structure::staticFunctionsReified): Deleted.
(JSC::Structure::setStaticFunctionsReified): Deleted.
* runtime/StructureInlines.h:
(JSC::Structure::setEnumerationCache):
(JSC::Structure::enumerationCache):
(JSC::Structure::checkOffsetConsistency):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchesftloptSourceJavaScriptCoreChangeLog">branches/ftlopt/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#branchesftloptSourceJavaScriptCoreruntimeJSObjectcpp">branches/ftlopt/Source/JavaScriptCore/runtime/JSObject.cpp</a></li>
<li><a href="#branchesftloptSourceJavaScriptCoreruntimeStructurecpp">branches/ftlopt/Source/JavaScriptCore/runtime/Structure.cpp</a></li>
<li><a href="#branchesftloptSourceJavaScriptCoreruntimeStructureh">branches/ftlopt/Source/JavaScriptCore/runtime/Structure.h</a></li>
<li><a href="#branchesftloptSourceJavaScriptCoreruntimeStructureInlinesh">branches/ftlopt/Source/JavaScriptCore/runtime/StructureInlines.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchesftloptSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/ftlopt/Source/JavaScriptCore/ChangeLog (170435 => 170436)</h4>
<pre class="diff"><span>
<span class="info">--- branches/ftlopt/Source/JavaScriptCore/ChangeLog        2014-06-25 21:04:17 UTC (rev 170435)
+++ branches/ftlopt/Source/JavaScriptCore/ChangeLog        2014-06-25 21:15:37 UTC (rev 170436)
</span><span class="lines">@@ -1,3 +1,67 @@
</span><ins>+2014-06-25  Mark Hahnenberg  &lt;mhahnenberg@apple.com&gt;
+
+        Structure bit fields should have a consistent format
+        https://bugs.webkit.org/show_bug.cgi?id=134307
+
+        Reviewed by Filip Pizlo.
+
+        Currently we use C-style bit fields for a number of member variables in Structure to save space. 
+        This makes it difficult to load these fields in the JIT. We should instead use our own bitfield 
+        format to make it easy to load and test these variables in JIT code.
+
+        * runtime/JSObject.cpp:
+        (JSC::JSObject::putDirectNonIndexAccessor):
+        (JSC::JSObject::reifyStaticFunctionsForDelete):
+        * runtime/Structure.cpp:
+        (JSC::StructureTransitionTable::contains):
+        (JSC::StructureTransitionTable::get):
+        (JSC::StructureTransitionTable::add):
+        (JSC::Structure::Structure):
+        (JSC::Structure::materializePropertyMap):
+        (JSC::Structure::addPropertyTransition):
+        (JSC::Structure::despecifyFunctionTransition):
+        (JSC::Structure::toDictionaryTransition):
+        (JSC::Structure::freezeTransition):
+        (JSC::Structure::preventExtensionsTransition):
+        (JSC::Structure::takePropertyTableOrCloneIfPinned):
+        (JSC::Structure::nonPropertyTransition):
+        (JSC::Structure::flattenDictionaryStructure):
+        (JSC::Structure::addPropertyWithoutTransition):
+        (JSC::Structure::pin):
+        (JSC::Structure::allocateRareData):
+        (JSC::Structure::cloneRareDataFrom):
+        (JSC::Structure::getConcurrently):
+        (JSC::Structure::putSpecificValue):
+        (JSC::Structure::getPropertyNamesFromStructure):
+        (JSC::Structure::visitChildren):
+        (JSC::Structure::checkConsistency):
+        * runtime/Structure.h:
+        (JSC::Structure::isExtensible):
+        (JSC::Structure::isDictionary):
+        (JSC::Structure::isUncacheableDictionary):
+        (JSC::Structure::propertyAccessesAreCacheable):
+        (JSC::Structure::previousID):
+        (JSC::Structure::setHasGetterSetterPropertiesWithProtoCheck):
+        (JSC::Structure::setContainsReadOnlyProperties):
+        (JSC::Structure::disableSpecificFunctionTracking):
+        (JSC::Structure::objectToStringValue):
+        (JSC::Structure::setObjectToStringValue):
+        (JSC::Structure::setPreviousID):
+        (JSC::Structure::clearPreviousID):
+        (JSC::Structure::previous):
+        (JSC::Structure::rareData):
+        (JSC::Structure::didTransition): Deleted.
+        (JSC::Structure::hasGetterSetterProperties): Deleted.
+        (JSC::Structure::hasReadOnlyOrGetterSetterPropertiesExcludingProto): Deleted.
+        (JSC::Structure::setHasGetterSetterProperties): Deleted.
+        (JSC::Structure::hasNonEnumerableProperties): Deleted.
+        (JSC::Structure::staticFunctionsReified): Deleted.
+        (JSC::Structure::setStaticFunctionsReified): Deleted.
+        * runtime/StructureInlines.h:
+        (JSC::Structure::setEnumerationCache):
+        (JSC::Structure::enumerationCache):
+        (JSC::Structure::checkOffsetConsistency):
+
</ins><span class="cx"> 2014-06-24  Mark Lam  &lt;mark.lam@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [ftlopt] Renamed DebuggerActivation to DebuggerScope.
</span></span></pre></div>
<a id="branchesftloptSourceJavaScriptCoreruntimeJSObjectcpp"></a>
<div class="modfile"><h4>Modified: branches/ftlopt/Source/JavaScriptCore/runtime/JSObject.cpp (170435 => 170436)</h4>
<pre class="diff"><span>
<span class="info">--- branches/ftlopt/Source/JavaScriptCore/runtime/JSObject.cpp        2014-06-25 21:04:17 UTC (rev 170435)
+++ branches/ftlopt/Source/JavaScriptCore/runtime/JSObject.cpp        2014-06-25 21:15:37 UTC (rev 170436)
</span><span class="lines">@@ -1239,7 +1239,7 @@
</span><span class="cx">     if (attributes &amp; ReadOnly)
</span><span class="cx">         structure-&gt;setContainsReadOnlyProperties();
</span><span class="cx"> 
</span><del>-    structure-&gt;setHasGetterSetterProperties(propertyName == vm.propertyNames-&gt;underscoreProto);
</del><ins>+    structure-&gt;setHasGetterSetterPropertiesWithProtoCheck(propertyName == vm.propertyNames-&gt;underscoreProto);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool JSObject::hasProperty(ExecState* exec, PropertyName propertyName) const
</span><span class="lines">@@ -1617,7 +1617,7 @@
</span><span class="cx">     // If this object's ClassInfo has no static properties, then nothing to reify!
</span><span class="cx">     // We can safely set the flag to avoid the expensive check again in the future.
</span><span class="cx">     if (!classInfo()-&gt;hasStaticProperties()) {
</span><del>-        structure(vm)-&gt;setStaticFunctionsReified();
</del><ins>+        structure(vm)-&gt;setStaticFunctionsReified(true);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -1635,7 +1635,7 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    structure(vm)-&gt;setStaticFunctionsReified();
</del><ins>+    structure(vm)-&gt;setStaticFunctionsReified(true);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool JSObject::removeDirect(VM&amp; vm, PropertyName propertyName)
</span></span></pre></div>
<a id="branchesftloptSourceJavaScriptCoreruntimeStructurecpp"></a>
<div class="modfile"><h4>Modified: branches/ftlopt/Source/JavaScriptCore/runtime/Structure.cpp (170435 => 170436)</h4>
<pre class="diff"><span>
<span class="info">--- branches/ftlopt/Source/JavaScriptCore/runtime/Structure.cpp        2014-06-25 21:04:17 UTC (rev 170435)
+++ branches/ftlopt/Source/JavaScriptCore/runtime/Structure.cpp        2014-06-25 21:15:37 UTC (rev 170436)
</span><span class="lines">@@ -71,7 +71,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (isUsingSingleSlot()) {
</span><span class="cx">         Structure* transition = singleTransition();
</span><del>-        return transition &amp;&amp; transition-&gt;m_nameInPrevious == rep &amp;&amp; transition-&gt;m_attributesInPrevious == attributes;
</del><ins>+        return transition &amp;&amp; transition-&gt;m_nameInPrevious == rep &amp;&amp; transition-&gt;attributesInPrevious() == attributes;
</ins><span class="cx">     }
</span><span class="cx">     return map()-&gt;get(std::make_pair(rep, attributes));
</span><span class="cx"> }
</span><span class="lines">@@ -80,7 +80,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (isUsingSingleSlot()) {
</span><span class="cx">         Structure* transition = singleTransition();
</span><del>-        return (transition &amp;&amp; transition-&gt;m_nameInPrevious == rep &amp;&amp; transition-&gt;m_attributesInPrevious == attributes) ? transition : 0;
</del><ins>+        return (transition &amp;&amp; transition-&gt;m_nameInPrevious == rep &amp;&amp; transition-&gt;attributesInPrevious() == attributes) ? transition : 0;
</ins><span class="cx">     }
</span><span class="cx">     return map()-&gt;get(std::make_pair(rep, attributes));
</span><span class="cx"> }
</span><span class="lines">@@ -107,7 +107,7 @@
</span><span class="cx">     // Newer versions of the STL have an std::make_pair function that takes rvalue references.
</span><span class="cx">     // When either of the parameters are bitfields, the C++ compiler will try to bind them as lvalues, which is invalid. To work around this, use unary &quot;+&quot; to make the parameter an rvalue.
</span><span class="cx">     // See https://bugs.webkit.org/show_bug.cgi?id=59261 for more details
</span><del>-    map()-&gt;set(std::make_pair(structure-&gt;m_nameInPrevious.get(), +structure-&gt;m_attributesInPrevious), structure);
</del><ins>+    map()-&gt;set(std::make_pair(structure-&gt;m_nameInPrevious.get(), +structure-&gt;attributesInPrevious()), structure);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Structure::dumpStatistics()
</span><span class="lines">@@ -165,21 +165,23 @@
</span><span class="cx">     , m_transitionWatchpointSet(IsWatched)
</span><span class="cx">     , m_offset(invalidOffset)
</span><span class="cx">     , m_inlineCapacity(inlineCapacity)
</span><del>-    , m_dictionaryKind(NoneDictionaryKind)
-    , m_isPinnedPropertyTable(false)
-    , m_hasGetterSetterProperties(classInfo-&gt;hasStaticSetterOrReadonlyProperties(vm))
-    , m_hasReadOnlyOrGetterSetterPropertiesExcludingProto(classInfo-&gt;hasStaticSetterOrReadonlyProperties(vm))
-    , m_hasNonEnumerableProperties(false)
-    , m_attributesInPrevious(0)
-    , m_specificFunctionThrashCount(0)
-    , m_preventExtensions(false)
-    , m_didTransition(false)
-    , m_staticFunctionReified(false)
-    , m_hasRareData(false)
</del><ins>+    , m_bitField(0)
</ins><span class="cx"> {
</span><ins>+    setDictionaryKind(NoneDictionaryKind);
+    setIsPinnedPropertyTable(false);
+    setHasGetterSetterProperties(classInfo-&gt;hasStaticSetterOrReadonlyProperties(vm));
+    setHasReadOnlyOrGetterSetterPropertiesExcludingProto(classInfo-&gt;hasStaticSetterOrReadonlyProperties(vm));
+    setHasNonEnumerableProperties(false);
+    setAttributesInPrevious(0);
+    setSpecificFunctionThrashCount(0);
+    setPreventExtensions(false);
+    setDidTransition(false);
+    setStaticFunctionsReified(false);
+    setHasRareData(false);
+
</ins><span class="cx">     ASSERT(inlineCapacity &lt;= JSFinalObject::maxInlineCapacity());
</span><span class="cx">     ASSERT(static_cast&lt;PropertyOffset&gt;(inlineCapacity) &lt; firstOutOfLineOffset);
</span><del>-    ASSERT(!m_hasRareData);
</del><ins>+    ASSERT(!hasRareData());
</ins><span class="cx">     ASSERT(hasReadOnlyOrGetterSetterPropertiesExcludingProto() || !m_classInfo-&gt;hasStaticSetterOrReadonlyProperties(vm));
</span><span class="cx">     ASSERT(hasGetterSetterProperties() || !m_classInfo-&gt;hasStaticSetterOrReadonlyProperties(vm));
</span><span class="cx"> }
</span><span class="lines">@@ -193,18 +195,20 @@
</span><span class="cx">     , m_transitionWatchpointSet(IsWatched)
</span><span class="cx">     , m_offset(invalidOffset)
</span><span class="cx">     , m_inlineCapacity(0)
</span><del>-    , m_dictionaryKind(NoneDictionaryKind)
-    , m_isPinnedPropertyTable(false)
-    , m_hasGetterSetterProperties(m_classInfo-&gt;hasStaticSetterOrReadonlyProperties(vm))
-    , m_hasReadOnlyOrGetterSetterPropertiesExcludingProto(m_classInfo-&gt;hasStaticSetterOrReadonlyProperties(vm))
-    , m_hasNonEnumerableProperties(false)
-    , m_attributesInPrevious(0)
-    , m_specificFunctionThrashCount(0)
-    , m_preventExtensions(false)
-    , m_didTransition(false)
-    , m_staticFunctionReified(false)
-    , m_hasRareData(false)
</del><ins>+    , m_bitField(0)
</ins><span class="cx"> {
</span><ins>+    setDictionaryKind(NoneDictionaryKind);
+    setIsPinnedPropertyTable(false);
+    setHasGetterSetterProperties(m_classInfo-&gt;hasStaticSetterOrReadonlyProperties(vm));
+    setHasReadOnlyOrGetterSetterPropertiesExcludingProto(m_classInfo-&gt;hasStaticSetterOrReadonlyProperties(vm));
+    setHasNonEnumerableProperties(false);
+    setAttributesInPrevious(0);
+    setSpecificFunctionThrashCount(0);
+    setPreventExtensions(false);
+    setDidTransition(false);
+    setStaticFunctionsReified(false);
+    setHasRareData(false);
+
</ins><span class="cx">     TypeInfo typeInfo = TypeInfo(CellType, OverridesVisitChildren | StructureIsImmortal);
</span><span class="cx">     m_blob = StructureIDBlob(vm.heap.structureIDTable().allocateID(this), 0, typeInfo);
</span><span class="cx">     m_outOfLineTypeFlags = typeInfo.outOfLineTypeFlags();
</span><span class="lines">@@ -220,24 +224,26 @@
</span><span class="cx">     , m_transitionWatchpointSet(IsWatched)
</span><span class="cx">     , m_offset(invalidOffset)
</span><span class="cx">     , m_inlineCapacity(previous-&gt;m_inlineCapacity)
</span><del>-    , m_dictionaryKind(previous-&gt;m_dictionaryKind)
-    , m_isPinnedPropertyTable(false)
-    , m_hasGetterSetterProperties(previous-&gt;m_hasGetterSetterProperties)
-    , m_hasReadOnlyOrGetterSetterPropertiesExcludingProto(previous-&gt;m_hasReadOnlyOrGetterSetterPropertiesExcludingProto)
-    , m_hasNonEnumerableProperties(previous-&gt;m_hasNonEnumerableProperties)
-    , m_attributesInPrevious(0)
-    , m_specificFunctionThrashCount(previous-&gt;m_specificFunctionThrashCount)
-    , m_preventExtensions(previous-&gt;m_preventExtensions)
-    , m_didTransition(true)
-    , m_staticFunctionReified(previous-&gt;m_staticFunctionReified)
-    , m_hasRareData(false)
</del><ins>+    , m_bitField(0)
</ins><span class="cx"> {
</span><ins>+    setDictionaryKind(previous-&gt;dictionaryKind());
+    setIsPinnedPropertyTable(false);
+    setHasGetterSetterProperties(previous-&gt;hasGetterSetterProperties());
+    setHasReadOnlyOrGetterSetterPropertiesExcludingProto(previous-&gt;hasReadOnlyOrGetterSetterPropertiesExcludingProto());
+    setHasNonEnumerableProperties(previous-&gt;hasNonEnumerableProperties());
+    setAttributesInPrevious(0);
+    setSpecificFunctionThrashCount(previous-&gt;specificFunctionThrashCount());
+    setPreventExtensions(previous-&gt;preventExtensions());
+    setDidTransition(true);
+    setStaticFunctionsReified(previous-&gt;staticFunctionsReified());
+    setHasRareData(false);
+
</ins><span class="cx">     TypeInfo typeInfo = previous-&gt;typeInfo();
</span><span class="cx">     m_blob = StructureIDBlob(vm.heap.structureIDTable().allocateID(this), previous-&gt;indexingTypeIncludingHistory(), typeInfo);
</span><span class="cx">     m_outOfLineTypeFlags = typeInfo.outOfLineTypeFlags();
</span><span class="cx"> 
</span><span class="cx">     ASSERT(!previous-&gt;typeInfo().structureIsImmortal());
</span><del>-    if (previous-&gt;m_hasRareData &amp;&amp; previous-&gt;rareData()-&gt;needsCloning())
</del><ins>+    if (previous-&gt;hasRareData() &amp;&amp; previous-&gt;rareData()-&gt;needsCloning())
</ins><span class="cx">         cloneRareDataFrom(vm, previous);
</span><span class="cx">     else if (previous-&gt;previousID())
</span><span class="cx">         m_previousOrRareData.set(vm, this, previous-&gt;previousID());
</span><span class="lines">@@ -313,7 +319,7 @@
</span><span class="cx">         structure = structures[i];
</span><span class="cx">         if (!structure-&gt;m_nameInPrevious)
</span><span class="cx">             continue;
</span><del>-        PropertyMapEntry entry(vm, this, structure-&gt;m_nameInPrevious.get(), structure-&gt;m_offset, structure-&gt;m_attributesInPrevious, structure-&gt;m_specificValueInPrevious.get());
</del><ins>+        PropertyMapEntry entry(vm, this, structure-&gt;m_nameInPrevious.get(), structure-&gt;m_offset, structure-&gt;attributesInPrevious(), structure-&gt;m_specificValueInPrevious.get());
</ins><span class="cx">         propertyTable()-&gt;add(entry, m_offset, PropertyTable::PropertyOffsetMustNotChange);
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -420,7 +426,7 @@
</span><span class="cx">     ASSERT(structure-&gt;isObject());
</span><span class="cx">     ASSERT(!Structure::addPropertyTransitionToExistingStructure(structure, propertyName, attributes, specificValue, offset));
</span><span class="cx">     
</span><del>-    if (structure-&gt;m_specificFunctionThrashCount == maxSpecificFunctionThrashCount)
</del><ins>+    if (structure-&gt;specificFunctionThrashCount() == maxSpecificFunctionThrashCount)
</ins><span class="cx">         specificValue = 0;
</span><span class="cx"> 
</span><span class="cx">     int maxTransitionLength;
</span><span class="lines">@@ -440,7 +446,7 @@
</span><span class="cx">     transition-&gt;m_cachedPrototypeChain.setMayBeNull(vm, transition, structure-&gt;m_cachedPrototypeChain.get());
</span><span class="cx">     transition-&gt;setPreviousID(vm, transition, structure);
</span><span class="cx">     transition-&gt;m_nameInPrevious = propertyName.uid();
</span><del>-    transition-&gt;m_attributesInPrevious = attributes;
</del><ins>+    transition-&gt;setAttributesInPrevious(attributes);
</ins><span class="cx">     transition-&gt;m_specificValueInPrevious.setMayBeNull(vm, transition, specificValue);
</span><span class="cx">     transition-&gt;propertyTable().set(vm, transition, structure-&gt;takePropertyTableOrCloneIfPinned(vm, transition));
</span><span class="cx">     transition-&gt;m_offset = structure-&gt;m_offset;
</span><span class="lines">@@ -487,10 +493,10 @@
</span><span class="cx"> 
</span><span class="cx"> Structure* Structure::despecifyFunctionTransition(VM&amp; vm, Structure* structure, PropertyName replaceFunction)
</span><span class="cx"> {
</span><del>-    ASSERT(structure-&gt;m_specificFunctionThrashCount &lt; maxSpecificFunctionThrashCount);
</del><ins>+    ASSERT(structure-&gt;specificFunctionThrashCount() &lt; maxSpecificFunctionThrashCount);
</ins><span class="cx">     Structure* transition = create(vm, structure);
</span><span class="cx"> 
</span><del>-    ++transition-&gt;m_specificFunctionThrashCount;
</del><ins>+    transition-&gt;setSpecificFunctionThrashCount(transition-&gt;specificFunctionThrashCount() + 1);
</ins><span class="cx"> 
</span><span class="cx">     DeferGC deferGC(vm.heap);
</span><span class="cx">     structure-&gt;materializePropertyMapIfNecessary(vm, deferGC);
</span><span class="lines">@@ -498,7 +504,7 @@
</span><span class="cx">     transition-&gt;m_offset = structure-&gt;m_offset;
</span><span class="cx">     transition-&gt;pin();
</span><span class="cx"> 
</span><del>-    if (transition-&gt;m_specificFunctionThrashCount == maxSpecificFunctionThrashCount)
</del><ins>+    if (transition-&gt;specificFunctionThrashCount() == maxSpecificFunctionThrashCount)
</ins><span class="cx">         transition-&gt;despecifyAllFunctions(vm);
</span><span class="cx">     else {
</span><span class="cx">         bool removed = transition-&gt;despecifyFunction(vm, replaceFunction);
</span><span class="lines">@@ -542,7 +548,7 @@
</span><span class="cx">     structure-&gt;materializePropertyMapIfNecessary(vm, deferGC);
</span><span class="cx">     transition-&gt;propertyTable().set(vm, transition, structure-&gt;copyPropertyTableForPinning(vm, transition));
</span><span class="cx">     transition-&gt;m_offset = structure-&gt;m_offset;
</span><del>-    transition-&gt;m_dictionaryKind = kind;
</del><ins>+    transition-&gt;setDictionaryKind(kind);
</ins><span class="cx">     transition-&gt;pin();
</span><span class="cx"> 
</span><span class="cx">     transition-&gt;checkOffsetConsistency();
</span><span class="lines">@@ -583,7 +589,7 @@
</span><span class="cx">         PropertyTable::iterator iter = transition-&gt;propertyTable()-&gt;begin();
</span><span class="cx">         PropertyTable::iterator end = transition-&gt;propertyTable()-&gt;end();
</span><span class="cx">         if (iter != end)
</span><del>-            transition-&gt;m_hasReadOnlyOrGetterSetterPropertiesExcludingProto = true;
</del><ins>+            transition-&gt;setHasReadOnlyOrGetterSetterPropertiesExcludingProto(true);
</ins><span class="cx">         for (; iter != end; ++iter)
</span><span class="cx">             iter-&gt;attributes |= iter-&gt;attributes &amp; Accessor ? DontDelete : (DontDelete | ReadOnly);
</span><span class="cx">     }
</span><span class="lines">@@ -605,7 +611,7 @@
</span><span class="cx">     structure-&gt;materializePropertyMapIfNecessary(vm, deferGC);
</span><span class="cx">     transition-&gt;propertyTable().set(vm, transition, structure-&gt;copyPropertyTableForPinning(vm, transition));
</span><span class="cx">     transition-&gt;m_offset = structure-&gt;m_offset;
</span><del>-    transition-&gt;m_preventExtensions = true;
</del><ins>+    transition-&gt;setPreventExtensions(true);
</ins><span class="cx">     transition-&gt;pin();
</span><span class="cx"> 
</span><span class="cx">     transition-&gt;checkOffsetConsistency();
</span><span class="lines">@@ -617,7 +623,7 @@
</span><span class="cx">     DeferGC deferGC(vm.heap);
</span><span class="cx">     materializePropertyMapIfNecessaryForPinning(vm, deferGC);
</span><span class="cx">     
</span><del>-    if (m_isPinnedPropertyTable)
</del><ins>+    if (isPinnedPropertyTable())
</ins><span class="cx">         return propertyTable()-&gt;copy(vm, owner, propertyTable()-&gt;size() + 1);
</span><span class="cx">     
</span><span class="cx">     // Hold the lock while stealing the table - so that getConcurrently() on another thread
</span><span class="lines">@@ -645,14 +651,14 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     if (Structure* existingTransition = structure-&gt;m_transitionTable.get(0, attributes)) {
</span><del>-        ASSERT(existingTransition-&gt;m_attributesInPrevious == attributes);
</del><ins>+        ASSERT(existingTransition-&gt;attributesInPrevious() == attributes);
</ins><span class="cx">         ASSERT(existingTransition-&gt;indexingTypeIncludingHistory() == indexingType);
</span><span class="cx">         return existingTransition;
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     Structure* transition = create(vm, structure);
</span><span class="cx">     transition-&gt;setPreviousID(vm, transition, structure);
</span><del>-    transition-&gt;m_attributesInPrevious = attributes;
</del><ins>+    transition-&gt;setAttributesInPrevious(attributes);
</ins><span class="cx">     transition-&gt;m_blob.setIndexingType(indexingType);
</span><span class="cx">     transition-&gt;propertyTable().set(vm, transition, structure-&gt;takePropertyTableOrCloneIfPinned(vm, transition));
</span><span class="cx">     transition-&gt;m_offset = structure-&gt;m_offset;
</span><span class="lines">@@ -735,7 +741,7 @@
</span><span class="cx">         checkOffsetConsistency();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    m_dictionaryKind = NoneDictionaryKind;
</del><ins>+    setDictionaryKind(NoneDictionaryKind);
</ins><span class="cx"> 
</span><span class="cx">     // If the object had a Butterfly but after flattening/compacting we no longer have need of it,
</span><span class="cx">     // we need to zero it out because the collector depends on the Structure to know the size for copying.
</span><span class="lines">@@ -749,7 +755,7 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!enumerationCache());
</span><span class="cx"> 
</span><del>-    if (m_specificFunctionThrashCount == maxSpecificFunctionThrashCount)
</del><ins>+    if (specificFunctionThrashCount() == maxSpecificFunctionThrashCount)
</ins><span class="cx">         specificValue = 0;
</span><span class="cx"> 
</span><span class="cx">     DeferGC deferGC(vm.heap);
</span><span class="lines">@@ -775,28 +781,28 @@
</span><span class="cx"> void Structure::pin()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(propertyTable());
</span><del>-    m_isPinnedPropertyTable = true;
</del><ins>+    setIsPinnedPropertyTable(true);
</ins><span class="cx">     clearPreviousID();
</span><span class="cx">     m_nameInPrevious.clear();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Structure::allocateRareData(VM&amp; vm)
</span><span class="cx"> {
</span><del>-    ASSERT(!m_hasRareData);
</del><ins>+    ASSERT(!hasRareData());
</ins><span class="cx">     StructureRareData* rareData = StructureRareData::create(vm, previous());
</span><span class="cx">     m_previousOrRareData.set(vm, this, rareData);
</span><del>-    m_hasRareData = true;
-    ASSERT(m_hasRareData);
</del><ins>+    setHasRareData(true);
+    ASSERT(hasRareData());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Structure::cloneRareDataFrom(VM&amp; vm, const Structure* other)
</span><span class="cx"> {
</span><del>-    ASSERT(!m_hasRareData);
-    ASSERT(other-&gt;m_hasRareData);
</del><ins>+    ASSERT(!hasRareData());
+    ASSERT(other-&gt;hasRareData());
</ins><span class="cx">     StructureRareData* newRareData = StructureRareData::clone(vm, other-&gt;rareData());
</span><span class="cx">     m_previousOrRareData.set(vm, this, newRareData);
</span><del>-    m_hasRareData = true;
-    ASSERT(m_hasRareData);
</del><ins>+    setHasRareData(true);
+    ASSERT(hasRareData());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if DUMP_PROPERTYMAP_STATS
</span><span class="lines">@@ -866,7 +872,7 @@
</span><span class="cx">         if (structure-&gt;m_nameInPrevious.get() != uid)
</span><span class="cx">             continue;
</span><span class="cx">         
</span><del>-        attributes = structure-&gt;m_attributesInPrevious;
</del><ins>+        attributes = structure-&gt;attributesInPrevious();
</ins><span class="cx">         specificValue = structure-&gt;m_specificValueInPrevious.get();
</span><span class="cx">         return structure-&gt;m_offset;
</span><span class="cx">     }
</span><span class="lines">@@ -929,7 +935,7 @@
</span><span class="cx"> 
</span><span class="cx">     checkConsistency();
</span><span class="cx">     if (attributes &amp; DontEnum)
</span><del>-        m_hasNonEnumerableProperties = true;
</del><ins>+        setHasNonEnumerableProperties(true);
</ins><span class="cx"> 
</span><span class="cx">     StringImpl* rep = propertyName.uid();
</span><span class="cx"> 
</span><span class="lines">@@ -987,7 +993,7 @@
</span><span class="cx"> 
</span><span class="cx">     PropertyTable::iterator end = propertyTable()-&gt;end();
</span><span class="cx">     for (PropertyTable::iterator iter = propertyTable()-&gt;begin(); iter != end; ++iter) {
</span><del>-        ASSERT(m_hasNonEnumerableProperties || !(iter-&gt;attributes &amp; DontEnum));
</del><ins>+        ASSERT(hasNonEnumerableProperties() || !(iter-&gt;attributes &amp; DontEnum));
</ins><span class="cx">         if (!iter-&gt;key-&gt;isEmptyUnique() &amp;&amp; (!(iter-&gt;attributes &amp; DontEnum) || mode == IncludeDontEnumProperties)) {
</span><span class="cx">             if (knownUnique)
</span><span class="cx">                 propertyNames.addKnownUnique(iter-&gt;key);
</span><span class="lines">@@ -1019,7 +1025,7 @@
</span><span class="cx">     visitor.append(&amp;thisObject-&gt;m_previousOrRareData);
</span><span class="cx">     visitor.append(&amp;thisObject-&gt;m_specificValueInPrevious);
</span><span class="cx"> 
</span><del>-    if (thisObject-&gt;m_isPinnedPropertyTable) {
</del><ins>+    if (thisObject-&gt;isPinnedPropertyTable()) {
</ins><span class="cx">         ASSERT(thisObject-&gt;m_propertyTableUnsafe);
</span><span class="cx">         visitor.append(&amp;thisObject-&gt;m_propertyTableUnsafe);
</span><span class="cx">     } else if (thisObject-&gt;m_propertyTableUnsafe)
</span><span class="lines">@@ -1181,7 +1187,7 @@
</span><span class="cx">     if (!propertyTable())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (!m_hasNonEnumerableProperties) {
</del><ins>+    if (!hasNonEnumerableProperties()) {
</ins><span class="cx">         PropertyTable::iterator end = propertyTable()-&gt;end();
</span><span class="cx">         for (PropertyTable::iterator iter = propertyTable()-&gt;begin(); iter != end; ++iter) {
</span><span class="cx">             ASSERT(!(iter-&gt;attributes &amp; DontEnum));
</span></span></pre></div>
<a id="branchesftloptSourceJavaScriptCoreruntimeStructureh"></a>
<div class="modfile"><h4>Modified: branches/ftlopt/Source/JavaScriptCore/runtime/Structure.h (170435 => 170436)</h4>
<pre class="diff"><span>
<span class="info">--- branches/ftlopt/Source/JavaScriptCore/runtime/Structure.h        2014-06-25 21:04:17 UTC (rev 170435)
+++ branches/ftlopt/Source/JavaScriptCore/runtime/Structure.h        2014-06-25 21:15:37 UTC (rev 170436)
</span><span class="lines">@@ -127,8 +127,7 @@
</span><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE bool isSealed(VM&amp;);
</span><span class="cx">     JS_EXPORT_PRIVATE bool isFrozen(VM&amp;);
</span><del>-    bool isExtensible() const { return !m_preventExtensions; }
-    bool didTransition() const { return m_didTransition; }
</del><ins>+    bool isExtensible() const { return !preventExtensions(); }
</ins><span class="cx">     bool putWillGrowOutOfLineStorage();
</span><span class="cx">     JS_EXPORT_PRIVATE size_t suggestedNewOutOfLineStorageCapacity(); 
</span><span class="cx"> 
</span><span class="lines">@@ -143,10 +142,10 @@
</span><span class="cx">     PropertyOffset removePropertyWithoutTransition(VM&amp;, PropertyName);
</span><span class="cx">     void setPrototypeWithoutTransition(VM&amp; vm, JSValue prototype) { m_prototype.set(vm, this, prototype); }
</span><span class="cx">         
</span><del>-    bool isDictionary() const { return m_dictionaryKind != NoneDictionaryKind; }
-    bool isUncacheableDictionary() const { return m_dictionaryKind == UncachedDictionaryKind; }
</del><ins>+    bool isDictionary() const { return dictionaryKind() != NoneDictionaryKind; }
+    bool isUncacheableDictionary() const { return dictionaryKind() == UncachedDictionaryKind; }
</ins><span class="cx"> 
</span><del>-    bool propertyAccessesAreCacheable() { return m_dictionaryKind != UncachedDictionaryKind &amp;&amp; !typeInfo().prohibitsPropertyCaching(); }
</del><ins>+    bool propertyAccessesAreCacheable() { return dictionaryKind() != UncachedDictionaryKind &amp;&amp; !typeInfo().prohibitsPropertyCaching(); }
</ins><span class="cx"> 
</span><span class="cx">     // We use SlowPath in GetByIdStatus for structures that may get new impure properties later to prevent
</span><span class="cx">     // DFG from inlining property accesses since structures don't transition when a new impure property appears.
</span><span class="lines">@@ -193,7 +192,7 @@
</span><span class="cx">     Structure* previousID() const
</span><span class="cx">     {
</span><span class="cx">         ASSERT(structure()-&gt;classInfo() == info());
</span><del>-        if (m_hasRareData)
</del><ins>+        if (hasRareData())
</ins><span class="cx">             return rareData()-&gt;previousID();
</span><span class="cx">         return previous();
</span><span class="cx">     }
</span><span class="lines">@@ -268,21 +267,15 @@
</span><span class="cx">     PropertyOffset getConcurrently(VM&amp;, StringImpl* uid);
</span><span class="cx">     PropertyOffset getConcurrently(VM&amp;, StringImpl* uid, unsigned&amp; attributes, JSCell*&amp; specificValue);
</span><span class="cx"> 
</span><del>-    bool hasGetterSetterProperties() const { return m_hasGetterSetterProperties; }
-    bool hasReadOnlyOrGetterSetterPropertiesExcludingProto() const { return m_hasReadOnlyOrGetterSetterPropertiesExcludingProto; }
-    void setHasGetterSetterProperties(bool is__proto__)
</del><ins>+    void setHasGetterSetterPropertiesWithProtoCheck(bool is__proto__)
</ins><span class="cx">     {
</span><del>-        m_hasGetterSetterProperties = true;
</del><ins>+        setHasGetterSetterProperties(true);
</ins><span class="cx">         if (!is__proto__)
</span><del>-            m_hasReadOnlyOrGetterSetterPropertiesExcludingProto = true;
</del><ins>+            setHasReadOnlyOrGetterSetterPropertiesExcludingProto(true);
</ins><span class="cx">     }
</span><del>-    void setContainsReadOnlyProperties()
-    {
-        m_hasReadOnlyOrGetterSetterPropertiesExcludingProto = true;
-    }
</del><span class="cx"> 
</span><del>-    bool hasNonEnumerableProperties() const { return m_hasNonEnumerableProperties; }
-        
</del><ins>+    void setContainsReadOnlyProperties() { setHasReadOnlyOrGetterSetterPropertiesExcludingProto(true); }
+
</ins><span class="cx">     bool isEmpty() const
</span><span class="cx">     {
</span><span class="cx">         ASSERT(checkOffsetConsistency());
</span><span class="lines">@@ -290,7 +283,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE void despecifyDictionaryFunction(VM&amp;, PropertyName);
</span><del>-    void disableSpecificFunctionTracking() { m_specificFunctionThrashCount = maxSpecificFunctionThrashCount; }
</del><ins>+    void disableSpecificFunctionTracking() { setSpecificFunctionThrashCount(maxSpecificFunctionThrashCount); }
</ins><span class="cx"> 
</span><span class="cx">     void setEnumerationCache(VM&amp;, JSPropertyNameIterator* enumerationCache); // Defined in JSPropertyNameIterator.h.
</span><span class="cx">     JSPropertyNameIterator* enumerationCache(); // Defined in JSPropertyNameIterator.h.
</span><span class="lines">@@ -298,28 +291,18 @@
</span><span class="cx"> 
</span><span class="cx">     JSString* objectToStringValue()
</span><span class="cx">     {
</span><del>-        if (!m_hasRareData)
</del><ins>+        if (!hasRareData())
</ins><span class="cx">             return 0;
</span><span class="cx">         return rareData()-&gt;objectToStringValue();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void setObjectToStringValue(VM&amp; vm, const JSCell* owner, JSString* value)
</span><span class="cx">     {
</span><del>-        if (!m_hasRareData)
</del><ins>+        if (!hasRareData())
</ins><span class="cx">             allocateRareData(vm);
</span><span class="cx">         rareData()-&gt;setObjectToStringValue(vm, owner, value);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool staticFunctionsReified()
-    {
-        return m_staticFunctionReified;
-    }
-
-    void setStaticFunctionsReified()
-    {
-        m_staticFunctionReified = true;
-    }
-
</del><span class="cx">     const ClassInfo* classInfo() const { return m_classInfo; }
</span><span class="cx"> 
</span><span class="cx">     static ptrdiff_t structureIDOffset()
</span><span class="lines">@@ -400,6 +383,36 @@
</span><span class="cx">     DECLARE_EXPORT_INFO;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    typedef enum { 
+        NoneDictionaryKind = 0,
+        CachedDictionaryKind = 1,
+        UncachedDictionaryKind = 2
+    } DictionaryKind;
+
+public:
+#define DEFINE_BITFIELD(type, lowerName, upperName, width, offset) \
+    static const uint32_t s_##lowerName##Shift = offset;\
+    static const uint32_t s_##lowerName##Mask = ((1 &lt;&lt; (width - 1)) | ((1 &lt;&lt; (width - 1)) - 1));\
+    type lowerName() const { return static_cast&lt;type&gt;((m_bitField &gt;&gt; offset) &amp; s_##lowerName##Mask); }\
+    void set##upperName(type newValue) \
+    {\
+        m_bitField &amp;= ~(s_##lowerName##Mask &lt;&lt; offset);\
+        m_bitField |= (newValue &amp; s_##lowerName##Mask) &lt;&lt; offset;\
+    }
+
+    DEFINE_BITFIELD(DictionaryKind, dictionaryKind, DictionaryKind, 2, 0);
+    DEFINE_BITFIELD(bool, isPinnedPropertyTable, IsPinnedPropertyTable, 1, 2);
+    DEFINE_BITFIELD(bool, hasGetterSetterProperties, HasGetterSetterProperties, 1, 3);
+    DEFINE_BITFIELD(bool, hasReadOnlyOrGetterSetterPropertiesExcludingProto, HasReadOnlyOrGetterSetterPropertiesExcludingProto, 1, 4);
+    DEFINE_BITFIELD(bool, hasNonEnumerableProperties, HasNonEnumerableProperties, 1, 5);
+    DEFINE_BITFIELD(unsigned, attributesInPrevious, AttributesInPrevious, 14, 6);
+    DEFINE_BITFIELD(unsigned, specificFunctionThrashCount, SpecificFunctionThrashCount, 2, 20);
+    DEFINE_BITFIELD(bool, preventExtensions, PreventExtensions, 1, 22);
+    DEFINE_BITFIELD(bool, didTransition, DidTransition, 1, 23);
+    DEFINE_BITFIELD(bool, staticFunctionsReified, StaticFunctionsReified, 1, 24);
+    DEFINE_BITFIELD(bool, hasRareData, HasRareData, 1, 25);
+
+private:
</ins><span class="cx">     friend class LLIntOffsetsExtractor;
</span><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE Structure(VM&amp;, JSGlobalObject*, JSValue prototype, const TypeInfo&amp;, const ClassInfo*, IndexingType, unsigned inlineCapacity);
</span><span class="lines">@@ -416,11 +429,6 @@
</span><span class="cx">     // to unlock it.
</span><span class="cx">     void findStructuresAndMapForMaterialization(Vector&lt;Structure*, 8&gt;&amp; structures, Structure*&amp;, PropertyTable*&amp;);
</span><span class="cx">     
</span><del>-    typedef enum { 
-        NoneDictionaryKind = 0,
-        CachedDictionaryKind = 1,
-        UncachedDictionaryKind = 2
-    } DictionaryKind;
</del><span class="cx">     static Structure* toDictionaryTransition(VM&amp;, Structure*, DictionaryKind);
</span><span class="cx"> 
</span><span class="cx">     PropertyOffset putSpecificValue(VM&amp;, PropertyName, unsigned attributes, JSCell* specificValue);
</span><span class="lines">@@ -455,7 +463,7 @@
</span><span class="cx"> 
</span><span class="cx">     void setPreviousID(VM&amp; vm, Structure* transition, Structure* structure)
</span><span class="cx">     {
</span><del>-        if (m_hasRareData)
</del><ins>+        if (hasRareData())
</ins><span class="cx">             rareData()-&gt;setPreviousID(vm, transition, structure);
</span><span class="cx">         else
</span><span class="cx">             m_previousOrRareData.set(vm, transition, structure);
</span><span class="lines">@@ -463,7 +471,7 @@
</span><span class="cx"> 
</span><span class="cx">     void clearPreviousID()
</span><span class="cx">     {
</span><del>-        if (m_hasRareData)
</del><ins>+        if (hasRareData())
</ins><span class="cx">             rareData()-&gt;clearPreviousID();
</span><span class="cx">         else
</span><span class="cx">             m_previousOrRareData.clear();
</span><span class="lines">@@ -482,13 +490,13 @@
</span><span class="cx"> 
</span><span class="cx">     Structure* previous() const
</span><span class="cx">     {
</span><del>-        ASSERT(!m_hasRareData);
</del><ins>+        ASSERT(!hasRareData());
</ins><span class="cx">         return static_cast&lt;Structure*&gt;(m_previousOrRareData.get());
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     StructureRareData* rareData() const
</span><span class="cx">     {
</span><del>-        ASSERT(m_hasRareData);
</del><ins>+        ASSERT(hasRareData());
</ins><span class="cx">         return static_cast&lt;StructureRareData*&gt;(m_previousOrRareData.get());
</span><span class="cx">     }
</span><span class="cx">         
</span><span class="lines">@@ -533,18 +541,8 @@
</span><span class="cx">     uint8_t m_inlineCapacity;
</span><span class="cx">     
</span><span class="cx">     ConcurrentJITLock m_lock;
</span><del>-    
-    unsigned m_dictionaryKind : 2;
-    bool m_isPinnedPropertyTable : 1;
-    bool m_hasGetterSetterProperties : 1;
-    bool m_hasReadOnlyOrGetterSetterPropertiesExcludingProto : 1;
-    bool m_hasNonEnumerableProperties : 1;
-    unsigned m_attributesInPrevious : 14;
-    unsigned m_specificFunctionThrashCount : 2;
-    unsigned m_preventExtensions : 1;
-    unsigned m_didTransition : 1;
-    unsigned m_staticFunctionReified : 1;
-    bool m_hasRareData : 1;
</del><ins>+
+    uint32_t m_bitField;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="branchesftloptSourceJavaScriptCoreruntimeStructureInlinesh"></a>
<div class="modfile"><h4>Modified: branches/ftlopt/Source/JavaScriptCore/runtime/StructureInlines.h (170435 => 170436)</h4>
<pre class="diff"><span>
<span class="info">--- branches/ftlopt/Source/JavaScriptCore/runtime/StructureInlines.h        2014-06-25 21:04:17 UTC (rev 170435)
+++ branches/ftlopt/Source/JavaScriptCore/runtime/StructureInlines.h        2014-06-25 21:15:37 UTC (rev 170436)
</span><span class="lines">@@ -135,14 +135,14 @@
</span><span class="cx"> inline void Structure::setEnumerationCache(VM&amp; vm, JSPropertyNameIterator* enumerationCache)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!isDictionary());
</span><del>-    if (!m_hasRareData)
</del><ins>+    if (!hasRareData())
</ins><span class="cx">         allocateRareData(vm);
</span><span class="cx">     rareData()-&gt;setEnumerationCache(vm, this, enumerationCache);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline JSPropertyNameIterator* Structure::enumerationCache()
</span><span class="cx"> {
</span><del>-    if (!m_hasRareData)
</del><ins>+    if (!hasRareData())
</ins><span class="cx">         return 0;
</span><span class="cx">     return rareData()-&gt;enumerationCache();
</span><span class="cx"> }
</span><span class="lines">@@ -228,7 +228,7 @@
</span><span class="cx">     PropertyTable* propertyTable = m_propertyTableUnsafe.get();
</span><span class="cx"> 
</span><span class="cx">     if (!propertyTable) {
</span><del>-        ASSERT(!m_isPinnedPropertyTable);
</del><ins>+        ASSERT(!isPinnedPropertyTable());
</ins><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>