Skip to content

Commit d7ad482

Browse files
authored
Cache more field accesses in std Map and Set (AssemblyScript#1578)
1 parent 028e998 commit d7ad482

File tree

8 files changed

+1057
-911
lines changed

8 files changed

+1057
-911
lines changed

std/assembly/map.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,9 @@ export class Map<K,V> {
8888
changetype<usize>(this.buckets) + <usize>(hashCode & this.bucketsMask) * BUCKET_SIZE
8989
);
9090
while (entry) {
91-
if (!(entry.taggedNext & EMPTY) && entry.key == key) return entry;
92-
entry = changetype<MapEntry<K,V>>(entry.taggedNext & ~EMPTY);
91+
let taggedNext = entry.taggedNext;
92+
if (!(taggedNext & EMPTY) && entry.key == key) return entry;
93+
entry = changetype<MapEntry<K,V>>(taggedNext & ~EMPTY);
9394
}
9495
return null;
9596
}
@@ -177,9 +178,10 @@ export class Map<K,V> {
177178
let oldEntry = changetype<MapEntry<K,V>>(oldPtr);
178179
if (!(oldEntry.taggedNext & EMPTY)) {
179180
let newEntry = changetype<MapEntry<K,V>>(newPtr);
180-
newEntry.key = oldEntry.key;
181+
let oldEntryKey = oldEntry.key;
182+
newEntry.key = oldEntryKey;
181183
newEntry.value = oldEntry.value;
182-
let newBucketIndex = HASH<K>(oldEntry.key) & newBucketsMask;
184+
let newBucketIndex = HASH<K>(oldEntryKey) & newBucketsMask;
183185
let newBucketPtrBase = changetype<usize>(newBuckets) + <usize>newBucketIndex * BUCKET_SIZE;
184186
newEntry.taggedNext = load<usize>(newBucketPtrBase);
185187
store<usize>(newBucketPtrBase, newPtr);

std/assembly/set.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,9 @@ export class Set<T> {
8585
changetype<usize>(this.buckets) + <usize>(hashCode & this.bucketsMask) * BUCKET_SIZE
8686
);
8787
while (entry) {
88-
if (!(entry.taggedNext & EMPTY) && entry.key == key) return entry;
89-
entry = changetype<SetEntry<T>>(entry.taggedNext & ~EMPTY);
88+
let taggedNext = entry.taggedNext;
89+
if (!(taggedNext & EMPTY) && entry.key == key) return entry;
90+
entry = changetype<SetEntry<T>>(taggedNext & ~EMPTY);
9091
}
9192
return null;
9293
}
@@ -157,8 +158,9 @@ export class Set<T> {
157158
let oldEntry = changetype<SetEntry<T>>(oldPtr); // unmanaged!
158159
if (!(oldEntry.taggedNext & EMPTY)) {
159160
let newEntry = changetype<SetEntry<T>>(newPtr); // unmanaged!
160-
newEntry.key = oldEntry.key;
161-
let newBucketIndex = HASH<T>(oldEntry.key) & newBucketsMask;
161+
let oldEntryKey = oldEntry.key;
162+
newEntry.key = oldEntryKey;
163+
let newBucketIndex = HASH<T>(oldEntryKey) & newBucketsMask;
162164
let newBucketPtrBase = changetype<usize>(newBuckets) + <usize>newBucketIndex * BUCKET_SIZE;
163165
newEntry.taggedNext = load<usize>(newBucketPtrBase);
164166
store<usize>(newBucketPtrBase, newPtr);

0 commit comments

Comments
 (0)