27 static B B_fn(
struct A b2,
struct B b3,
struct C b4)
31 result.
x.
a = b2.
a + b3.
x.
a + b4.
d;
32 result.
x.
b = b2.
b + b3.
x.
b + b3.
y + b4.
e;
33 result.
y = b2.
b + b3.
x.
b + b4.
e;
35 printf(
"%d %d %d %d %d %d %d: %d %d %d\n", b2.
a, (
int)b2.
b,
36 b3.
x.
a, (
int)b3.
x.
b, b3.
y, (
int)b4.
d, b4.
e,
37 result.
x.
a, (
int)result.
x.
b, result.
y);
44 void* userdata __UNUSED__)
50 b0 = *(
struct A*)(args[0]);
51 b1 = *(
struct B*)(args[1]);
52 b2 = *(
struct C*)(args[2]);
54 *(
B*)resp =
B_fn(b0, b1, b2);
61 ffi_closure *pcl = ffi_closure_alloc(
sizeof(ffi_closure), &code);
63 ffi_type* cls_struct_fields[3];
64 ffi_type* cls_struct_fields1[3];
65 ffi_type* cls_struct_fields2[3];
66 ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
67 ffi_type* dbl_arg_types[4];
69 struct A e_dbl = { 1, 7LL};
70 struct B f_dbl = {{12.0 , 127}, 99};
71 struct C g_dbl = { 2, 9};
75 cls_struct_type.size = 0;
76 cls_struct_type.alignment = 0;
77 cls_struct_type.type = FFI_TYPE_STRUCT;
78 cls_struct_type.elements = cls_struct_fields;
80 cls_struct_type1.size = 0;
81 cls_struct_type1.alignment = 0;
82 cls_struct_type1.type = FFI_TYPE_STRUCT;
83 cls_struct_type1.elements = cls_struct_fields1;
85 cls_struct_type2.size = 0;
86 cls_struct_type2.alignment = 0;
87 cls_struct_type2.type = FFI_TYPE_STRUCT;
88 cls_struct_type2.elements = cls_struct_fields2;
91 cls_struct_fields[1] = &ffi_type_uint64;
92 cls_struct_fields[2] =
NULL;
94 cls_struct_fields1[0] = &cls_struct_type;
96 cls_struct_fields1[2] =
NULL;
98 cls_struct_fields2[0] = &ffi_type_ulong;
100 cls_struct_fields2[2] =
NULL;
103 dbl_arg_types[0] = &cls_struct_type;
104 dbl_arg_types[1] = &cls_struct_type1;
105 dbl_arg_types[2] = &cls_struct_type2;
106 dbl_arg_types[3] =
NULL;
109 dbl_arg_types) == FFI_OK);
111 args_dbl[0] = &e_dbl;
112 args_dbl[1] = &f_dbl;
113 args_dbl[2] = &g_dbl;
118 CHECK( res_dbl.
x.
a == (e_dbl.
a + f_dbl.
x.
a + g_dbl.
d));
119 CHECK( res_dbl.
x.
b == (e_dbl.
b + f_dbl.
x.
b + f_dbl.
y + g_dbl.
e));
120 CHECK( res_dbl.
y == (e_dbl.
b + f_dbl.
x.
b + g_dbl.
e));
124 res_dbl = ((
B(*)(
A,
B,
C))(code))(e_dbl, f_dbl, g_dbl);
126 CHECK( res_dbl.
x.
a == (e_dbl.
a + f_dbl.x.a + g_dbl.
d));
127 CHECK( res_dbl.
x.
b == (e_dbl.
b + f_dbl.x.b + f_dbl.y + g_dbl.
e));
128 CHECK( res_dbl.
y == (e_dbl.
b + f_dbl.x.b + g_dbl.
e));
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)
static void B_gn(ffi_cif *cif __UNUSED__, void *resp, void **args, void *userdata __UNUSED__)
static B B_fn(struct A b2, struct B b3, struct C b4)
ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, ffi_type *rtype, ffi_type **atypes)