<!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>[188557] 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/188557">188557</a></dd>
<dt>Author</dt> <dd>mmaxfield@apple.com</dd>
<dt>Date</dt> <dd>2015-08-17 16:59:05 -0700 (Mon, 17 Aug 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Implement IntegerHasher
https://bugs.webkit.org/show_bug.cgi?id=147866

Reviewed by Darin Adler and Anders Carlsson.

Source/WebCore:

Rename StringHasher.h to Hasher.

No new tests because there is no behavior difference.

* contentextensions/DFAMinimizer.cpp: Use new #include.
* contentextensions/HashableActionList.h: Ditto.
* platform/graphics/FontFeatureSettings.cpp:
(WebCore::FontFeatureSettings::hash): Use new IntegerHasher class.
(WebCore::FontFeature::hash): Deleted.
* platform/graphics/FontFeatureSettings.h: Remove unnecessary function.
* platform/graphics/Gradient.cpp: Use new #include.
* platform/graphics/WidthCache.h: Ditto.

Source/WebInspectorUI:

Update comment.

* UserInterface/Base/Utilities.js:

Source/WebKit2:

Use new #include.

* DatabaseProcess/IndexedDB/IDBIdentifier.h:
* Platform/IPC/StringReference.cpp:

Source/WTF:

Rename StringHasher.h to Hasher.h, and include an IntegerHasher class.

* WTF.vcxproj/WTF.vcxproj: Update to target new file.
* WTF.vcxproj/WTF.vcxproj.filters: Ditto.
* WTF.xcodeproj/project.pbxproj: Ditto.
* wtf/CMakeLists.txt: Ditto.
* wtf/Hasher.h: Renamed from Source/WTF/wtf/StringHasher.h.
* wtf/text/CString.cpp: Use new #include
* wtf/text/StringHash.h: Ditto.
* wtf/text/StringImpl.h: Ditto.
* wtf/unicode/UTF8.cpp: Ditto.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFWTFvcxprojWTFvcxproj">trunk/Source/WTF/WTF.vcxproj/WTF.vcxproj</a></li>
<li><a href="#trunkSourceWTFWTFvcxprojWTFvcxprojfilters">trunk/Source/WTF/WTF.vcxproj/WTF.vcxproj.filters</a></li>
<li><a href="#trunkSourceWTFWTFxcodeprojprojectpbxproj">trunk/Source/WTF/WTF.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWTFwtfCMakeListstxt">trunk/Source/WTF/wtf/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWTFwtftextCStringcpp">trunk/Source/WTF/wtf/text/CString.cpp</a></li>
<li><a href="#trunkSourceWTFwtftextStringHashh">trunk/Source/WTF/wtf/text/StringHash.h</a></li>
<li><a href="#trunkSourceWTFwtftextStringImplh">trunk/Source/WTF/wtf/text/StringImpl.h</a></li>
<li><a href="#trunkSourceWTFwtfunicodeUTF8cpp">trunk/Source/WTF/wtf/unicode/UTF8.cpp</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecontentextensionsDFAMinimizercpp">trunk/Source/WebCore/contentextensions/DFAMinimizer.cpp</a></li>
<li><a href="#trunkSourceWebCorecontentextensionsHashableActionListh">trunk/Source/WebCore/contentextensions/HashableActionList.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsFontFeatureSettingscpp">trunk/Source/WebCore/platform/graphics/FontFeatureSettings.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsFontFeatureSettingsh">trunk/Source/WebCore/platform/graphics/FontFeatureSettings.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsGradientcpp">trunk/Source/WebCore/platform/graphics/Gradient.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsWidthCacheh">trunk/Source/WebCore/platform/graphics/WidthCache.h</a></li>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceBaseUtilitiesjs">trunk/Source/WebInspectorUI/UserInterface/Base/Utilities.js</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessIndexedDBIDBIdentifierh">trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBIdentifier.h</a></li>
<li><a href="#trunkSourceWebKit2PlatformIPCStringReferencecpp">trunk/Source/WebKit2/Platform/IPC/StringReference.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWTFwtfHasherh">trunk/Source/WTF/wtf/Hasher.h</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWTFwtfStringHasherh">trunk/Source/WTF/wtf/StringHasher.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WTF/ChangeLog        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2015-08-17  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        Implement IntegerHasher
+        https://bugs.webkit.org/show_bug.cgi?id=147866
+
+        Reviewed by Darin Adler and Anders Carlsson.
+
+        Rename StringHasher.h to Hasher.h, and include an IntegerHasher class.
+
+        * WTF.vcxproj/WTF.vcxproj: Update to target new file.
+        * WTF.vcxproj/WTF.vcxproj.filters: Ditto.
+        * WTF.xcodeproj/project.pbxproj: Ditto.
+        * wtf/CMakeLists.txt: Ditto.
+        * wtf/Hasher.h: Renamed from Source/WTF/wtf/StringHasher.h.
+        * wtf/text/CString.cpp: Use new #include
+        * wtf/text/StringHash.h: Ditto.
+        * wtf/text/StringImpl.h: Ditto.
+        * wtf/unicode/UTF8.cpp: Ditto.
+
</ins><span class="cx"> 2015-08-17  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Move some commands from ./CMakeLists.txt to Source/cmake
</span></span></pre></div>
<a id="trunkSourceWTFWTFvcxprojWTFvcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/WTF.vcxproj/WTF.vcxproj (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/WTF.vcxproj/WTF.vcxproj        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WTF/WTF.vcxproj/WTF.vcxproj        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -216,6 +216,7 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\glib\GUniquePtr.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\GregorianDateTime.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\HashCountedSet.h&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\wtf\Hasher.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\HashFunctions.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\HashIterators.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\HashMap.h&quot; /&gt;
</span><span class="lines">@@ -276,7 +277,6 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\StdLibExtras.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\Stopwatch.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\StringExtras.h&quot; /&gt;
</span><del>-    &lt;ClInclude Include=&quot;..\wtf\StringHasher.h&quot; /&gt;
</del><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\StringPrintStream.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\TemporaryChange.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\text\ASCIIFastPath.h&quot; /&gt;
</span></span></pre></div>
<a id="trunkSourceWTFWTFvcxprojWTFvcxprojfilters"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/WTF.vcxproj/WTF.vcxproj.filters (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/WTF.vcxproj/WTF.vcxproj.filters        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WTF/WTF.vcxproj/WTF.vcxproj.filters        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -463,6 +463,9 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\HashCountedSet.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;wtf&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\wtf\Hasher.h&quot;&gt;
+      &lt;Filter&gt;wtf&lt;/Filter&gt;
+    &lt;/ClInclude&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\HashFunctions.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;wtf&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><span class="lines">@@ -622,9 +625,6 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\StringExtras.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;wtf&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><del>-    &lt;ClInclude Include=&quot;..\wtf\StringHasher.h&quot;&gt;
-      &lt;Filter&gt;wtf&lt;/Filter&gt;
-    &lt;/ClInclude&gt;
</del><span class="cx">     &lt;ClInclude Include=&quot;..\wtf\StringPrintStream.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;wtf&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><span class="lines">@@ -721,4 +721,4 @@
</span><span class="cx">     &lt;None Include=&quot;WTFPostBuild.cmd&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;WTFPreBuild.cmd&quot; /&gt;
</span><span class="cx">   &lt;/ItemGroup&gt;
</span><del>-&lt;/Project&gt;
</del><span class="cx">\ No newline at end of file
</span><ins>+&lt;/Project&gt;
</ins></span></pre></div>
<a id="trunkSourceWTFWTFxcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/WTF.xcodeproj/project.pbxproj (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/WTF.xcodeproj/project.pbxproj        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WTF/WTF.xcodeproj/project.pbxproj        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -167,6 +167,7 @@
</span><span class="cx">                 A8A473C9151A825B004123FF /* Functional.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A472A7151A825A004123FF /* Functional.h */; };
</span><span class="cx">                 A8A473CA151A825B004123FF /* GetPtr.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A472A8151A825A004123FF /* GetPtr.h */; };
</span><span class="cx">                 A8A473D3151A825B004123FF /* HashCountedSet.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A472B3151A825A004123FF /* HashCountedSet.h */; };
</span><ins>+                A8A4742D151A825B004123FF /* Hasher.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A47314151A825B004123FF /* Hasher.h */; };
</ins><span class="cx">                 A8A473D4151A825B004123FF /* HashFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A472B4151A825A004123FF /* HashFunctions.h */; };
</span><span class="cx">                 A8A473D5151A825B004123FF /* HashIterators.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A472B5151A825A004123FF /* HashIterators.h */; };
</span><span class="cx">                 A8A473D6151A825B004123FF /* HashMap.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A472B6151A825A004123FF /* HashMap.h */; };
</span><span class="lines">@@ -226,7 +227,6 @@
</span><span class="cx">                 A8A47429151A825B004123FF /* StaticConstructors.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A47310151A825B004123FF /* StaticConstructors.h */; };
</span><span class="cx">                 A8A4742A151A825B004123FF /* StdLibExtras.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A47311151A825B004123FF /* StdLibExtras.h */; };
</span><span class="cx">                 A8A4742C151A825B004123FF /* StringExtras.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A47313151A825B004123FF /* StringExtras.h */; };
</span><del>-                A8A4742D151A825B004123FF /* StringHasher.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A47314151A825B004123FF /* StringHasher.h */; };
</del><span class="cx">                 A8A47433151A825B004123FF /* TemporaryChange.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A4731A151A825B004123FF /* TemporaryChange.h */; };
</span><span class="cx">                 A8A47434151A825B004123FF /* ASCIIFastPath.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A4731C151A825B004123FF /* ASCIIFastPath.h */; };
</span><span class="cx">                 A8A47435151A825B004123FF /* AtomicString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A8A4731D151A825B004123FF /* AtomicString.cpp */; };
</span><span class="lines">@@ -465,6 +465,7 @@
</span><span class="cx">                 A8A472A7151A825A004123FF /* Functional.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Functional.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A8A472A8151A825A004123FF /* GetPtr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GetPtr.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A8A472B3151A825A004123FF /* HashCountedSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashCountedSet.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                A8A47314151A825B004123FF /* Hasher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Hasher.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 A8A472B4151A825A004123FF /* HashFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashFunctions.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A8A472B5151A825A004123FF /* HashIterators.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashIterators.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A8A472B6151A825A004123FF /* HashMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashMap.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -524,7 +525,6 @@
</span><span class="cx">                 A8A47310151A825B004123FF /* StaticConstructors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StaticConstructors.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A8A47311151A825B004123FF /* StdLibExtras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StdLibExtras.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A8A47313151A825B004123FF /* StringExtras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringExtras.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                A8A47314151A825B004123FF /* StringHasher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringHasher.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 A8A4731A151A825B004123FF /* TemporaryChange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TemporaryChange.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A8A4731C151A825B004123FF /* ASCIIFastPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASCIIFastPath.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A8A4731D151A825B004123FF /* AtomicString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AtomicString.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -768,6 +768,7 @@
</span><span class="cx">                                 2CCD892915C0390200285083 /* GregorianDateTime.cpp */,
</span><span class="cx">                                 2C05385315BC819000F21B96 /* GregorianDateTime.h */,
</span><span class="cx">                                 A8A472B3151A825A004123FF /* HashCountedSet.h */,
</span><ins>+                                A8A47314151A825B004123FF /* Hasher.h */,
</ins><span class="cx">                                 A8A472B4151A825A004123FF /* HashFunctions.h */,
</span><span class="cx">                                 A8A472B5151A825A004123FF /* HashIterators.h */,
</span><span class="cx">                                 A8A472B6151A825A004123FF /* HashMap.h */,
</span><span class="lines">@@ -871,7 +872,6 @@
</span><span class="cx">                                 1A6BB768162F300500DD16DB /* StreamBuffer.h */,
</span><span class="cx">                                 A8A47313151A825B004123FF /* StringExtras.h */,
</span><span class="cx">                                 A748745117A0BDAE00FA04CB /* StringHashDumpContext.h */,
</span><del>-                                A8A47314151A825B004123FF /* StringHasher.h */,
</del><span class="cx">                                 0FDDBFA51666DFA300C55FEF /* StringPrintStream.cpp */,
</span><span class="cx">                                 0FDDBFA61666DFA300C55FEF /* StringPrintStream.h */,
</span><span class="cx">                                 A8A4731A151A825B004123FF /* TemporaryChange.h */,
</span><span class="lines">@@ -1122,6 +1122,7 @@
</span><span class="cx">                                 A8A473CA151A825B004123FF /* GetPtr.h in Headers */,
</span><span class="cx">                                 2C05385415BC819000F21B96 /* GregorianDateTime.h in Headers */,
</span><span class="cx">                                 A8A473D3151A825B004123FF /* HashCountedSet.h in Headers */,
</span><ins>+                                A8A4742D151A825B004123FF /* Hasher.h in Headers */,
</ins><span class="cx">                                 A8A473D4151A825B004123FF /* HashFunctions.h in Headers */,
</span><span class="cx">                                 A8A473D5151A825B004123FF /* HashIterators.h in Headers */,
</span><span class="cx">                                 A8A473D6151A825B004123FF /* HashMap.h in Headers */,
</span><span class="lines">@@ -1204,7 +1205,6 @@
</span><span class="cx">                                 A8A4743F151A825B004123FF /* StringHash.h in Headers */,
</span><span class="cx">                                 FE8225311B2A1E5B00BA68FD /* NakedPtr.h in Headers */,
</span><span class="cx">                                 A748745417A0BDAE00FA04CB /* StringHashDumpContext.h in Headers */,
</span><del>-                                A8A4742D151A825B004123FF /* StringHasher.h in Headers */,
</del><span class="cx">                                 A8A47441151A825B004123FF /* StringImpl.h in Headers */,
</span><span class="cx">                                 A8A47442151A825B004123FF /* StringOperators.h in Headers */,
</span><span class="cx">                                 0FDDBFA81666DFA300C55FEF /* StringPrintStream.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceWTFwtfCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/CMakeLists.txt (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/CMakeLists.txt        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WTF/wtf/CMakeLists.txt        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx">     GetPtr.h
</span><span class="cx">     GregorianDateTime.h
</span><span class="cx">     HashCountedSet.h
</span><ins>+    Hasher.h
</ins><span class="cx">     HashFunctions.h
</span><span class="cx">     HashIterators.h
</span><span class="cx">     HashMap.h
</span><span class="lines">@@ -90,7 +91,6 @@
</span><span class="cx">     StdLibExtras.h
</span><span class="cx">     Stopwatch.h
</span><span class="cx">     StringExtras.h
</span><del>-    StringHasher.h
</del><span class="cx">     StringPrintStream.h
</span><span class="cx">     ThreadIdentifierDataPthreads.h
</span><span class="cx">     ThreadSafeRefCounted.h
</span></span></pre></div>
<a id="trunkSourceWTFwtfHasherhfromrev188553trunkSourceWTFwtfStringHasherh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WTF/wtf/Hasher.h (from rev 188553, trunk/Source/WTF/wtf/StringHasher.h) (0 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Hasher.h                                (rev 0)
+++ trunk/Source/WTF/wtf/Hasher.h        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -0,0 +1,314 @@
</span><ins>+/*
+ * Copyright (C) 2005, 2006, 2008, 2010, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2010 Patrick Gansterer &lt;paroga@paroga.com&gt;
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef WTF_Hasher_h
+#define WTF_Hasher_h
+
+#include &lt;unicode/utypes.h&gt;
+#include &lt;wtf/text/LChar.h&gt;
+
+namespace WTF {
+
+// Paul Hsieh's SuperFastHash
+// http://www.azillionmonkeys.com/qed/hash.html
+
+// LChar data is interpreted as Latin-1-encoded (zero extended to 16 bits).
+
+// NOTE: The hash computation here must stay in sync with the create_hash_table script in
+// JavaScriptCore and the CodeGeneratorJS.pm script in WebCore.
+
+// Golden ratio. Arbitrary start value to avoid mapping all zeros to a hash value of zero.
+static const unsigned stringHashingStartValue = 0x9E3779B9U;
+
+class StringHasher {
+public:
+    static const unsigned flagCount = 8; // Save 8 bits for StringImpl to use as flags.
+
+    StringHasher()
+        : m_hash(stringHashingStartValue)
+        , m_hasPendingCharacter(false)
+        , m_pendingCharacter(0)
+    {
+    }
+
+    // The hasher hashes two characters at a time, and thus an &quot;aligned&quot; hasher is one
+    // where an even number of characters have been added. Callers that always add
+    // characters two at a time can use the &quot;assuming aligned&quot; functions.
+    void addCharactersAssumingAligned(UChar a, UChar b)
+    {
+        ASSERT(!m_hasPendingCharacter);
+        m_hash += a;
+        m_hash = (m_hash &lt;&lt; 16) ^ ((b &lt;&lt; 11) ^ m_hash);
+        m_hash += m_hash &gt;&gt; 11;
+    }
+
+    void addCharacter(UChar character)
+    {
+        if (m_hasPendingCharacter) {
+            m_hasPendingCharacter = false;
+            addCharactersAssumingAligned(m_pendingCharacter, character);
+            return;
+        }
+
+        m_pendingCharacter = character;
+        m_hasPendingCharacter = true;
+    }
+
+    void addCharacters(UChar a, UChar b)
+    {
+        if (m_hasPendingCharacter) {
+#if !ASSERT_DISABLED
+            m_hasPendingCharacter = false;
+#endif
+            addCharactersAssumingAligned(m_pendingCharacter, a);
+            m_pendingCharacter = b;
+#if !ASSERT_DISABLED
+            m_hasPendingCharacter = true;
+#endif
+            return;
+        }
+
+        addCharactersAssumingAligned(a, b);
+    }
+
+    template&lt;typename T, UChar Converter(T)&gt; void addCharactersAssumingAligned(const T* data, unsigned length)
+    {
+        ASSERT(!m_hasPendingCharacter);
+
+        bool remainder = length &amp; 1;
+        length &gt;&gt;= 1;
+
+        while (length--) {
+            addCharactersAssumingAligned(Converter(data[0]), Converter(data[1]));
+            data += 2;
+        }
+
+        if (remainder)
+            addCharacter(Converter(*data));
+    }
+
+    template&lt;typename T&gt; void addCharactersAssumingAligned(const T* data, unsigned length)
+    {
+        addCharactersAssumingAligned&lt;T, defaultConverter&gt;(data, length);
+    }
+
+    template&lt;typename T, UChar Converter(T)&gt; void addCharactersAssumingAligned(const T* data)
+    {
+        ASSERT(!m_hasPendingCharacter);
+
+        while (T a = *data++) {
+            T b = *data++;
+            if (!b) {
+                addCharacter(Converter(a));
+                break;
+            }
+            addCharactersAssumingAligned(Converter(a), Converter(b));
+        }
+    }
+
+    template&lt;typename T&gt; void addCharactersAssumingAligned(const T* data)
+    {
+        addCharactersAssumingAligned&lt;T, defaultConverter&gt;(data);
+    }
+
+    template&lt;typename T, UChar Converter(T)&gt; void addCharacters(const T* data, unsigned length)
+    {
+        if (m_hasPendingCharacter &amp;&amp; length) {
+            m_hasPendingCharacter = false;
+            addCharactersAssumingAligned(m_pendingCharacter, Converter(*data++));
+            --length;
+        }
+        addCharactersAssumingAligned&lt;T, Converter&gt;(data, length);
+    }
+
+    template&lt;typename T&gt; void addCharacters(const T* data, unsigned length)
+    {
+        addCharacters&lt;T, defaultConverter&gt;(data, length);
+    }
+
+    template&lt;typename T, UChar Converter(T)&gt; void addCharacters(const T* data)
+    {
+        if (m_hasPendingCharacter &amp;&amp; *data) {
+            m_hasPendingCharacter = false;
+            addCharactersAssumingAligned(m_pendingCharacter, Converter(*data++));
+        }
+        addCharactersAssumingAligned&lt;T, Converter&gt;(data);
+    }
+
+    template&lt;typename T&gt; void addCharacters(const T* data)
+    {
+        addCharacters&lt;T, defaultConverter&gt;(data);
+    }
+
+    unsigned hashWithTop8BitsMasked() const
+    {
+        unsigned result = avalancheBits();
+
+        // Reserving space from the high bits for flags preserves most of the hash's
+        // value, since hash lookup typically masks out the high bits anyway.
+        result &amp;= (1U &lt;&lt; (sizeof(result) * 8 - flagCount)) - 1;
+
+        // This avoids ever returning a hash code of 0, since that is used to
+        // signal &quot;hash not computed yet&quot;. Setting the high bit maintains
+        // reasonable fidelity to a hash code of 0 because it is likely to yield
+        // exactly 0 when hash lookup masks out the high bits.
+        if (!result)
+            result = 0x80000000 &gt;&gt; flagCount;
+
+        return result;
+    }
+
+    unsigned hash() const
+    {
+        unsigned result = avalancheBits();
+
+        // This avoids ever returning a hash code of 0, since that is used to
+        // signal &quot;hash not computed yet&quot;. Setting the high bit maintains
+        // reasonable fidelity to a hash code of 0 because it is likely to yield
+        // exactly 0 when hash lookup masks out the high bits.
+        if (!result)
+            result = 0x80000000;
+
+        return result;
+    }
+
+    template&lt;typename T, UChar Converter(T)&gt; static unsigned computeHashAndMaskTop8Bits(const T* data, unsigned length)
+    {
+        StringHasher hasher;
+        hasher.addCharactersAssumingAligned&lt;T, Converter&gt;(data, length);
+        return hasher.hashWithTop8BitsMasked();
+    }
+
+    template&lt;typename T, UChar Converter(T)&gt; static unsigned computeHashAndMaskTop8Bits(const T* data)
+    {
+        StringHasher hasher;
+        hasher.addCharactersAssumingAligned&lt;T, Converter&gt;(data);
+        return hasher.hashWithTop8BitsMasked();
+    }
+
+    template&lt;typename T&gt; static unsigned computeHashAndMaskTop8Bits(const T* data, unsigned length)
+    {
+        return computeHashAndMaskTop8Bits&lt;T, defaultConverter&gt;(data, length);
+    }
+
+    template&lt;typename T&gt; static unsigned computeHashAndMaskTop8Bits(const T* data)
+    {
+        return computeHashAndMaskTop8Bits&lt;T, defaultConverter&gt;(data);
+    }
+
+    template&lt;typename T, UChar Converter(T)&gt; static unsigned computeHash(const T* data, unsigned length)
+    {
+        StringHasher hasher;
+        hasher.addCharactersAssumingAligned&lt;T, Converter&gt;(data, length);
+        return hasher.hash();
+    }
+
+    template&lt;typename T, UChar Converter(T)&gt; static unsigned computeHash(const T* data)
+    {
+        StringHasher hasher;
+        hasher.addCharactersAssumingAligned&lt;T, Converter&gt;(data);
+        return hasher.hash();
+    }
+
+    template&lt;typename T&gt; static unsigned computeHash(const T* data, unsigned length)
+    {
+        return computeHash&lt;T, defaultConverter&gt;(data, length);
+    }
+
+    template&lt;typename T&gt; static unsigned computeHash(const T* data)
+    {
+        return computeHash&lt;T, defaultConverter&gt;(data);
+    }
+
+    static unsigned hashMemory(const void* data, unsigned length)
+    {
+        // FIXME: Why does this function use the version of the hash that drops the top 8 bits?
+        // We want that for all string hashing so we can use those bits in StringImpl and hash
+        // strings consistently, but I don't see why we'd want that for general memory hashing.
+        ASSERT(!(length % 2));
+        return computeHashAndMaskTop8Bits&lt;UChar&gt;(static_cast&lt;const UChar*&gt;(data), length / sizeof(UChar));
+    }
+
+    template&lt;size_t length&gt; static unsigned hashMemory(const void* data)
+    {
+        static_assert(!(length % 2), &quot;length must be a multiple of two!&quot;);
+        return hashMemory(data, length);
+    }
+
+private:
+    static UChar defaultConverter(UChar character)
+    {
+        return character;
+    }
+
+    static UChar defaultConverter(LChar character)
+    {
+        return character;
+    }
+
+    unsigned avalancheBits() const
+    {
+        unsigned result = m_hash;
+
+        // Handle end case.
+        if (m_hasPendingCharacter) {
+            result += m_pendingCharacter;
+            result ^= result &lt;&lt; 11;
+            result += result &gt;&gt; 17;
+        }
+
+        // Force &quot;avalanching&quot; of final 31 bits.
+        result ^= result &lt;&lt; 3;
+        result += result &gt;&gt; 5;
+        result ^= result &lt;&lt; 2;
+        result += result &gt;&gt; 15;
+        result ^= result &lt;&lt; 10;
+
+        return result;
+    }
+
+    unsigned m_hash;
+    bool m_hasPendingCharacter;
+    UChar m_pendingCharacter;
+};
+
+class IntegerHasher {
+public:
+    void add(unsigned integer)
+    {
+        m_underlyingHasher.addCharactersAssumingAligned(integer, integer &gt;&gt; 16);
+    }
+
+    unsigned hash() const
+    {
+        return m_underlyingHasher.hash();
+    }
+
+private:
+    StringHasher m_underlyingHasher;
+};
+
+} // namespace WTF
+
+using WTF::IntegerHasher;
+using WTF::StringHasher;
+
+#endif // WTF_Hasher_h
</ins></span></pre></div>
<a id="trunkSourceWTFwtfStringHasherh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WTF/wtf/StringHasher.h (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/StringHasher.h        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WTF/wtf/StringHasher.h        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -1,297 +0,0 @@
</span><del>-/*
- * Copyright (C) 2005, 2006, 2008, 2010, 2013 Apple Inc. All rights reserved.
- * Copyright (C) 2010 Patrick Gansterer &lt;paroga@paroga.com&gt;
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef WTF_StringHasher_h
-#define WTF_StringHasher_h
-
-#include &lt;unicode/utypes.h&gt;
-#include &lt;wtf/text/LChar.h&gt;
-
-namespace WTF {
-
-// Paul Hsieh's SuperFastHash
-// http://www.azillionmonkeys.com/qed/hash.html
-
-// LChar data is interpreted as Latin-1-encoded (zero extended to 16 bits).
-
-// NOTE: The hash computation here must stay in sync with the create_hash_table script in
-// JavaScriptCore and the CodeGeneratorJS.pm script in WebCore.
-
-// Golden ratio. Arbitrary start value to avoid mapping all zeros to a hash value of zero.
-static const unsigned stringHashingStartValue = 0x9E3779B9U;
-
-class StringHasher {
-public:
-    static const unsigned flagCount = 8; // Save 8 bits for StringImpl to use as flags.
-
-    StringHasher()
-        : m_hash(stringHashingStartValue)
-        , m_hasPendingCharacter(false)
-        , m_pendingCharacter(0)
-    {
-    }
-
-    // The hasher hashes two characters at a time, and thus an &quot;aligned&quot; hasher is one
-    // where an even number of characters have been added. Callers that always add
-    // characters two at a time can use the &quot;assuming aligned&quot; functions.
-    void addCharactersAssumingAligned(UChar a, UChar b)
-    {
-        ASSERT(!m_hasPendingCharacter);
-        m_hash += a;
-        m_hash = (m_hash &lt;&lt; 16) ^ ((b &lt;&lt; 11) ^ m_hash);
-        m_hash += m_hash &gt;&gt; 11;
-    }
-
-    void addCharacter(UChar character)
-    {
-        if (m_hasPendingCharacter) {
-            m_hasPendingCharacter = false;
-            addCharactersAssumingAligned(m_pendingCharacter, character);
-            return;
-        }
-
-        m_pendingCharacter = character;
-        m_hasPendingCharacter = true;
-    }
-
-    void addCharacters(UChar a, UChar b)
-    {
-        if (m_hasPendingCharacter) {
-#if !ASSERT_DISABLED
-            m_hasPendingCharacter = false;
-#endif
-            addCharactersAssumingAligned(m_pendingCharacter, a);
-            m_pendingCharacter = b;
-#if !ASSERT_DISABLED
-            m_hasPendingCharacter = true;
-#endif
-            return;
-        }
-
-        addCharactersAssumingAligned(a, b);
-    }
-
-    template&lt;typename T, UChar Converter(T)&gt; void addCharactersAssumingAligned(const T* data, unsigned length)
-    {
-        ASSERT(!m_hasPendingCharacter);
-
-        bool remainder = length &amp; 1;
-        length &gt;&gt;= 1;
-
-        while (length--) {
-            addCharactersAssumingAligned(Converter(data[0]), Converter(data[1]));
-            data += 2;
-        }
-
-        if (remainder)
-            addCharacter(Converter(*data));
-    }
-
-    template&lt;typename T&gt; void addCharactersAssumingAligned(const T* data, unsigned length)
-    {
-        addCharactersAssumingAligned&lt;T, defaultConverter&gt;(data, length);
-    }
-
-    template&lt;typename T, UChar Converter(T)&gt; void addCharactersAssumingAligned(const T* data)
-    {
-        ASSERT(!m_hasPendingCharacter);
-
-        while (T a = *data++) {
-            T b = *data++;
-            if (!b) {
-                addCharacter(Converter(a));
-                break;
-            }
-            addCharactersAssumingAligned(Converter(a), Converter(b));
-        }
-    }
-
-    template&lt;typename T&gt; void addCharactersAssumingAligned(const T* data)
-    {
-        addCharactersAssumingAligned&lt;T, defaultConverter&gt;(data);
-    }
-
-    template&lt;typename T, UChar Converter(T)&gt; void addCharacters(const T* data, unsigned length)
-    {
-        if (m_hasPendingCharacter &amp;&amp; length) {
-            m_hasPendingCharacter = false;
-            addCharactersAssumingAligned(m_pendingCharacter, Converter(*data++));
-            --length;
-        }
-        addCharactersAssumingAligned&lt;T, Converter&gt;(data, length);
-    }
-
-    template&lt;typename T&gt; void addCharacters(const T* data, unsigned length)
-    {
-        addCharacters&lt;T, defaultConverter&gt;(data, length);
-    }
-
-    template&lt;typename T, UChar Converter(T)&gt; void addCharacters(const T* data)
-    {
-        if (m_hasPendingCharacter &amp;&amp; *data) {
-            m_hasPendingCharacter = false;
-            addCharactersAssumingAligned(m_pendingCharacter, Converter(*data++));
-        }
-        addCharactersAssumingAligned&lt;T, Converter&gt;(data);
-    }
-
-    template&lt;typename T&gt; void addCharacters(const T* data)
-    {
-        addCharacters&lt;T, defaultConverter&gt;(data);
-    }
-
-    unsigned hashWithTop8BitsMasked() const
-    {
-        unsigned result = avalancheBits();
-
-        // Reserving space from the high bits for flags preserves most of the hash's
-        // value, since hash lookup typically masks out the high bits anyway.
-        result &amp;= (1U &lt;&lt; (sizeof(result) * 8 - flagCount)) - 1;
-
-        // This avoids ever returning a hash code of 0, since that is used to
-        // signal &quot;hash not computed yet&quot;. Setting the high bit maintains
-        // reasonable fidelity to a hash code of 0 because it is likely to yield
-        // exactly 0 when hash lookup masks out the high bits.
-        if (!result)
-            result = 0x80000000 &gt;&gt; flagCount;
-
-        return result;
-    }
-
-    unsigned hash() const
-    {
-        unsigned result = avalancheBits();
-
-        // This avoids ever returning a hash code of 0, since that is used to
-        // signal &quot;hash not computed yet&quot;. Setting the high bit maintains
-        // reasonable fidelity to a hash code of 0 because it is likely to yield
-        // exactly 0 when hash lookup masks out the high bits.
-        if (!result)
-            result = 0x80000000;
-
-        return result;
-    }
-
-    template&lt;typename T, UChar Converter(T)&gt; static unsigned computeHashAndMaskTop8Bits(const T* data, unsigned length)
-    {
-        StringHasher hasher;
-        hasher.addCharactersAssumingAligned&lt;T, Converter&gt;(data, length);
-        return hasher.hashWithTop8BitsMasked();
-    }
-
-    template&lt;typename T, UChar Converter(T)&gt; static unsigned computeHashAndMaskTop8Bits(const T* data)
-    {
-        StringHasher hasher;
-        hasher.addCharactersAssumingAligned&lt;T, Converter&gt;(data);
-        return hasher.hashWithTop8BitsMasked();
-    }
-
-    template&lt;typename T&gt; static unsigned computeHashAndMaskTop8Bits(const T* data, unsigned length)
-    {
-        return computeHashAndMaskTop8Bits&lt;T, defaultConverter&gt;(data, length);
-    }
-
-    template&lt;typename T&gt; static unsigned computeHashAndMaskTop8Bits(const T* data)
-    {
-        return computeHashAndMaskTop8Bits&lt;T, defaultConverter&gt;(data);
-    }
-
-    template&lt;typename T, UChar Converter(T)&gt; static unsigned computeHash(const T* data, unsigned length)
-    {
-        StringHasher hasher;
-        hasher.addCharactersAssumingAligned&lt;T, Converter&gt;(data, length);
-        return hasher.hash();
-    }
-
-    template&lt;typename T, UChar Converter(T)&gt; static unsigned computeHash(const T* data)
-    {
-        StringHasher hasher;
-        hasher.addCharactersAssumingAligned&lt;T, Converter&gt;(data);
-        return hasher.hash();
-    }
-
-    template&lt;typename T&gt; static unsigned computeHash(const T* data, unsigned length)
-    {
-        return computeHash&lt;T, defaultConverter&gt;(data, length);
-    }
-
-    template&lt;typename T&gt; static unsigned computeHash(const T* data)
-    {
-        return computeHash&lt;T, defaultConverter&gt;(data);
-    }
-
-    static unsigned hashMemory(const void* data, unsigned length)
-    {
-        // FIXME: Why does this function use the version of the hash that drops the top 8 bits?
-        // We want that for all string hashing so we can use those bits in StringImpl and hash
-        // strings consistently, but I don't see why we'd want that for general memory hashing.
-        ASSERT(!(length % 2));
-        return computeHashAndMaskTop8Bits&lt;UChar&gt;(static_cast&lt;const UChar*&gt;(data), length / sizeof(UChar));
-    }
-
-    template&lt;size_t length&gt; static unsigned hashMemory(const void* data)
-    {
-        static_assert(!(length % 2), &quot;length must be a multiple of two!&quot;);
-        return hashMemory(data, length);
-    }
-
-private:
-    static UChar defaultConverter(UChar character)
-    {
-        return character;
-    }
-
-    static UChar defaultConverter(LChar character)
-    {
-        return character;
-    }
-
-    unsigned avalancheBits() const
-    {
-        unsigned result = m_hash;
-
-        // Handle end case.
-        if (m_hasPendingCharacter) {
-            result += m_pendingCharacter;
-            result ^= result &lt;&lt; 11;
-            result += result &gt;&gt; 17;
-        }
-
-        // Force &quot;avalanching&quot; of final 31 bits.
-        result ^= result &lt;&lt; 3;
-        result += result &gt;&gt; 5;
-        result ^= result &lt;&lt; 2;
-        result += result &gt;&gt; 15;
-        result ^= result &lt;&lt; 10;
-
-        return result;
-    }
-
-    unsigned m_hash;
-    bool m_hasPendingCharacter;
-    UChar m_pendingCharacter;
-};
-
-} // namespace WTF
-
-using WTF::StringHasher;
-
-#endif // WTF_StringHasher_h
</del></span></pre></div>
<a id="trunkSourceWTFwtftextCStringcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/text/CString.cpp (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/text/CString.cpp        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WTF/wtf/text/CString.cpp        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> #include &quot;CString.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;string.h&gt;
</span><del>-#include &lt;wtf/StringHasher.h&gt;
</del><ins>+#include &lt;wtf/Hasher.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WTF {
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWTFwtftextStringHashh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/text/StringHash.h (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/text/StringHash.h        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WTF/wtf/text/StringHash.h        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;wtf/text/AtomicString.h&gt;
</span><span class="cx"> #include &lt;wtf/HashTraits.h&gt;
</span><del>-#include &lt;wtf/StringHasher.h&gt;
</del><ins>+#include &lt;wtf/Hasher.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WTF {
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWTFwtftextStringImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/text/StringImpl.h (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/text/StringImpl.h        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WTF/wtf/text/StringImpl.h        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -28,9 +28,9 @@
</span><span class="cx"> #include &lt;unicode/ustring.h&gt;
</span><span class="cx"> #include &lt;wtf/ASCIICType.h&gt;
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><ins>+#include &lt;wtf/Hasher.h&gt;
</ins><span class="cx"> #include &lt;wtf/MathExtras.h&gt;
</span><span class="cx"> #include &lt;wtf/StdLibExtras.h&gt;
</span><del>-#include &lt;wtf/StringHasher.h&gt;
</del><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> #include &lt;wtf/text/ConversionMode.h&gt;
</span><span class="cx"> #include &lt;wtf/text/StringCommon.h&gt;
</span></span></pre></div>
<a id="trunkSourceWTFwtfunicodeUTF8cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/unicode/UTF8.cpp (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/unicode/UTF8.cpp        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WTF/wtf/unicode/UTF8.cpp        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> #include &quot;UTF8.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ASCIICType.h&quot;
</span><del>-#include &lt;wtf/StringHasher.h&gt;
</del><ins>+#include &lt;wtf/Hasher.h&gt;
</ins><span class="cx"> #include &lt;wtf/unicode/CharacterNames.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WTF {
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WebCore/ChangeLog        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2015-08-17  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        Implement IntegerHasher
+        https://bugs.webkit.org/show_bug.cgi?id=147866
+
+        Reviewed by Darin Adler and Anders Carlsson.
+
+        Rename StringHasher.h to Hasher.
+
+        No new tests because there is no behavior difference.
+
+        * contentextensions/DFAMinimizer.cpp: Use new #include.
+        * contentextensions/HashableActionList.h: Ditto.
+        * platform/graphics/FontFeatureSettings.cpp:
+        (WebCore::FontFeatureSettings::hash): Use new IntegerHasher class.
+        (WebCore::FontFeature::hash): Deleted.
+        * platform/graphics/FontFeatureSettings.h: Remove unnecessary function.
+        * platform/graphics/Gradient.cpp: Use new #include.
+        * platform/graphics/WidthCache.h: Ditto.
+
</ins><span class="cx"> 2015-08-17  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Log actual PageCache retrieval success rate using diagnostic logging
</span></span></pre></div>
<a id="trunkSourceWebCorecontentextensionsDFAMinimizercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/contentextensions/DFAMinimizer.cpp (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/contentextensions/DFAMinimizer.cpp        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WebCore/contentextensions/DFAMinimizer.cpp        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -33,7 +33,7 @@
</span><span class="cx"> #include &quot;MutableRangeList.h&quot;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><del>-#include &lt;wtf/StringHasher.h&gt;
</del><ins>+#include &lt;wtf/Hasher.h&gt;
</ins><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span></span></pre></div>
<a id="trunkSourceWebCorecontentextensionsHashableActionListh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/contentextensions/HashableActionList.h (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/contentextensions/HashableActionList.h        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WebCore/contentextensions/HashableActionList.h        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> #ifndef HashableActionList_h
</span><span class="cx"> #define HashableActionList_h
</span><span class="cx"> 
</span><del>-#include &lt;wtf/StringHasher.h&gt;
</del><ins>+#include &lt;wtf/Hasher.h&gt;
</ins><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsFontFeatureSettingscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/FontFeatureSettings.cpp (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/FontFeatureSettings.cpp        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WebCore/platform/graphics/FontFeatureSettings.cpp        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -46,11 +46,6 @@
</span><span class="cx">     return (m_tag.impl() &lt; other.m_tag.impl()) || (m_tag.impl() == other.m_tag.impl() &amp;&amp; m_value &lt; other.m_value);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned FontFeature::hash() const
-{
-    return WTF::PairHash&lt;AtomicString, unsigned&gt;::hash(std::make_pair(m_tag, m_value));
-}
-
</del><span class="cx"> Ref&lt;FontFeatureSettings&gt; FontFeatureSettings::create()
</span><span class="cx"> {
</span><span class="cx">     return adoptRef(*new FontFeatureSettings);
</span><span class="lines">@@ -69,10 +64,12 @@
</span><span class="cx"> 
</span><span class="cx"> unsigned FontFeatureSettings::hash() const
</span><span class="cx"> {
</span><del>-    unsigned result = 0;
-    for (size_t i = 0; i &lt; size(); ++i)
-        result = WTF::pairIntHash(result, at(i).hash());
-    return result;
</del><ins>+    IntegerHasher hasher;
+    for (auto&amp; feature : m_list) {
+        hasher.add(feature.tag().impl()-&gt;existingHash());
+        hasher.add(feature.value());
+    }
+    return hasher.hash();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsFontFeatureSettingsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/FontFeatureSettings.h (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/FontFeatureSettings.h        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WebCore/platform/graphics/FontFeatureSettings.h        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -45,8 +45,6 @@
</span><span class="cx">     int value() const { return m_value; }
</span><span class="cx">     bool enabled() const { return value(); }
</span><span class="cx"> 
</span><del>-    unsigned hash() const;
-
</del><span class="cx"> private:
</span><span class="cx">     AtomicString m_tag;
</span><span class="cx">     const int m_value { 0 };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGradientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/Gradient.cpp (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/Gradient.cpp        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WebCore/platform/graphics/Gradient.cpp        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> #include &quot;Color.h&quot;
</span><span class="cx"> #include &quot;FloatRect.h&quot;
</span><span class="cx"> #include &lt;wtf/HashFunctions.h&gt;
</span><del>-#include &lt;wtf/StringHasher.h&gt;
</del><ins>+#include &lt;wtf/Hasher.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using WTF::pairIntHash;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsWidthCacheh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/WidthCache.h (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/WidthCache.h        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WebCore/platform/graphics/WidthCache.h        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -30,8 +30,8 @@
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> #include &lt;wtf/HashFunctions.h&gt;
</span><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><ins>+#include &lt;wtf/Hasher.h&gt;
</ins><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><del>-#include &lt;wtf/StringHasher.h&gt;
</del><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WebInspectorUI/ChangeLog        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2015-08-17  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        Implement IntegerHasher
+        https://bugs.webkit.org/show_bug.cgi?id=147866
+
+        Reviewed by Darin Adler and Anders Carlsson.
+
+        Update comment.
+
+        * UserInterface/Base/Utilities.js:
+
</ins><span class="cx"> 2015-08-17  Brian Burg  &lt;bburg@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: InspectorTest should be a subclass of TestHarness
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceBaseUtilitiesjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Base/Utilities.js (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Base/Utilities.js        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WebInspectorUI/UserInterface/Base/Utilities.js        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -588,7 +588,7 @@
</span><span class="cx"> {
</span><span class="cx">     get: function()
</span><span class="cx">     {
</span><del>-        // Matches the wtf/StringHasher.h (SuperFastHash) algorithm.
</del><ins>+        // Matches the wtf/Hasher.h (SuperFastHash) algorithm.
</ins><span class="cx"> 
</span><span class="cx">         // Arbitrary start value to avoid mapping all 0's to all 0's.
</span><span class="cx">         const stringHashingStartValue = 0x9e3779b9;
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WebKit2/ChangeLog        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2015-08-17  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        Implement IntegerHasher
+        https://bugs.webkit.org/show_bug.cgi?id=147866
+
+        Reviewed by Darin Adler and Anders Carlsson.
+
+        Use new #include.
+
+        * DatabaseProcess/IndexedDB/IDBIdentifier.h:
+        * Platform/IPC/StringReference.cpp:
+
</ins><span class="cx"> 2015-08-13  Anders Carlsson  &lt;andersca@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add WKWindowFeaturesRef and a new modern createNewPage UI client callback
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBIDBIdentifierh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBIdentifier.h (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBIdentifier.h        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBIdentifier.h        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -29,7 +29,7 @@
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE) &amp;&amp; ENABLE(DATABASE_PROCESS)
</span><span class="cx"> 
</span><span class="cx"> #include &lt;wtf/HashTraits.h&gt;
</span><del>-#include &lt;wtf/StringHasher.h&gt;
</del><ins>+#include &lt;wtf/Hasher.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformIPCStringReferencecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Platform/IPC/StringReference.cpp (188556 => 188557)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Platform/IPC/StringReference.cpp        2015-08-17 23:59:03 UTC (rev 188556)
+++ trunk/Source/WebKit2/Platform/IPC/StringReference.cpp        2015-08-17 23:59:05 UTC (rev 188557)
</span><span class="lines">@@ -29,7 +29,7 @@
</span><span class="cx"> #include &quot;ArgumentDecoder.h&quot;
</span><span class="cx"> #include &quot;ArgumentEncoder.h&quot;
</span><span class="cx"> #include &quot;DataReference.h&quot;
</span><del>-#include &lt;wtf/StringHasher.h&gt;
</del><ins>+#include &lt;wtf/Hasher.h&gt;
</ins><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace IPC {
</span></span></pre>
</div>
</div>

</body>
</html>