<!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>[176290] trunk/Source</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/176290">176290</a></dd>
<dt>Author</dt> <dd>ggaren@apple.com</dd>
<dt>Date</dt> <dd>2014-11-18 15:06:00 -0800 (Tue, 18 Nov 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Removed the custom allocator for ListHashSet nodes
https://bugs.webkit.org/show_bug.cgi?id=138841

Reviewed by Andreas Kling.

Source/WebCore:

Uses of ListHashSet no longer need to declare an inline capacity,
since that was only used to specify the capacity of the custom allocator.

* dom/DOMNamedFlowCollection.h:
* dom/DocumentEventQueue.h:
* dom/DocumentStyleSheetCollection.h:
* dom/NamedFlowCollection.h:
* html/FormController.h:
* rendering/FloatingObjects.h:
* rendering/RenderBlock.h:

Source/WebKit2:

Uses of ListHashSet no longer need to declare an inline capacity,
since that was only used to specify the capacity of the custom allocator.

* UIProcess/Plugins/PluginInfoStore.cpp:
(WebKit::PluginInfoStore::loadPluginsIfNecessary):

Source/WTF:

bmalloc is fast, so we don't need a custom allocator.

The MallocBench test for linked list node allocation (list_allocate) is
4.09X faster in bmalloc than TCMalloc. Also, I wrote a stress test to
add/remove link elements, which modify a ListHashSet on insertion and
removal, and it was 1% faster / in the noise with bmalloc enabled.

* wtf/ListHashSet.h:
(WTF::ListHashSetNode::ListHashSetNode):
(WTF::ListHashSetTranslator::translate):
(WTF::U&gt;::ListHashSet):
(WTF::=):
(WTF::U&gt;::swap):
(WTF::U&gt;::~ListHashSet):
(WTF::U&gt;::size):
(WTF::U&gt;::capacity):
(WTF::U&gt;::isEmpty):
(WTF::U&gt;::first):
(WTF::U&gt;::removeFirst):
(WTF::U&gt;::takeFirst):
(WTF::U&gt;::last):
(WTF::U&gt;::removeLast):
(WTF::U&gt;::takeLast):
(WTF::U&gt;::contains):
(WTF::U&gt;::remove):
(WTF::U&gt;::clear):
(WTF::U&gt;::unlink):
(WTF::U&gt;::unlinkAndDelete):
(WTF::U&gt;::appendNode):
(WTF::U&gt;::prependNode):
(WTF::U&gt;::insertNodeBefore):
(WTF::U&gt;::deleteAllNodes):
(WTF::ListHashSetNodeAllocator::ListHashSetNodeAllocator): Deleted.
(WTF::ListHashSetNodeAllocator::allocate): Deleted.
(WTF::ListHashSetNodeAllocator::deallocate): Deleted.
(WTF::ListHashSetNodeAllocator::pool): Deleted.
(WTF::ListHashSetNodeAllocator::pastPool): Deleted.
(WTF::ListHashSetNodeAllocator::inPool): Deleted.
(WTF::ListHashSetNode::operator new): Deleted.
(WTF::ListHashSetNode::destroy): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfListHashSeth">trunk/Source/WTF/wtf/ListHashSet.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredomDOMNamedFlowCollectionh">trunk/Source/WebCore/dom/DOMNamedFlowCollection.h</a></li>
<li><a href="#trunkSourceWebCoredomDocumentEventQueueh">trunk/Source/WebCore/dom/DocumentEventQueue.h</a></li>
<li><a href="#trunkSourceWebCoredomDocumentStyleSheetCollectionh">trunk/Source/WebCore/dom/DocumentStyleSheetCollection.h</a></li>
<li><a href="#trunkSourceWebCoredomNamedFlowCollectionh">trunk/Source/WebCore/dom/NamedFlowCollection.h</a></li>
<li><a href="#trunkSourceWebCorehtmlFormControllerh">trunk/Source/WebCore/html/FormController.h</a></li>
<li><a href="#trunkSourceWebCorerenderingFloatingObjectsh">trunk/Source/WebCore/rendering/FloatingObjects.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBlockh">trunk/Source/WebCore/rendering/RenderBlock.h</a></li>
<li><a href="#trunkSourceWebKitWebKitvcxprojWebKitExportGeneratorWebKitExportsdefin">trunk/Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessPluginsPluginInfoStorecpp">trunk/Source/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (176289 => 176290)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2014-11-18 22:57:43 UTC (rev 176289)
+++ trunk/Source/WTF/ChangeLog        2014-11-18 23:06:00 UTC (rev 176290)
</span><span class="lines">@@ -1,3 +1,51 @@
</span><ins>+2014-11-18  Geoffrey Garen  &lt;ggaren@apple.com&gt;
+
+        Removed the custom allocator for ListHashSet nodes
+        https://bugs.webkit.org/show_bug.cgi?id=138841
+
+        Reviewed by Andreas Kling.
+
+        bmalloc is fast, so we don't need a custom allocator.
+
+        The MallocBench test for linked list node allocation (list_allocate) is
+        4.09X faster in bmalloc than TCMalloc. Also, I wrote a stress test to
+        add/remove link elements, which modify a ListHashSet on insertion and
+        removal, and it was 1% faster / in the noise with bmalloc enabled.
+
+        * wtf/ListHashSet.h:
+        (WTF::ListHashSetNode::ListHashSetNode):
+        (WTF::ListHashSetTranslator::translate):
+        (WTF::U&gt;::ListHashSet):
+        (WTF::=):
+        (WTF::U&gt;::swap):
+        (WTF::U&gt;::~ListHashSet):
+        (WTF::U&gt;::size):
+        (WTF::U&gt;::capacity):
+        (WTF::U&gt;::isEmpty):
+        (WTF::U&gt;::first):
+        (WTF::U&gt;::removeFirst):
+        (WTF::U&gt;::takeFirst):
+        (WTF::U&gt;::last):
+        (WTF::U&gt;::removeLast):
+        (WTF::U&gt;::takeLast):
+        (WTF::U&gt;::contains):
+        (WTF::U&gt;::remove):
+        (WTF::U&gt;::clear):
+        (WTF::U&gt;::unlink):
+        (WTF::U&gt;::unlinkAndDelete):
+        (WTF::U&gt;::appendNode):
+        (WTF::U&gt;::prependNode):
+        (WTF::U&gt;::insertNodeBefore):
+        (WTF::U&gt;::deleteAllNodes):
+        (WTF::ListHashSetNodeAllocator::ListHashSetNodeAllocator): Deleted.
+        (WTF::ListHashSetNodeAllocator::allocate): Deleted.
+        (WTF::ListHashSetNodeAllocator::deallocate): Deleted.
+        (WTF::ListHashSetNodeAllocator::pool): Deleted.
+        (WTF::ListHashSetNodeAllocator::pastPool): Deleted.
+        (WTF::ListHashSetNodeAllocator::inPool): Deleted.
+        (WTF::ListHashSetNode::operator new): Deleted.
+        (WTF::ListHashSetNode::destroy): Deleted.
+
</ins><span class="cx"> 2014-11-18  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Update the Vector API to deal with unsigned types instead of size_t
</span></span></pre></div>
<a id="trunkSourceWTFwtfListHashSeth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/ListHashSet.h (176289 => 176290)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/ListHashSet.h        2014-11-18 22:57:43 UTC (rev 176289)
+++ trunk/Source/WTF/wtf/ListHashSet.h        2014-11-18 23:06:00 UTC (rev 176290)
</span><span class="lines">@@ -38,22 +38,20 @@
</span><span class="cx"> // guaranteed safe against mutation of the ListHashSet, except for
</span><span class="cx"> // removal of the item currently pointed to by a given iterator.
</span><span class="cx"> 
</span><del>-template&lt;typename Value, size_t inlineCapacity, typename HashFunctions&gt; class ListHashSet;
</del><ins>+template&lt;typename Value, typename HashFunctions&gt; class ListHashSet;
</ins><span class="cx"> 
</span><del>-template&lt;typename ValueArg, size_t inlineCapacity, typename HashArg&gt; class ListHashSetIterator;
-template&lt;typename ValueArg, size_t inlineCapacity, typename HashArg&gt; class ListHashSetConstIterator;
</del><ins>+template&lt;typename ValueArg, typename HashArg&gt; class ListHashSetIterator;
+template&lt;typename ValueArg, typename HashArg&gt; class ListHashSetConstIterator;
</ins><span class="cx"> 
</span><del>-template&lt;typename ValueArg, size_t inlineCapacity&gt; struct ListHashSetNode;
-template&lt;typename ValueArg, size_t inlineCapacity&gt; class ListHashSetNodeAllocator;
</del><ins>+template&lt;typename ValueArg&gt; struct ListHashSetNode;
</ins><span class="cx"> 
</span><span class="cx"> template&lt;typename HashArg&gt; struct ListHashSetNodeHashFunctions;
</span><span class="cx"> template&lt;typename HashArg&gt; struct ListHashSetTranslator;
</span><span class="cx"> 
</span><del>-template&lt;typename ValueArg, size_t inlineCapacity = 256, typename HashArg = typename DefaultHash&lt;ValueArg&gt;::Hash&gt; class ListHashSet {
</del><ins>+template&lt;typename ValueArg, typename HashArg = typename DefaultHash&lt;ValueArg&gt;::Hash&gt; class ListHashSet {
</ins><span class="cx">     WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> private:
</span><del>-    typedef ListHashSetNode&lt;ValueArg, inlineCapacity&gt; Node;
-    typedef ListHashSetNodeAllocator&lt;ValueArg, inlineCapacity&gt; NodeAllocator;
</del><ins>+    typedef ListHashSetNode&lt;ValueArg&gt; Node;
</ins><span class="cx"> 
</span><span class="cx">     typedef HashTraits&lt;Node*&gt; NodeTraits;
</span><span class="cx">     typedef ListHashSetNodeHashFunctions&lt;HashArg&gt; NodeHash;
</span><span class="lines">@@ -64,9 +62,9 @@
</span><span class="cx"> public:
</span><span class="cx">     typedef ValueArg ValueType;
</span><span class="cx"> 
</span><del>-    typedef ListHashSetIterator&lt;ValueType, inlineCapacity, HashArg&gt; iterator;
-    typedef ListHashSetConstIterator&lt;ValueType, inlineCapacity, HashArg&gt; const_iterator;
-    friend class ListHashSetConstIterator&lt;ValueType, inlineCapacity, HashArg&gt;;
</del><ins>+    typedef ListHashSetIterator&lt;ValueType, HashArg&gt; iterator;
+    typedef ListHashSetConstIterator&lt;ValueType, HashArg&gt; const_iterator;
+    friend class ListHashSetConstIterator&lt;ValueType, HashArg&gt;;
</ins><span class="cx"> 
</span><span class="cx">     typedef std::reverse_iterator&lt;iterator&gt; reverse_iterator;
</span><span class="cx">     typedef std::reverse_iterator&lt;const_iterator&gt; const_reverse_iterator;
</span><span class="lines">@@ -155,111 +153,22 @@
</span><span class="cx">     HashTable&lt;Node*, Node*, IdentityExtractor, NodeHash, NodeTraits, NodeTraits&gt; m_impl;
</span><span class="cx">     Node* m_head;
</span><span class="cx">     Node* m_tail;
</span><del>-    std::unique_ptr&lt;NodeAllocator&gt; m_allocator;
</del><span class="cx"> };
</span><span class="cx"> 
</span><del>-template&lt;typename ValueArg, size_t inlineCapacity&gt; class ListHashSetNodeAllocator {
</del><ins>+template&lt;typename ValueArg&gt; struct ListHashSetNode {
</ins><span class="cx">     WTF_MAKE_FAST_ALLOCATED;
</span><del>-
</del><span class="cx"> public:
</span><del>-    typedef ListHashSetNode&lt;ValueArg, inlineCapacity&gt; Node;
-    typedef ListHashSetNodeAllocator&lt;ValueArg, inlineCapacity&gt; NodeAllocator;
-
-    ListHashSetNodeAllocator() 
-        : m_freeList(pool())
-        , m_isDoneWithInitialFreeList(false)
-    { 
-        memset(m_pool.pool, 0, sizeof(m_pool.pool));
-    }
-
-    Node* allocate()
-    { 
-        Node* result = m_freeList;
-
-        if (!result)
-            return static_cast&lt;Node*&gt;(fastMalloc(sizeof(Node)));
-
-        ASSERT(!result-&gt;m_isAllocated);
-
-        Node* next = result-&gt;m_next;
-        ASSERT(!next || !next-&gt;m_isAllocated);
-        if (!next &amp;&amp; !m_isDoneWithInitialFreeList) {
-            next = result + 1;
-            if (next == pastPool()) {
-                m_isDoneWithInitialFreeList = true;
-                next = 0;
-            } else {
-                ASSERT(inPool(next));
-                ASSERT(!next-&gt;m_isAllocated);
-            }
-        }
-        m_freeList = next;
-
-        return result;
-    }
-
-    void deallocate(Node* node) 
-    {
-        if (inPool(node)) {
-#ifndef NDEBUG
-            node-&gt;m_isAllocated = false;
-#endif
-            node-&gt;m_next = m_freeList;
-            m_freeList = node;
-            return;
-        }
-
-        fastFree(node);
-    }
-
-private:
-    Node* pool() { return reinterpret_cast_ptr&lt;Node*&gt;(m_pool.pool); }
-    Node* pastPool() { return pool() + m_poolSize; }
-    bool inPool(Node* node)
-    {
-        return node &gt;= pool() &amp;&amp; node &lt; pastPool();
-    }
-
-    Node* m_freeList;
-    bool m_isDoneWithInitialFreeList;
-    static const size_t m_poolSize = inlineCapacity;
-    union {
-        char pool[sizeof(Node) * m_poolSize];
-        double forAlignment;
-    } m_pool;
-};
-
-template&lt;typename ValueArg, size_t inlineCapacity&gt; struct ListHashSetNode {
-    typedef ListHashSetNodeAllocator&lt;ValueArg, inlineCapacity&gt; NodeAllocator;
-
</del><span class="cx">     template&lt;typename T&gt;
</span><span class="cx">     ListHashSetNode(T&amp;&amp; value)
</span><span class="cx">         : m_value(std::forward&lt;T&gt;(value))
</span><span class="cx">         , m_prev(0)
</span><span class="cx">         , m_next(0)
</span><del>-#ifndef NDEBUG
-        , m_isAllocated(true)
-#endif
</del><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void* operator new(size_t, NodeAllocator* allocator)
-    {
-        return allocator-&gt;allocate();
-    }
-    void destroy(NodeAllocator* allocator)
-    {
-        this-&gt;~ListHashSetNode();
-        allocator-&gt;deallocate(this);
-    }
-
</del><span class="cx">     ValueArg m_value;
</span><span class="cx">     ListHashSetNode* m_prev;
</span><span class="cx">     ListHashSetNode* m_next;
</span><del>-
-#ifndef NDEBUG
-    bool m_isAllocated;
-#endif
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename HashArg&gt; struct ListHashSetNodeHashFunctions {
</span><span class="lines">@@ -268,15 +177,15 @@
</span><span class="cx">     static const bool safeToCompareToEmptyOrDeleted = false;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-template&lt;typename ValueArg, size_t inlineCapacity, typename HashArg&gt; class ListHashSetIterator {
</del><ins>+template&lt;typename ValueArg, typename HashArg&gt; class ListHashSetIterator {
</ins><span class="cx"> private:
</span><del>-    typedef ListHashSet&lt;ValueArg, inlineCapacity, HashArg&gt; ListHashSetType;
-    typedef ListHashSetIterator&lt;ValueArg, inlineCapacity, HashArg&gt; iterator;
-    typedef ListHashSetConstIterator&lt;ValueArg, inlineCapacity, HashArg&gt; const_iterator;
-    typedef ListHashSetNode&lt;ValueArg, inlineCapacity&gt; Node;
</del><ins>+    typedef ListHashSet&lt;ValueArg, HashArg&gt; ListHashSetType;
+    typedef ListHashSetIterator&lt;ValueArg, HashArg&gt; iterator;
+    typedef ListHashSetConstIterator&lt;ValueArg, HashArg&gt; const_iterator;
+    typedef ListHashSetNode&lt;ValueArg&gt; Node;
</ins><span class="cx">     typedef ValueArg ValueType;
</span><span class="cx"> 
</span><del>-    friend class ListHashSet&lt;ValueArg, inlineCapacity, HashArg&gt;;
</del><ins>+    friend class ListHashSet&lt;ValueArg, HashArg&gt;;
</ins><span class="cx"> 
</span><span class="cx">     ListHashSetIterator(const ListHashSetType* set, Node* position) : m_iterator(set, position) { }
</span><span class="cx"> 
</span><span class="lines">@@ -315,16 +224,16 @@
</span><span class="cx">     const_iterator m_iterator;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-template&lt;typename ValueArg, size_t inlineCapacity, typename HashArg&gt; class ListHashSetConstIterator {
</del><ins>+template&lt;typename ValueArg, typename HashArg&gt; class ListHashSetConstIterator {
</ins><span class="cx"> private:
</span><del>-    typedef ListHashSet&lt;ValueArg, inlineCapacity, HashArg&gt; ListHashSetType;
-    typedef ListHashSetIterator&lt;ValueArg, inlineCapacity, HashArg&gt; iterator;
-    typedef ListHashSetConstIterator&lt;ValueArg, inlineCapacity, HashArg&gt; const_iterator;
-    typedef ListHashSetNode&lt;ValueArg, inlineCapacity&gt; Node;
</del><ins>+    typedef ListHashSet&lt;ValueArg, HashArg&gt; ListHashSetType;
+    typedef ListHashSetIterator&lt;ValueArg, HashArg&gt; iterator;
+    typedef ListHashSetConstIterator&lt;ValueArg, HashArg&gt; const_iterator;
+    typedef ListHashSetNode&lt;ValueArg&gt; Node;
</ins><span class="cx">     typedef ValueArg ValueType;
</span><span class="cx"> 
</span><del>-    friend class ListHashSet&lt;ValueArg, inlineCapacity, HashArg&gt;;
-    friend class ListHashSetIterator&lt;ValueArg, inlineCapacity, HashArg&gt;;
</del><ins>+    friend class ListHashSet&lt;ValueArg, HashArg&gt;;
+    friend class ListHashSetIterator&lt;ValueArg, HashArg&gt;;
</ins><span class="cx"> 
</span><span class="cx">     ListHashSetConstIterator(const ListHashSetType* set, Node* position)
</span><span class="cx">         : m_set(set)
</span><span class="lines">@@ -393,86 +302,83 @@
</span><span class="cx"> struct ListHashSetTranslator {
</span><span class="cx">     template&lt;typename T&gt; static unsigned hash(const T&amp; key) { return HashFunctions::hash(key); }
</span><span class="cx">     template&lt;typename T, typename U&gt; static bool equal(const T&amp; a, const U&amp; b) { return HashFunctions::equal(a-&gt;m_value, b); }
</span><del>-    template&lt;typename T, typename U, typename V&gt; static void translate(T*&amp; location, U&amp;&amp; key, const V&amp; allocator)
</del><ins>+    template&lt;typename T, typename U, typename V&gt; static void translate(T*&amp; location, U&amp;&amp; key, V&amp;&amp;)
</ins><span class="cx">     {
</span><del>-        location = new (allocator) T(std::forward&lt;U&gt;(key));
</del><ins>+        location = new T(std::forward&lt;U&gt;(key));
</ins><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline ListHashSet&lt;T, inlineCapacity, U&gt;::ListHashSet()
</del><ins>+template&lt;typename T, typename U&gt;
+inline ListHashSet&lt;T, U&gt;::ListHashSet()
</ins><span class="cx">     : m_head(0)
</span><span class="cx">     , m_tail(0)
</span><del>-    , m_allocator(std::make_unique&lt;NodeAllocator&gt;())
</del><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline ListHashSet&lt;T, inlineCapacity, U&gt;::ListHashSet(const ListHashSet&amp; other)
</del><ins>+template&lt;typename T, typename U&gt;
+inline ListHashSet&lt;T, U&gt;::ListHashSet(const ListHashSet&amp; other)
</ins><span class="cx">     : m_head(0)
</span><span class="cx">     , m_tail(0)
</span><del>-    , m_allocator(std::make_unique&lt;NodeAllocator&gt;())
</del><span class="cx"> {
</span><span class="cx">     for (auto it = other.begin(), end = other.end(); it != end; ++it)
</span><span class="cx">         add(*it);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline ListHashSet&lt;T, inlineCapacity, U&gt;&amp; ListHashSet&lt;T, inlineCapacity, U&gt;::operator=(const ListHashSet&amp; other)
</del><ins>+template&lt;typename T, typename U&gt;
+inline ListHashSet&lt;T, U&gt;&amp; ListHashSet&lt;T, U&gt;::operator=(const ListHashSet&amp; other)
</ins><span class="cx"> {
</span><span class="cx">     ListHashSet tmp(other);
</span><span class="cx">     swap(tmp);
</span><span class="cx">     return *this;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline void ListHashSet&lt;T, inlineCapacity, U&gt;::swap(ListHashSet&amp; other)
</del><ins>+template&lt;typename T, typename U&gt;
+inline void ListHashSet&lt;T, U&gt;::swap(ListHashSet&amp; other)
</ins><span class="cx"> {
</span><span class="cx">     m_impl.swap(other.m_impl);
</span><span class="cx">     std::swap(m_head, other.m_head);
</span><span class="cx">     std::swap(m_tail, other.m_tail);
</span><del>-    m_allocator.swap(other.m_allocator);
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline ListHashSet&lt;T, inlineCapacity, U&gt;::~ListHashSet()
</del><ins>+template&lt;typename T, typename U&gt;
+inline ListHashSet&lt;T, U&gt;::~ListHashSet()
</ins><span class="cx"> {
</span><span class="cx">     deleteAllNodes();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline int ListHashSet&lt;T, inlineCapacity, U&gt;::size() const
</del><ins>+template&lt;typename T, typename U&gt;
+inline int ListHashSet&lt;T, U&gt;::size() const
</ins><span class="cx"> {
</span><span class="cx">     return m_impl.size(); 
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline int ListHashSet&lt;T, inlineCapacity, U&gt;::capacity() const
</del><ins>+template&lt;typename T, typename U&gt;
+inline int ListHashSet&lt;T, U&gt;::capacity() const
</ins><span class="cx"> {
</span><span class="cx">     return m_impl.capacity(); 
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline bool ListHashSet&lt;T, inlineCapacity, U&gt;::isEmpty() const
</del><ins>+template&lt;typename T, typename U&gt;
+inline bool ListHashSet&lt;T, U&gt;::isEmpty() const
</ins><span class="cx"> {
</span><span class="cx">     return m_impl.isEmpty(); 
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline T&amp; ListHashSet&lt;T, inlineCapacity, U&gt;::first()
</del><ins>+template&lt;typename T, typename U&gt;
+inline T&amp; ListHashSet&lt;T, U&gt;::first()
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!isEmpty());
</span><span class="cx">     return m_head-&gt;m_value;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline void ListHashSet&lt;T, inlineCapacity, U&gt;::removeFirst()
</del><ins>+template&lt;typename T, typename U&gt;
+inline void ListHashSet&lt;T, U&gt;::removeFirst()
</ins><span class="cx"> {
</span><span class="cx">     takeFirst();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline T ListHashSet&lt;T, inlineCapacity, U&gt;::takeFirst()
</del><ins>+template&lt;typename T, typename U&gt;
+inline T ListHashSet&lt;T, U&gt;::takeFirst()
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!isEmpty());
</span><span class="cx">     auto it = m_impl.find(m_head);
</span><span class="lines">@@ -484,35 +390,35 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline const T&amp; ListHashSet&lt;T, inlineCapacity, U&gt;::first() const
</del><ins>+template&lt;typename T, typename U&gt;
+inline const T&amp; ListHashSet&lt;T, U&gt;::first() const
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!isEmpty());
</span><span class="cx">     return m_head-&gt;m_value;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline T&amp; ListHashSet&lt;T, inlineCapacity, U&gt;::last()
</del><ins>+template&lt;typename T, typename U&gt;
+inline T&amp; ListHashSet&lt;T, U&gt;::last()
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!isEmpty());
</span><span class="cx">     return m_tail-&gt;m_value;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline const T&amp; ListHashSet&lt;T, inlineCapacity, U&gt;::last() const
</del><ins>+template&lt;typename T, typename U&gt;
+inline const T&amp; ListHashSet&lt;T, U&gt;::last() const
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!isEmpty());
</span><span class="cx">     return m_tail-&gt;m_value;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline void ListHashSet&lt;T, inlineCapacity, U&gt;::removeLast()
</del><ins>+template&lt;typename T, typename U&gt;
+inline void ListHashSet&lt;T, U&gt;::removeLast()
</ins><span class="cx"> {
</span><span class="cx">     takeLast();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline T ListHashSet&lt;T, inlineCapacity, U&gt;::takeLast()
</del><ins>+template&lt;typename T, typename U&gt;
+inline T ListHashSet&lt;T, U&gt;::takeLast()
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!isEmpty());
</span><span class="cx">     auto it = m_impl.find(m_tail);
</span><span class="lines">@@ -524,8 +430,8 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline auto ListHashSet&lt;T, inlineCapacity, U&gt;::find(const ValueType&amp; value) -&gt; iterator
</del><ins>+template&lt;typename T, typename U&gt;
+inline auto ListHashSet&lt;T, U&gt;::find(const ValueType&amp; value) -&gt; iterator
</ins><span class="cx"> {
</span><span class="cx">     auto it = m_impl.template find&lt;BaseTranslator&gt;(value);
</span><span class="cx">     if (it == m_impl.end())
</span><span class="lines">@@ -533,8 +439,8 @@
</span><span class="cx">     return makeIterator(*it); 
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline auto ListHashSet&lt;T, inlineCapacity, U&gt;::find(const ValueType&amp; value) const -&gt; const_iterator
</del><ins>+template&lt;typename T, typename U&gt;
+inline auto ListHashSet&lt;T, U&gt;::find(const ValueType&amp; value) const -&gt; const_iterator
</ins><span class="cx"> {
</span><span class="cx">     auto it = m_impl.template find&lt;BaseTranslator&gt;(value);
</span><span class="cx">     if (it == m_impl.end())
</span><span class="lines">@@ -548,9 +454,9 @@
</span><span class="cx">     template&lt;typename T, typename U&gt; static bool equal(const T&amp; a, const U&amp; b) { return Translator::equal(a-&gt;m_value, b); }
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-template&lt;typename ValueType, size_t inlineCapacity, typename U&gt;
</del><ins>+template&lt;typename ValueType, typename U&gt;
</ins><span class="cx"> template&lt;typename T, typename HashTranslator&gt;
</span><del>-inline auto ListHashSet&lt;ValueType, inlineCapacity, U&gt;::find(const T&amp; value) -&gt; iterator
</del><ins>+inline auto ListHashSet&lt;ValueType, U&gt;::find(const T&amp; value) -&gt; iterator
</ins><span class="cx"> {
</span><span class="cx">     auto it = m_impl.template find&lt;ListHashSetTranslatorAdapter&lt;HashTranslator&gt;&gt;(value);
</span><span class="cx">     if (it == m_impl.end())
</span><span class="lines">@@ -558,9 +464,9 @@
</span><span class="cx">     return makeIterator(*it);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename ValueType, size_t inlineCapacity, typename U&gt;
</del><ins>+template&lt;typename ValueType, typename U&gt;
</ins><span class="cx"> template&lt;typename T, typename HashTranslator&gt;
</span><del>-inline auto ListHashSet&lt;ValueType, inlineCapacity, U&gt;::find(const T&amp; value) const -&gt; const_iterator
</del><ins>+inline auto ListHashSet&lt;ValueType, U&gt;::find(const T&amp; value) const -&gt; const_iterator
</ins><span class="cx"> {
</span><span class="cx">     auto it = m_impl.template find&lt;ListHashSetTranslatorAdapter&lt;HashTranslator&gt;&gt;(value);
</span><span class="cx">     if (it == m_impl.end())
</span><span class="lines">@@ -568,41 +474,41 @@
</span><span class="cx">     return makeConstIterator(*it);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename ValueType, size_t inlineCapacity, typename U&gt;
</del><ins>+template&lt;typename ValueType, typename U&gt;
</ins><span class="cx"> template&lt;typename T, typename HashTranslator&gt;
</span><del>-inline bool ListHashSet&lt;ValueType, inlineCapacity, U&gt;::contains(const T&amp; value) const
</del><ins>+inline bool ListHashSet&lt;ValueType, U&gt;::contains(const T&amp; value) const
</ins><span class="cx"> {
</span><span class="cx">     return m_impl.template contains&lt;ListHashSetTranslatorAdapter&lt;HashTranslator&gt;&gt;(value);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline bool ListHashSet&lt;T, inlineCapacity, U&gt;::contains(const ValueType&amp; value) const
</del><ins>+template&lt;typename T, typename U&gt;
+inline bool ListHashSet&lt;T, U&gt;::contains(const ValueType&amp; value) const
</ins><span class="cx"> {
</span><span class="cx">     return m_impl.template contains&lt;BaseTranslator&gt;(value);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-auto ListHashSet&lt;T, inlineCapacity, U&gt;::add(const ValueType&amp; value) -&gt; AddResult
</del><ins>+template&lt;typename T, typename U&gt;
+auto ListHashSet&lt;T, U&gt;::add(const ValueType&amp; value) -&gt; AddResult
</ins><span class="cx"> {
</span><del>-    auto result = m_impl.template add&lt;BaseTranslator&gt;(value, m_allocator.get());
</del><ins>+    auto result = m_impl.template add&lt;BaseTranslator&gt;(value, nullptr);
</ins><span class="cx">     if (result.isNewEntry)
</span><span class="cx">         appendNode(*result.iterator);
</span><span class="cx">     return AddResult(makeIterator(*result.iterator), result.isNewEntry);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-auto ListHashSet&lt;T, inlineCapacity, U&gt;::add(ValueType&amp;&amp; value) -&gt; AddResult
</del><ins>+template&lt;typename T, typename U&gt;
+auto ListHashSet&lt;T, U&gt;::add(ValueType&amp;&amp; value) -&gt; AddResult
</ins><span class="cx"> {
</span><del>-    auto result = m_impl.template add&lt;BaseTranslator&gt;(WTF::move(value), m_allocator.get());
</del><ins>+    auto result = m_impl.template add&lt;BaseTranslator&gt;(WTF::move(value), nullptr);
</ins><span class="cx">     if (result.isNewEntry)
</span><span class="cx">         appendNode(*result.iterator);
</span><span class="cx">     return AddResult(makeIterator(*result.iterator), result.isNewEntry);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-auto ListHashSet&lt;T, inlineCapacity, U&gt;::appendOrMoveToLast(const ValueType&amp; value) -&gt; AddResult
</del><ins>+template&lt;typename T, typename U&gt;
+auto ListHashSet&lt;T, U&gt;::appendOrMoveToLast(const ValueType&amp; value) -&gt; AddResult
</ins><span class="cx"> {
</span><del>-    auto result = m_impl.template add&lt;BaseTranslator&gt;(value, m_allocator.get());
</del><ins>+    auto result = m_impl.template add&lt;BaseTranslator&gt;(value, nullptr);
</ins><span class="cx">     Node* node = *result.iterator;
</span><span class="cx">     if (!result.isNewEntry)
</span><span class="cx">         unlink(node);
</span><span class="lines">@@ -611,10 +517,10 @@
</span><span class="cx">     return AddResult(makeIterator(*result.iterator), result.isNewEntry);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-auto ListHashSet&lt;T, inlineCapacity, U&gt;::appendOrMoveToLast(ValueType&amp;&amp; value) -&gt; AddResult
</del><ins>+template&lt;typename T, typename U&gt;
+auto ListHashSet&lt;T, U&gt;::appendOrMoveToLast(ValueType&amp;&amp; value) -&gt; AddResult
</ins><span class="cx"> {
</span><del>-    auto result = m_impl.template add&lt;BaseTranslator&gt;(WTF::move(value), m_allocator.get());
</del><ins>+    auto result = m_impl.template add&lt;BaseTranslator&gt;(WTF::move(value), nullptr);
</ins><span class="cx">     Node* node = *result.iterator;
</span><span class="cx">     if (!result.isNewEntry)
</span><span class="cx">         unlink(node);
</span><span class="lines">@@ -623,10 +529,10 @@
</span><span class="cx">     return AddResult(makeIterator(*result.iterator), result.isNewEntry);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-auto ListHashSet&lt;T, inlineCapacity, U&gt;::prependOrMoveToFirst(const ValueType&amp; value) -&gt; AddResult
</del><ins>+template&lt;typename T, typename U&gt;
+auto ListHashSet&lt;T, U&gt;::prependOrMoveToFirst(const ValueType&amp; value) -&gt; AddResult
</ins><span class="cx"> {
</span><del>-    auto result = m_impl.template add&lt;BaseTranslator&gt;(value, m_allocator.get());
</del><ins>+    auto result = m_impl.template add&lt;BaseTranslator&gt;(value, nullptr);
</ins><span class="cx">     Node* node = *result.iterator;
</span><span class="cx">     if (!result.isNewEntry)
</span><span class="cx">         unlink(node);
</span><span class="lines">@@ -635,10 +541,10 @@
</span><span class="cx">     return AddResult(makeIterator(*result.iterator), result.isNewEntry);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-auto ListHashSet&lt;T, inlineCapacity, U&gt;::prependOrMoveToFirst(ValueType&amp;&amp; value) -&gt; AddResult
</del><ins>+template&lt;typename T, typename U&gt;
+auto ListHashSet&lt;T, U&gt;::prependOrMoveToFirst(ValueType&amp;&amp; value) -&gt; AddResult
</ins><span class="cx"> {
</span><del>-    auto result = m_impl.template add&lt;BaseTranslator&gt;(WTF::move(value), m_allocator.get());
</del><ins>+    auto result = m_impl.template add&lt;BaseTranslator&gt;(WTF::move(value), nullptr);
</ins><span class="cx">     Node* node = *result.iterator;
</span><span class="cx">     if (!result.isNewEntry)
</span><span class="cx">         unlink(node);
</span><span class="lines">@@ -647,38 +553,38 @@
</span><span class="cx">     return AddResult(makeIterator(*result.iterator), result.isNewEntry);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-auto ListHashSet&lt;T, inlineCapacity, U&gt;::insertBefore(const ValueType&amp; beforeValue, const ValueType&amp; newValue) -&gt; AddResult
</del><ins>+template&lt;typename T, typename U&gt;
+auto ListHashSet&lt;T, U&gt;::insertBefore(const ValueType&amp; beforeValue, const ValueType&amp; newValue) -&gt; AddResult
</ins><span class="cx"> {
</span><span class="cx">     return insertBefore(find(beforeValue), newValue);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-auto ListHashSet&lt;T, inlineCapacity, U&gt;::insertBefore(const ValueType&amp; beforeValue, ValueType&amp;&amp; newValue) -&gt; AddResult
</del><ins>+template&lt;typename T, typename U&gt;
+auto ListHashSet&lt;T, U&gt;::insertBefore(const ValueType&amp; beforeValue, ValueType&amp;&amp; newValue) -&gt; AddResult
</ins><span class="cx"> {
</span><span class="cx">     return insertBefore(find(beforeValue), WTF::move(newValue));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-auto ListHashSet&lt;T, inlineCapacity, U&gt;::insertBefore(iterator it, const ValueType&amp; newValue) -&gt; AddResult
</del><ins>+template&lt;typename T, typename U&gt;
+auto ListHashSet&lt;T, U&gt;::insertBefore(iterator it, const ValueType&amp; newValue) -&gt; AddResult
</ins><span class="cx"> {
</span><del>-    auto result = m_impl.template add&lt;BaseTranslator&gt;(newValue, m_allocator.get());
</del><ins>+    auto result = m_impl.template add&lt;BaseTranslator&gt;(newValue, nullptr);
</ins><span class="cx">     if (result.isNewEntry)
</span><span class="cx">         insertNodeBefore(it.node(), *result.iterator);
</span><span class="cx">     return AddResult(makeIterator(*result.iterator), result.isNewEntry);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-auto ListHashSet&lt;T, inlineCapacity, U&gt;::insertBefore(iterator it, ValueType&amp;&amp; newValue) -&gt; AddResult
</del><ins>+template&lt;typename T, typename U&gt;
+auto ListHashSet&lt;T, U&gt;::insertBefore(iterator it, ValueType&amp;&amp; newValue) -&gt; AddResult
</ins><span class="cx"> {
</span><del>-    auto result = m_impl.template add&lt;BaseTranslator&gt;(WTF::move(newValue), m_allocator.get());
</del><ins>+    auto result = m_impl.template add&lt;BaseTranslator&gt;(WTF::move(newValue), nullptr);
</ins><span class="cx">     if (result.isNewEntry)
</span><span class="cx">         insertNodeBefore(it.node(), *result.iterator);
</span><span class="cx">     return AddResult(makeIterator(*result.iterator), result.isNewEntry);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline bool ListHashSet&lt;T, inlineCapacity, U&gt;::remove(iterator it)
</del><ins>+template&lt;typename T, typename U&gt;
+inline bool ListHashSet&lt;T, U&gt;::remove(iterator it)
</ins><span class="cx"> {
</span><span class="cx">     if (it == end())
</span><span class="cx">         return false;
</span><span class="lines">@@ -687,14 +593,14 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline bool ListHashSet&lt;T, inlineCapacity, U&gt;::remove(const ValueType&amp; value)
</del><ins>+template&lt;typename T, typename U&gt;
+inline bool ListHashSet&lt;T, U&gt;::remove(const ValueType&amp; value)
</ins><span class="cx"> {
</span><span class="cx">     return remove(find(value));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline void ListHashSet&lt;T, inlineCapacity, U&gt;::clear()
</del><ins>+template&lt;typename T, typename U&gt;
+inline void ListHashSet&lt;T, U&gt;::clear()
</ins><span class="cx"> {
</span><span class="cx">     deleteAllNodes();
</span><span class="cx">     m_impl.clear(); 
</span><span class="lines">@@ -702,8 +608,8 @@
</span><span class="cx">     m_tail = 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-void ListHashSet&lt;T, inlineCapacity, U&gt;::unlink(Node* node)
</del><ins>+template&lt;typename T, typename U&gt;
+void ListHashSet&lt;T, U&gt;::unlink(Node* node)
</ins><span class="cx"> {
</span><span class="cx">     if (!node-&gt;m_prev) {
</span><span class="cx">         ASSERT(node == m_head);
</span><span class="lines">@@ -722,15 +628,15 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-void ListHashSet&lt;T, inlineCapacity, U&gt;::unlinkAndDelete(Node* node)
</del><ins>+template&lt;typename T, typename U&gt;
+void ListHashSet&lt;T, U&gt;::unlinkAndDelete(Node* node)
</ins><span class="cx"> {
</span><span class="cx">     unlink(node);
</span><del>-    node-&gt;destroy(m_allocator.get());
</del><ins>+    delete node;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-void ListHashSet&lt;T, inlineCapacity, U&gt;::appendNode(Node* node)
</del><ins>+template&lt;typename T, typename U&gt;
+void ListHashSet&lt;T, U&gt;::appendNode(Node* node)
</ins><span class="cx"> {
</span><span class="cx">     node-&gt;m_prev = m_tail;
</span><span class="cx">     node-&gt;m_next = 0;
</span><span class="lines">@@ -746,8 +652,8 @@
</span><span class="cx">     m_tail = node;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-void ListHashSet&lt;T, inlineCapacity, U&gt;::prependNode(Node* node)
</del><ins>+template&lt;typename T, typename U&gt;
+void ListHashSet&lt;T, U&gt;::prependNode(Node* node)
</ins><span class="cx"> {
</span><span class="cx">     node-&gt;m_prev = 0;
</span><span class="cx">     node-&gt;m_next = m_head;
</span><span class="lines">@@ -760,8 +666,8 @@
</span><span class="cx">     m_head = node;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-void ListHashSet&lt;T, inlineCapacity, U&gt;::insertNodeBefore(Node* beforeNode, Node* newNode)
</del><ins>+template&lt;typename T, typename U&gt;
+void ListHashSet&lt;T, U&gt;::insertNodeBefore(Node* beforeNode, Node* newNode)
</ins><span class="cx"> {
</span><span class="cx">     if (!beforeNode)
</span><span class="cx">         return appendNode(newNode);
</span><span class="lines">@@ -776,24 +682,24 @@
</span><span class="cx">         m_head = newNode;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-void ListHashSet&lt;T, inlineCapacity, U&gt;::deleteAllNodes()
</del><ins>+template&lt;typename T, typename U&gt;
+void ListHashSet&lt;T, U&gt;::deleteAllNodes()
</ins><span class="cx"> {
</span><span class="cx">     if (!m_head)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     for (Node* node = m_head, *next = m_head-&gt;m_next; node; node = next, next = node ? node-&gt;m_next : 0)
</span><del>-        node-&gt;destroy(m_allocator.get());
</del><ins>+        delete node;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline auto ListHashSet&lt;T, inlineCapacity, U&gt;::makeIterator(Node* position) -&gt; iterator
</del><ins>+template&lt;typename T, typename U&gt;
+inline auto ListHashSet&lt;T, U&gt;::makeIterator(Node* position) -&gt; iterator
</ins><span class="cx"> {
</span><span class="cx">     return iterator(this, position);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T, size_t inlineCapacity, typename U&gt;
-inline auto ListHashSet&lt;T, inlineCapacity, U&gt;::makeConstIterator(Node* position) const -&gt; const_iterator
</del><ins>+template&lt;typename T, typename U&gt;
+inline auto ListHashSet&lt;T, U&gt;::makeConstIterator(Node* position) const -&gt; const_iterator
</ins><span class="cx"> { 
</span><span class="cx">     return const_iterator(this, position);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (176289 => 176290)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-11-18 22:57:43 UTC (rev 176289)
+++ trunk/Source/WebCore/ChangeLog        2014-11-18 23:06:00 UTC (rev 176290)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2014-11-18  Geoffrey Garen  &lt;ggaren@apple.com&gt;
+
+        Removed the custom allocator for ListHashSet nodes
+        https://bugs.webkit.org/show_bug.cgi?id=138841
+
+        Reviewed by Andreas Kling.
+
+        Uses of ListHashSet no longer need to declare an inline capacity,
+        since that was only used to specify the capacity of the custom allocator.
+
+        * dom/DOMNamedFlowCollection.h:
+        * dom/DocumentEventQueue.h:
+        * dom/DocumentStyleSheetCollection.h:
+        * dom/NamedFlowCollection.h:
+        * html/FormController.h:
+        * rendering/FloatingObjects.h:
+        * rendering/RenderBlock.h:
+
</ins><span class="cx"> 2014-11-18  David Hyatt  &lt;hyatt@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION(r152313): Inline-block element doesn't wrap properly
</span></span></pre></div>
<a id="trunkSourceWebCoredomDOMNamedFlowCollectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/DOMNamedFlowCollection.h (176289 => 176290)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/DOMNamedFlowCollection.h        2014-11-18 22:57:43 UTC (rev 176289)
+++ trunk/Source/WebCore/dom/DOMNamedFlowCollection.h        2014-11-18 23:06:00 UTC (rev 176290)
</span><span class="lines">@@ -57,7 +57,7 @@
</span><span class="cx">     struct DOMNamedFlowHashFunctions;
</span><span class="cx">     struct DOMNamedFlowHashTranslator;
</span><span class="cx"> 
</span><del>-    typedef ListHashSet&lt;RefPtr&lt;WebKitNamedFlow&gt;, 1, DOMNamedFlowHashFunctions&gt; DOMNamedFlowSet;
</del><ins>+    typedef ListHashSet&lt;RefPtr&lt;WebKitNamedFlow&gt;, DOMNamedFlowHashFunctions&gt; DOMNamedFlowSet;
</ins><span class="cx">     explicit DOMNamedFlowCollection(const Vector&lt;WebKitNamedFlow*&gt;&amp;);
</span><span class="cx">     DOMNamedFlowSet m_namedFlows;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentEventQueueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/DocumentEventQueue.h (176289 => 176290)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/DocumentEventQueue.h        2014-11-18 22:57:43 UTC (rev 176289)
+++ trunk/Source/WebCore/dom/DocumentEventQueue.h        2014-11-18 23:06:00 UTC (rev 176290)
</span><span class="lines">@@ -58,7 +58,7 @@
</span><span class="cx"> 
</span><span class="cx">     Document&amp; m_document;
</span><span class="cx">     std::unique_ptr&lt;Timer&gt; m_pendingEventTimer;
</span><del>-    ListHashSet&lt;RefPtr&lt;Event&gt;, 16&gt; m_queuedEvents;
</del><ins>+    ListHashSet&lt;RefPtr&lt;Event&gt;&gt; m_queuedEvents;
</ins><span class="cx">     HashSet&lt;Node*&gt; m_nodesWithQueuedScrollEvents;
</span><span class="cx">     bool m_isClosed;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentStyleSheetCollectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/DocumentStyleSheetCollection.h (176289 => 176290)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/DocumentStyleSheetCollection.h        2014-11-18 22:57:43 UTC (rev 176289)
+++ trunk/Source/WebCore/dom/DocumentStyleSheetCollection.h        2014-11-18 23:06:00 UTC (rev 176290)
</span><span class="lines">@@ -152,7 +152,7 @@
</span><span class="cx">     bool m_hadActiveLoadingStylesheet;
</span><span class="cx">     UpdateFlag m_pendingUpdateType;
</span><span class="cx"> 
</span><del>-    typedef ListHashSet&lt;Node*, 32&gt; StyleSheetCandidateListHashSet;
</del><ins>+    typedef ListHashSet&lt;Node*&gt; StyleSheetCandidateListHashSet;
</ins><span class="cx">     StyleSheetCandidateListHashSet m_styleSheetCandidateNodes;
</span><span class="cx"> 
</span><span class="cx">     String m_preferredStylesheetSetName;
</span></span></pre></div>
<a id="trunkSourceWebCoredomNamedFlowCollectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/NamedFlowCollection.h (176289 => 176290)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/NamedFlowCollection.h        2014-11-18 22:57:43 UTC (rev 176289)
+++ trunk/Source/WebCore/dom/NamedFlowCollection.h        2014-11-18 23:06:00 UTC (rev 176290)
</span><span class="lines">@@ -63,7 +63,7 @@
</span><span class="cx">     struct NamedFlowHashFunctions;
</span><span class="cx">     struct NamedFlowHashTranslator;
</span><span class="cx"> 
</span><del>-    typedef ListHashSet&lt;WebKitNamedFlow*, 1, NamedFlowHashFunctions&gt; NamedFlowSet;
</del><ins>+    typedef ListHashSet&lt;WebKitNamedFlow*, NamedFlowHashFunctions&gt; NamedFlowSet;
</ins><span class="cx"> 
</span><span class="cx">     explicit NamedFlowCollection(Document*);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlFormControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/FormController.h (176289 => 176290)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/FormController.h        2014-11-18 22:57:43 UTC (rev 176289)
+++ trunk/Source/WebCore/html/FormController.h        2014-11-18 23:06:00 UTC (rev 176290)
</span><span class="lines">@@ -95,7 +95,7 @@
</span><span class="cx">     WEBCORE_EXPORT static Vector&lt;String&gt; getReferencedFilePaths(const Vector&lt;String&gt;&amp; stateVector);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    typedef ListHashSet&lt;RefPtr&lt;HTMLFormControlElementWithState&gt;, 64&gt; FormElementListHashSet;
</del><ins>+    typedef ListHashSet&lt;RefPtr&lt;HTMLFormControlElementWithState&gt;&gt; FormElementListHashSet;
</ins><span class="cx">     typedef HashMap&lt;RefPtr&lt;AtomicStringImpl&gt;, std::unique_ptr&lt;SavedFormState&gt;&gt; SavedFormStateMap;
</span><span class="cx"> 
</span><span class="cx">     static std::unique_ptr&lt;SavedFormStateMap&gt; createSavedFormStateMap(const FormElementListHashSet&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingFloatingObjectsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/FloatingObjects.h (176289 => 176290)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/FloatingObjects.h        2014-11-18 22:57:43 UTC (rev 176289)
+++ trunk/Source/WebCore/rendering/FloatingObjects.h        2014-11-18 23:06:00 UTC (rev 176290)
</span><span class="lines">@@ -111,7 +111,7 @@
</span><span class="cx">     static bool equal(const std::unique_ptr&lt;FloatingObject&gt;&amp; a, const FloatingObject&amp; b) { return &amp;a-&gt;renderer() == &amp;b.renderer(); }
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-typedef ListHashSet&lt;std::unique_ptr&lt;FloatingObject&gt;, 4, FloatingObjectHashFunctions&gt; FloatingObjectSet;
</del><ins>+typedef ListHashSet&lt;std::unique_ptr&lt;FloatingObject&gt;, FloatingObjectHashFunctions&gt; FloatingObjectSet;
</ins><span class="cx"> 
</span><span class="cx"> typedef PODInterval&lt;LayoutUnit, FloatingObject*&gt; FloatingObjectInterval;
</span><span class="cx"> typedef PODIntervalTree&lt;LayoutUnit, FloatingObject*&gt; FloatingObjectTree;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBlockh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBlock.h (176289 => 176290)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBlock.h        2014-11-18 22:57:43 UTC (rev 176289)
+++ trunk/Source/WebCore/rendering/RenderBlock.h        2014-11-18 23:06:00 UTC (rev 176290)
</span><span class="lines">@@ -40,7 +40,7 @@
</span><span class="cx"> struct BidiRun;
</span><span class="cx"> struct PaintInfo;
</span><span class="cx"> 
</span><del>-typedef WTF::ListHashSet&lt;RenderBox*, 16&gt; TrackedRendererListHashSet;
</del><ins>+typedef WTF::ListHashSet&lt;RenderBox*&gt; TrackedRendererListHashSet;
</ins><span class="cx"> typedef WTF::HashMap&lt;const RenderBlock*, std::unique_ptr&lt;TrackedRendererListHashSet&gt;&gt; TrackedDescendantsMap;
</span><span class="cx"> typedef WTF::HashMap&lt;const RenderBox*, std::unique_ptr&lt;HashSet&lt;RenderBlock*&gt;&gt;&gt; TrackedContainerMap;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKitWebKitvcxprojWebKitExportGeneratorWebKitExportsdefin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in (176289 => 176290)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in        2014-11-18 22:57:43 UTC (rev 176289)
+++ trunk/Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in        2014-11-18 23:06:00 UTC (rev 176290)
</span><span class="lines">@@ -259,7 +259,7 @@
</span><span class="cx">         symbolWithPointer(?pageNumberForElement@PrintContext@WebCore@@SAHPAVElement@2@ABVFloatSize@2@@Z, ?pageNumberForElement@PrintContext@WebCore@@SAHPEAVElement@2@AEBVFloatSize@2@@Z)
</span><span class="cx">         symbolWithPointer(?paintControlTints@FrameView@WebCore@@AAEXXZ, ?paintControlTints@FrameView@WebCore@@AEAAXXZ)
</span><span class="cx">         symbolWithPointer(?rangeFromLocationAndLength@TextIterator@WebCore@@SA?AV?$PassRefPtr@VRange@WebCore@@@WTF@@PAVContainerNode@2@HH_N@Z, ?rangeFromLocationAndLength@TextIterator@WebCore@@SA?AV?$PassRefPtr@VRange@WebCore@@@WTF@@PEAVContainerNode@2@HH_N@Z)
</span><del>-        symbolWithPointer(?rectBasedTestResult@HitTestResult@WebCore@@QBEABV?$ListHashSet@V?$RefPtr@VNode@WebCore@@@WTF@@$0BAA@U?$PtrHash@V?$RefPtr@VNode@WebCore@@@WTF@@@2@@WTF@@XZ, ?rectBasedTestResult@HitTestResult@WebCore@@QEBAAEBV?$ListHashSet@V?$RefPtr@VNode@WebCore@@@WTF@@$0BAA@U?$PtrHash@V?$RefPtr@VNode@WebCore@@@WTF@@@2@@WTF@@XZ)
</del><ins>+        symbolWithPointer(?rectBasedTestResult@HitTestResult@WebCore@@QBEABV?$ListHashSet@V?$RefPtr@VNode@WebCore@@@WTF@@U?$PtrHash@V?$RefPtr@VNode@WebCore@@@WTF@@@2@@WTF@@XZ, )
</ins><span class="cx">         symbolWithPointer(?rectForPoint@HitTestLocation@WebCore@@SA?AVIntRect@2@ABVLayoutPoint@2@IIII@Z, ?rectForPoint@HitTestLocation@WebCore@@SA?AVIntRect@2@AEBVLayoutPoint@2@IIII@Z)
</span><span class="cx">         symbolWithPointer(?reload@FrameLoader@WebCore@@QAEX_N@Z, ?reload@FrameLoader@WebCore@@QEAAX_N@Z)
</span><span class="cx">         symbolWithPointer(?remove@String@WTF@@QAEXIH@Z, ?remove@String@WTF@@QEAAXIH@Z)
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (176289 => 176290)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-11-18 22:57:43 UTC (rev 176289)
+++ trunk/Source/WebKit2/ChangeLog        2014-11-18 23:06:00 UTC (rev 176290)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2014-11-18  Geoffrey Garen  &lt;ggaren@apple.com&gt;
+
+        Removed the custom allocator for ListHashSet nodes
+        https://bugs.webkit.org/show_bug.cgi?id=138841
+
+        Reviewed by Andreas Kling.
+
+        Uses of ListHashSet no longer need to declare an inline capacity,
+        since that was only used to specify the capacity of the custom allocator.
+
+        * UIProcess/Plugins/PluginInfoStore.cpp:
+        (WebKit::PluginInfoStore::loadPluginsIfNecessary):
+
</ins><span class="cx"> 2014-11-18  Eric Carlson  &lt;eric.carlson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed build fix after r176283.
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessPluginsPluginInfoStorecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp (176289 => 176290)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp        2014-11-18 22:57:43 UTC (rev 176289)
+++ trunk/Source/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp        2014-11-18 23:06:00 UTC (rev 176290)
</span><span class="lines">@@ -68,7 +68,7 @@
</span><span class="cx">     if (m_pluginListIsUpToDate)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    ListHashSet&lt;String, 32&gt; uniquePluginPaths;
</del><ins>+    ListHashSet&lt;String&gt; uniquePluginPaths;
</ins><span class="cx"> 
</span><span class="cx">     // First, load plug-ins from the additional plug-ins directories specified.
</span><span class="cx">     for (size_t i = 0; i &lt; m_additionalPluginsDirectories.size(); ++i)
</span></span></pre>
</div>
</div>

</body>
</html>