Index: runtime/lib/compact_hash.dart |
diff --git a/runtime/lib/compact_hash.dart b/runtime/lib/compact_hash.dart |
index 5bcb48e6fe5b41a7bc95d7ded1ee5dab007992fd..d973a740c393b7438e15aec974b24e7148fda6e2 100644 |
--- a/runtime/lib/compact_hash.dart |
+++ b/runtime/lib/compact_hash.dart |
@@ -16,13 +16,13 @@ abstract class _HashFieldBase { |
// NOTE: When maps are deserialized, their _index and _hashMask is regenerated |
// lazily by _regenerateIndex. |
// TODO(koda): Consider also using null _index for tiny, linear-search tables. |
- Uint32List _index = new Uint32List(_HashBase._INITIAL_INDEX_SIZE); |
+ Uint32List _index; |
// Cached in-place mask for the hash pattern component. |
- int _hashMask = _HashBase._indexSizeToHashMask(_HashBase._INITIAL_INDEX_SIZE); |
+ int _hashMask; |
// Fixed-length list of keys (set) or key/value at even/odd indices (map). |
- List _data = new List(_HashBase._INITIAL_INDEX_SIZE); |
+ List _data; |
// Length of _data that is used (i.e., keys + values for a map). |
int _usedData = 0; |
@@ -125,7 +125,7 @@ class _LinkedHashMapMixin<K, V> { |
int get length => (_usedData >> 1) - _deletedKeys; |
bool get isEmpty => length == 0; |
bool get isNotEmpty => !isEmpty; |
- |
+ |
void _rehash() { |
if ((_deletedKeys << 2) > _usedData) { |
// TODO(koda): Consider shrinking. |
@@ -140,12 +140,12 @@ class _LinkedHashMapMixin<K, V> { |
void clear() { |
if (!isEmpty) { |
// Use _data.length, since _index might be null. |
- _init(_data.length, _hashMask); |
+ _init(_data.length, _hashMask, null, 0); |
} |
} |
// Allocate new _index and _data, and optionally copy existing contents. |
- void _init(int size, int hashMask, [List oldData, int oldUsed]) { |
+ void _init(int size, int hashMask, List oldData, int oldUsed) { |
assert(size & (size - 1) == 0); |
assert(_HashBase._UNUSED_PAIR == 0); |
_index = new Uint32List(size); |
@@ -206,7 +206,7 @@ class _LinkedHashMapMixin<K, V> { |
int pair = _index[i]; |
while (pair != _HashBase._UNUSED_PAIR) { |
if (pair == _HashBase._DELETED_PAIR) { |
- if (firstDeleted < 0){ |
+ if (firstDeleted < 0) { |
firstDeleted = i; |
} |
} else { |
@@ -351,6 +351,12 @@ class _CompactLinkedIdentityHashMap<K, V> extends _HashFieldBase |
with MapMixin<K, V>, _LinkedHashMapMixin<K, V>, _HashBase, |
_IdenticalAndIdentityHashCode |
implements LinkedHashMap<K, V> { |
+ |
+ _CompactLinkedIdentityHashMap() { |
+ _index = new Uint32List(_HashBase._INITIAL_INDEX_SIZE); |
+ _hashMask = _HashBase._indexSizeToHashMask(_HashBase._INITIAL_INDEX_SIZE); |
+ _data = new List(_HashBase._INITIAL_INDEX_SIZE); |
+ } |
} |
class _CompactLinkedCustomHashMap<K, V> extends _HashFieldBase |
@@ -369,7 +375,11 @@ class _CompactLinkedCustomHashMap<K, V> extends _HashFieldBase |
V remove(Object o) => _validKey(o) ? super.remove(o) : null; |
_CompactLinkedCustomHashMap(this._equality, this._hasher, validKey) |
- : _validKey = (validKey != null) ? validKey : new _TypeTest<K>().test; |
+ : _validKey = (validKey != null) ? validKey : new _TypeTest<K>().test { |
+ _index = new Uint32List(_HashBase._INITIAL_INDEX_SIZE); |
+ _hashMask = _HashBase._indexSizeToHashMask(_HashBase._INITIAL_INDEX_SIZE); |
+ _data = new List(_HashBase._INITIAL_INDEX_SIZE); |
+ } |
} |
// Iterates through _data[_offset + _step], _data[_offset + 2*_step], ... |
@@ -429,6 +439,7 @@ class _CompactLinkedHashSet<E> extends _HashFieldBase |
_CompactLinkedHashSet() { |
assert(_HashBase._UNUSED_PAIR == 0); |
_index = new Uint32List(_HashBase._INITIAL_INDEX_SIZE); |
+ _hashMask = _HashBase._indexSizeToHashMask(_HashBase._INITIAL_INDEX_SIZE); |
_data = new List(_HashBase._INITIAL_INDEX_SIZE >> 1); |
} |
@@ -444,11 +455,11 @@ class _CompactLinkedHashSet<E> extends _HashFieldBase |
void clear() { |
if (!isEmpty) { |
- _init(_index.length, _hashMask); |
+ _init(_index.length, _hashMask, null, 0); |
} |
} |
- void _init(int size, int hashMask, [List oldData, int oldUsed]) { |
+ void _init(int size, int hashMask, List oldData, int oldUsed) { |
_index = new Uint32List(size); |
_hashMask = hashMask; |
_data = new List(size >> 1); |
@@ -475,7 +486,7 @@ class _CompactLinkedHashSet<E> extends _HashFieldBase |
int pair = _index[i]; |
while (pair != _HashBase._UNUSED_PAIR) { |
if (pair == _HashBase._DELETED_PAIR) { |
- if (firstDeleted < 0){ |
+ if (firstDeleted < 0) { |
firstDeleted = i; |
} |
} else { |