| Index: runtime/platform/hashmap.cc
|
| diff --git a/runtime/platform/hashmap.cc b/runtime/platform/hashmap.cc
|
| index 461153398129a270433f45682ffd8f0765885a91..4d4b4774dd362a8e3c866f00c49c9abb6de84678 100644
|
| --- a/runtime/platform/hashmap.cc
|
| +++ b/runtime/platform/hashmap.cc
|
| @@ -106,11 +106,27 @@ void HashMap::Remove(void* key, uint32_t hash) {
|
|
|
| // Clear the candidate which will not break searching the hash table.
|
| candidate->key = NULL;
|
| - candidate->value = NULL;
|
| occupancy_--;
|
| }
|
|
|
|
|
| +HashMap::Entry* HashMap::Remove(Entry* entry) {
|
| + Remove(entry->key, entry->hash);
|
| +
|
| + // A key can only exist once in the map and we just removed `key`. This means
|
| + // that either a left-rotation has happened (in which case `entry` points
|
| + // already to the next element (in terms of iteration order)) or alternatively
|
| + // we can use the normal `Next()` call to move in iteration order.
|
| + if (entry->key != NULL) {
|
| + // A left-rotation happened. `entry` points already to the next element in
|
| + // iteration order.
|
| + return entry;
|
| + } else {
|
| + return Next(entry);
|
| + }
|
| +}
|
| +
|
| +
|
| void HashMap::Clear(ClearFun clear) {
|
| // Mark all entries as empty.
|
| const Entry* end = map_end();
|
| @@ -118,7 +134,6 @@ void HashMap::Clear(ClearFun clear) {
|
| if ((clear != NULL) && (p->key != NULL)) {
|
| clear(p->value);
|
| }
|
| - p->value = NULL;
|
| p->key = NULL;
|
| }
|
| occupancy_ = 0;
|
|
|