aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2014-12-22 19:07:05 -0800
committerRuss Cox <rsc@golang.org>2015-01-14 05:41:52 +0000
commit957ed90d0eced2c5dbe39eb49926795b87a126f3 (patch)
tree6f97124c296787e2d71b4ae23e7fb5b8404dac92
parentcc7bbb0ae9cb34170fa9b53ca7accbe1b80fece4 (diff)
downloadgo-957ed90d0eced2c5dbe39eb49926795b87a126f3.tar.gz
go-957ed90d0eced2c5dbe39eb49926795b87a126f3.zip
[release-branch.go1.4] reflect: add kindNoPointers if a function layout has no pointers.
malloc checks kindNoPointers and if it is not set and the object is one pointer in size, it assumes it contains a pointer. So we must set kindNoPointers correctly; it isn't just a hint. Fixes #9425 Change-Id: Ia43da23cc3298d6e3d6dbdf66d32e9678f0aedcf Reviewed-on: https://go-review.googlesource.com/2055 Reviewed-by: Russ Cox <rsc@golang.org> (cherry picked from commit d11f41118116e0b5c2fb3b3296323d888dff2d6e) Reviewed-on: https://go-review.googlesource.com/2800 Reviewed-by: Andrew Gerrand <adg@golang.org>
-rw-r--r--src/reflect/type.go22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/reflect/type.go b/src/reflect/type.go
index c0ddfcad0a..99712495b6 100644
--- a/src/reflect/type.go
+++ b/src/reflect/type.go
@@ -1498,8 +1498,9 @@ func MapOf(key, elem Type) Type {
// gcProg is a helper type for generatation of GC pointer info.
type gcProg struct {
- gc []byte
- size uintptr // size of type in bytes
+ gc []byte
+ size uintptr // size of type in bytes
+ hasPtr bool
}
func (gc *gcProg) append(v byte) {
@@ -1560,11 +1561,14 @@ func (gc *gcProg) appendWord(v byte) {
gc.gc[nptr/2] &= ^(3 << ((nptr%2)*4 + 2))
gc.gc[nptr/2] |= v << ((nptr%2)*4 + 2)
gc.size += ptrsize
+ if v == bitsPointer {
+ gc.hasPtr = true
+ }
}
-func (gc *gcProg) finalize() unsafe.Pointer {
+func (gc *gcProg) finalize() (unsafe.Pointer, bool) {
if gc.size == 0 {
- return nil
+ return nil, false
}
ptrsize := unsafe.Sizeof(uintptr(0))
gc.align(ptrsize)
@@ -1579,7 +1583,7 @@ func (gc *gcProg) finalize() unsafe.Pointer {
gc.appendWord(extractGCWord(gc.gc, i))
}
}
- return unsafe.Pointer(&gc.gc[0])
+ return unsafe.Pointer(&gc.gc[0]), gc.hasPtr
}
func extractGCWord(gc []byte, i uintptr) byte {
@@ -1639,7 +1643,7 @@ func bucketOf(ktyp, etyp *rtype) *rtype {
b := new(rtype)
b.size = gc.size
- b.gc[0] = gc.finalize()
+ b.gc[0], _ = gc.finalize()
s := "bucket(" + *ktyp.string + "," + *etyp.string + ")"
b.string = &s
return b
@@ -1840,7 +1844,11 @@ func funcLayout(t *rtype, rcvr *rtype) (frametype *rtype, argSize, retOffset uin
// build dummy rtype holding gc program
x := new(rtype)
x.size = gc.size
- x.gc[0] = gc.finalize()
+ var hasPtr bool
+ x.gc[0], hasPtr = gc.finalize()
+ if !hasPtr {
+ x.kind |= kindNoPointers
+ }
var s string
if rcvr != nil {
s = "methodargs(" + *rcvr.string + ")(" + *t.string + ")"