<!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>[184050] 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/184050">184050</a></dd>
<dt>Author</dt> <dd>akling@apple.com</dd>
<dt>Date</dt> <dd>2015-05-10 13:03:57 -0700 (Sun, 10 May 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Remove unused things from PropertyNameArray.
&lt;https://webkit.org/b/144834&gt;

Reviewed by Filip Pizlo.

PropertyNameArray had a bunch of bells and whistles added to it when for-in iteration
was refactored and optimized last year. Then more refactoring happened and this class
doesn't need to ring and toot anymore.

The RefCountedIdentifierSet class disappears since the JSPropertyNameEnumerator wasn't
actually using it for anything and we were just wasting time creating these.

Also made the member functions take AtomicStringImpl* instead of plain StringImpl*.

* runtime/JSObject.cpp:
(JSC::JSObject::getPropertyNames):
* runtime/JSPropertyNameEnumerator.cpp:
(JSC::JSPropertyNameEnumerator::create):
(JSC::JSPropertyNameEnumerator::JSPropertyNameEnumerator):
* runtime/JSPropertyNameEnumerator.h:
* runtime/PropertyNameArray.cpp:
(JSC::PropertyNameArray::add):
(JSC::PropertyNameArray::setPreviouslyEnumeratedProperties): Deleted.
* runtime/PropertyNameArray.h:
(JSC::PropertyNameArray::PropertyNameArray):
(JSC::PropertyNameArray::add):
(JSC::PropertyNameArray::addKnownUnique):
(JSC::PropertyNameArray::canAddKnownUniqueForStructure):
(JSC::RefCountedIdentifierSet::contains): Deleted.
(JSC::RefCountedIdentifierSet::size): Deleted.
(JSC::RefCountedIdentifierSet::add): Deleted.
(JSC::PropertyNameArray::identifierSet): Deleted.
(JSC::PropertyNameArray::numCacheableSlots): Deleted.
(JSC::PropertyNameArray::setNumCacheableSlotsForObject): Deleted.
(JSC::PropertyNameArray::setBaseObject): Deleted.
(JSC::PropertyNameArray::setPreviouslyEnumeratedLength): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSObjectcpp">trunk/Source/JavaScriptCore/runtime/JSObject.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPropertyNameEnumeratorcpp">trunk/Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPropertyNameEnumeratorh">trunk/Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimePropertyNameArraycpp">trunk/Source/JavaScriptCore/runtime/PropertyNameArray.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimePropertyNameArrayh">trunk/Source/JavaScriptCore/runtime/PropertyNameArray.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (184049 => 184050)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-05-10 19:28:08 UTC (rev 184049)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-05-10 20:03:57 UTC (rev 184050)
</span><span class="lines">@@ -1,3 +1,42 @@
</span><ins>+2015-05-10  Andreas Kling  &lt;akling@apple.com&gt;
+
+        Remove unused things from PropertyNameArray.
+        &lt;https://webkit.org/b/144834&gt;
+
+        Reviewed by Filip Pizlo.
+
+        PropertyNameArray had a bunch of bells and whistles added to it when for-in iteration
+        was refactored and optimized last year. Then more refactoring happened and this class
+        doesn't need to ring and toot anymore.
+
+        The RefCountedIdentifierSet class disappears since the JSPropertyNameEnumerator wasn't
+        actually using it for anything and we were just wasting time creating these.
+
+        Also made the member functions take AtomicStringImpl* instead of plain StringImpl*.
+
+        * runtime/JSObject.cpp:
+        (JSC::JSObject::getPropertyNames):
+        * runtime/JSPropertyNameEnumerator.cpp:
+        (JSC::JSPropertyNameEnumerator::create):
+        (JSC::JSPropertyNameEnumerator::JSPropertyNameEnumerator):
+        * runtime/JSPropertyNameEnumerator.h:
+        * runtime/PropertyNameArray.cpp:
+        (JSC::PropertyNameArray::add):
+        (JSC::PropertyNameArray::setPreviouslyEnumeratedProperties): Deleted.
+        * runtime/PropertyNameArray.h:
+        (JSC::PropertyNameArray::PropertyNameArray):
+        (JSC::PropertyNameArray::add):
+        (JSC::PropertyNameArray::addKnownUnique):
+        (JSC::PropertyNameArray::canAddKnownUniqueForStructure):
+        (JSC::RefCountedIdentifierSet::contains): Deleted.
+        (JSC::RefCountedIdentifierSet::size): Deleted.
+        (JSC::RefCountedIdentifierSet::add): Deleted.
+        (JSC::PropertyNameArray::identifierSet): Deleted.
+        (JSC::PropertyNameArray::numCacheableSlots): Deleted.
+        (JSC::PropertyNameArray::setNumCacheableSlotsForObject): Deleted.
+        (JSC::PropertyNameArray::setBaseObject): Deleted.
+        (JSC::PropertyNameArray::setPreviouslyEnumeratedLength): Deleted.
+
</ins><span class="cx"> 2015-05-09  Yoav Weiss  &lt;yoav@yoav.ws&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove the PICTURE_SIZES build flag
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSObject.cpp (184049 => 184050)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSObject.cpp        2015-05-10 19:28:08 UTC (rev 184049)
+++ trunk/Source/JavaScriptCore/runtime/JSObject.cpp        2015-05-10 20:03:57 UTC (rev 184050)
</span><span class="lines">@@ -1456,7 +1456,6 @@
</span><span class="cx"> 
</span><span class="cx"> void JSObject::getPropertyNames(JSObject* object, ExecState* exec, PropertyNameArray&amp; propertyNames, EnumerationMode mode)
</span><span class="cx"> {
</span><del>-    propertyNames.setBaseObject(object);
</del><span class="cx">     object-&gt;methodTable(exec-&gt;vm())-&gt;getOwnPropertyNames(object, exec, propertyNames, mode);
</span><span class="cx"> 
</span><span class="cx">     if (object-&gt;prototype().isNull())
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPropertyNameEnumeratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.cpp (184049 => 184050)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.cpp        2015-05-10 19:28:08 UTC (rev 184049)
+++ trunk/Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.cpp        2015-05-10 20:03:57 UTC (rev 184050)
</span><span class="lines">@@ -47,14 +47,13 @@
</span><span class="cx">     StructureID structureID = structure ? structure-&gt;id() : 0;
</span><span class="cx">     uint32_t inlineCapacity = structure ? structure-&gt;inlineCapacity() : 0;
</span><span class="cx">     JSPropertyNameEnumerator* enumerator = new (NotNull, 
</span><del>-        allocateCell&lt;JSPropertyNameEnumerator&gt;(vm.heap)) JSPropertyNameEnumerator(vm, structureID, inlineCapacity, propertyNames.identifierSet());
</del><ins>+        allocateCell&lt;JSPropertyNameEnumerator&gt;(vm.heap)) JSPropertyNameEnumerator(vm, structureID, inlineCapacity);
</ins><span class="cx">     enumerator-&gt;finishCreation(vm, indexedLength, numberStructureProperties, propertyNames.data());
</span><span class="cx">     return enumerator;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSPropertyNameEnumerator::JSPropertyNameEnumerator(VM&amp; vm, StructureID structureID, uint32_t inlineCapacity, RefCountedIdentifierSet* set)
</del><ins>+JSPropertyNameEnumerator::JSPropertyNameEnumerator(VM&amp; vm, StructureID structureID, uint32_t inlineCapacity)
</ins><span class="cx">     : JSCell(vm, vm.propertyNameEnumeratorStructure.get())
</span><del>-    , m_identifierSet(set)
</del><span class="cx">     , m_cachedStructureID(structureID)
</span><span class="cx">     , m_cachedInlineCapacity(inlineCapacity)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPropertyNameEnumeratorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.h (184049 => 184050)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.h        2015-05-10 19:28:08 UTC (rev 184049)
+++ trunk/Source/JavaScriptCore/runtime/JSPropertyNameEnumerator.h        2015-05-10 20:03:57 UTC (rev 184050)
</span><span class="lines">@@ -60,11 +60,6 @@
</span><span class="cx">         return m_propertyNames[index].get();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    RefCountedIdentifierSet* identifierSet() const
-    {
-        return m_identifierSet.get();
-    }
-
</del><span class="cx">     StructureChain* cachedPrototypeChain() const { return m_prototypeChain.get(); }
</span><span class="cx">     void setCachedPrototypeChain(VM&amp; vm, StructureChain* prototypeChain) { return m_prototypeChain.set(vm, this, prototypeChain); }
</span><span class="cx"> 
</span><span class="lines">@@ -92,11 +87,10 @@
</span><span class="cx">     static void visitChildren(JSCell*, SlotVisitor&amp;);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    JSPropertyNameEnumerator(VM&amp;, StructureID, uint32_t, RefCountedIdentifierSet*);
</del><ins>+    JSPropertyNameEnumerator(VM&amp;, StructureID, uint32_t);
</ins><span class="cx">     void finishCreation(VM&amp;, uint32_t, uint32_t, PassRefPtr&lt;PropertyNameArrayData&gt;);
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;WriteBarrier&lt;JSString&gt;&gt; m_propertyNames;
</span><del>-    RefPtr&lt;RefCountedIdentifierSet&gt; m_identifierSet;
</del><span class="cx">     StructureID m_cachedStructureID;
</span><span class="cx">     WriteBarrier&lt;StructureChain&gt; m_prototypeChain;
</span><span class="cx">     uint32_t m_indexedLength;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimePropertyNameArraycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/PropertyNameArray.cpp (184049 => 184050)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/PropertyNameArray.cpp        2015-05-10 19:28:08 UTC (rev 184049)
+++ trunk/Source/JavaScriptCore/runtime/PropertyNameArray.cpp        2015-05-10 20:03:57 UTC (rev 184050)
</span><span class="lines">@@ -29,26 +29,14 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-void PropertyNameArray::add(StringImpl* identifier)
</del><ins>+void PropertyNameArray::add(AtomicStringImpl* identifier)
</ins><span class="cx"> {
</span><del>-    ASSERT(!identifier || (identifier == StringImpl::empty() || identifier-&gt;isAtomic() || identifier-&gt;isSymbol()));
-    if (!ASSERT_DISABLED) {
-        Optional&lt;uint32_t&gt; index = parseIndex(Identifier::fromUid(m_vm, identifier));
-        ASSERT_UNUSED(index, !index || index.value() &gt;= m_previouslyEnumeratedLength);
-    }
</del><ins>+    ASSERT(identifier);
</ins><span class="cx"> 
</span><del>-    if (m_alternateSet &amp;&amp; m_alternateSet-&gt;contains(identifier))
</del><ins>+    if (!m_set.add(identifier).isNewEntry)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    if (!m_set-&gt;add(identifier).isNewEntry)
-        return;
-
</del><span class="cx">     addKnownUnique(identifier);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PropertyNameArray::setPreviouslyEnumeratedProperties(const JSPropertyNameEnumerator* enumerator)
-{
-    m_alternateSet = enumerator-&gt;identifierSet();
-}
-
</del><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimePropertyNameArrayh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/PropertyNameArray.h (184049 => 184050)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/PropertyNameArray.h        2015-05-10 19:28:08 UTC (rev 184049)
+++ trunk/Source/JavaScriptCore/runtime/PropertyNameArray.h        2015-05-10 20:03:57 UTC (rev 184050)
</span><span class="lines">@@ -30,20 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> class JSPropertyNameEnumerator;
</span><span class="cx"> class Structure;
</span><del>-class StructureChain;
</del><span class="cx"> 
</span><del>-class RefCountedIdentifierSet : public RefCounted&lt;RefCountedIdentifierSet&gt; {
-public:
-    typedef HashSet&lt;StringImpl*, PtrHash&lt;StringImpl*&gt;&gt; Set;
-
-    bool contains(StringImpl* impl) const { return m_set.contains(impl); }
-    size_t size() const  { return m_set.size(); }
-    Set::AddResult add(StringImpl* impl) { return m_set.add(impl); }
-
-private:
-    Set m_set;
-};
-
</del><span class="cx"> // FIXME: Rename to PropertyNameArray.
</span><span class="cx"> class PropertyNameArrayData : public RefCounted&lt;PropertyNameArrayData&gt; {
</span><span class="cx"> public:
</span><span class="lines">@@ -66,21 +53,13 @@
</span><span class="cx"> public:
</span><span class="cx">     PropertyNameArray(VM* vm)
</span><span class="cx">         : m_data(PropertyNameArrayData::create())
</span><del>-        , m_set(adoptRef(new RefCountedIdentifierSet))
</del><span class="cx">         , m_vm(vm)
</span><del>-        , m_numCacheableSlots(0)
-        , m_baseObject(0)
-        , m_previouslyEnumeratedLength(0)
</del><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     PropertyNameArray(ExecState* exec)
</span><span class="cx">         : m_data(PropertyNameArrayData::create())
</span><del>-        , m_set(adoptRef(new RefCountedIdentifierSet))
</del><span class="cx">         , m_vm(&amp;exec-&gt;vm())
</span><del>-        , m_numCacheableSlots(0)
-        , m_baseObject(0)
-        , m_previouslyEnumeratedLength(0)
</del><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -88,16 +67,14 @@
</span><span class="cx"> 
</span><span class="cx">     void add(uint32_t index)
</span><span class="cx">     {
</span><del>-        if (index &lt; m_previouslyEnumeratedLength)
-            return;
</del><span class="cx">         add(Identifier::from(m_vm, index));
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void add(const Identifier&amp; identifier) { add(identifier.impl()); }
</span><del>-    JS_EXPORT_PRIVATE void add(StringImpl*);
-    void addKnownUnique(StringImpl* identifier)
</del><ins>+    JS_EXPORT_PRIVATE void add(AtomicStringImpl*);
+    void addKnownUnique(AtomicStringImpl* identifier)
</ins><span class="cx">     {
</span><del>-        m_set-&gt;add(identifier);
</del><ins>+        m_set.add(identifier);
</ins><span class="cx">         m_data-&gt;propertyNameVector().append(Identifier::fromUid(m_vm, identifier));
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -108,40 +85,17 @@
</span><span class="cx">     PropertyNameArrayData* data() { return m_data.get(); }
</span><span class="cx">     PassRefPtr&lt;PropertyNameArrayData&gt; releaseData() { return m_data.release(); }
</span><span class="cx"> 
</span><del>-    RefCountedIdentifierSet* identifierSet() const { return m_set.get(); }
-
</del><span class="cx">     // FIXME: Remove these functions.
</span><del>-    bool canAddKnownUniqueForStructure() const { return !m_set-&gt;size() &amp;&amp; (!m_alternateSet || !m_alternateSet-&gt;size()); }
</del><ins>+    bool canAddKnownUniqueForStructure() const { return m_set.isEmpty(); }
</ins><span class="cx">     typedef PropertyNameArrayData::PropertyNameVector::const_iterator const_iterator;
</span><span class="cx">     size_t size() const { return m_data-&gt;propertyNameVector().size(); }
</span><span class="cx">     const_iterator begin() const { return m_data-&gt;propertyNameVector().begin(); }
</span><span class="cx">     const_iterator end() const { return m_data-&gt;propertyNameVector().end(); }
</span><span class="cx"> 
</span><del>-    size_t numCacheableSlots() const { return m_numCacheableSlots; }
-    void setNumCacheableSlotsForObject(JSObject* object, size_t numCacheableSlots)
-    {
-        if (object != m_baseObject)
-            return;
-        m_numCacheableSlots = numCacheableSlots;
-    }
-    void setBaseObject(JSObject* object)
-    {
-        if (m_baseObject)
-            return;
-        m_baseObject = object;
-    }
-
-    void setPreviouslyEnumeratedLength(uint32_t length) { m_previouslyEnumeratedLength = length; }
-    void setPreviouslyEnumeratedProperties(const JSPropertyNameEnumerator*);
-
</del><span class="cx"> private:
</span><span class="cx">     RefPtr&lt;PropertyNameArrayData&gt; m_data;
</span><del>-    RefPtr&lt;RefCountedIdentifierSet&gt; m_set;
-    RefPtr&lt;RefCountedIdentifierSet&gt; m_alternateSet;
</del><ins>+    HashSet&lt;AtomicStringImpl*, PtrHash&lt;AtomicStringImpl*&gt;&gt; m_set;
</ins><span class="cx">     VM* m_vm;
</span><del>-    size_t m_numCacheableSlots;
-    JSObject* m_baseObject;
-    uint32_t m_previouslyEnumeratedLength;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre>
</div>
</div>

</body>
</html>