mirror of
https://github.com/golang/go
synced 2024-11-23 13:20:09 -07:00
reflect: use runtime's memmove instead of its own
They will both need write barriers at some point. But until then, no reason why we shouldn't share. LGTM=rsc R=golang-codereviews, rsc CC=golang-codereviews https://golang.org/cl/141330043
This commit is contained in:
parent
2302b21bbe
commit
b78d7b75c7
@ -15,32 +15,6 @@ const bigEndian = false // can be smarter if we find a big-endian machine
|
||||
const ptrSize = unsafe.Sizeof((*byte)(nil))
|
||||
const cannotSet = "cannot set value obtained from unexported struct field"
|
||||
|
||||
// TODO: This will have to go away when
|
||||
// the new gc goes in.
|
||||
func memmove(adst, asrc unsafe.Pointer, n uintptr) {
|
||||
dst := uintptr(adst)
|
||||
src := uintptr(asrc)
|
||||
switch {
|
||||
case src < dst && src+n > dst:
|
||||
// byte copy backward
|
||||
// careful: i is unsigned
|
||||
for i := n; i > 0; {
|
||||
i--
|
||||
*(*byte)(unsafe.Pointer(dst + i)) = *(*byte)(unsafe.Pointer(src + i))
|
||||
}
|
||||
case (n|src|dst)&(ptrSize-1) != 0:
|
||||
// byte copy forward
|
||||
for i := uintptr(0); i < n; i++ {
|
||||
*(*byte)(unsafe.Pointer(dst + i)) = *(*byte)(unsafe.Pointer(src + i))
|
||||
}
|
||||
default:
|
||||
// word copy forward
|
||||
for i := uintptr(0); i < n; i += ptrSize {
|
||||
*(*uintptr)(unsafe.Pointer(dst + i)) = *(*uintptr)(unsafe.Pointer(src + i))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Value is the reflection interface to a Go value.
|
||||
//
|
||||
// Not all methods apply to all kinds of values. Restrictions,
|
||||
@ -2703,6 +2677,9 @@ func call(fn, arg unsafe.Pointer, n uint32, retoffset uint32)
|
||||
|
||||
func ifaceE2I(t *rtype, src interface{}, dst unsafe.Pointer)
|
||||
|
||||
//go:noescape
|
||||
func memmove(adst, asrc unsafe.Pointer, n uintptr)
|
||||
|
||||
// Dummy annotation marking that the value x escapes,
|
||||
// for use in cases where the reflect code is so clever that
|
||||
// the compiler cannot follow.
|
||||
|
@ -74,6 +74,9 @@ TEXT reflect·chansend(SB), NOSPLIT, $0-0
|
||||
TEXT reflect·chanrecv(SB), NOSPLIT, $0-0
|
||||
JMP runtime·reflect_chanrecv(SB)
|
||||
|
||||
TEXT reflect·memmove(SB), NOSPLIT, $0-0
|
||||
JMP runtime·memmove(SB)
|
||||
|
||||
TEXT runtime∕debug·freeOSMemory(SB), NOSPLIT, $0-0
|
||||
JMP runtime·freeOSMemory(SB)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user