diff options
author | tduehr <tduehr@gmail.com> | 2015-03-19 16:44:33 -0700 |
---|---|---|
committer | tduehr <tduehr@gmail.com> | 2015-06-17 09:01:47 -0500 |
commit | e9d07620ae8ac090863998d22ab7ca0db9cd1e89 (patch) | |
tree | ba0c75a8e11e88123926cb9817a3bb0a7c1b157b /ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c | |
parent | 194784d60f53e242a8aab88c216126785dc047dd (diff) | |
download | ffi-libffi-3.2.1.tar.gz |
update libffilibffi-3.2.1
Diffstat (limited to 'ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c')
-rw-r--r-- | ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c b/ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c new file mode 100644 index 0000000..5a4e728 --- /dev/null +++ b/ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c @@ -0,0 +1,55 @@ +/* Area: closure_call + Purpose: Check simple closure handling with all ABIs + Limitations: none. + PR: none. + Originator: <twalljava@dev.java.net> */ + +/* { dg-do run } */ +#include "ffitest.h" + +static void +closure_test(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata) +{ + *(ffi_arg*)resp = + (int)*(int *)args[0] + (int)(*(int *)args[1]) + + (int)(*(int *)args[2]) + (int)(*(int *)args[3]) + + (int)(intptr_t)userdata; + + printf("%d %d %d %d: %d\n", + (int)*(int *)args[0], (int)(*(int *)args[1]), + (int)(*(int *)args[2]), (int)(*(int *)args[3]), + (int)*(ffi_arg *)resp); + +} + +typedef int (ABI_ATTR *closure_test_type0)(int, int, int, int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; + + cl_arg_types[0] = &ffi_type_uint; + cl_arg_types[1] = &ffi_type_uint; + cl_arg_types[2] = &ffi_type_uint; + cl_arg_types[3] = &ffi_type_uint; + cl_arg_types[4] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, ABI_NUM, 4, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test, + (void *) 3 /* userdata */, code) == FFI_OK); + + res = (*(closure_test_type0)code)(0, 1, 2, 3); + /* { dg-output "0 1 2 3: 9" } */ + + printf("res: %d\n",res); + /* { dg-output "\nres: 9" } */ + + exit(0); +} |