| 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 dcef50665806042b1c54e63839a7d06188819d7a..9df7c993393011693306552cfbee61454f19a616 100644
|
| --- a/sdk/lib/_internal/compiler/js_lib/collection_patch.dart
|
| +++ b/sdk/lib/_internal/compiler/js_lib/collection_patch.dart
|
| @@ -9,8 +9,6 @@ import 'dart:_js_helper' show
|
| JsLinkedHashMap, LinkedHashMapCell, LinkedHashMapKeyIterable,
|
| LinkedHashMapKeyIterator;
|
|
|
| -const _USE_ES6_MAPS = const bool.fromEnvironment("dart2js.use.es6.maps");
|
| -
|
| @patch
|
| class HashMap<K, V> {
|
| @patch
|
| @@ -502,7 +500,7 @@ class LinkedHashMap<K, V> {
|
| } else {
|
| if (identical(identityHashCode, hashCode) &&
|
| identical(identical, equals)) {
|
| - return new _LinkedIdentityHashMap<K, V>.es6();
|
| + return new _LinkedIdentityHashMap<K, V>();
|
| }
|
| if (equals == null) {
|
| equals = _defaultEquals;
|
| @@ -520,7 +518,7 @@ class LinkedHashMap<K, V> {
|
| }
|
|
|
| @patch
|
| - factory LinkedHashMap.identity() = _LinkedIdentityHashMap<K, V>.es6;
|
| + factory LinkedHashMap.identity() = _LinkedIdentityHashMap<K, V>;
|
|
|
| // Private factory constructor called by generated code for map literals.
|
| @NoInline()
|
| @@ -546,20 +544,8 @@ class LinkedHashMap<K, V> {
|
| fillLiteralMap(keyValuePairs, new JsLinkedHashMap());
|
| }
|
|
|
| +// TODO(floitsch): use ES6 Maps when available.
|
| class _LinkedIdentityHashMap<K, V> extends JsLinkedHashMap<K, V> {
|
| - static bool get _supportsEs6Maps {
|
| - return JS('returns:bool;depends:none;effects:none;throws:never;gvn:true',
|
| - 'typeof Map != "undefined"');
|
| - }
|
| -
|
| - factory _LinkedIdentityHashMap.es6() {
|
| - return (_USE_ES6_MAPS && _LinkedIdentityHashMap._supportsEs6Maps)
|
| - ? new _LinkedIdentityHashMap<K, V>()
|
| - : new _Es6LinkedIdentityHashMap<K, V>();
|
| - }
|
| -
|
| - _LinkedIdentityHashMap();
|
| -
|
| 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
|
| @@ -578,164 +564,6 @@ class _LinkedIdentityHashMap<K, V> extends JsLinkedHashMap<K, V> {
|
| }
|
| }
|
|
|
| -class _Es6LinkedIdentityHashMap<K, V>
|
| - implements LinkedHashMap<K, V>, InternalMap {
|
| - final _map;
|
| - int _modifications = 0;
|
| -
|
| - _Es6LinkedIdentityHashMap() : _map = JS('var', 'new Map()');
|
| -
|
| - int get length => JS('int', '#.size', _map);
|
| - bool get isEmpty => length == 0;
|
| - bool get isNotEmpty => !isEmpty;
|
| -
|
| - Iterable<K> get keys => new _Es6MapIterable<K>(this, true);
|
| -
|
| - Iterable<V> get values =>
|
| - new _Es6MapIterable<V>(this, false);
|
| -
|
| - bool containsKey(Object key) {
|
| - return JS('bool', '#.has(#)', _map, key);
|
| - }
|
| -
|
| - bool containsValue(Object value) {
|
| - return values.any((each) => each == value);
|
| - }
|
| -
|
| - void addAll(Map<K, V> other) {
|
| - other.forEach((K key, V value) {
|
| - this[key] = value;
|
| - _modified();
|
| - });
|
| - }
|
| -
|
| - V operator[](Object key) {
|
| - return JS('var', '#.get(#)', _map, key);
|
| - }
|
| -
|
| - void operator[]=(K key, V value) {
|
| - JS('var', '#.set(#, #)', _map, key, value);
|
| - _modified();
|
| - }
|
| -
|
| - V putIfAbsent(K key, V ifAbsent()) {
|
| - if (containsKey(key)) return this[key];
|
| - V value = ifAbsent();
|
| - this[key] = value;
|
| - _modified();
|
| - return value;
|
| - }
|
| -
|
| - V remove(Object key) {
|
| - V value = this[key];
|
| - JS('bool', '#.delete(#)', _map, key);
|
| - _modified();
|
| - return value;
|
| - }
|
| -
|
| - void clear() {
|
| - JS('void', '#.clear()', _map);
|
| - _modified();
|
| - }
|
| -
|
| - void forEach(void action(K key, V value)) {
|
| - var jsEntries = JS('var', '#.entries()', _map);
|
| - int modifications = _modifications;
|
| - while (true) {
|
| - var next = JS('var', '#.next()', jsEntries);
|
| - bool done = JS('bool', '#.done', next);
|
| - if (done) break;
|
| - var entry = JS('var', '#.value', next);
|
| - var key = JS('var', '#[0]', entry);
|
| - var value = JS('var', '#[1]', entry);
|
| - action(key, value);
|
| - if (modifications != _modifications) {
|
| - throw new ConcurrentModificationError(this);
|
| - }
|
| - }
|
| - }
|
| -
|
| - void _modified() {
|
| - // Value cycles after 2^30 modifications. If you keep hold of an
|
| - // iterator for that long, you might miss a modification
|
| - // detection, and iteration can go sour. Don't do that.
|
| - _modifications = (_modifications + 1) & 0x3ffffff;
|
| - }
|
| -
|
| - String toString() => Maps.mapToString(this);
|
| -}
|
| -
|
| -class _Es6MapIterable<E> extends Iterable<E>
|
| - implements EfficientLength {
|
| - final _map;
|
| - final bool _isKeys;
|
| -
|
| - _Es6MapIterable(this._map, this._isKeys);
|
| -
|
| - int get length => _map.length;
|
| - bool get isEmpty => _map.isEmpty;
|
| -
|
| - Iterator<E> get iterator =>
|
| - new _Es6MapIterator<E>(_map, _map._modifications, _isKeys);
|
| -
|
| - bool contains(Object element) => _map.containsKey(element);
|
| -
|
| - void forEach(void f(E element)) {
|
| - var jsIterator;
|
| - if (_isKeys) {
|
| - jsIterator = JS('var', '#.keys()', _map._map);
|
| - } else {
|
| - jsIterator = JS('var', '#.values()', _map._map);
|
| - }
|
| - int modifications = _map.modifications;
|
| - while (true) {
|
| - var next = JS('var', '#.next()', jsIterator);
|
| - bool done = JS('bool', '#.done', next);
|
| - if (done) break;
|
| - var value = JS('var', '#.value', next);
|
| - f(value);
|
| - if (modifications != _map.modifications) {
|
| - throw new ConcurrentModificationError(_map);
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -class _Es6MapIterator<E> implements Iterator<E> {
|
| - final _map;
|
| - final int _modifications;
|
| - final bool _isKeys;
|
| - var _jsIterator;
|
| - var _next;
|
| - E _current;
|
| -
|
| - _Es6MapIterator(this._map, this._modifications, this._isKeys) {
|
| - if (_isKeys) {
|
| - _jsIterator = JS('var', '#.keys()', _map._map);
|
| - } else {
|
| - _jsIterator = JS('var', '#.values()', _map._map);
|
| - }
|
| - _next = JS('var', '#.next()', _jsIterator);
|
| - }
|
| -
|
| - E get current => _current;
|
| -
|
| - bool moveNext() {
|
| - if (_modifications != _map._modifications) {
|
| - throw new ConcurrentModificationError(_map);
|
| - }
|
| - bool done = JS('bool', '#.done', _next);
|
| - if (done) {
|
| - _current = null;
|
| - return false;
|
| - } else {
|
| - _current = JS('var', '#.value', _next);
|
| - _next = JS('var', '#.next()', _jsIterator);
|
| - return true;
|
| - }
|
| - }
|
| -}
|
| -
|
| // TODO(floitsch): use ES6 maps when available.
|
| class _LinkedCustomHashMap<K, V> extends JsLinkedHashMap<K, V> {
|
| final _Equality<K> _equals;
|
|
|