diff mbox series

libgo patch committed: Correct runtime structfield type to match reflect

Message ID CAOyqgcX7D=tEmC1F3AB1-4XyxSecotDZufvJD4BufrZwr3KtKQ@mail.gmail.com
State New
Headers show
Series libgo patch committed: Correct runtime structfield type to match reflect | expand

Commit Message

Ian Lance Taylor Feb. 6, 2018, 3:18 p.m. UTC
This libgo patch corrects the runtime structfield type to match the
reflect type, which is the one actually generated by the compiler.
The offset field in structfield has changed to offsetAnon, and now
requires a shift to get the actual offset value.  This fixes
https://golang.org/issue/23391.  Bootstrapped and ran Go testsuite on
x86_64-pc-linux-gnu.  Committed to mainline.

Ian
diff mbox series

Patch

Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE	(revision 257393)
+++ gcc/go/gofrontend/MERGE	(working copy)
@@ -1,4 +1,4 @@ 
-c02c71187c9794b50444e2858c582e66a3442ee8
+1927b40e59e7c2067ecb03384b331d1be3cb5eea
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: libgo/go/runtime/cgocall.go
===================================================================
--- libgo/go/runtime/cgocall.go	(revision 257357)
+++ libgo/go/runtime/cgocall.go	(working copy)
@@ -189,7 +189,7 @@  func cgoCheckArg(t *_type, p unsafe.Poin
 			return
 		}
 		for _, f := range st.fields {
-			cgoCheckArg(f.typ, add(p, f.offset), true, top, msg)
+			cgoCheckArg(f.typ, add(p, f.offset()), true, top, msg)
 		}
 	case kindPtr, kindUnsafePointer:
 		if indir {
Index: libgo/go/runtime/type.go
===================================================================
--- libgo/go/runtime/type.go	(revision 257357)
+++ libgo/go/runtime/type.go	(working copy)
@@ -113,11 +113,19 @@  type ptrtype struct {
 }
 
 type structfield struct {
-	name    *string // nil for embedded fields
-	pkgPath *string // nil for exported Names; otherwise import path
-	typ     *_type  // type of field
-	tag     *string // nil if no tag
-	offset  uintptr // byte offset of field within struct
+	name       *string // nil for embedded fields
+	pkgPath    *string // nil for exported Names; otherwise import path
+	typ        *_type  // type of field
+	tag        *string // nil if no tag
+	offsetAnon uintptr // byte offset of field<<1 | isAnonymous
+}
+
+func (f *structfield) offset() uintptr {
+	return f.offsetAnon >> 1
+}
+
+func (f *structfield) anon() bool {
+	return f.offsetAnon&1 != 0
 }
 
 type structtype struct {