cgo: refactor union support

Instead of putting the magic in the AST, generate regular accessor
methods. This avoids a number of special cases in the compiler, and
avoids missing any of them.

The resulting union accesses are somewhat clunkier to use, but the
compiler implementation has far less coupling between the CGo
implementation and the IR generator.
This commit is contained in:
Ayke van Laethem
2019-11-07 15:34:07 +01:00
committed by Ron Evans
parent 76c9f13e13
commit 6108ee6859
8 changed files with 340 additions and 174 deletions
+12 -9
View File
@@ -57,12 +57,14 @@ func main() {
println("array:", C.globalArray[0], C.globalArray[1], C.globalArray[2])
println("union:", C.int(unsafe.Sizeof(C.globalUnion)) == C.globalUnionSize)
C.unionSetShort(22)
println("union s:", C.globalUnion.s)
println("union s:", *C.globalUnion.unionfield_s())
C.unionSetFloat(3.14)
println("union f:", C.globalUnion.f)
println("union f:", *C.globalUnion.unionfield_f())
C.unionSetData(5, 8, 1)
println("union global data:", C.globalUnion.data[0], C.globalUnion.data[1], C.globalUnion.data[2])
println("union field:", printUnion(C.globalUnion).f)
data := C.globalUnion.unionfield_data()
println("union global data:", data[0], data[1], data[2])
returnedUnion := printUnion(C.globalUnion)
println("union field:", *returnedUnion.unionfield_f())
var _ C.union_joined = C.globalUnion
printBitfield(&C.globalBitfield)
C.globalBitfield.set_bitfield_a(7)
@@ -105,11 +107,12 @@ func main() {
}
func printUnion(union C.joined_t) C.joined_t {
println("union local data: ", union.data[0], union.data[1], union.data[2])
union.s = -33
println("union s:", union.data[0] == -33)
union.f = 6.28
println("union f:", union.f)
data := union.unionfield_data()
println("union local data: ", data[0], data[1], data[2])
*union.unionfield_s() = -33
println("union s:", data[0] == -33)
*union.unionfield_f() = 6.28
println("union f:", *union.unionfield_f())
return union
}