cgo: implement C.struct_ types

These types (called elaborated types in C) are used as part of linked
lists, among others.

This is part an extra feature (to be compatible with CGo C.struct_
types) and part a bugfix: linked lists would result in endless recursion
leading to a stack overflow.
This commit is contained in:
Ayke van Laethem
2019-04-20 02:39:31 +02:00
committed by Ron Evans
parent b716cf1afd
commit 21a4c14e86
5 changed files with 89 additions and 13 deletions
+8
View File
@@ -53,6 +53,14 @@ func main() {
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)
// recursive types, test using a linked list
lastElement := &C.list_t{n: 7, next: nil}
list := &C.list_t{n: 3, next: &C.struct_list_t{n: 6, next: (*C.struct_list_t)(lastElement)}}
for list != nil {
println("n in chain:", list.n)
list = (*C.list_t)(list.next)
}
}
func printUnion(union C.joined_t) C.joined_t {
+6
View File
@@ -12,6 +12,12 @@ typedef struct collection {
unsigned char c;
} collection_t;
// linked list
typedef struct list_t {
int n;
struct list_t *next;
} list_t;
typedef union joined {
myint s;
float f;
+3
View File
@@ -24,3 +24,6 @@ union local data: 5 8 1
union s method: -33 false
union f: +6.280000e+000
union field: +6.280000e+000
n in chain: 3
n in chain: 6
n in chain: 7