28 static B B_fn(
struct A b2,
struct B b3,
struct C b4)
32 result.
x.
a = b2.
a + b3.
x.
a + b3.
z + b4.
d;
33 result.
x.
b = b2.
b + b3.
x.
b + b3.
y + b4.
e;
34 result.
y = b2.
b + b3.
x.
b + b4.
e;
36 printf(
"%d %d %d %d %d %d %d %d: %d %d %d\n", (
int)b2.
a, b2.
b,
37 (
int)b3.
x.
a, b3.
x.
b, b3.
y, b3.
z, (
int)b4.
d, b4.
e,
38 (
int)result.
x.
a, result.
x.
b, result.
y);
45 void* userdata __UNUSED__)
51 b0 = *(
struct A*)(args[0]);
52 b1 = *(
struct B*)(args[1]);
53 b2 = *(
struct C*)(args[2]);
55 *(
B*)resp =
B_fn(b0, b1, b2);
62 ffi_closure *pcl = ffi_closure_alloc(
sizeof(ffi_closure), &code);
64 ffi_type* cls_struct_fields[3];
65 ffi_type* cls_struct_fields1[4];
66 ffi_type* cls_struct_fields2[3];
67 ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
68 ffi_type* dbl_arg_types[4];
70 struct A e_dbl = { 1LL, 7};
71 struct B f_dbl = { 99, {12LL , 127}, 255};
72 struct C g_dbl = { 2LL, 9};
76 cls_struct_type.size = 0;
77 cls_struct_type.alignment = 0;
78 cls_struct_type.type = FFI_TYPE_STRUCT;
79 cls_struct_type.elements = cls_struct_fields;
81 cls_struct_type1.size = 0;
82 cls_struct_type1.alignment = 0;
83 cls_struct_type1.type = FFI_TYPE_STRUCT;
84 cls_struct_type1.elements = cls_struct_fields1;
86 cls_struct_type2.size = 0;
87 cls_struct_type2.alignment = 0;
88 cls_struct_type2.type = FFI_TYPE_STRUCT;
89 cls_struct_type2.elements = cls_struct_fields2;
91 cls_struct_fields[0] = &ffi_type_uint64;
93 cls_struct_fields[2] =
NULL;
96 cls_struct_fields1[1] = &cls_struct_type;
97 cls_struct_fields1[2] = &ffi_type_uint;
98 cls_struct_fields1[3] =
NULL;
100 cls_struct_fields2[0] = &ffi_type_uint64;
102 cls_struct_fields2[2] =
NULL;
105 dbl_arg_types[0] = &cls_struct_type;
106 dbl_arg_types[1] = &cls_struct_type1;
107 dbl_arg_types[2] = &cls_struct_type2;
108 dbl_arg_types[3] =
NULL;
111 dbl_arg_types) == FFI_OK);
113 args_dbl[0] = &e_dbl;
114 args_dbl[1] = &f_dbl;
115 args_dbl[2] = &g_dbl;
120 CHECK( res_dbl.
x.
a == (e_dbl.
a + f_dbl.
x.
a + f_dbl.
z + g_dbl.
d));
121 CHECK( res_dbl.
x.
b == (e_dbl.
b + f_dbl.
x.
b + f_dbl.
y + g_dbl.
e));
122 CHECK( res_dbl.
y == (e_dbl.
b + f_dbl.
x.
b + g_dbl.
e));
126 res_dbl = ((
B(*)(
A,
B,
C))(code))(e_dbl, f_dbl, g_dbl);
128 CHECK( res_dbl.
x.
a == (e_dbl.
a + f_dbl.x.a + f_dbl.z + g_dbl.
d));
129 CHECK( res_dbl.
x.
b == (e_dbl.
b + f_dbl.x.b + f_dbl.y + g_dbl.
e));
130 CHECK( res_dbl.
y == (e_dbl.
b + f_dbl.x.b + g_dbl.
e));
static B B_fn(struct A b2, struct B b3, struct C b4)
ffi_status ffi_prep_closure_loc(ffi_closure *closure, ffi_cif *cif, void(*fun)(ffi_cif *, void *, void **, void *), void *user_data, void *codeloc)
static void B_gn(ffi_cif *cif __UNUSED__, void *resp, void **args, void *userdata __UNUSED__)
void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue)
ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, ffi_type *rtype, ffi_type **atypes)