<!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>[201853] 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/201853">201853</a></dd>
<dt>Author</dt> <dd>barraclough@apple.com</dd>
<dt>Date</dt> <dd>2016-06-08 22:43:46 -0700 (Wed, 08 Jun 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>JSObject::reifyAllStaticProperties cleanup
https://bugs.webkit.org/show_bug.cgi?id=158543

Reviewed by Mark Lam.

- JSObject &amp; Structure contain fields labeled 'staticFunctionsReified', however reification now
  affects all properties, not just functions. Rename to 'staticPropertiesReified'.
- reifyAllStaticProperties relies on a 'hasStaticProperties' method on ClassInfo that walks the
  ClassInfo inheritance chain looking for static property tables. We can now more efficiently
  get this information from TypeInfo.
- reifyAllStaticProperties triggers a 'toUncacheableDictionaryTransition'; this is overzealous,
  cacheable dictionary is sufficient - this is what we do in the case of DOM prototype property
  reification (see 'reifyStaticProperties' in Lookup.h). (Changing this with an eye on switching
  DOM prototype property reification to use JSObject:: reifyAllStaticProperties, rather than
  having its own special purpose code path.)

* runtime/ClassInfo.h:
(JSC::ClassInfo::hasStaticProperties): Deleted.
    - deprecated by TypeInfo::hasStaticPropertyTable.
* runtime/JSObject.cpp:
(JSC::JSObject::putInlineSlow):
(JSC::JSObject::deleteProperty):
(JSC::JSObject::getOwnNonIndexPropertyNames):
    - staticFunctionsReified -&gt; staticPropertiesReified
(JSC::JSObject::reifyAllStaticProperties):
    - hasStaticProperties -&gt; TypeInfo::hasStaticPropertyTable
    - toUncacheableDictionaryTransition -&gt; toCacheableDictionaryTransition
    - staticFunctionsReified -&gt; staticPropertiesReified
* runtime/JSObject.h:
(JSC::JSObject::staticPropertiesReified):
(JSC::JSObject::staticFunctionsReified): Deleted.
* runtime/Lookup.cpp:
(JSC::setUpStaticFunctionSlot):
* runtime/Lookup.h:
(JSC::getStaticPropertySlotFromTable):
(JSC::replaceStaticPropertySlot):
* runtime/Structure.cpp:
(JSC::Structure::Structure):
* runtime/Structure.h:
    - staticFunctionsReified -&gt; staticPropertiesReified</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeClassInfoh">trunk/Source/JavaScriptCore/runtime/ClassInfo.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSObjectcpp">trunk/Source/JavaScriptCore/runtime/JSObject.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSObjecth">trunk/Source/JavaScriptCore/runtime/JSObject.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeLookupcpp">trunk/Source/JavaScriptCore/runtime/Lookup.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeLookuph">trunk/Source/JavaScriptCore/runtime/Lookup.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructurecpp">trunk/Source/JavaScriptCore/runtime/Structure.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructureh">trunk/Source/JavaScriptCore/runtime/Structure.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (201852 => 201853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-06-09 05:18:38 UTC (rev 201852)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-06-09 05:43:46 UTC (rev 201853)
</span><span class="lines">@@ -1,3 +1,46 @@
</span><ins>+2016-06-08  Gavin &amp; Ellie Barraclough  &lt;barraclough@apple.com&gt;
+
+        JSObject::reifyAllStaticProperties cleanup
+        https://bugs.webkit.org/show_bug.cgi?id=158543
+
+        Reviewed by Mark Lam.
+
+        - JSObject &amp; Structure contain fields labeled 'staticFunctionsReified', however reification now
+          affects all properties, not just functions. Rename to 'staticPropertiesReified'.
+        - reifyAllStaticProperties relies on a 'hasStaticProperties' method on ClassInfo that walks the
+          ClassInfo inheritance chain looking for static property tables. We can now more efficiently
+          get this information from TypeInfo.
+        - reifyAllStaticProperties triggers a 'toUncacheableDictionaryTransition'; this is overzealous,
+          cacheable dictionary is sufficient - this is what we do in the case of DOM prototype property
+          reification (see 'reifyStaticProperties' in Lookup.h). (Changing this with an eye on switching
+          DOM prototype property reification to use JSObject:: reifyAllStaticProperties, rather than
+          having its own special purpose code path.)
+
+        * runtime/ClassInfo.h:
+        (JSC::ClassInfo::hasStaticProperties): Deleted.
+            - deprecated by TypeInfo::hasStaticPropertyTable.
+        * runtime/JSObject.cpp:
+        (JSC::JSObject::putInlineSlow):
+        (JSC::JSObject::deleteProperty):
+        (JSC::JSObject::getOwnNonIndexPropertyNames):
+            - staticFunctionsReified -&gt; staticPropertiesReified
+        (JSC::JSObject::reifyAllStaticProperties):
+            - hasStaticProperties -&gt; TypeInfo::hasStaticPropertyTable
+            - toUncacheableDictionaryTransition -&gt; toCacheableDictionaryTransition
+            - staticFunctionsReified -&gt; staticPropertiesReified
+        * runtime/JSObject.h:
+        (JSC::JSObject::staticPropertiesReified):
+        (JSC::JSObject::staticFunctionsReified): Deleted.
+        * runtime/Lookup.cpp:
+        (JSC::setUpStaticFunctionSlot):
+        * runtime/Lookup.h:
+        (JSC::getStaticPropertySlotFromTable):
+        (JSC::replaceStaticPropertySlot):
+        * runtime/Structure.cpp:
+        (JSC::Structure::Structure):
+        * runtime/Structure.h:
+            - staticFunctionsReified -&gt; staticPropertiesReified
+
</ins><span class="cx"> 2016-06-08  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Change thresholdForOptimizeSoon to match thresholdForOptimizeAfterWarmUp
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeClassInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ClassInfo.h (201852 => 201853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ClassInfo.h        2016-06-09 05:18:38 UTC (rev 201852)
+++ trunk/Source/JavaScriptCore/runtime/ClassInfo.h        2016-06-09 05:43:46 UTC (rev 201853)
</span><span class="lines">@@ -197,15 +197,6 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool hasStaticProperties() const
-    {
-        for (const ClassInfo* ci = this; ci; ci = ci-&gt;parentClass) {
-            if (ci-&gt;staticPropHashTable)
-                return true;
-        }
-        return false;
-    }
-
</del><span class="cx">     JS_EXPORT_PRIVATE bool hasStaticSetterOrReadonlyProperties() const;
</span><span class="cx"> 
</span><span class="cx">     const HashTable* staticPropHashTable;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSObject.cpp (201852 => 201853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSObject.cpp        2016-06-09 05:18:38 UTC (rev 201852)
+++ trunk/Source/JavaScriptCore/runtime/JSObject.cpp        2016-06-09 05:43:46 UTC (rev 201853)
</span><span class="lines">@@ -568,7 +568,7 @@
</span><span class="cx">             // prototypes it should be replaced, so break here.
</span><span class="cx">             break;
</span><span class="cx">         }
</span><del>-        if (!obj-&gt;staticFunctionsReified()) {
</del><ins>+        if (!obj-&gt;staticPropertiesReified()) {
</ins><span class="cx">             if (obj-&gt;classInfo()-&gt;hasStaticSetterOrReadonlyProperties()) {
</span><span class="cx">                 if (auto* entry = obj-&gt;findPropertyHashEntry(propertyName))
</span><span class="cx">                     return putEntry(exec, entry, obj, this, propertyName, value, slot);
</span><span class="lines">@@ -1498,7 +1498,7 @@
</span><span class="cx"> 
</span><span class="cx">     unsigned attributes;
</span><span class="cx"> 
</span><del>-    if (!thisObject-&gt;staticFunctionsReified()) {
</del><ins>+    if (!thisObject-&gt;staticPropertiesReified()) {
</ins><span class="cx">         if (auto* entry = thisObject-&gt;findPropertyHashEntry(propertyName)) {
</span><span class="cx">             // If the static table contains a non-configurable (DontDelete) property then we can return early;
</span><span class="cx">             // if there is a property in the storage array it too must be non-configurable (the language does
</span><span class="lines">@@ -1890,7 +1890,7 @@
</span><span class="cx"> 
</span><span class="cx"> void JSObject::getOwnNonIndexPropertyNames(JSObject* object, ExecState* exec, PropertyNameArray&amp; propertyNames, EnumerationMode mode)
</span><span class="cx"> {
</span><del>-    if (!object-&gt;staticFunctionsReified())
</del><ins>+    if (!object-&gt;staticPropertiesReified())
</ins><span class="cx">         getClassPropertyNames(exec, object-&gt;classInfo(), propertyNames, mode);
</span><span class="cx"> 
</span><span class="cx">     if (!mode.includeJSObjectProperties())
</span><span class="lines">@@ -1965,18 +1965,18 @@
</span><span class="cx"> 
</span><span class="cx"> void JSObject::reifyAllStaticProperties(ExecState* exec)
</span><span class="cx"> {
</span><del>-    ASSERT(!staticFunctionsReified());
</del><ins>+    ASSERT(!staticPropertiesReified());
</ins><span class="cx">     VM&amp; vm = exec-&gt;vm();
</span><span class="cx"> 
</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><del>-    if (!classInfo()-&gt;hasStaticProperties()) {
-        structure(vm)-&gt;setStaticFunctionsReified(true);
</del><ins>+    if (!TypeInfo::hasStaticPropertyTable(inlineTypeFlags())) {
+        structure(vm)-&gt;setStaticPropertiesReified(true);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!structure(vm)-&gt;isUncacheableDictionary())
-        setStructure(vm, Structure::toUncacheableDictionaryTransition(vm, structure(vm)));
</del><ins>+    if (!structure(vm)-&gt;isDictionary())
+        setStructure(vm, Structure::toCacheableDictionaryTransition(vm, structure(vm)));
</ins><span class="cx"> 
</span><span class="cx">     for (const ClassInfo* info = classInfo(); info; info = info-&gt;parentClass) {
</span><span class="cx">         const HashTable* hashTable = info-&gt;staticPropHashTable;
</span><span class="lines">@@ -1992,7 +1992,7 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    structure(vm)-&gt;setStaticFunctionsReified(true);
</del><ins>+    structure(vm)-&gt;setStaticPropertiesReified(true);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> NEVER_INLINE void JSObject::fillGetterPropertySlot(PropertySlot&amp; slot, JSValue getterSetter, unsigned attributes, PropertyOffset offset)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSObject.h (201852 => 201853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSObject.h        2016-06-09 05:18:38 UTC (rev 201852)
+++ trunk/Source/JavaScriptCore/runtime/JSObject.h        2016-06-09 05:43:46 UTC (rev 201853)
</span><span class="lines">@@ -678,7 +678,7 @@
</span><span class="cx">             || structure()-&gt;typeInfo().interceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool staticFunctionsReified() { return structure()-&gt;staticFunctionsReified(); }
</del><ins>+    bool staticPropertiesReified() { return structure()-&gt;staticPropertiesReified(); }
</ins><span class="cx">     void reifyAllStaticProperties(ExecState*);
</span><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE Butterfly* growOutOfLineStorage(VM&amp;, size_t oldSize, size_t newSize);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeLookupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Lookup.cpp (201852 => 201853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Lookup.cpp        2016-06-09 05:18:38 UTC (rev 201852)
+++ trunk/Source/JavaScriptCore/runtime/Lookup.cpp        2016-06-09 05:43:46 UTC (rev 201853)
</span><span class="lines">@@ -53,7 +53,7 @@
</span><span class="cx">     if (!isValidOffset(offset)) {
</span><span class="cx">         // If a property is ever deleted from an object with a static table, then we reify
</span><span class="cx">         // all static functions at that time - after this we shouldn't be re-adding anything.
</span><del>-        if (thisObject-&gt;staticFunctionsReified())
</del><ins>+        if (thisObject-&gt;staticPropertiesReified())
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><span class="cx">         if (entry-&gt;attributes() &amp; Builtin)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeLookuph"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Lookup.h (201852 => 201853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Lookup.h        2016-06-09 05:18:38 UTC (rev 201852)
+++ trunk/Source/JavaScriptCore/runtime/Lookup.h        2016-06-09 05:43:46 UTC (rev 201853)
</span><span class="lines">@@ -210,7 +210,7 @@
</span><span class="cx"> 
</span><span class="cx"> inline bool getStaticPropertySlotFromTable(VM&amp; vm, const HashTable&amp; table, JSObject* thisObject, PropertyName propertyName, PropertySlot&amp; slot)
</span><span class="cx"> {
</span><del>-    if (thisObject-&gt;staticFunctionsReified())
</del><ins>+    if (thisObject-&gt;staticPropertiesReified())
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     auto* entry = table.entry(propertyName);
</span><span class="lines">@@ -234,7 +234,7 @@
</span><span class="cx">     if (!thisObject-&gt;putDirect(vm, propertyName, value))
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    if (!thisObject-&gt;staticFunctionsReified())
</del><ins>+    if (!thisObject-&gt;staticPropertiesReified())
</ins><span class="cx">         thisObject-&gt;JSObject::setStructure(vm, Structure::attributeChangeTransition(vm, thisObject-&gt;structure(), propertyName, 0));
</span><span class="cx"> 
</span><span class="cx">     return true;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructurecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Structure.cpp (201852 => 201853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Structure.cpp        2016-06-09 05:18:38 UTC (rev 201852)
+++ trunk/Source/JavaScriptCore/runtime/Structure.cpp        2016-06-09 05:43:46 UTC (rev 201853)
</span><span class="lines">@@ -205,7 +205,7 @@
</span><span class="cx">     setAttributesInPrevious(0);
</span><span class="cx">     setDidPreventExtensions(false);
</span><span class="cx">     setDidTransition(false);
</span><del>-    setStaticFunctionsReified(false);
</del><ins>+    setStaticPropertiesReified(false);
</ins><span class="cx">     setTransitionWatchpointIsLikelyToBeFired(false);
</span><span class="cx">     setHasBeenDictionary(false);
</span><span class="cx">  
</span><span class="lines">@@ -236,7 +236,7 @@
</span><span class="cx">     setAttributesInPrevious(0);
</span><span class="cx">     setDidPreventExtensions(false);
</span><span class="cx">     setDidTransition(false);
</span><del>-    setStaticFunctionsReified(false);
</del><ins>+    setStaticPropertiesReified(false);
</ins><span class="cx">     setTransitionWatchpointIsLikelyToBeFired(false);
</span><span class="cx">     setHasBeenDictionary(false);
</span><span class="cx">  
</span><span class="lines">@@ -266,7 +266,7 @@
</span><span class="cx">     setAttributesInPrevious(0);
</span><span class="cx">     setDidPreventExtensions(previous-&gt;didPreventExtensions());
</span><span class="cx">     setDidTransition(true);
</span><del>-    setStaticFunctionsReified(previous-&gt;staticFunctionsReified());
</del><ins>+    setStaticPropertiesReified(previous-&gt;staticPropertiesReified());
</ins><span class="cx">     setHasBeenDictionary(previous-&gt;hasBeenDictionary());
</span><span class="cx">  
</span><span class="cx">     TypeInfo typeInfo = previous-&gt;typeInfo();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructureh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Structure.h (201852 => 201853)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Structure.h        2016-06-09 05:18:38 UTC (rev 201852)
+++ trunk/Source/JavaScriptCore/runtime/Structure.h        2016-06-09 05:43:46 UTC (rev 201853)
</span><span class="lines">@@ -609,7 +609,7 @@
</span><span class="cx">     DEFINE_BITFIELD(unsigned, attributesInPrevious, AttributesInPrevious, 14, 6);
</span><span class="cx">     DEFINE_BITFIELD(bool, didPreventExtensions, DidPreventExtensions, 1, 20);
</span><span class="cx">     DEFINE_BITFIELD(bool, didTransition, DidTransition, 1, 21);
</span><del>-    DEFINE_BITFIELD(bool, staticFunctionsReified, StaticFunctionsReified, 1, 22);
</del><ins>+    DEFINE_BITFIELD(bool, staticPropertiesReified, StaticPropertiesReified, 1, 22);
</ins><span class="cx">     DEFINE_BITFIELD(bool, hasBeenFlattenedBefore, HasBeenFlattenedBefore, 1, 23);
</span><span class="cx">     DEFINE_BITFIELD(bool, hasCustomGetterSetterProperties, HasCustomGetterSetterProperties, 1, 24);
</span><span class="cx">     DEFINE_BITFIELD(bool, didWatchInternalProperties, DidWatchInternalProperties, 1, 25);
</span></span></pre>
</div>
</div>

</body>
</html>