mirror of
https://github.com/golang/go
synced 2024-11-19 21:04: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:
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 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.
|
||||||
|
@ -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 runtime∕debug·freeOSMemory(SB), NOSPLIT, $0-0
|
TEXT runtime∕debug·freeOSMemory(SB), NOSPLIT, $0-0
|
||||||
JMP runtime·freeOSMemory(SB)
|
JMP runtime·freeOSMemory(SB)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user