runtime: add padding to FFI type of struct ending with zero-sized field
CL 157557 changes the compiler to add one byte padding to non-empty struct ending with a zero-sized field. Add the same padding to the FFI type, so reflect.Call works. This fixes test/fixedbugs/issue26335.go in the main repo. Reviewed-on: https://go-review.googlesource.com/c/158018 From-SVN: r267956
This commit is contained in:
parent
5e95646e73
commit
b7ec44e82b
2 changed files with 11 additions and 1 deletions
|
@ -1,4 +1,4 @@
|
|||
87005025fcd0d7e7908b3aae7062b52cb80eb0f3
|
||||
9a79c333e896ea49f6a708d459148074d29a2af6
|
||||
|
||||
The first line of this file holds the git revision number of the last
|
||||
merge done from the gofrontend repository.
|
||||
|
|
|
@ -227,6 +227,7 @@ func structToFFI(typ *structtype) *__ffi_type {
|
|||
|
||||
fields := make([]*__ffi_type, 0, c+1)
|
||||
checkPad := false
|
||||
lastzero := false
|
||||
for i, v := range typ.fields {
|
||||
// Skip zero-sized fields; they confuse libffi,
|
||||
// and there is no value to pass in any case.
|
||||
|
@ -235,8 +236,10 @@ func structToFFI(typ *structtype) *__ffi_type {
|
|||
// next field.
|
||||
if v.typ.size == 0 {
|
||||
checkPad = true
|
||||
lastzero = true
|
||||
continue
|
||||
}
|
||||
lastzero = false
|
||||
|
||||
if checkPad {
|
||||
off := uintptr(0)
|
||||
|
@ -257,6 +260,13 @@ func structToFFI(typ *structtype) *__ffi_type {
|
|||
fields = append(fields, typeToFFI(v.typ))
|
||||
}
|
||||
|
||||
if lastzero {
|
||||
// The compiler adds one byte padding to non-empty struct ending
|
||||
// with a zero-sized field (types.cc:get_backend_struct_fields).
|
||||
// Add this padding to the FFI type.
|
||||
fields = append(fields, ffi_type_uint8())
|
||||
}
|
||||
|
||||
fields = append(fields, nil)
|
||||
|
||||
return &__ffi_type{
|
||||
|
|
Loading…
Add table
Reference in a new issue