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
|
@ -1,4 +1,4 @@
|
||||||
87005025fcd0d7e7908b3aae7062b52cb80eb0f3
|
9a79c333e896ea49f6a708d459148074d29a2af6
|
||||||
|
|
||||||
The first line of this file holds the git revision number of the last
|
The first line of this file holds the git revision number of the last
|
||||||
merge done from the gofrontend repository.
|
merge done from the gofrontend repository.
|
||||||
|
|
|
@ -227,6 +227,7 @@ func structToFFI(typ *structtype) *__ffi_type {
|
||||||
|
|
||||||
fields := make([]*__ffi_type, 0, c+1)
|
fields := make([]*__ffi_type, 0, c+1)
|
||||||
checkPad := false
|
checkPad := false
|
||||||
|
lastzero := false
|
||||||
for i, v := range typ.fields {
|
for i, v := range typ.fields {
|
||||||
// Skip zero-sized fields; they confuse libffi,
|
// Skip zero-sized fields; they confuse libffi,
|
||||||
// and there is no value to pass in any case.
|
// and there is no value to pass in any case.
|
||||||
|
@ -235,8 +236,10 @@ func structToFFI(typ *structtype) *__ffi_type {
|
||||||
// next field.
|
// next field.
|
||||||
if v.typ.size == 0 {
|
if v.typ.size == 0 {
|
||||||
checkPad = true
|
checkPad = true
|
||||||
|
lastzero = true
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
lastzero = false
|
||||||
|
|
||||||
if checkPad {
|
if checkPad {
|
||||||
off := uintptr(0)
|
off := uintptr(0)
|
||||||
|
@ -257,6 +260,13 @@ func structToFFI(typ *structtype) *__ffi_type {
|
||||||
fields = append(fields, typeToFFI(v.typ))
|
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)
|
fields = append(fields, nil)
|
||||||
|
|
||||||
return &__ffi_type{
|
return &__ffi_type{
|
||||||
|
|
Loading…
Reference in New Issue