]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: simplify typedmemmovepartial
authorIan Lance Taylor <iant@golang.org>
Wed, 8 Apr 2020 04:39:39 +0000 (21:39 -0700)
committerIan Lance Taylor <iant@golang.org>
Wed, 8 Apr 2020 21:52:45 +0000 (21:52 +0000)
The offset is always a multiple of the pointer size.

Change-Id: I790e087e89a081044a3ec35d99880533a4c929bd
Reviewed-on: https://go-review.googlesource.com/c/go/+/227540
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
src/runtime/mbarrier.go

index 264376da9b4afa56e3f36b134493529e440ea256..019905318313d2e3f1d745490aac39b43d37fa80 100644 (file)
@@ -193,32 +193,18 @@ func reflectlite_typedmemmove(typ *_type, dst, src unsafe.Pointer) {
 
 // typedmemmovepartial is like typedmemmove but assumes that
 // dst and src point off bytes into the value and only copies size bytes.
+// off must be a multiple of sys.PtrSize.
 //go:linkname reflect_typedmemmovepartial reflect.typedmemmovepartial
 func reflect_typedmemmovepartial(typ *_type, dst, src unsafe.Pointer, off, size uintptr) {
-       if writeBarrier.needed && typ.ptrdata != 0 && size >= sys.PtrSize {
-               // Pointer-align start address for bulk barrier.
-               adst, asrc, asize := dst, src, size
-               ptrdata := typ.ptrdata
-               if ptrdata > off {
-                       ptrdata -= off
-               } else {
-                       ptrdata = 0
+       if writeBarrier.needed && typ.ptrdata > off && size >= sys.PtrSize {
+               if off&(sys.PtrSize-1) != 0 {
+                       panic("reflect: internal error: misaligned offset")
                }
-               if frag := -off & (sys.PtrSize - 1); frag != 0 {
-                       adst = add(dst, frag)
-                       asrc = add(src, frag)
-                       asize -= frag
-                       if ptrdata > frag {
-                               ptrdata -= frag
-                       } else {
-                               ptrdata = 0
-                       }
+               pwsize := alignDown(size, sys.PtrSize)
+               if poff := typ.ptrdata - off; pwsize > poff {
+                       pwsize = poff
                }
-               pwsize := asize &^ (sys.PtrSize - 1)
-               if pwsize > ptrdata {
-                       pwsize = ptrdata
-               }
-               bulkBarrierPreWrite(uintptr(adst), uintptr(asrc), pwsize)
+               bulkBarrierPreWrite(uintptr(dst), uintptr(src), pwsize)
        }
 
        memmove(dst, src, size)