aboutsummaryrefslogtreecommitdiff
path: root/libgo/go/runtime/slice.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/runtime/slice.go')
-rw-r--r--libgo/go/runtime/slice.go48
1 files changed, 12 insertions, 36 deletions
diff --git a/libgo/go/runtime/slice.go b/libgo/go/runtime/slice.go
index ddd588e..27a9777 100644
--- a/libgo/go/runtime/slice.go
+++ b/libgo/go/runtime/slice.go
@@ -18,8 +18,6 @@ import (
//go:linkname checkMakeSlice
//go:linkname makeslice64
//go:linkname growslice
-//go:linkname slicecopy
-//go:linkname slicestringcopy
type slice struct {
array unsafe.Pointer
@@ -158,7 +156,7 @@ func growslice(et *_type, oldarray unsafe.Pointer, oldlen, oldcap, cap int) slic
if cap > doublecap {
newcap = cap
} else {
- if oldlen < 1024 {
+ if oldcap < 1024 {
newcap = doublecap
} else {
// Check 0 < newcap to detect overflow
@@ -255,12 +253,13 @@ func isPowerOfTwo(x uintptr) bool {
return x&(x-1) == 0
}
-func slicecopy(toPtr unsafe.Pointer, toLen int, fmPtr unsafe.Pointer, fmLen int, width uintptr) int {
- if fmLen == 0 || toLen == 0 {
+// slicecopy is used to copy from a string or slice of pointerless elements into a slice.
+func slicecopy(toPtr unsafe.Pointer, toLen int, fromPtr unsafe.Pointer, fromLen int, width uintptr) int {
+ if fromLen == 0 || toLen == 0 {
return 0
}
- n := fmLen
+ n := fromLen
if toLen < n {
n = toLen
}
@@ -269,46 +268,23 @@ func slicecopy(toPtr unsafe.Pointer, toLen int, fmPtr unsafe.Pointer, fmLen int,
return n
}
+ size := uintptr(n) * width
if raceenabled {
callerpc := getcallerpc()
pc := funcPC(slicecopy)
- racereadrangepc(fmPtr, uintptr(n*int(width)), callerpc, pc)
- racewriterangepc(toPtr, uintptr(n*int(width)), callerpc, pc)
+ racereadrangepc(fromPtr, size, callerpc, pc)
+ racewriterangepc(toPtr, size, callerpc, pc)
}
if msanenabled {
- msanread(fmPtr, uintptr(n*int(width)))
- msanwrite(toPtr, uintptr(n*int(width)))
+ msanread(fromPtr, size)
+ msanwrite(toPtr, size)
}
- size := uintptr(n) * width
if size == 1 { // common case worth about 2x to do here
// TODO: is this still worth it with new memmove impl?
- *(*byte)(toPtr) = *(*byte)(fmPtr) // known to be a byte pointer
+ *(*byte)(toPtr) = *(*byte)(fromPtr) // known to be a byte pointer
} else {
- memmove(toPtr, fmPtr, size)
- }
- return n
-}
-
-func slicestringcopy(toPtr *byte, toLen int, fm string) int {
- if len(fm) == 0 || toLen == 0 {
- return 0
- }
-
- n := len(fm)
- if toLen < n {
- n = toLen
+ memmove(toPtr, fromPtr, size)
}
-
- if raceenabled {
- callerpc := getcallerpc()
- pc := funcPC(slicestringcopy)
- racewriterangepc(unsafe.Pointer(toPtr), uintptr(n), callerpc, pc)
- }
- if msanenabled {
- msanwrite(unsafe.Pointer(toPtr), uintptr(n))
- }
-
- memmove(unsafe.Pointer(toPtr), stringStructOf(&fm).str, uintptr(n))
return n
}