mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 16:59:47 +00:00
[vm/wasm] Make HashMap<K, V> use non-generic _HashMapEntry object
TEST=ci Change-Id: Ifef2ef8859a037cd2830182520e6d19cb9b2281e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/357142 Reviewed-by: Slava Egorov <vegorov@google.com> Commit-Queue: Martin Kustermann <kustermann@google.com>
This commit is contained in:
parent
0a68ca97b9
commit
bca5e833cb
|
@ -4,7 +4,7 @@
|
|||
|
||||
import "dart:_internal" as internal;
|
||||
|
||||
import "dart:_internal" show patch, IterableElementError;
|
||||
import "dart:_internal" show unsafeCast, patch, IterableElementError;
|
||||
|
||||
class _TypeTest<T> {
|
||||
bool test(v) => v is T;
|
||||
|
@ -50,7 +50,7 @@ base class _HashMap<K, V> extends MapBase<K, V> implements HashMap<K, V> {
|
|||
static const int _INITIAL_CAPACITY = 8;
|
||||
|
||||
int _elementCount = 0;
|
||||
var _buckets = List<_HashMapEntry<K, V>?>.filled(_INITIAL_CAPACITY, null);
|
||||
var _buckets = List<_HashMapEntry?>.filled(_INITIAL_CAPACITY, null);
|
||||
int _modificationCount = 0;
|
||||
|
||||
int get length => _elementCount;
|
||||
|
@ -92,7 +92,7 @@ base class _HashMap<K, V> extends MapBase<K, V> implements HashMap<K, V> {
|
|||
var entry = buckets[index];
|
||||
while (entry != null) {
|
||||
if (hashCode == entry.hashCode && entry.key == key) {
|
||||
return entry.value;
|
||||
return unsafeCast<V>(entry.value);
|
||||
}
|
||||
entry = entry.next;
|
||||
}
|
||||
|
@ -123,7 +123,7 @@ base class _HashMap<K, V> extends MapBase<K, V> implements HashMap<K, V> {
|
|||
var entry = buckets[index];
|
||||
while (entry != null) {
|
||||
if (hashCode == entry.hashCode && entry.key == key) {
|
||||
return entry.value;
|
||||
return unsafeCast<V>(entry.value);
|
||||
}
|
||||
entry = entry.next;
|
||||
}
|
||||
|
@ -150,7 +150,7 @@ base class _HashMap<K, V> extends MapBase<K, V> implements HashMap<K, V> {
|
|||
for (int i = 0; i < length; i++) {
|
||||
var entry = buckets[i];
|
||||
while (entry != null) {
|
||||
action(entry.key, entry.value);
|
||||
action(unsafeCast<K>(entry.key), unsafeCast<V>(entry.value));
|
||||
if (stamp != _modificationCount) {
|
||||
throw new ConcurrentModificationError(this);
|
||||
}
|
||||
|
@ -164,7 +164,7 @@ base class _HashMap<K, V> extends MapBase<K, V> implements HashMap<K, V> {
|
|||
final buckets = _buckets;
|
||||
final index = hashCode & (buckets.length - 1);
|
||||
var entry = buckets[index];
|
||||
_HashMapEntry<K, V>? previous = null;
|
||||
_HashMapEntry? previous = null;
|
||||
while (entry != null) {
|
||||
final next = entry.next;
|
||||
if (hashCode == entry.hashCode && entry.key == key) {
|
||||
|
@ -172,7 +172,7 @@ base class _HashMap<K, V> extends MapBase<K, V> implements HashMap<K, V> {
|
|||
_elementCount--;
|
||||
_modificationCount =
|
||||
(_modificationCount + 1) & _MODIFICATION_COUNT_MASK;
|
||||
return entry.value;
|
||||
return unsafeCast<V>(entry.value);
|
||||
}
|
||||
previous = entry;
|
||||
entry = next;
|
||||
|
@ -188,8 +188,8 @@ base class _HashMap<K, V> extends MapBase<K, V> implements HashMap<K, V> {
|
|||
}
|
||||
}
|
||||
|
||||
void _removeEntry(_HashMapEntry<K, V> entry,
|
||||
_HashMapEntry<K, V>? previousInBucket, int bucketIndex) {
|
||||
void _removeEntry(
|
||||
_HashMapEntry entry, _HashMapEntry? previousInBucket, int bucketIndex) {
|
||||
if (previousInBucket == null) {
|
||||
_buckets[bucketIndex] = entry.next;
|
||||
} else {
|
||||
|
@ -197,9 +197,9 @@ base class _HashMap<K, V> extends MapBase<K, V> implements HashMap<K, V> {
|
|||
}
|
||||
}
|
||||
|
||||
void _addEntry(List<_HashMapEntry<K, V>?> buckets, int index, int length,
|
||||
K key, V value, int hashCode) {
|
||||
final entry = new _HashMapEntry<K, V>(key, value, hashCode, buckets[index]);
|
||||
void _addEntry(List<_HashMapEntry?> buckets, int index, int length, K key,
|
||||
V value, int hashCode) {
|
||||
final entry = new _HashMapEntry(key, value, hashCode, buckets[index]);
|
||||
buckets[index] = entry;
|
||||
final newElements = _elementCount + 1;
|
||||
_elementCount = newElements;
|
||||
|
@ -213,7 +213,7 @@ base class _HashMap<K, V> extends MapBase<K, V> implements HashMap<K, V> {
|
|||
final oldBuckets = _buckets;
|
||||
final oldLength = oldBuckets.length;
|
||||
final newLength = oldLength << 1;
|
||||
final newBuckets = new List<_HashMapEntry<K, V>?>.filled(newLength, null);
|
||||
final newBuckets = new List<_HashMapEntry?>.filled(newLength, null);
|
||||
for (int i = 0; i < oldLength; i++) {
|
||||
var entry = oldBuckets[i];
|
||||
while (entry != null) {
|
||||
|
@ -237,7 +237,7 @@ base class _HashMap<K, V> extends MapBase<K, V> implements HashMap<K, V> {
|
|||
var entry = buckets[index];
|
||||
while (entry != null) {
|
||||
if (hashCode == entry.hashCode && entry.key == key) {
|
||||
return entry.value = update(entry.value);
|
||||
return entry.value = update(unsafeCast<V>(entry.value));
|
||||
}
|
||||
entry = entry.next;
|
||||
}
|
||||
|
@ -268,7 +268,10 @@ base class _CustomHashMap<K, V> extends _HashMap<K, V> {
|
|||
final index = hashCode & (buckets.length - 1);
|
||||
var entry = buckets[index];
|
||||
while (entry != null) {
|
||||
if (hashCode == entry.hashCode && _equals(entry.key, lkey)) return true;
|
||||
if (hashCode == entry.hashCode &&
|
||||
_equals(unsafeCast<K>(entry.key), unsafeCast<K>(lkey))) {
|
||||
return true;
|
||||
}
|
||||
entry = entry.next;
|
||||
}
|
||||
return false;
|
||||
|
@ -282,8 +285,9 @@ base class _CustomHashMap<K, V> extends _HashMap<K, V> {
|
|||
final index = hashCode & (buckets.length - 1);
|
||||
var entry = buckets[index];
|
||||
while (entry != null) {
|
||||
if (hashCode == entry.hashCode && _equals(entry.key, lkey)) {
|
||||
return entry.value;
|
||||
if (hashCode == entry.hashCode &&
|
||||
_equals(unsafeCast<K>(entry.key), unsafeCast<K>(lkey))) {
|
||||
return unsafeCast<V>(entry.value);
|
||||
}
|
||||
entry = entry.next;
|
||||
}
|
||||
|
@ -297,7 +301,8 @@ base class _CustomHashMap<K, V> extends _HashMap<K, V> {
|
|||
final index = hashCode & (length - 1);
|
||||
var entry = buckets[index];
|
||||
while (entry != null) {
|
||||
if (hashCode == entry.hashCode && _equals(entry.key, key)) {
|
||||
if (hashCode == entry.hashCode &&
|
||||
_equals(unsafeCast<K>(entry.key), unsafeCast<K>(key))) {
|
||||
entry.value = value;
|
||||
return;
|
||||
}
|
||||
|
@ -313,8 +318,9 @@ base class _CustomHashMap<K, V> extends _HashMap<K, V> {
|
|||
final index = hashCode & (length - 1);
|
||||
var entry = buckets[index];
|
||||
while (entry != null) {
|
||||
if (hashCode == entry.hashCode && _equals(entry.key, key)) {
|
||||
return entry.value;
|
||||
if (hashCode == entry.hashCode &&
|
||||
_equals(unsafeCast<K>(entry.key), unsafeCast<K>(key))) {
|
||||
return unsafeCast<V>(entry.value);
|
||||
}
|
||||
entry = entry.next;
|
||||
}
|
||||
|
@ -335,15 +341,16 @@ base class _CustomHashMap<K, V> extends _HashMap<K, V> {
|
|||
final buckets = _buckets;
|
||||
final index = hashCode & (buckets.length - 1);
|
||||
var entry = buckets[index];
|
||||
_HashMapEntry<K, V>? previous = null;
|
||||
_HashMapEntry? previous = null;
|
||||
while (entry != null) {
|
||||
final next = entry.next;
|
||||
if (hashCode == entry.hashCode && _equals(entry.key, lkey)) {
|
||||
if (hashCode == entry.hashCode &&
|
||||
_equals(unsafeCast<K>(entry.key), unsafeCast<K>(lkey))) {
|
||||
_removeEntry(entry, previous, index);
|
||||
_elementCount--;
|
||||
_modificationCount =
|
||||
(_modificationCount + 1) & _MODIFICATION_COUNT_MASK;
|
||||
return entry.value;
|
||||
return unsafeCast<V>(entry.value);
|
||||
}
|
||||
previous = entry;
|
||||
entry = next;
|
||||
|
@ -374,7 +381,7 @@ base class _IdentityHashMap<K, V> extends _HashMap<K, V> {
|
|||
var entry = buckets[index];
|
||||
while (entry != null) {
|
||||
if (hashCode == entry.hashCode && identical(entry.key, key)) {
|
||||
return entry.value;
|
||||
return unsafeCast<V>(entry.value);
|
||||
}
|
||||
entry = entry.next;
|
||||
}
|
||||
|
@ -405,7 +412,7 @@ base class _IdentityHashMap<K, V> extends _HashMap<K, V> {
|
|||
var entry = buckets[index];
|
||||
while (entry != null) {
|
||||
if (hashCode == entry.hashCode && identical(entry.key, key)) {
|
||||
return entry.value;
|
||||
return unsafeCast<V>(entry.value);
|
||||
}
|
||||
entry = entry.next;
|
||||
}
|
||||
|
@ -424,7 +431,7 @@ base class _IdentityHashMap<K, V> extends _HashMap<K, V> {
|
|||
final buckets = _buckets;
|
||||
final index = hashCode & (buckets.length - 1);
|
||||
var entry = buckets[index];
|
||||
_HashMapEntry<K, V>? previous = null;
|
||||
_HashMapEntry? previous = null;
|
||||
while (entry != null) {
|
||||
final next = entry.next;
|
||||
if (hashCode == entry.hashCode && identical(entry.key, key)) {
|
||||
|
@ -432,7 +439,7 @@ base class _IdentityHashMap<K, V> extends _HashMap<K, V> {
|
|||
_elementCount--;
|
||||
_modificationCount =
|
||||
(_modificationCount + 1) & _MODIFICATION_COUNT_MASK;
|
||||
return entry.value;
|
||||
return unsafeCast<V>(entry.value);
|
||||
}
|
||||
previous = entry;
|
||||
entry = next;
|
||||
|
@ -449,7 +456,7 @@ base class _IdentityHashMap<K, V> extends _HashMap<K, V> {
|
|||
var entry = buckets[index];
|
||||
while (entry != null) {
|
||||
if (hashCode == entry.hashCode && identical(entry.key, key)) {
|
||||
return entry.value = update(entry.value);
|
||||
return entry.value = update(unsafeCast<V>(entry.value));
|
||||
}
|
||||
entry = entry.next;
|
||||
}
|
||||
|
@ -465,11 +472,11 @@ base class _IdentityHashMap<K, V> extends _HashMap<K, V> {
|
|||
Set<K> _newKeySet() => new _IdentityHashSet<K>();
|
||||
}
|
||||
|
||||
class _HashMapEntry<K, V> {
|
||||
final K key;
|
||||
V value;
|
||||
class _HashMapEntry {
|
||||
final Object? key;
|
||||
Object? value;
|
||||
final int hashCode;
|
||||
_HashMapEntry<K, V>? next;
|
||||
_HashMapEntry? next;
|
||||
_HashMapEntry(this.key, this.value, this.hashCode, this.next);
|
||||
}
|
||||
|
||||
|
@ -511,7 +518,7 @@ abstract class _HashMapIterator<K, V, E> implements Iterator<E> {
|
|||
final int _stamp;
|
||||
|
||||
int _index = 0;
|
||||
_HashMapEntry<K, V>? _entry;
|
||||
_HashMapEntry? _entry;
|
||||
|
||||
_HashMapIterator(this._map) : _stamp = _map._modificationCount;
|
||||
|
||||
|
@ -545,12 +552,12 @@ abstract class _HashMapIterator<K, V, E> implements Iterator<E> {
|
|||
|
||||
class _HashMapKeyIterator<K, V> extends _HashMapIterator<K, V, K> {
|
||||
_HashMapKeyIterator(_HashMap<K, V> map) : super(map);
|
||||
K get current => _entry!.key;
|
||||
K get current => unsafeCast<K>(_entry!.key);
|
||||
}
|
||||
|
||||
class _HashMapValueIterator<K, V> extends _HashMapIterator<K, V, V> {
|
||||
_HashMapValueIterator(_HashMap<K, V> map) : super(map);
|
||||
V get current => _entry!.value;
|
||||
V get current => unsafeCast<V>(_entry!.value);
|
||||
}
|
||||
|
||||
@patch
|
||||
|
|
Loading…
Reference in a new issue