26 result.
x.
a = b0.
a + b1.
x.
a;
27 result.
x.
b = b0.
b + b1.
x.
b + b1.
y;
28 result.
y = b0.
b + b1.
x.
b;
30 printf(
"%lu %d %lu %d %d: %lu %d %d\n", b0.
a, b0.
b, b1.
x.
a, b1.
x.
b, b1.
y,
31 result.
x.
a, result.
x.
b, result.
y);
37 B_gn(ffi_cif* cif
__UNUSED__,
void* resp,
void** args,
43 b0 = *(
struct A*)(args[0]);
44 b1 = *(
struct B*)(args[1]);
46 *(
B*)resp =
B_fn(b0, b1);
53 ffi_closure *pcl = ffi_closure_alloc(
sizeof(ffi_closure), &code);
55 ffi_type* cls_struct_fields[3];
56 ffi_type* cls_struct_fields1[3];
57 ffi_type cls_struct_type, cls_struct_type1;
58 ffi_type* dbl_arg_types[3];
60 struct A e_dbl = { 1, 7};
61 struct B f_dbl = {{12 , 127}, 99};
65 cls_struct_type.size = 0;
66 cls_struct_type.alignment = 0;
67 cls_struct_type.type = FFI_TYPE_STRUCT;
68 cls_struct_type.elements = cls_struct_fields;
70 cls_struct_type1.size = 0;
71 cls_struct_type1.alignment = 0;
72 cls_struct_type1.type = FFI_TYPE_STRUCT;
73 cls_struct_type1.elements = cls_struct_fields1;
75 cls_struct_fields[0] = &ffi_type_ulong;
77 cls_struct_fields[2] =
NULL;
79 cls_struct_fields1[0] = &cls_struct_type;
81 cls_struct_fields1[2] =
NULL;
84 dbl_arg_types[0] = &cls_struct_type;
85 dbl_arg_types[1] = &cls_struct_type1;
86 dbl_arg_types[2] =
NULL;
89 dbl_arg_types) == FFI_OK);
98 CHECK( res_dbl.
x.
b == (e_dbl.
b + f_dbl.
x.
b + f_dbl.
y));
99 CHECK( res_dbl.
y == (e_dbl.
b + f_dbl.
x.
b));
103 res_dbl = ((
B(*)(
A,
B))(code))(e_dbl, f_dbl);
106 CHECK( res_dbl.
x.
b == (e_dbl.
b + f_dbl.
x.
b + f_dbl.
y));
107 CHECK( res_dbl.
y == (e_dbl.
b + f_dbl.
x.
b));