2 Purpose: Check simple closure handling with all ABIs
5 Originator: <twalljava@dev.java.net> */
11 closure_test(ffi_cif
* cif __UNUSED__
, void* resp
, void** args
, void* userdata
)
14 (int)*(int *)args
[0] + (int)(*(int *)args
[1])
15 + (int)(*(int *)args
[2]) + (int)(*(int *)args
[3])
16 + (int)(intptr_t)userdata
;
18 printf("%d %d %d %d: %d\n",
19 (int)*(int *)args
[0], (int)(*(int *)args
[1]),
20 (int)(*(int *)args
[2]), (int)(*(int *)args
[3]),
21 (int)*(ffi_arg
*)resp
);
25 typedef int (ABI_ATTR
*closure_test_type0
)(int, int, int, int);
31 ffi_closure
*pcl
= ffi_closure_alloc(sizeof(ffi_closure
), &code
);
32 ffi_type
* cl_arg_types
[17];
35 cl_arg_types
[0] = &ffi_type_uint
;
36 cl_arg_types
[1] = &ffi_type_uint
;
37 cl_arg_types
[2] = &ffi_type_uint
;
38 cl_arg_types
[3] = &ffi_type_uint
;
39 cl_arg_types
[4] = NULL
;
41 /* Initialize the cif */
42 CHECK(ffi_prep_cif(&cif
, ABI_NUM
, 4,
43 &ffi_type_sint
, cl_arg_types
) == FFI_OK
);
45 CHECK(ffi_prep_closure_loc(pcl
, &cif
, closure_test
,
46 (void *) 3 /* userdata */, code
) == FFI_OK
);
48 res
= (*(closure_test_type0
)code
)(0, 1, 2, 3);
49 /* { dg-output "0 1 2 3: 9" } */
51 printf("res: %d\n",res
);
52 /* { dg-output "\nres: 9" } */