summaryrefslogtreecommitdiff
path: root/src/internal/reflectlite
diff options
context:
space:
mode:
authorBryan C. Mills <bcmills@google.com>2020-04-30 17:05:59 -0400
committerBryan C. Mills <bcmills@google.com>2020-05-01 02:31:29 +0000
commitda382a3978d3db2380c7e9a69207545562dfd727 (patch)
treed8105be3c7281e8bdf1c475f7c7866fe21aac806 /src/internal/reflectlite
parent4c78d54fdd9ffc81c15ffc3c4a2946f89d4fca22 (diff)
downloadgo-git-da382a3978d3db2380c7e9a69207545562dfd727.tar.gz
internal/unsafeheader: consolidate stringHeader and sliceHeader declarations into an internal package
The new package "internal/unsafeheader" depends only on "unsafe", and provides declarations equivalent to reflect.StringHeader and reflect.SliceHeader but with Data fields of the proper unsafe.Pointer type (instead of uintptr). Unlike the types it replaces, the "internal/unsafeheader" package has a regression test to ensure that its header types remain equivalent to the declarations provided by the "reflect" package. Since "internal/unsafeheader" has almost no dependencies, it can be used in other low-level packages such as "syscall" and "reflect". This change is based on the corresponding x/sys change in CL 231177. Fixes #37805 Updates #19367 Change-Id: I7a6d93ef8dd6e235bcab94e7c47270aad047af31 Reviewed-on: https://go-review.googlesource.com/c/go/+/231223 Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/internal/reflectlite')
-rw-r--r--src/internal/reflectlite/swapper.go7
-rw-r--r--src/internal/reflectlite/type.go5
-rw-r--r--src/internal/reflectlite/value.go18
3 files changed, 11 insertions, 19 deletions
diff --git a/src/internal/reflectlite/swapper.go b/src/internal/reflectlite/swapper.go
index 4594fb5ee2..6330ab2d34 100644
--- a/src/internal/reflectlite/swapper.go
+++ b/src/internal/reflectlite/swapper.go
@@ -4,7 +4,10 @@
package reflectlite
-import "unsafe"
+import (
+ "internal/unsafeheader"
+ "unsafe"
+)
// Swapper returns a function that swaps the elements in the provided
// slice.
@@ -58,7 +61,7 @@ func Swapper(slice interface{}) func(i, j int) {
}
}
- s := (*sliceHeader)(v.ptr)
+ s := (*unsafeheader.Slice)(v.ptr)
tmp := unsafe_New(typ) // swap scratch space
return func(i, j int) {
diff --git a/src/internal/reflectlite/type.go b/src/internal/reflectlite/type.go
index 49a03ac1e1..eb7f1a4b78 100644
--- a/src/internal/reflectlite/type.go
+++ b/src/internal/reflectlite/type.go
@@ -7,6 +7,7 @@
package reflectlite
import (
+ "internal/unsafeheader"
"unsafe"
)
@@ -338,7 +339,7 @@ func (n name) name() (s string) {
}
b := (*[4]byte)(unsafe.Pointer(n.bytes))
- hdr := (*stringHeader)(unsafe.Pointer(&s))
+ hdr := (*unsafeheader.String)(unsafe.Pointer(&s))
hdr.Data = unsafe.Pointer(&b[3])
hdr.Len = int(b[1])<<8 | int(b[2])
return s
@@ -350,7 +351,7 @@ func (n name) tag() (s string) {
return ""
}
nl := n.nameLen()
- hdr := (*stringHeader)(unsafe.Pointer(&s))
+ hdr := (*unsafeheader.String)(unsafe.Pointer(&s))
hdr.Data = unsafe.Pointer(n.data(3+nl+2, "non-empty string"))
hdr.Len = tl
return s
diff --git a/src/internal/reflectlite/value.go b/src/internal/reflectlite/value.go
index 6a493938f5..85beea606c 100644
--- a/src/internal/reflectlite/value.go
+++ b/src/internal/reflectlite/value.go
@@ -5,6 +5,7 @@
package reflectlite
import (
+ "internal/unsafeheader"
"runtime"
"unsafe"
)
@@ -335,10 +336,10 @@ func (v Value) Len() int {
return maplen(v.pointer())
case Slice:
// Slice is bigger than a word; assume flagIndir.
- return (*sliceHeader)(v.ptr).Len
+ return (*unsafeheader.Slice)(v.ptr).Len
case String:
// String is bigger than a word; assume flagIndir.
- return (*stringHeader)(v.ptr).Len
+ return (*unsafeheader.String)(v.ptr).Len
}
panic(&ValueError{"reflect.Value.Len", v.kind()})
}
@@ -379,19 +380,6 @@ func (v Value) Type() Type {
return v.typ
}
-// stringHeader is a safe version of StringHeader used within this package.
-type stringHeader struct {
- Data unsafe.Pointer
- Len int
-}
-
-// sliceHeader is a safe version of SliceHeader used within this package.
-type sliceHeader struct {
- Data unsafe.Pointer
- Len int
- Cap int
-}
-
/*
* constructors
*/