1
0
mirror of https://github.com/golang/go synced 2024-11-19 23:44:43 -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:
Keith Randall 2014-09-10 12:37:28 -07:00
parent 2302b21bbe
commit b78d7b75c7
2 changed files with 6 additions and 26 deletions

View File

@ -15,32 +15,6 @@ const bigEndian = false // can be smarter if we find a big-endian machine
const ptrSize = unsafe.Sizeof((*byte)(nil)) const ptrSize = unsafe.Sizeof((*byte)(nil))
const cannotSet = "cannot set value obtained from unexported struct field" 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. // Value is the reflection interface to a Go value.
// //
// Not all methods apply to all kinds of values. Restrictions, // 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) 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, // Dummy annotation marking that the value x escapes,
// for use in cases where the reflect code is so clever that // for use in cases where the reflect code is so clever that
// the compiler cannot follow. // the compiler cannot follow.

View File

@ -74,6 +74,9 @@ TEXT reflect·chansend(SB), NOSPLIT, $0-0
TEXT reflect·chanrecv(SB), NOSPLIT, $0-0 TEXT reflect·chanrecv(SB), NOSPLIT, $0-0
JMP runtime·reflect_chanrecv(SB) JMP runtime·reflect_chanrecv(SB)
TEXT reflect·memmove(SB), NOSPLIT, $0-0
JMP runtime·memmove(SB)
TEXT runtimedebug·freeOSMemory(SB), NOSPLIT, $0-0 TEXT runtimedebug·freeOSMemory(SB), NOSPLIT, $0-0
JMP runtime·freeOSMemory(SB) JMP runtime·freeOSMemory(SB)