Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (212968 => 212969)
--- trunk/Source/_javascript_Core/ChangeLog 2017-02-24 20:44:41 UTC (rev 212968)
+++ trunk/Source/_javascript_Core/ChangeLog 2017-02-24 22:14:38 UTC (rev 212969)
@@ -1,3 +1,19 @@
+2017-02-24 Keith Miller <[email protected]>
+
+ We should be able to use std::tuples as keys in HashMap
+ https://bugs.webkit.org/show_bug.cgi?id=168805
+
+ Reviewed by Filip Pizlo.
+
+ Convert the mess of std::pairs we used as the keys in PrototypeMap
+ to a std::tuple. I also plan on using this for a HashMap in wasm.
+
+ * _javascript_Core.xcodeproj/project.pbxproj:
+ * runtime/PrototypeMap.cpp:
+ (JSC::PrototypeMap::createEmptyStructure):
+ (JSC::PrototypeMap::clearEmptyObjectStructureForPrototype):
+ * runtime/PrototypeMap.h:
+
2017-02-24 Saam Barati <[email protected]>
Unreviewed. Remove inaccurate copy-paste comment from r212939.
Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (212968 => 212969)
--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2017-02-24 20:44:41 UTC (rev 212968)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2017-02-24 22:14:38 UTC (rev 212969)
@@ -1262,6 +1262,7 @@
2AF7382C18BBBF92008A5A37 /* StructureIDTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2AF7382A18BBBF92008A5A37 /* StructureIDTable.cpp */; };
2AF7382D18BBBF92008A5A37 /* StructureIDTable.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AF7382B18BBBF92008A5A37 /* StructureIDTable.h */; settings = {ATTRIBUTES = (Private, ); }; };
2D342F36F7244096804ADB24 /* SourceOrigin.h in Headers */ = {isa = PBXBuildFile; fileRef = 425BA1337E4344E1B269A671 /* SourceOrigin.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 321D9E4CFB67423A97F191A7 /* ModuleNamespaceAccessCase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 20ECB15EFC524624BC2F02D5 /* ModuleNamespaceAccessCase.cpp */; };
371D842D17C98B6E00ECF994 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 371D842C17C98B6E00ECF994 /* libz.dylib */; };
412952771D2CF6BC00E78B89 /* builtins_generate_internals_wrapper_header.py in Headers */ = {isa = PBXBuildFile; fileRef = 412952731D2CF6AC00E78B89 /* builtins_generate_internals_wrapper_header.py */; settings = {ATTRIBUTES = (Private, ); }; };
412952781D2CF6BC00E78B89 /* builtins_generate_internals_wrapper_implementation.py in Headers */ = {isa = PBXBuildFile; fileRef = 412952741D2CF6AC00E78B89 /* builtins_generate_internals_wrapper_implementation.py */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -1673,6 +1674,7 @@
9E729407190F01A5001A91B5 /* InitializeThreading.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E178636C0D9BEEC300D74E75 /* InitializeThreading.cpp */; };
9E72940B190F0514001A91B5 /* BundlePath.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E72940A190F0514001A91B5 /* BundlePath.h */; };
9EA5C7A1190F084200508EBE /* BundlePath.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9E729409190F0306001A91B5 /* BundlePath.mm */; };
+ 9F63434577274FAFB9336C38 /* ModuleNamespaceAccessCase.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CE978E385A8498199052153 /* ModuleNamespaceAccessCase.h */; };
A125846E1B45A36000CC7F6C /* IntlNumberFormatConstructor.lut.h in Headers */ = {isa = PBXBuildFile; fileRef = A125846C1B45A36000CC7F6C /* IntlNumberFormatConstructor.lut.h */; };
A125846F1B45A36000CC7F6C /* IntlNumberFormatPrototype.lut.h in Headers */ = {isa = PBXBuildFile; fileRef = A125846D1B45A36000CC7F6C /* IntlNumberFormatPrototype.lut.h */; };
A12BBFF21B044A8B00664B69 /* IntlObject.h in Headers */ = {isa = PBXBuildFile; fileRef = A12BBFF11B044A8B00664B69 /* IntlObject.h */; };
@@ -2413,8 +2415,6 @@
FED94F2F171E3E2300BE77A4 /* Watchdog.h in Headers */ = {isa = PBXBuildFile; fileRef = FED94F2C171E3E2300BE77A4 /* Watchdog.h */; settings = {ATTRIBUTES = (Private, ); }; };
FEF040511AAE662D00BD28B0 /* CompareAndSwapTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FEF040501AAE662D00BD28B0 /* CompareAndSwapTest.cpp */; };
FEFD6FC61D5E7992008F2F0B /* JSStringInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = FEFD6FC51D5E7970008F2F0B /* JSStringInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 321D9E4CFB67423A97F191A7 /* ModuleNamespaceAccessCase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 20ECB15EFC524624BC2F02D5 /* ModuleNamespaceAccessCase.cpp */; };
- 9F63434577274FAFB9336C38 /* ModuleNamespaceAccessCase.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CE978E385A8498199052153 /* ModuleNamespaceAccessCase.h */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -3683,6 +3683,7 @@
1C9051450BA9E8A70081E9D0 /* Base.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Base.xcconfig; sourceTree = "<group>"; };
1CAA8B4A0D32C39A0041BCFF /* _javascript_.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _javascript_.h; sourceTree = "<group>"; };
1CAA8B4B0D32C39A0041BCFF /* _javascript_Core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _javascript_Core.h; sourceTree = "<group>"; };
+ 20ECB15EFC524624BC2F02D5 /* ModuleNamespaceAccessCase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModuleNamespaceAccessCase.cpp; sourceTree = "<group>"; };
2600B5A4152BAAA70091EE5F /* JSStringJoiner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSStringJoiner.cpp; sourceTree = "<group>"; };
2600B5A5152BAAA70091EE5F /* JSStringJoiner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSStringJoiner.h; sourceTree = "<group>"; };
262D85B41C0D650F006ACB61 /* AirFixPartialRegisterStalls.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AirFixPartialRegisterStalls.cpp; path = b3/air/AirFixPartialRegisterStalls.cpp; sourceTree = "<group>"; };
@@ -3736,6 +3737,7 @@
449097EE0F8F81B50076A327 /* FeatureDefines.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = FeatureDefines.xcconfig; sourceTree = "<group>"; };
451539B812DC994500EF7AC4 /* Yarr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Yarr.h; path = yarr/Yarr.h; sourceTree = "<group>"; };
45E12D8806A49B0F00E9DF84 /* jsc.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = jsc.cpp; sourceTree = "<group>"; tabWidth = 4; };
+ 4CE978E385A8498199052153 /* ModuleNamespaceAccessCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModuleNamespaceAccessCase.h; sourceTree = "<group>"; };
51F0EB6105C86C6B00E6DF1B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
51F0EC0705C86C9A00E6DF1B /* libobjc.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libobjc.dylib; path = /usr/lib/libobjc.dylib; sourceTree = "<absolute>"; };
52678F8C1A031009006A306D /* BasicBlockLocation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BasicBlockLocation.cpp; sourceTree = "<group>"; };
@@ -4984,8 +4986,6 @@
FEF040501AAE662D00BD28B0 /* CompareAndSwapTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CompareAndSwapTest.cpp; path = API/tests/CompareAndSwapTest.cpp; sourceTree = "<group>"; };
FEF040521AAEC4ED00BD28B0 /* CompareAndSwapTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CompareAndSwapTest.h; path = API/tests/CompareAndSwapTest.h; sourceTree = "<group>"; };
FEFD6FC51D5E7970008F2F0B /* JSStringInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSStringInlines.h; sourceTree = "<group>"; };
- 20ECB15EFC524624BC2F02D5 /* ModuleNamespaceAccessCase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ModuleNamespaceAccessCase.cpp; path = ModuleNamespaceAccessCase.cpp; sourceTree = "<group>"; };
- 4CE978E385A8498199052153 /* ModuleNamespaceAccessCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ModuleNamespaceAccessCase.h; path = ModuleNamespaceAccessCase.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
Modified: trunk/Source/_javascript_Core/runtime/PrototypeMap.cpp (212968 => 212969)
--- trunk/Source/_javascript_Core/runtime/PrototypeMap.cpp 2017-02-24 20:44:41 UTC (rev 212968)
+++ trunk/Source/_javascript_Core/runtime/PrototypeMap.cpp 2017-02-24 22:14:38 UTC (rev 212969)
@@ -56,7 +56,7 @@
inline Structure* PrototypeMap::createEmptyStructure(JSGlobalObject* globalObject, JSObject* prototype, const TypeInfo& typeInfo, const ClassInfo* classInfo, IndexingType indexingType, unsigned inlineCapacity)
{
- auto key = std::make_pair(prototype, std::make_pair(inlineCapacity, std::make_pair(classInfo, globalObject)));
+ auto key = std::make_tuple(prototype, inlineCapacity, classInfo, globalObject);
if (Structure* structure = m_structures.get(key)) {
ASSERT(isPrototype(prototype));
return structure;
@@ -86,7 +86,7 @@
void PrototypeMap::clearEmptyObjectStructureForPrototype(JSGlobalObject* globalObject, JSObject* object, unsigned inlineCapacity)
{
- m_structures.remove(std::make_pair(object, std::make_pair(inlineCapacity, std::make_pair(JSFinalObject::info(), globalObject))));
+ m_structures.remove(std::make_tuple(object, inlineCapacity, JSFinalObject::info(), globalObject));
}
} // namespace JSC
Modified: trunk/Source/_javascript_Core/runtime/PrototypeMap.h (212968 => 212969)
--- trunk/Source/_javascript_Core/runtime/PrototypeMap.h 2017-02-24 20:44:41 UTC (rev 212968)
+++ trunk/Source/_javascript_Core/runtime/PrototypeMap.h 2017-02-24 22:14:38 UTC (rev 212969)
@@ -57,7 +57,7 @@
WeakGCMap<JSObject*, JSObject> m_prototypes;
// FIXME: make the key a struct.
- typedef WeakGCMap<std::pair<JSObject*, std::pair<unsigned, std::pair<const ClassInfo*, JSGlobalObject*>>>, Structure> StructureMap;
+ typedef WeakGCMap<std::tuple<JSObject*, unsigned, const ClassInfo*, JSGlobalObject*>, Structure> StructureMap;
StructureMap m_structures;
};
Modified: trunk/Source/WTF/ChangeLog (212968 => 212969)
--- trunk/Source/WTF/ChangeLog 2017-02-24 20:44:41 UTC (rev 212968)
+++ trunk/Source/WTF/ChangeLog 2017-02-24 22:14:38 UTC (rev 212969)
@@ -1,3 +1,24 @@
+2017-02-24 Keith Miller <[email protected]>
+
+ We should be able to use std::tuples as keys in HashMap
+ https://bugs.webkit.org/show_bug.cgi?id=168805
+
+ Reviewed by Filip Pizlo.
+
+ This patch adds support for using std::tupeles as the key
+ type in HashMap. It is equivalent to doing a sequence of
+ std::pairs but has a nicer syntax.
+
+ * wtf/HashFunctions.h:
+ (WTF::TupleHash::hash):
+ (WTF::TupleHash::equal):
+ (WTF::TupleHash::allTrue):
+ * wtf/HashTraits.h:
+ (WTF::TupleHashTraits::allTrue):
+ (WTF::TupleHashTraits::emptyValue):
+ (WTF::TupleHashTraits::constructDeletedValue):
+ (WTF::TupleHashTraits::isDeletedValue):
+
2017-02-24 Alex Christensen <[email protected]>
Prepare to enable WebRTC on iOS
Modified: trunk/Source/WTF/wtf/HashFunctions.h (212968 => 212969)
--- trunk/Source/WTF/wtf/HashFunctions.h 2017-02-24 20:44:41 UTC (rev 212968)
+++ trunk/Source/WTF/wtf/HashFunctions.h 2017-02-24 22:14:38 UTC (rev 212969)
@@ -175,6 +175,45 @@
static const bool safeToCompareToEmptyOrDeleted = PairHash<T, U>::safeToCompareToEmptyOrDeleted;
};
+ template<typename... Types>
+ struct TupleHash {
+ template<size_t I = 0>
+ static typename std::enable_if<I < sizeof...(Types) - 1, unsigned>::type hash(const std::tuple<Types...>& t)
+ {
+ using IthTupleElementType = typename std::tuple_element<I, typename std::tuple<Types...>>::type;
+ return pairIntHash(DefaultHash<IthTupleElementType>::Hash::hash(std::get<I>(t)), hash<I + 1>(t));
+ }
+
+ template<size_t I = 0>
+ static typename std::enable_if<I == sizeof...(Types) - 1, unsigned>::type hash(const std::tuple<Types...>& t)
+ {
+ using IthTupleElementType = typename std::tuple_element<I, typename std::tuple<Types...>>::type;
+ return DefaultHash<IthTupleElementType>::Hash::hash(std::get<I>(t));
+ }
+
+ template<size_t I = 0>
+ static typename std::enable_if<I < sizeof...(Types) - 1, bool>::type equal(const std::tuple<Types...>& a, const std::tuple<Types...>& b)
+ {
+ using IthTupleElementType = typename std::tuple_element<I, typename std::tuple<Types...>>::type;
+ return DefaultHash<IthTupleElementType>::Hash::equal(std::get<I>(a), std::get<I>(b)) && equal<I + 1>(a, b);
+ }
+
+ template<size_t I = 0>
+ static typename std::enable_if<I == sizeof...(Types) - 1, bool>::type equal(const std::tuple<Types...>& a, const std::tuple<Types...>& b)
+ {
+ using IthTupleElementType = typename std::tuple_element<I, typename std::tuple<Types...>>::type;
+ return DefaultHash<IthTupleElementType>::Hash::equal(std::get<I>(a), std::get<I>(b));
+ }
+
+ // We should use safeToCompareToEmptyOrDeleted = DefaultHash<Types>::Hash::safeToCompareToEmptyOrDeleted &&... whenever
+ // we switch to C++17. We can't do anything better here right now because GCC can't do C++.
+ template<typename Bool>
+ static constexpr bool allTrue(Bool value) { return value; }
+ template<typename Bool, typename... Bools>
+ static constexpr bool allTrue(Bool value, Bools... values) { return value && allTrue(values...); }
+ static const bool safeToCompareToEmptyOrDeleted = allTrue(DefaultHash<Types>::Hash::safeToCompareToEmptyOrDeleted...);
+ };
+
// make IntHash the default hash function for many integer types
template<> struct DefaultHash<bool> { typedef IntHash<uint8_t> Hash; };
@@ -224,6 +263,7 @@
// make PairHash the default hash function for pairs of arbitrary values.
template<typename T, typename U> struct DefaultHash<std::pair<T, U>> { typedef PairHash<T, U> Hash; };
+ template<typename... Types> struct DefaultHash<std::tuple<Types...>> { typedef TupleHash<Types...> Hash; };
} // namespace WTF
Modified: trunk/Source/WTF/wtf/HashTraits.h (212968 => 212969)
--- trunk/Source/WTF/wtf/HashTraits.h 2017-02-24 20:44:41 UTC (rev 212968)
+++ trunk/Source/WTF/wtf/HashTraits.h 2017-02-24 22:14:38 UTC (rev 212969)
@@ -256,6 +256,29 @@
template<typename First, typename Second>
struct HashTraits<std::pair<First, Second>> : public PairHashTraits<HashTraits<First>, HashTraits<Second>> { };
+template<typename FirstTrait, typename... Traits>
+struct TupleHashTraits : GenericHashTraits<std::tuple<typename FirstTrait::TraitType, typename Traits::TraitType...>> {
+ typedef std::tuple<typename FirstTrait::TraitType, typename Traits::TraitType...> TraitType;
+ typedef std::tuple<typename FirstTrait::EmptyValueType, typename Traits::EmptyValueType...> EmptyValueType;
+
+ // We should use emptyValueIsZero = Traits::emptyValueIsZero &&... whenever we switch to C++17. We can't do anything
+ // better here right now because GCC can't do C++.
+ template<typename Bool>
+ static constexpr bool allTrue(Bool value) { return value; }
+ template<typename Bool, typename... Bools>
+ static constexpr bool allTrue(Bool value, Bools... values) { return value && allTrue(values...); }
+ static const bool emptyValueIsZero = allTrue(FirstTrait::emptyValueIsZero, Traits::emptyValueIsZero...);
+ static EmptyValueType emptyValue() { return std::make_tuple(FirstTrait::emptyValue(), Traits::emptyValue()...); }
+
+ static const unsigned minimumTableSize = FirstTrait::minimumTableSize;
+
+ static void constructDeletedValue(TraitType& slot) { FirstTrait::constructDeletedValue(std::get<0>(slot)); }
+ static bool isDeletedValue(const TraitType& value) { return FirstTrait::isDeletedValue(std::get<0>(value)); }
+};
+
+template<typename... Traits>
+struct HashTraits<std::tuple<Traits...>> : public TupleHashTraits<HashTraits<Traits>...> { };
+
template<typename KeyTypeArg, typename ValueTypeArg>
struct KeyValuePair {
typedef KeyTypeArg KeyType;