Skip to content

Commit d8d8e3e

Browse files
committed
codec: unsafe runtime stubs: use runtime stubs in reflect package directly (not those in runtime)
1 parent 67be63f commit d8d8e3e

File tree

1 file changed

+14
-13
lines changed

1 file changed

+14
-13
lines changed

codec/helper_unsafe.go

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -956,7 +956,10 @@ func (n *structFieldInfoPathNode) rvField(v reflect.Value) (rv reflect.Value) {
956956
// Note that as of Jan 2021 (go 1.16 release), go:linkname(s) are not inlined
957957
// outside of the standard library use (e.g. within sync, reflect, etc).
958958
//
959-
// Consequently, these do not necessarily give a performance boost, as a function overhead
959+
// Consequently, these do not necessarily give a performance boost, as a function overhead.
960+
//
961+
// Also, we link to the functions in reflect where possible, as opposed to those in runtime.
962+
// They are guaranteed to be safer for our use, even when they are just trampoline functions.
960963

961964
//go:linkname maplen reflect.maplen
962965
//go:noescape
@@ -986,34 +989,32 @@ func mapassign(typ unsafe.Pointer, m unsafe.Pointer, key, val unsafe.Pointer)
986989
//go:noescape
987990
func mapdelete(typ unsafe.Pointer, m unsafe.Pointer, key unsafe.Pointer)
988991

989-
//go:linkname typedmemmove runtime.typedmemmove
990-
//go:noescape
991-
func typedmemmove(typ unsafe.Pointer, dst, src unsafe.Pointer)
992-
993-
//go:linkname typedmemclr runtime.typedmemclr
992+
//go:linkname unsafe_New reflect.unsafe_New
994993
//go:noescape
995-
func typedmemclr(typ unsafe.Pointer, dst unsafe.Pointer)
994+
func unsafe_New(typ unsafe.Pointer) unsafe.Pointer
996995

997996
//go:linkname typedslicecopy reflect.typedslicecopy
998997
//go:noescape
999998
func typedslicecopy(elemType unsafe.Pointer, dst, src unsafeSlice) int
1000999

1001-
//go:linkname unsafe_New reflect.unsafe_New
1000+
//go:linkname typedmemmove reflect.typedmemmove
10021001
//go:noescape
1003-
func unsafe_New(typ unsafe.Pointer) unsafe.Pointer
1002+
func typedmemmove(typ unsafe.Pointer, dst, src unsafe.Pointer)
1003+
1004+
//go:linkname typedmemclr reflect.typedmemclr
1005+
//go:noescape
1006+
func typedmemclr(typ unsafe.Pointer, dst unsafe.Pointer)
10041007

10051008
//go:linkname memhash runtime.memhash
10061009
//go:noescape
10071010
func memhash(p unsafe.Pointer, seed, length uintptr) uintptr
10081011

1009-
// //go:linkname memmove reflect.memmove
1010-
// //go:noescape
1011-
// func memmove(dst, src unsafe.Pointer, n int)
1012-
10131012
// ---------- others ---------------
10141013

10151014
func hashShortString(b []byte) uintptr {
10161015
return memhash(unsafe.Pointer(&b[0]), 0, uintptr(len(b)))
10171016
}
10181017

10191018
// var _ = runtime.MemProfileRate
1019+
// func maplen(typ unsafe.Pointer) int { return *((*int)(typ)) }
1020+
// func chanlen(typ unsafe.Pointer) int { return int(*((*uint)(typ))) }

0 commit comments

Comments
 (0)