]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: add missing write barriers in append's copy of slice data
authorRuss Cox <rsc@golang.org>
Tue, 23 Dec 2014 03:42:05 +0000 (22:42 -0500)
committerRuss Cox <rsc@golang.org>
Tue, 6 Jan 2015 00:26:45 +0000 (00:26 +0000)
Found with GODEBUG=wbshadow=1 mode.
Eventually that will run automatically, but right now
it still detects other missing write barriers.

Change-Id: Ic8624401d7c8225a935f719f96f2675c6f5c0d7c
Reviewed-on: https://go-review.googlesource.com/2064
Reviewed-by: Rick Hudson <rlh@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
src/runtime/slice.go

index e427a8b7cc2f742b79d343e2e8a75d4db1e2ae4d..8264cd6956f500e5ae74ff461c6803fb7a00601f 100644 (file)
@@ -81,12 +81,16 @@ func growslice(t *slicetype, old sliceStruct, n int64) sliceStruct {
        var p unsafe.Pointer
        if et.kind&kindNoPointers != 0 {
                p = rawmem(capmem)
+               memmove(p, old.array, lenmem)
                memclr(add(p, lenmem), capmem-lenmem)
        } else {
-               // Note: can't use rawmem (which avoids zeroing of memory), because then GC can scan unitialized memory
+               // Note: can't use rawmem (which avoids zeroing of memory), because then GC can scan unitialized memory.
+               // TODO(rsc): Use memmove when !needwb().
                p = newarray(et, uintptr(newcap))
+               for i := 0; i < old.len; i++ {
+                       writebarrierfat(et, add(p, uintptr(i)*et.size), add(old.array, uintptr(i)*et.size))
+               }
        }
-       memmove(p, old.array, lenmem)
 
        return sliceStruct{p, old.len, newcap}
 }