]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: avoid redundant zeroing of hiter
authorMartin Möhrmann <moehrmann@google.com>
Thu, 31 Aug 2017 19:26:03 +0000 (21:26 +0200)
committerMartin Möhrmann <moehrmann@google.com>
Wed, 6 Sep 2017 04:00:51 +0000 (04:00 +0000)
The compiler and reflect already zero hiter before mapiterinit.

While here expand the documentation for mapiterinit.

Change-Id: I78b05d4d14bf78e8091e5353cdac80ffed30ca1e
Reviewed-on: https://go-review.googlesource.com/60673
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/runtime/hashmap.go

index bf5d51ab8f517aea11172dc005a2d468a8ff6d69..1e76fc590c1096edea40e8859bbb85979ba36b9c 100644 (file)
@@ -678,25 +678,17 @@ search:
        h.flags &^= hashWriting
 }
 
+// mapiterinit initializes the hiter struct used for ranging over maps.
+// The hiter struct pointed to by 'it' is allocated on the stack
+// by the compilers order pass or on the heap by reflect_mapiterinit.
+// Both need to have zeroed hiter since the struct contains pointers.
 func mapiterinit(t *maptype, h *hmap, it *hiter) {
-       // Clear pointer fields so garbage collector does not complain.
-       it.key = nil
-       it.value = nil
-       it.t = nil
-       it.h = nil
-       it.buckets = nil
-       it.bptr = nil
-       it.overflow[0] = nil
-       it.overflow[1] = nil
-
        if raceenabled && h != nil {
                callerpc := getcallerpc(unsafe.Pointer(&t))
                racereadpc(unsafe.Pointer(h), callerpc, funcPC(mapiterinit))
        }
 
        if h == nil || h.count == 0 {
-               it.key = nil
-               it.value = nil
                return
        }
 
@@ -728,11 +720,9 @@ func mapiterinit(t *maptype, h *hmap, it *hiter) {
 
        // iterator state
        it.bucket = it.startBucket
-       it.wrapped = false
-       it.bptr = nil
 
        // Remember we have an iterator.
-       // Can run concurrently with another hash_iter_init().
+       // Can run concurrently with another mapiterinit().
        if old := h.flags; old&(iterator|oldIterator) != iterator|oldIterator {
                atomic.Or8(&h.flags, iterator|oldIterator)
        }