]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: no need to protect key/value increments against end of bucket
authorKeith Randall <khr@golang.org>
Fri, 18 Aug 2017 06:13:57 +0000 (23:13 -0700)
committerKeith Randall <khr@golang.org>
Fri, 18 Aug 2017 14:52:25 +0000 (14:52 +0000)
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: Martin Möhrmann <moehrmann@google.com>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Avelino <t@avelino.xxx>
src/runtime/hashmap.go

index 28ea376cf4522019dd1fbfdba950d4cac92ee510..f39fb7d3bf9a32c6b9b66999778aea3bfd4ffa35 100644 (file)
@@ -1119,12 +1119,12 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
                                        typedmemmove(t.elem, dst.v, v)
                                }
                                dst.i++
-                               // If we're at the end of the bucket, don't update k/v,
-                               // to avoid pointers pointing past the end of the bucket.
-                               if dst.i < bucketCnt {
-                                       dst.k = add(dst.k, uintptr(t.keysize))
-                                       dst.v = add(dst.v, uintptr(t.valuesize))
-                               }
+                               // These updates might push these pointers past the end of the
+                               // key or value arrays.  That's ok, as we have the overflow pointer
+                               // at the end of the bucket to protect against pointing past the
+                               // end of the bucket.
+                               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.