Commit 77871cc6 authored by Keith Randall's avatar Keith Randall

runtime: no need to protect key/value increments against end of bucket

After the key and value arrays, we have an overflow pointer.
So there's no way a past-the-end key or value pointer could point
past the end of the containing bucket.

So we don't need this additional protection.

Update #21459

Change-Id: I7726140033b06b187f7a7d566b3af8cdcaeab0b0
Reviewed-on: https://go-review.googlesource.com/56772
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarMartin Möhrmann <moehrmann@google.com>
Reviewed-by: default avatarJosh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: default avatarAvelino <t@avelino.xxx>
parent a9375340
...@@ -1119,12 +1119,12 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) { ...@@ -1119,12 +1119,12 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
typedmemmove(t.elem, dst.v, v) typedmemmove(t.elem, dst.v, v)
} }
dst.i++ dst.i++
// If we're at the end of the bucket, don't update k/v, // These updates might push these pointers past the end of the
// to avoid pointers pointing past the end of the bucket. // key or value arrays. That's ok, as we have the overflow pointer
if dst.i < bucketCnt { // at the end of the bucket to protect against pointing past the
dst.k = add(dst.k, uintptr(t.keysize)) // end of the bucket.
dst.v = add(dst.v, uintptr(t.valuesize)) dst.k = add(dst.k, uintptr(t.keysize))
} dst.v = add(dst.v, uintptr(t.valuesize))
} }
} }
// Unlink the overflow buckets & clear key/value to help GC. // Unlink the overflow buckets & clear key/value to help GC.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment