runtime: correct runtime structfield type to match reflect

The offset field in structfield has changed to offsetAnon, and now
    requires a shift to get the actual offset value.
    
    Fixes golang/go#23391
    
    Reviewed-on: https://go-review.googlesource.com/92275

From-SVN: r257413
This commit is contained in:
Ian Lance Taylor 2018-02-06 15:18:50 +00:00
parent 43fbc2e9c4
commit c88893a0da
3 changed files with 15 additions and 7 deletions

View file

@ -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.

View file

@ -189,7 +189,7 @@ func cgoCheckArg(t *_type, p unsafe.Pointer, indir, top bool, msg string) {
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 {

View file

@ -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 {