22static B B_fn(
struct A b2,
struct B b3)
26 result.
x.
a = b2.
a + b3.
x.
a;
27 result.
x.
b = b2.
b + b3.
x.
b + b3.
y;
28 result.
y = b2.
b + b3.
x.
b;
30 printf(
"%d %d %d %d %d: %d %d %d\n", (
int)b2.
a, b2.
b,
31 (
int)b3.
x.
a, b3.
x.
b, b3.
y,
32 (
int)result.
x.
a, result.
x.
b, result.
y);
38B_gn(ffi_cif* cif
__UNUSED__,
void* resp,
void** args,
44 b0 = *(
struct A*)(args[0]);
45 b1 = *(
struct B*)(args[1]);
47 *(
B*)resp =
B_fn(b0, b1);
54 ffi_closure *pcl = ffi_closure_alloc(
sizeof(ffi_closure), &code);
56 ffi_type* cls_struct_fields[3];
57 ffi_type* cls_struct_fields1[3];
58 ffi_type cls_struct_type, cls_struct_type1;
59 ffi_type* dbl_arg_types[3];
61 struct A e_dbl = { 1LL, 7};
62 struct B f_dbl = {{12.0 , 127}, 99};
66 cls_struct_type.size = 0;
67 cls_struct_type.alignment = 0;
68 cls_struct_type.type = FFI_TYPE_STRUCT;
69 cls_struct_type.elements = cls_struct_fields;
71 cls_struct_type1.size = 0;
72 cls_struct_type1.alignment = 0;
73 cls_struct_type1.type = FFI_TYPE_STRUCT;
74 cls_struct_type1.elements = cls_struct_fields1;
76 cls_struct_fields[0] = &ffi_type_uint64;
78 cls_struct_fields[2] =
NULL;
80 cls_struct_fields1[0] = &cls_struct_type;
82 cls_struct_fields1[2] =
NULL;
85 dbl_arg_types[0] = &cls_struct_type;
86 dbl_arg_types[1] = &cls_struct_type1;
87 dbl_arg_types[2] =
NULL;
90 dbl_arg_types) == FFI_OK);
99 CHECK( res_dbl.
x.
b == (e_dbl.
b + f_dbl.
x.
b + f_dbl.
y));
100 CHECK( res_dbl.
y == (e_dbl.
b + f_dbl.
x.
b));
104 res_dbl = ((
B(*)(
A,
B))(code))(e_dbl, f_dbl);
107 CHECK( res_dbl.
x.
b == (e_dbl.
b + f_dbl.
x.
b + f_dbl.
y));
108 CHECK( res_dbl.
y == (e_dbl.
b + f_dbl.
x.
b));
ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif, void(*fun)(ffi_cif *, void *, void **, void *), void *user_data, void *codeloc)
void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue)
B B_fn(struct A b0, struct B b1)
ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, ffi_type *rtype, ffi_type **atypes)