Chromium Code Reviews| Index: runtime/platform/hashmap.cc |
| diff --git a/runtime/platform/hashmap.cc b/runtime/platform/hashmap.cc |
| index 461153398129a270433f45682ffd8f0765885a91..999e511e145d4ad5e83fb95b4c4289829594db5a 100644 |
| --- a/runtime/platform/hashmap.cc |
| +++ b/runtime/platform/hashmap.cc |
| @@ -107,10 +107,32 @@ 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; |
| + candidate->hash = 0; |
|
Florian Schneider
2016/11/30 18:08:41
Why clear the hash code?
kustermann
2016/11/30 21:27:15
For consistency:
The [key] *needs* to be cleared
Florian Schneider
2016/11/30 21:51:48
Agree, on the other hand, it may be useful to exam
|
| occupancy_--; |
| } |
| +HashMap::Entry* HashMap::Remove(Entry* entry) { |
| + // Save the key of the entry we would like to remove, since the removal itself |
| + // might do a left-rotation of elements following this one, thereby overriding |
| + // `entry`. |
| + void* key = entry->key; |
|
Florian Schneider
2016/11/30 18:08:41
Where is the saved key used after calling Remove?
kustermann
2016/11/30 21:27:15
Sorry that was a left-over. The indication whether
|
| + Remove(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(); |
| @@ -120,6 +142,7 @@ void HashMap::Clear(ClearFun clear) { |
| } |
| p->value = NULL; |
| p->key = NULL; |
| + p->hash = 0; |
|
Florian Schneider
2016/11/30 18:08:41
Same here. Seems wasted work.
kustermann
2016/11/30 21:27:15
Same answer.
|
| } |
| occupancy_ = 0; |
| } |