mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-05 19:43:44 +00:00
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:
committed by
Ron Evans
parent
b716cf1afd
commit
21a4c14e86
Vendored
+8
@@ -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 {
|
||||
|
||||
Vendored
+6
@@ -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;
|
||||
|
||||
Vendored
+3
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user