Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(68)

Side by Side Diff: sdk/lib/_internal/compiler/js_lib/collection_patch.dart

Issue 1032783003: dart2js: use Es6 maps when available. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Mark empty-hashmap creation as having no side-effect. Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 // Patch file for dart:collection classes. 5 // Patch file for dart:collection classes.
6 import 'dart:_foreign_helper' show JS; 6 import 'dart:_foreign_helper' show JS;
7 import 'dart:_js_helper' show 7 import 'dart:_js_helper' show
8 fillLiteralMap, InternalMap, NoInline, NoThrows, patch, JsLinkedHashMap, 8 fillLiteralMap, InternalMap, NoInline, NoSideEffects, NoThrows, patch,
9 LinkedHashMapCell, LinkedHashMapKeyIterable, LinkedHashMapKeyIterator; 9 JsLinkedHashMap, LinkedHashMapCell, LinkedHashMapKeyIterable,
10 LinkedHashMapKeyIterator;
10 11
11 @patch 12 @patch
12 class HashMap<K, V> { 13 class HashMap<K, V> {
13 @patch 14 @patch
14 factory HashMap({ bool equals(K key1, K key2), 15 factory HashMap({ bool equals(K key1, K key2),
15 int hashCode(K key), 16 int hashCode(K key),
16 bool isValidKey(potentialKey) }) { 17 bool isValidKey(potentialKey) }) {
17 if (isValidKey == null) { 18 if (isValidKey == null) {
18 if (hashCode == null) { 19 if (hashCode == null) {
19 if (equals == null) { 20 if (equals == null) {
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 if (identical(JS('var', '#[#]', bucket, i), key)) return i; 380 if (identical(JS('var', '#[#]', bucket, i), key)) return i;
380 } 381 }
381 return -1; 382 return -1;
382 } 383 }
383 } 384 }
384 385
385 class _CustomHashMap<K, V> extends _HashMap<K, V> { 386 class _CustomHashMap<K, V> extends _HashMap<K, V> {
386 final _Equality<K> _equals; 387 final _Equality<K> _equals;
387 final _Hasher<K> _hashCode; 388 final _Hasher<K> _hashCode;
388 final _Predicate _validKey; 389 final _Predicate _validKey;
390
389 _CustomHashMap(this._equals, this._hashCode, bool validKey(potentialKey)) 391 _CustomHashMap(this._equals, this._hashCode, bool validKey(potentialKey))
390 : _validKey = (validKey != null) ? validKey : ((v) => v is K); 392 : _validKey = (validKey != null) ? validKey : ((v) => v is K);
391 393
392 V operator[](Object key) { 394 V operator[](Object key) {
393 if (!_validKey(key)) return null; 395 if (!_validKey(key)) return null;
394 return super._get(key); 396 return super._get(key);
395 } 397 }
396 398
397 void operator[]=(K key, V value) { 399 void operator[]=(K key, V value) {
398 super._set(key, value); 400 super._set(key, value);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 487
486 @patch 488 @patch
487 class LinkedHashMap<K, V> { 489 class LinkedHashMap<K, V> {
488 @patch 490 @patch
489 factory LinkedHashMap({ bool equals(K key1, K key2), 491 factory LinkedHashMap({ bool equals(K key1, K key2),
490 int hashCode(K key), 492 int hashCode(K key),
491 bool isValidKey(potentialKey) }) { 493 bool isValidKey(potentialKey) }) {
492 if (isValidKey == null) { 494 if (isValidKey == null) {
493 if (hashCode == null) { 495 if (hashCode == null) {
494 if (equals == null) { 496 if (equals == null) {
495 return new JsLinkedHashMap<K, V>(); 497 return new JsLinkedHashMap<K, V>.es6();
496 } 498 }
497 hashCode = _defaultHashCode; 499 hashCode = _defaultHashCode;
498 } else { 500 } else {
499 if (identical(identityHashCode, hashCode) && 501 if (identical(identityHashCode, hashCode) &&
500 identical(identical, equals)) { 502 identical(identical, equals)) {
501 return new _LinkedIdentityHashMap<K, V>(); 503 return new _LinkedIdentityHashMap<K, V>();
502 } 504 }
503 if (equals == null) { 505 if (equals == null) {
504 equals = _defaultEquals; 506 equals = _defaultEquals;
505 } 507 }
506 } 508 }
507 } else { 509 } else {
508 if (hashCode == null) { 510 if (hashCode == null) {
509 hashCode = _defaultHashCode; 511 hashCode = _defaultHashCode;
510 } 512 }
511 if (equals == null) { 513 if (equals == null) {
512 equals = _defaultEquals; 514 equals = _defaultEquals;
513 } 515 }
514 } 516 }
515 return new _LinkedCustomHashMap<K, V>(equals, hashCode, isValidKey); 517 return new _LinkedCustomHashMap<K, V>(equals, hashCode, isValidKey);
516 } 518 }
517 519
518 @patch 520 @patch
519 factory LinkedHashMap.identity() = _LinkedIdentityHashMap<K, V>; 521 factory LinkedHashMap.identity() = _LinkedIdentityHashMap<K, V>;
520 522
521 // Private factory constructor called by generated code for map literals. 523 // Private factory constructor called by generated code for map literals.
522 @NoInline() 524 @NoInline()
523 factory LinkedHashMap._literal(List keyValuePairs) { 525 factory LinkedHashMap._literal(List keyValuePairs) {
524 return fillLiteralMap(keyValuePairs, new JsLinkedHashMap<K, V>()); 526 return fillLiteralMap(keyValuePairs, new JsLinkedHashMap<K, V>.es6());
525 } 527 }
526 528
527 // Private factory constructor called by generated code for map literals. 529 // Private factory constructor called by generated code for map literals.
528 @NoThrows() @NoInline() 530 @NoThrows() @NoInline() @NoSideEffects()
529 factory LinkedHashMap._empty() { 531 factory LinkedHashMap._empty() {
530 return new JsLinkedHashMap<K, V>(); 532 return new JsLinkedHashMap<K, V>.es6();
531 } 533 }
532 } 534 }
533 535
536 // TODO(floitsch): use ES6 Maps when available.
534 class _LinkedIdentityHashMap<K, V> extends JsLinkedHashMap<K, V> { 537 class _LinkedIdentityHashMap<K, V> extends JsLinkedHashMap<K, V> {
535 int internalComputeHashCode(var key) { 538 int internalComputeHashCode(var key) {
536 // We force the hash codes to be unsigned 30-bit integers to avoid 539 // We force the hash codes to be unsigned 30-bit integers to avoid
537 // issues with problematic keys like '__proto__'. Another option 540 // issues with problematic keys like '__proto__'. Another option
538 // would be to throw an exception if the hash code isn't a number. 541 // would be to throw an exception if the hash code isn't a number.
539 return JS('int', '# & 0x3ffffff', identityHashCode(key)); 542 return JS('int', '# & 0x3ffffff', identityHashCode(key));
540 } 543 }
541 544
542 int internalFindBucketIndex(var bucket, var key) { 545 int internalFindBucketIndex(var bucket, var key) {
543 if (bucket == null) return -1; 546 if (bucket == null) return -1;
544 int length = JS('int', '#.length', bucket); 547 int length = JS('int', '#.length', bucket);
545 for (int i = 0; i < length; i++) { 548 for (int i = 0; i < length; i++) {
546 LinkedHashMapCell cell = JS('var', '#[#]', bucket, i); 549 LinkedHashMapCell cell = JS('var', '#[#]', bucket, i);
547 if (identical(cell.hashMapCellKey, key)) return i; 550 if (identical(cell.hashMapCellKey, key)) return i;
548 } 551 }
549 return -1; 552 return -1;
550 } 553 }
551 } 554 }
552 555
556 // TODO(floitsch): use ES6 maps when available.
553 class _LinkedCustomHashMap<K, V> extends JsLinkedHashMap<K, V> { 557 class _LinkedCustomHashMap<K, V> extends JsLinkedHashMap<K, V> {
554 final _Equality<K> _equals; 558 final _Equality<K> _equals;
555 final _Hasher<K> _hashCode; 559 final _Hasher<K> _hashCode;
556 final _Predicate _validKey; 560 final _Predicate _validKey;
561
557 _LinkedCustomHashMap(this._equals, this._hashCode, 562 _LinkedCustomHashMap(this._equals, this._hashCode,
558 bool validKey(potentialKey)) 563 bool validKey(potentialKey))
559 : _validKey = (validKey != null) ? validKey : ((v) => v is K); 564 : _validKey = (validKey != null) ? validKey : ((v) => v is K);
560 565
561 V operator[](Object key) { 566 V operator[](Object key) {
562 if (!_validKey(key)) return null; 567 if (!_validKey(key)) return null;
563 return super.internalGet(key); 568 return super.internalGet(key);
564 } 569 }
565 570
566 void operator[]=(K key, V value) { 571 void operator[]=(K key, V value) {
(...skipping 891 matching lines...) Expand 10 before | Expand all | Expand 10 after
1458 } else if (_cell == null) { 1463 } else if (_cell == null) {
1459 _current = null; 1464 _current = null;
1460 return false; 1465 return false;
1461 } else { 1466 } else {
1462 _current = _cell._element; 1467 _current = _cell._element;
1463 _cell = _cell._next; 1468 _cell = _cell._next;
1464 return true; 1469 return true;
1465 } 1470 }
1466 } 1471 }
1467 } 1472 }
OLDNEW
« no previous file with comments | « sdk/lib/_internal/compiler/js_lib/annotations.dart ('k') | sdk/lib/_internal/compiler/js_lib/linked_hash_map.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698