Index: sdk/lib/_internal/compiler/js_lib/collection_patch.dart |
diff --git a/sdk/lib/_internal/compiler/js_lib/collection_patch.dart b/sdk/lib/_internal/compiler/js_lib/collection_patch.dart |
index 67e54bc0978c6367684ee3b35025e006361add9f..509b83edd0cb82569cb54c94dea5f04db478de5e 100644 |
--- a/sdk/lib/_internal/compiler/js_lib/collection_patch.dart |
+++ b/sdk/lib/_internal/compiler/js_lib/collection_patch.dart |
@@ -5,7 +5,8 @@ |
// Patch file for dart:collection classes. |
import 'dart:_foreign_helper' show JS; |
import 'dart:_js_helper' show |
- fillLiteralMap, InternalMap, NoInline, NoThrows, patch, JsLinkedHashMap, |
+ fillLiteralMap, InternalMap, NoInline, NoThrows, patch, |
+ JsLinkedHashMap, Es6LinkedHashMap, |
LinkedHashMapCell, LinkedHashMapKeyIterable, LinkedHashMapKeyIterator; |
@patch |
@@ -386,6 +387,7 @@ class _CustomHashMap<K, V> extends _HashMap<K, V> { |
final _Equality<K> _equals; |
final _Hasher<K> _hashCode; |
final _Predicate _validKey; |
+ |
_CustomHashMap(this._equals, this._hashCode, bool validKey(potentialKey)) |
: _validKey = (validKey != null) ? validKey : ((v) => v is K); |
@@ -492,7 +494,11 @@ class LinkedHashMap<K, V> { |
if (isValidKey == null) { |
if (hashCode == null) { |
if (equals == null) { |
- return new JsLinkedHashMap<K, V>(); |
+ if (JsLinkedHashMap.supportsEs6Maps) { |
+ return new Es6LinkedHashMap<K, V>(); |
+ } else { |
+ return new JsLinkedHashMap<K, V>(); |
+ } |
} |
hashCode = _defaultHashCode; |
} else { |
@@ -531,7 +537,9 @@ class LinkedHashMap<K, V> { |
} |
} |
+// TODO(floitsch): use ES6 Maps when available. |
class _LinkedIdentityHashMap<K, V> extends JsLinkedHashMap<K, V> { |
+ |
int internalComputeHashCode(var key) { |
// We force the hash codes to be unsigned 30-bit integers to avoid |
// issues with problematic keys like '__proto__'. Another option |
@@ -550,14 +558,17 @@ class _LinkedIdentityHashMap<K, V> extends JsLinkedHashMap<K, V> { |
} |
} |
+// TODO(floitsch): use ES6 maps when available. |
class _LinkedCustomHashMap<K, V> extends JsLinkedHashMap<K, V> { |
final _Equality<K> _equals; |
final _Hasher<K> _hashCode; |
final _Predicate _validKey; |
+ |
_LinkedCustomHashMap(this._equals, this._hashCode, |
bool validKey(potentialKey)) |
: _validKey = (validKey != null) ? validKey : ((v) => v is K); |
+ |
V operator[](Object key) { |
if (!_validKey(key)) return null; |
return super.internalGet(key); |