<!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>[165440] 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/165440">165440</a></dd>
<dt>Author</dt> <dd>akling@apple.com</dd>
<dt>Date</dt> <dd>2014-03-11 02:35:55 -0700 (Tue, 11 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Streamline PropertyTable for lookup-only access.
&lt;https://webkit.org/b/130060&gt;

The PropertyTable lookup algorithm was written to support both read
and write access. This wasn't actually needed in most places.

This change adds a PropertyTable::get() that just returns the value
type (instead of an insertion iterator.) It also adds an early return
for empty tables.

Finally, up the minimum table capacity from 8 to 16. It was lowered
to 8 in order to save memory, but that was before PropertyTables were
GC allocated. Nowadays we don't have nearly as many tables, since all
the unpinned transitions die off.

Reviewed by Darin Adler.

* runtime/PropertyMapHashTable.h:
(JSC::PropertyTable::get):
* runtime/Structure.cpp:
(JSC::Structure::despecifyDictionaryFunction):
(JSC::Structure::attributeChangeTransition):
(JSC::Structure::get):
(JSC::Structure::despecifyFunction):
* runtime/StructureInlines.h:
(JSC::Structure::get):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimePropertyMapHashTableh">trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructurecpp">trunk/Source/JavaScriptCore/runtime/Structure.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeStructureInlinesh">trunk/Source/JavaScriptCore/runtime/StructureInlines.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (165439 => 165440)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-03-11 09:14:22 UTC (rev 165439)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-03-11 09:35:55 UTC (rev 165440)
</span><span class="lines">@@ -1,3 +1,32 @@
</span><ins>+2014-03-11  Andreas Kling  &lt;akling@apple.com&gt;
+
+        Streamline PropertyTable for lookup-only access.
+        &lt;https://webkit.org/b/130060&gt;
+
+        The PropertyTable lookup algorithm was written to support both read
+        and write access. This wasn't actually needed in most places.
+
+        This change adds a PropertyTable::get() that just returns the value
+        type (instead of an insertion iterator.) It also adds an early return
+        for empty tables.
+
+        Finally, up the minimum table capacity from 8 to 16. It was lowered
+        to 8 in order to save memory, but that was before PropertyTables were
+        GC allocated. Nowadays we don't have nearly as many tables, since all
+        the unpinned transitions die off.
+
+        Reviewed by Darin Adler.
+
+        * runtime/PropertyMapHashTable.h:
+        (JSC::PropertyTable::get):
+        * runtime/Structure.cpp:
+        (JSC::Structure::despecifyDictionaryFunction):
+        (JSC::Structure::attributeChangeTransition):
+        (JSC::Structure::get):
+        (JSC::Structure::despecifyFunction):
+        * runtime/StructureInlines.h:
+        (JSC::Structure::get):
+
</ins><span class="cx"> 2014-03-10  Mark Hahnenberg  &lt;mhahnenberg@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION(r165407): DoYouEvenBench crashes in DRT
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimePropertyMapHashTableh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h (165439 => 165440)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h        2014-03-11 09:14:22 UTC (rev 165439)
+++ trunk/Source/JavaScriptCore/runtime/PropertyMapHashTable.h        2014-03-11 09:35:55 UTC (rev 165440)
</span><span class="lines">@@ -170,6 +170,7 @@
</span><span class="cx">     // Find a value in the table.
</span><span class="cx">     find_iterator find(const KeyType&amp;);
</span><span class="cx">     find_iterator findWithString(const KeyType&amp;);
</span><ins>+    ValueType* get(const KeyType&amp;);
</ins><span class="cx">     // Add a value to the table
</span><span class="cx">     enum EffectOnPropertyOffset { PropertyOffsetMayChange, PropertyOffsetMustNotChange };
</span><span class="cx">     std::pair&lt;find_iterator, bool&gt; add(const ValueType&amp; entry, PropertyOffset&amp;, EffectOnPropertyOffset);
</span><span class="lines">@@ -256,7 +257,7 @@
</span><span class="cx">     unsigned m_deletedCount;
</span><span class="cx">     OwnPtr&lt; Vector&lt;PropertyOffset&gt;&gt; m_deletedOffsets;
</span><span class="cx"> 
</span><del>-    static const unsigned MinimumTableSize = 8;
</del><ins>+    static const unsigned MinimumTableSize = 16;
</ins><span class="cx">     static const unsigned EmptyEntryIndex = 0;
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -312,6 +313,42 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline PropertyTable::ValueType* PropertyTable::get(const KeyType&amp; key)
+{
+    ASSERT(key);
+    ASSERT(key-&gt;isIdentifier() || key-&gt;isEmptyUnique());
+
+    if (!m_keyCount)
+        return nullptr;
+
+    unsigned hash = key-&gt;existingHash();
+    unsigned step = 0;
+
+#if DUMP_PROPERTYMAP_STATS
+    ++numProbes;
+#endif
+
+    while (true) {
+        unsigned entryIndex = m_index[hash &amp; m_indexMask];
+        if (entryIndex == EmptyEntryIndex)
+            return nullptr;
+        if (key == table()[entryIndex - 1].key)
+            return &amp;table()[entryIndex - 1];
+
+#if DUMP_PROPERTYMAP_STATS
+        ++numCollisions;
+#endif
+
+        if (!step)
+            step = WTF::doubleHash(key-&gt;existingHash()) | 1;
+        hash += step;
+
+#if DUMP_PROPERTYMAP_STATS
+        ++numRehashes;
+#endif
+    }
+}
+
</ins><span class="cx"> inline PropertyTable::find_iterator PropertyTable::findWithString(const KeyType&amp; key)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(key);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructurecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Structure.cpp (165439 => 165440)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Structure.cpp        2014-03-11 09:14:22 UTC (rev 165439)
+++ trunk/Source/JavaScriptCore/runtime/Structure.cpp        2014-03-11 09:35:55 UTC (rev 165440)
</span><span class="lines">@@ -339,7 +339,7 @@
</span><span class="cx">     ASSERT(isDictionary());
</span><span class="cx">     ASSERT(propertyTable());
</span><span class="cx"> 
</span><del>-    PropertyMapEntry* entry = propertyTable()-&gt;find(rep).first;
</del><ins>+    PropertyMapEntry* entry = propertyTable()-&gt;get(rep);
</ins><span class="cx">     ASSERT(entry);
</span><span class="cx">     entry-&gt;specificValue.clear();
</span><span class="cx"> }
</span><span class="lines">@@ -521,7 +521,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ASSERT(structure-&gt;propertyTable());
</span><del>-    PropertyMapEntry* entry = structure-&gt;propertyTable()-&gt;find(propertyName.uid()).first;
</del><ins>+    PropertyMapEntry* entry = structure-&gt;propertyTable()-&gt;get(propertyName.uid());
</ins><span class="cx">     ASSERT(entry);
</span><span class="cx">     entry-&gt;attributes = attributes;
</span><span class="cx"> 
</span><span class="lines">@@ -850,7 +850,7 @@
</span><span class="cx">     findStructuresAndMapForMaterialization(structures, structure, table);
</span><span class="cx">     
</span><span class="cx">     if (table) {
</span><del>-        PropertyMapEntry* entry = table-&gt;find(uid).first;
</del><ins>+        PropertyMapEntry* entry = table-&gt;get(uid);
</ins><span class="cx">         if (entry) {
</span><span class="cx">             attributes = entry-&gt;attributes;
</span><span class="cx">             specificValue = entry-&gt;specificValue.get();
</span><span class="lines">@@ -884,7 +884,7 @@
</span><span class="cx">     if (!propertyTable())
</span><span class="cx">         return invalidOffset;
</span><span class="cx"> 
</span><del>-    PropertyMapEntry* entry = propertyTable()-&gt;find(propertyName.uid()).first;
</del><ins>+    PropertyMapEntry* entry = propertyTable()-&gt;get(propertyName.uid());
</ins><span class="cx">     if (!entry)
</span><span class="cx">         return invalidOffset;
</span><span class="cx"> 
</span><span class="lines">@@ -900,7 +900,7 @@
</span><span class="cx">     if (!propertyTable())
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    PropertyMapEntry* entry = propertyTable()-&gt;find(propertyName.uid()).first;
</del><ins>+    PropertyMapEntry* entry = propertyTable()-&gt;get(propertyName.uid());
</ins><span class="cx">     if (!entry)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeStructureInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/StructureInlines.h (165439 => 165440)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/StructureInlines.h        2014-03-11 09:14:22 UTC (rev 165439)
+++ trunk/Source/JavaScriptCore/runtime/StructureInlines.h        2014-03-11 09:35:55 UTC (rev 165440)
</span><span class="lines">@@ -82,7 +82,7 @@
</span><span class="cx">     if (!propertyTable())
</span><span class="cx">         return invalidOffset;
</span><span class="cx"> 
</span><del>-    PropertyMapEntry* entry = propertyTable()-&gt;find(propertyName.uid()).first;
</del><ins>+    PropertyMapEntry* entry = propertyTable()-&gt;get(propertyName.uid());
</ins><span class="cx">     return entry ? entry-&gt;offset : invalidOffset;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>