diff options
author | Keith Randall <khr@golang.org> | 2014-12-22 19:07:05 -0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2015-01-14 05:41:52 +0000 |
commit | 957ed90d0eced2c5dbe39eb49926795b87a126f3 (patch) | |
tree | 6f97124c296787e2d71b4ae23e7fb5b8404dac92 | |
parent | cc7bbb0ae9cb34170fa9b53ca7accbe1b80fece4 (diff) | |
download | go-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.go | 22 |
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 + ")" |