<!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>[202136] trunk</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/202136">202136</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2016-06-16 13:39:45 -0700 (Thu, 16 Jun 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Unreviewed, rolling out <a href="http://trac.webkit.org/projects/webkit/changeset/202002">r202002</a> and <a href="http://trac.webkit.org/projects/webkit/changeset/202111">r202111</a>.
Ryosuke says this was a JSBench regression on iOS
Reverted changesets:
"Make HashMap and HashSet work with Refs"
https://bugs.webkit.org/show_bug.cgi?id=158638
http://trac.webkit.org/changeset/202002
"Improve HashMap and HashSet support for Ref"
https://bugs.webkit.org/show_bug.cgi?id=158789
http://trac.webkit.org/changeset/202111</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfGetPtrh">trunk/Source/WTF/wtf/GetPtr.h</a></li>
<li><a href="#trunkSourceWTFwtfHashFunctionsh">trunk/Source/WTF/wtf/HashFunctions.h</a></li>
<li><a href="#trunkSourceWTFwtfHashMaph">trunk/Source/WTF/wtf/HashMap.h</a></li>
<li><a href="#trunkSourceWTFwtfHashSeth">trunk/Source/WTF/wtf/HashSet.h</a></li>
<li><a href="#trunkSourceWTFwtfHashTableh">trunk/Source/WTF/wtf/HashTable.h</a></li>
<li><a href="#trunkSourceWTFwtfHashTraitsh">trunk/Source/WTF/wtf/HashTraits.h</a></li>
<li><a href="#trunkSourceWTFwtfRefh">trunk/Source/WTF/wtf/Ref.h</a></li>
<li><a href="#trunkSourceWTFwtfRefPtrh">trunk/Source/WTF/wtf/RefPtr.h</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWTFHashMapcpp">trunk/Tools/TestWebKitAPI/Tests/WTF/HashMap.cpp</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWTFHashSetcpp">trunk/Tools/TestWebKitAPI/Tests/WTF/HashSet.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (202135 => 202136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2016-06-16 20:39:44 UTC (rev 202135)
+++ trunk/Source/WTF/ChangeLog        2016-06-16 20:39:45 UTC (rev 202136)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2016-06-16 Chris Dumez <cdumez@apple.com>
+
+ Unreviewed, rolling out r202002 and r202111.
+
+ Ryosuke says this was a JSBench regression on iOS
+
+ Reverted changesets:
+
+ "Make HashMap and HashSet work with Refs"
+ https://bugs.webkit.org/show_bug.cgi?id=158638
+ http://trac.webkit.org/changeset/202002
+
+ "Improve HashMap and HashSet support for Ref"
+ https://bugs.webkit.org/show_bug.cgi?id=158789
+ http://trac.webkit.org/changeset/202111
+
</ins><span class="cx"> 2016-06-15 Chris Dumez <cdumez@apple.com>
</span><span class="cx">
</span><span class="cx"> [Cocoa] Clean up / optimize ResourceResponse::platformLazyInit(InitLevel)
</span></span></pre></div>
<a id="trunkSourceWTFwtfGetPtrh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/GetPtr.h (202135 => 202136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/GetPtr.h        2016-06-16 20:39:44 UTC (rev 202135)
+++ trunk/Source/WTF/wtf/GetPtr.h        2016-06-16 20:39:45 UTC (rev 202136)
</span><span class="lines">@@ -25,9 +25,6 @@
</span><span class="cx">
</span><span class="cx"> namespace WTF {
</span><span class="cx">
</span><del>-enum HashTableDeletedValueType { HashTableDeletedValue };
-enum HashTableEmptyValueType { HashTableEmptyValue };
-
</del><span class="cx"> template <typename T> inline T* getPtr(T* p) { return p; }
</span><span class="cx">
</span><span class="cx"> template <typename T> struct IsSmartPtr {
</span></span></pre></div>
<a id="trunkSourceWTFwtfHashFunctionsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/HashFunctions.h (202135 => 202136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/HashFunctions.h        2016-06-16 20:39:44 UTC (rev 202135)
+++ trunk/Source/WTF/wtf/HashFunctions.h        2016-06-16 20:39:45 UTC (rev 202136)
</span><span class="lines">@@ -149,10 +149,6 @@
</span><span class="cx"> template<typename T> struct PtrHash : PtrHashBase<T, IsSmartPtr<T>::value> {
</span><span class="cx"> };
</span><span class="cx">
</span><del>- template<typename P> struct PtrHash<Ref<P>> : PtrHashBase<Ref<P>, IsSmartPtr<Ref<P>>::value> {
- static const bool safeToCompareToEmptyOrDeleted = false;
- };
-
</del><span class="cx"> // default hash function for each type
</span><span class="cx">
</span><span class="cx"> template<typename T> struct DefaultHash;
</span><span class="lines">@@ -198,8 +194,6 @@
</span><span class="cx">
</span><span class="cx"> template<typename P> struct DefaultHash<P*> { typedef PtrHash<P*> Hash; };
</span><span class="cx"> template<typename P> struct DefaultHash<RefPtr<P>> { typedef PtrHash<RefPtr<P>> Hash; };
</span><del>- template<typename P> struct DefaultHash<Ref<P>> { typedef PtrHash<Ref<P>> Hash; };
-
</del><span class="cx"> template<typename P, typename Deleter> struct DefaultHash<std::unique_ptr<P, Deleter>> { typedef PtrHash<std::unique_ptr<P, Deleter>> Hash; };
</span><span class="cx">
</span><span class="cx"> // make IntPairHash the default hash function for pairs of (at most) 32-bit integers.
</span></span></pre></div>
<a id="trunkSourceWTFwtfHashMaph"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/HashMap.h (202135 => 202136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/HashMap.h        2016-06-16 20:39:44 UTC (rev 202135)
+++ trunk/Source/WTF/wtf/HashMap.h        2016-06-16 20:39:45 UTC (rev 202136)
</span><span class="lines">@@ -54,7 +54,6 @@
</span><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> typedef typename MappedTraits::PeekType MappedPeekType;
</span><del>- typedef typename MappedTraits::TakeType MappedTakeType;
</del><span class="cx">
</span><span class="cx"> typedef HashArg HashFunctions;
</span><span class="cx">
</span><span class="lines">@@ -131,7 +130,7 @@
</span><span class="cx"> void removeIf(const Functor& functor);
</span><span class="cx"> void clear();
</span><span class="cx">
</span><del>- MappedTakeType take(const KeyType&); // efficient combination of get with remove
</del><ins>+ MappedType take(const KeyType&); // efficient combination of get with remove
</ins><span class="cx">
</span><span class="cx"> // An alternate version of find() that finds the object by hashing and comparing
</span><span class="cx"> // with some other type, to avoid the cost of type conversion. HashTranslator
</span><span class="lines">@@ -157,7 +156,7 @@
</span><span class="cx"> template<typename K = KeyType> typename std::enable_if<IsSmartPtr<K>::value, MappedPeekType>::type inlineGet(typename GetPtrHelper<K>::PtrType) const;
</span><span class="cx"> template<typename K = KeyType> typename std::enable_if<IsSmartPtr<K>::value, MappedPeekType>::type get(typename GetPtrHelper<K>::PtrType) const;
</span><span class="cx"> template<typename K = KeyType> typename std::enable_if<IsSmartPtr<K>::value, bool>::type remove(typename GetPtrHelper<K>::PtrType);
</span><del>- template<typename K = KeyType> typename std::enable_if<IsSmartPtr<K>::value, MappedTakeType>::type take(typename GetPtrHelper<K>::PtrType);
</del><ins>+ template<typename K = KeyType> typename std::enable_if<IsSmartPtr<K>::value, MappedType>::type take(typename GetPtrHelper<K>::PtrType);
</ins><span class="cx">
</span><span class="cx"> void checkConsistency() const;
</span><span class="cx">
</span><span class="lines">@@ -182,8 +181,8 @@
</span><span class="cx"> template<typename T, typename U> static bool equal(const T& a, const U& b) { return HashFunctions::equal(a, b); }
</span><span class="cx"> template<typename T, typename U, typename V> static void translate(T& location, U&& key, V&& mapped)
</span><span class="cx"> {
</span><del>- ValueTraits::KeyTraits::assignToEmpty(location.key, std::forward<U>(key));
- ValueTraits::ValueTraits::assignToEmpty(location.value, std::forward<V>(mapped));
</del><ins>+ location.key = std::forward<U>(key);
+ location.value = std::forward<V>(mapped);
</ins><span class="cx"> }
</span><span class="cx"> };
</span><span class="cx">
</span><span class="lines">@@ -193,8 +192,8 @@
</span><span class="cx"> template<typename T, typename U> static bool equal(const T& a, const U& b) { return HashFunctions::equal(a, b); }
</span><span class="cx"> template<typename T, typename U, typename Functor> static void translate(T& location, U&& key, const Functor& functor)
</span><span class="cx"> {
</span><del>- ValueTraits::KeyTraits::assignToEmpty(location.key, std::forward<U>(key));
- ValueTraits::ValueTraits::assignToEmpty(location.value, functor());
</del><ins>+ location.key = std::forward<U>(key);
+ location.value = functor();
</ins><span class="cx"> }
</span><span class="cx"> };
</span><span class="cx">
</span><span class="lines">@@ -435,12 +434,12 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename T, typename U, typename V, typename W, typename MappedTraits>
</span><del>-auto HashMap<T, U, V, W, MappedTraits>::take(const KeyType& key) -> MappedTakeType
</del><ins>+auto HashMap<T, U, V, W, MappedTraits>::take(const KeyType& key) -> MappedType
</ins><span class="cx"> {
</span><span class="cx"> iterator it = find(key);
</span><span class="cx"> if (it == end())
</span><del>- return MappedTraits::take(MappedTraits::emptyValue());
- auto value = MappedTraits::take(WTFMove(it->value));
</del><ins>+ return MappedTraits::emptyValue();
+ MappedType value = WTFMove(it->value);
</ins><span class="cx"> remove(it);
</span><span class="cx"> return value;
</span><span class="cx"> }
</span><span class="lines">@@ -492,12 +491,12 @@
</span><span class="cx">
</span><span class="cx"> template<typename T, typename U, typename V, typename W, typename X>
</span><span class="cx"> template<typename K>
</span><del>-inline auto HashMap<T, U, V, W, X>::take(typename GetPtrHelper<K>::PtrType key) -> typename std::enable_if<IsSmartPtr<K>::value, MappedTakeType>::type
</del><ins>+inline auto HashMap<T, U, V, W, X>::take(typename GetPtrHelper<K>::PtrType key) -> typename std::enable_if<IsSmartPtr<K>::value, MappedType>::type
</ins><span class="cx"> {
</span><span class="cx"> iterator it = find(key);
</span><span class="cx"> if (it == end())
</span><del>- return MappedTraits::take(MappedTraits::emptyValue());
- auto value = MappedTraits::take(WTFMove(it->value));
</del><ins>+ return MappedTraits::emptyValue();
+ MappedType value = WTFMove(it->value);
</ins><span class="cx"> remove(it);
</span><span class="cx"> return value;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWTFwtfHashSeth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/HashSet.h (202135 => 202136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/HashSet.h        2016-06-16 20:39:44 UTC (rev 202135)
+++ trunk/Source/WTF/wtf/HashSet.h        2016-06-16 20:39:45 UTC (rev 202136)
</span><span class="lines">@@ -38,7 +38,6 @@
</span><span class="cx"> private:
</span><span class="cx"> typedef HashArg HashFunctions;
</span><span class="cx"> typedef TraitsArg ValueTraits;
</span><del>- typedef typename ValueTraits::TakeType TakeType;
</del><span class="cx">
</span><span class="cx"> public:
</span><span class="cx"> typedef typename ValueTraits::TraitType ValueType;
</span><span class="lines">@@ -106,15 +105,15 @@
</span><span class="cx"> void removeIf(const Functor&);
</span><span class="cx"> void clear();
</span><span class="cx">
</span><del>- TakeType take(const ValueType&);
- TakeType take(iterator);
- TakeType takeAny();
</del><ins>+ ValueType take(const ValueType&);
+ ValueType take(iterator);
+ ValueType takeAny();
</ins><span class="cx">
</span><span class="cx"> // Overloads for smart pointer values that take the raw pointer type as the parameter.
</span><span class="cx"> template<typename V = ValueType> typename std::enable_if<IsSmartPtr<V>::value, iterator>::type find(typename GetPtrHelper<V>::PtrType) const;
</span><span class="cx"> template<typename V = ValueType> typename std::enable_if<IsSmartPtr<V>::value, bool>::type contains(typename GetPtrHelper<V>::PtrType) const;
</span><span class="cx"> template<typename V = ValueType> typename std::enable_if<IsSmartPtr<V>::value, bool>::type remove(typename GetPtrHelper<V>::PtrType);
</span><del>- template<typename V = ValueType> typename std::enable_if<IsSmartPtr<V>::value, TakeType>::type take(typename GetPtrHelper<V>::PtrType);
</del><ins>+ template<typename V = ValueType> typename std::enable_if<IsSmartPtr<V>::value, ValueType>::type take(typename GetPtrHelper<V>::PtrType);
</ins><span class="cx">
</span><span class="cx"> static bool isValidValue(const ValueType&);
</span><span class="cx">
</span><span class="lines">@@ -129,14 +128,11 @@
</span><span class="cx"> template<typename T> static const T& extract(const T& t) { return t; }
</span><span class="cx"> };
</span><span class="cx">
</span><del>- template<typename ValueTraits, typename HashFunctions>
</del><ins>+ template<typename HashFunctions>
</ins><span class="cx"> struct HashSetTranslator {
</span><span class="cx"> template<typename T> static unsigned hash(const T& key) { return HashFunctions::hash(key); }
</span><span class="cx"> template<typename T, typename U> static bool equal(const T& a, const U& b) { return HashFunctions::equal(a, b); }
</span><del>- template<typename T, typename U, typename V> static void translate(T& location, U&&, V&& value)
- {
- ValueTraits::assignToEmpty(location, std::forward<V>(value));
- }
</del><ins>+ template<typename T, typename U, typename V> static void translate(T& location, U&&, V&& value) { location = std::forward<V>(value); }
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> template<typename Translator>
</span><span class="lines">@@ -270,24 +266,24 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename T, typename U, typename V>
</span><del>- inline auto HashSet<T, U, V>::take(iterator it) -> TakeType
</del><ins>+ inline auto HashSet<T, U, V>::take(iterator it) -> ValueType
</ins><span class="cx"> {
</span><span class="cx"> if (it == end())
</span><del>- return ValueTraits::take(ValueTraits::emptyValue());
</del><ins>+ return ValueTraits::emptyValue();
</ins><span class="cx">
</span><del>- auto result = ValueTraits::take(WTFMove(const_cast<ValueType&>(*it)));
</del><ins>+ ValueType result = WTFMove(const_cast<ValueType&>(*it));
</ins><span class="cx"> remove(it);
</span><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename T, typename U, typename V>
</span><del>- inline auto HashSet<T, U, V>::take(const ValueType& value) -> TakeType
</del><ins>+ inline auto HashSet<T, U, V>::take(const ValueType& value) -> ValueType
</ins><span class="cx"> {
</span><span class="cx"> return take(find(value));
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename T, typename U, typename V>
</span><del>- inline auto HashSet<T, U, V>::takeAny() -> TakeType
</del><ins>+ inline auto HashSet<T, U, V>::takeAny() -> ValueType
</ins><span class="cx"> {
</span><span class="cx"> return take(begin());
</span><span class="cx"> }
</span><span class="lines">@@ -296,14 +292,14 @@
</span><span class="cx"> template<typename V>
</span><span class="cx"> inline auto HashSet<Value, HashFunctions, Traits>::find(typename GetPtrHelper<V>::PtrType value) const -> typename std::enable_if<IsSmartPtr<V>::value, iterator>::type
</span><span class="cx"> {
</span><del>- return m_impl.template find<HashSetTranslator<Traits, HashFunctions>>(value);
</del><ins>+ return m_impl.template find<HashSetTranslator<HashFunctions>>(value);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename Value, typename HashFunctions, typename Traits>
</span><span class="cx"> template<typename V>
</span><span class="cx"> inline auto HashSet<Value, HashFunctions, Traits>::contains(typename GetPtrHelper<V>::PtrType value) const -> typename std::enable_if<IsSmartPtr<V>::value, bool>::type
</span><span class="cx"> {
</span><del>- return m_impl.template contains<HashSetTranslator<Traits, HashFunctions>>(value);
</del><ins>+ return m_impl.template contains<HashSetTranslator<HashFunctions>>(value);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename Value, typename HashFunctions, typename Traits>
</span><span class="lines">@@ -315,7 +311,7 @@
</span><span class="cx">
</span><span class="cx"> template<typename Value, typename HashFunctions, typename Traits>
</span><span class="cx"> template<typename V>
</span><del>- inline auto HashSet<Value, HashFunctions, Traits>::take(typename GetPtrHelper<V>::PtrType value) -> typename std::enable_if<IsSmartPtr<V>::value, TakeType>::type
</del><ins>+ inline auto HashSet<Value, HashFunctions, Traits>::take(typename GetPtrHelper<V>::PtrType value) -> typename std::enable_if<IsSmartPtr<V>::value, ValueType>::type
</ins><span class="cx"> {
</span><span class="cx"> return take(find(value));
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWTFwtfHashTableh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/HashTable.h (202135 => 202136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/HashTable.h        2016-06-16 20:39:44 UTC (rev 202135)
+++ trunk/Source/WTF/wtf/HashTable.h        2016-06-16 20:39:45 UTC (rev 202136)
</span><span class="lines">@@ -279,14 +279,11 @@
</span><span class="cx"> const_iterator m_iterator;
</span><span class="cx"> };
</span><span class="cx">
</span><del>- template<typename ValueTraits, typename HashFunctions> class IdentityHashTranslator {
</del><ins>+ template<typename HashFunctions> class IdentityHashTranslator {
</ins><span class="cx"> public:
</span><span class="cx"> template<typename T> static unsigned hash(const T& key) { return HashFunctions::hash(key); }
</span><span class="cx"> template<typename T, typename U> static bool equal(const T& a, const U& b) { return HashFunctions::equal(a, b); }
</span><del>- template<typename T, typename U, typename V> static void translate(T& location, const U&, V&& value)
- {
- ValueTraits::assignToEmpty(location, std::forward<V>(value));
- }
</del><ins>+ template<typename T, typename U, typename V> static void translate(T& location, const U&, V&& value) { location = std::forward<V>(value); }
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> template<typename IteratorType> struct HashTableAddResult {
</span><span class="lines">@@ -306,7 +303,7 @@
</span><span class="cx"> typedef Traits ValueTraits;
</span><span class="cx"> typedef Key KeyType;
</span><span class="cx"> typedef Value ValueType;
</span><del>- typedef IdentityHashTranslator<ValueTraits, HashFunctions> IdentityTranslatorType;
</del><ins>+ typedef IdentityHashTranslator<HashFunctions> IdentityTranslatorType;
</ins><span class="cx"> typedef HashTableAddResult<iterator> AddResult;
</span><span class="cx">
</span><span class="cx"> #if DUMP_HASHTABLE_STATS_PER_TABLE
</span></span></pre></div>
<a id="trunkSourceWTFwtfHashTraitsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/HashTraits.h (202135 => 202136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/HashTraits.h        2016-06-16 20:39:44 UTC (rev 202135)
+++ trunk/Source/WTF/wtf/HashTraits.h        2016-06-16 20:39:45 UTC (rev 202136)
</span><span class="lines">@@ -21,11 +21,10 @@
</span><span class="cx"> #ifndef WTF_HashTraits_h
</span><span class="cx"> #define WTF_HashTraits_h
</span><span class="cx">
</span><del>-#include <limits>
-#include <utility>
</del><span class="cx"> #include <wtf/HashFunctions.h>
</span><del>-#include <wtf/Optional.h>
</del><span class="cx"> #include <wtf/StdLibExtras.h>
</span><ins>+#include <utility>
+#include <limits>
</ins><span class="cx">
</span><span class="cx"> namespace WTF {
</span><span class="cx">
</span><span class="lines">@@ -62,18 +61,9 @@
</span><span class="cx">
</span><span class="cx"> static T emptyValue() { return T(); }
</span><span class="cx">
</span><del>- template<typename U, typename V>
- static void assignToEmpty(U& emptyValue, V&& value)
- {
- emptyValue = std::forward<V>(value);
- }
-
</del><span class="cx"> // Type for return value of functions that do not transfer ownership, such as get.
</span><span class="cx"> typedef T PeekType;
</span><span class="cx"> template<typename U> static U&& peek(U&& value) { return std::forward<U>(value); }
</span><del>-
- typedef T TakeType;
- template<typename U> static TakeType take(U&& value) { return std::forward<U>(value); }
</del><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> template<typename T> struct HashTraits : GenericHashTraits<T> { };
</span><span class="lines">@@ -175,23 +165,6 @@
</span><span class="cx"> }
</span><span class="cx"> };
</span><span class="cx">
</span><del>-template<typename P> struct HashTraits<Ref<P>> : SimpleClassHashTraits<Ref<P>> {
- static const bool emptyValueIsZero = true;
- static Ref<P> emptyValue() { return HashTableEmptyValue; }
-
- static const bool hasIsEmptyValueFunction = true;
- static bool isEmptyValue(const Ref<P>& value) { return value.isHashTableEmptyValue(); }
-
- static void assignToEmpty(Ref<P>& emptyValue, Ref<P>&& newValue) { ASSERT(isEmptyValue(emptyValue)); emptyValue.assignToHashTableEmptyValue(WTFMove(newValue)); }
-
- typedef P* PeekType;
- static PeekType peek(const Ref<P>& value) { return const_cast<PeekType>(value.ptrAllowingHashTableEmptyValue()); }
- static PeekType peek(P* value) { return value; }
-
- typedef Optional<Ref<P>> TakeType;
- static TakeType take(Ref<P>&& value) { return isEmptyValue(value) ? Nullopt : Optional<Ref<P>>(WTFMove(value)); }
-};
-
</del><span class="cx"> template<> struct HashTraits<String> : SimpleClassHashTraits<String> {
</span><span class="cx"> static const bool hasIsEmptyValueFunction = true;
</span><span class="cx"> static bool isEmptyValue(const String&);
</span></span></pre></div>
<a id="trunkSourceWTFwtfRefh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Ref.h (202135 => 202136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Ref.h        2016-06-16 20:39:44 UTC (rev 202135)
+++ trunk/Source/WTF/wtf/Ref.h        2016-06-16 20:39:45 UTC (rev 202136)
</span><span class="lines">@@ -114,25 +114,6 @@
</span><span class="cx"> return *this;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- // Hash table deleted/empty values, which are only constructed and never copied or destroyed.
- Ref(HashTableDeletedValueType) : m_ptr(hashTableDeletedValue()) { }
- bool isHashTableDeletedValue() const { return m_ptr == hashTableDeletedValue(); }
- static T* hashTableDeletedValue() { return reinterpret_cast<T*>(-1); }
-
- Ref(HashTableEmptyValueType) : m_ptr(hashTableEmptyValue()) { }
- bool isHashTableEmptyValue() const { return m_ptr == hashTableEmptyValue(); }
- static T* hashTableEmptyValue() { return nullptr; }
-
- const T* ptrAllowingHashTableEmptyValue() const { ASSERT(m_ptr || isHashTableEmptyValue()); return m_ptr; }
- T* ptrAllowingHashTableEmptyValue() { ASSERT(m_ptr || isHashTableEmptyValue()); return m_ptr; }
-
- void assignToHashTableEmptyValue(Ref&& reference)
- {
- ASSERT(m_ptr == hashTableEmptyValue());
- m_ptr = &reference.leakRef();
- ASSERT(m_ptr);
- }
-
</del><span class="cx"> const T* operator->() const { ASSERT(m_ptr); return m_ptr; }
</span><span class="cx"> T* operator->() { ASSERT(m_ptr); return m_ptr; }
</span><span class="cx">
</span><span class="lines">@@ -205,16 +186,12 @@
</span><span class="cx"> static T* getPtr(const Ref<T>& p) { return const_cast<T*>(p.ptr()); }
</span><span class="cx"> };
</span><span class="cx">
</span><del>-template <typename T>
-struct IsSmartPtr<Ref<T>> {
- static const bool value = true;
-};
-
</del><span class="cx"> template<typename T>
</span><span class="cx"> inline Ref<T> adoptRef(T& reference)
</span><span class="cx"> {
</span><span class="cx"> adopted(&reference);
</span><span class="cx"> return Ref<T>(reference, Ref<T>::Adopt);
</span><ins>+
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename ExpectedType, typename ArgType> inline bool is(Ref<ArgType>& source)
</span></span></pre></div>
<a id="trunkSourceWTFwtfRefPtrh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/RefPtr.h (202135 => 202136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/RefPtr.h        2016-06-16 20:39:44 UTC (rev 202135)
+++ trunk/Source/WTF/wtf/RefPtr.h        2016-06-16 20:39:45 UTC (rev 202136)
</span><span class="lines">@@ -34,6 +34,8 @@
</span><span class="cx"> template<typename T> class RefPtr;
</span><span class="cx"> template<typename T> RefPtr<T> adoptRef(T*);
</span><span class="cx">
</span><ins>+enum HashTableDeletedValueType { HashTableDeletedValue };
+
</ins><span class="cx"> template<typename T> class RefPtr {
</span><span class="cx"> WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (202135 => 202136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-06-16 20:39:44 UTC (rev 202135)
+++ trunk/Tools/ChangeLog        2016-06-16 20:39:45 UTC (rev 202136)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2016-06-16 Chris Dumez <cdumez@apple.com>
+
+ Unreviewed, rolling out r202002 and r202111.
+
+ Ryosuke says this was a JSBench regression on iOS
+
+ Reverted changesets:
+
+ "Make HashMap and HashSet work with Refs"
+ https://bugs.webkit.org/show_bug.cgi?id=158638
+ http://trac.webkit.org/changeset/202002
+
+ "Improve HashMap and HashSet support for Ref"
+ https://bugs.webkit.org/show_bug.cgi?id=158789
+ http://trac.webkit.org/changeset/202111
+
</ins><span class="cx"> 2016-06-15 Simon Fraser <simon.fraser@apple.com>
</span><span class="cx">
</span><span class="cx"> [iOS WK2] On iPad, indirect focussing of a text field doesn't always scroll to the correct location
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWTFHashMapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/HashMap.cpp (202135 => 202136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WTF/HashMap.cpp        2016-06-16 20:39:44 UTC (rev 202135)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/HashMap.cpp        2016-06-16 20:39:45 UTC (rev 202136)
</span><span class="lines">@@ -701,196 +701,4 @@
</span><span class="cx"> EXPECT_EQ(observer->count, 0u);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-TEST(WTF_HashMap, Ref_Key)
-{
- {
- HashMap<Ref<RefLogger>, int> map;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- map.add(WTFMove(ref), 1);
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashMap<Ref<RefLogger>, int> map;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- map.set(WTFMove(ref), 1);
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashMap<Ref<RefLogger>, int> map;
-
- RefLogger a("a");
- Ref<RefLogger> refA(a);
- map.add(WTFMove(refA), 1);
-
- Ref<RefLogger> refA2(a);
- map.set(WTFMove(refA2), 1);
- }
-
- ASSERT_STREQ("ref(a) ref(a) deref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashMap<Ref<RefLogger>, int> map;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- map.ensure(WTFMove(ref), []() {
- return 1;
- });
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashMap<Ref<RefLogger>, int> map;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- map.add(WTFMove(ref), 1);
-
- auto it = map.find(&a);
- ASSERT_TRUE(it != map.end());
-
- ASSERT_EQ(it->key.ptr(), &a);
- ASSERT_EQ(it->value, 1);
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashMap<Ref<RefLogger>, int> map;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- map.add(WTFMove(ref), 1);
-
- map.remove(&a);
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashMap<Ref<RefLogger>, int> map;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- map.add(WTFMove(ref), 1);
-
- int i = map.take(&a);
- ASSERT_EQ(i, 1);
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-}
-
-TEST(WTF_HashMap, Ref_Value)
-{
- {
- HashMap<int, Ref<RefLogger>> map;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- map.add(1, WTFMove(ref));
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashMap<int, Ref<RefLogger>> map;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- map.set(1, WTFMove(ref));
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashMap<int, Ref<RefLogger>> map;
-
- RefLogger a("a");
- Ref<RefLogger> refA(a);
- map.add(1, WTFMove(refA));
-
- RefLogger b("b");
- Ref<RefLogger> refB(b);
- map.set(1, WTFMove(refB));
- }
-
- ASSERT_STREQ("ref(a) ref(b) deref(a) deref(b) ", takeLogStr().c_str());
-
- {
- HashMap<int, Ref<RefLogger>> map;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- map.add(1, WTFMove(ref));
-
- auto aGet = map.get(1);
- ASSERT_EQ(aGet, &a);
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashMap<int, Ref<RefLogger>> map;
-
- auto emptyGet = map.get(1);
- ASSERT_TRUE(emptyGet == nullptr);
- }
-
- {
- HashMap<int, Ref<RefLogger>> map;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- map.add(1, WTFMove(ref));
-
- auto aOut = map.take(1);
- ASSERT_TRUE(static_cast<bool>(aOut));
- ASSERT_EQ(&a, aOut.value().ptr());
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashMap<int, Ref<RefLogger>> map;
-
- auto emptyTake = map.take(1);
- ASSERT_FALSE(static_cast<bool>(emptyTake));
- }
-
- {
- HashMap<int, Ref<RefLogger>> map;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- map.add(1, WTFMove(ref));
- map.remove(1);
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashMap<int, Ref<RefLogger>> map;
-
- RefLogger a("a");
- map.ensure(1, [&]() {
- Ref<RefLogger> ref(a);
- return ref;
- });
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-}
-
-
-
</del><span class="cx"> } // namespace TestWebKitAPI
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWTFHashSetcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/HashSet.cpp (202135 => 202136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WTF/HashSet.cpp        2016-06-16 20:39:44 UTC (rev 202135)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/HashSet.cpp        2016-06-16 20:39:45 UTC (rev 202136)
</span><span class="lines">@@ -27,7 +27,6 @@
</span><span class="cx">
</span><span class="cx"> #include "Counters.h"
</span><span class="cx"> #include "MoveOnly.h"
</span><del>-#include "RefLogger.h"
</del><span class="cx"> #include <wtf/HashSet.h>
</span><span class="cx"> #include <wtf/RefPtr.h>
</span><span class="cx">
</span><span class="lines">@@ -349,84 +348,5 @@
</span><span class="cx"> EXPECT_TRUE(observedBucket == observerAddress || observedBucket == reinterpret_cast<const DestructorObserver*>(-1));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-TEST(WTF_HashSet, Ref)
-{
- {
- HashSet<Ref<RefLogger>> set;
</del><span class="cx">
</span><del>- RefLogger a("a");
- Ref<RefLogger> ref(a);
- set.add(WTFMove(ref));
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashSet<Ref<RefLogger>> set;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- set.add(ref.copyRef());
- }
-
- ASSERT_STREQ("ref(a) ref(a) deref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashSet<Ref<RefLogger>> set;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- set.add(WTFMove(ref));
- set.remove(&a);
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashSet<Ref<RefLogger>> set;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- set.add(WTFMove(ref));
-
- auto aOut = set.take(&a);
- ASSERT_TRUE(static_cast<bool>(aOut));
- ASSERT_EQ(&a, aOut.value().ptr());
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashSet<Ref<RefLogger>> set;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- set.add(WTFMove(ref));
-
- auto aOut = set.takeAny();
- ASSERT_TRUE(static_cast<bool>(aOut));
- ASSERT_EQ(&a, aOut.value().ptr());
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-
- {
- HashSet<Ref<RefLogger>> set;
- auto emptyTake = set.takeAny();
- ASSERT_FALSE(static_cast<bool>(emptyTake));
- }
-
- {
- HashSet<Ref<RefLogger>> set;
-
- RefLogger a("a");
- Ref<RefLogger> ref(a);
- set.add(WTFMove(ref));
-
- ASSERT_TRUE(set.contains(&a));
- }
-
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
-}
-
</del><span class="cx"> } // namespace TestWebKitAPI
</span></span></pre>
</div>
</div>
</body>
</html>