Back to index

python3.2  3.2.2
Functions
cls_pointer.c File Reference
#include "ffitest.h"

Go to the source code of this file.

Functions

voidcls_pointer_fn (void *a1, void *a2)
static void cls_pointer_gn (ffi_cif *cif __UNUSED__, void *resp, void **args, void *userdata __UNUSED__)
int main (void)

Function Documentation

void* cls_pointer_fn ( void a1,
void a2 
)

Definition at line 10 of file cls_pointer.c.

{
       void*  result = (void*)((intptr_t)a1 + (intptr_t)a2);

       printf("0x%08x 0x%08x: 0x%08x\n", 
              (unsigned int)(uintptr_t) a1,
               (unsigned int)(uintptr_t) a2,
               (unsigned int)(uintptr_t) result);

       return result;
}

Here is the caller graph for this function:

static void cls_pointer_gn ( ffi_cif *cif  __UNUSED__,
void resp,
void **  args,
void *userdata  __UNUSED__ 
) [static]

Definition at line 23 of file cls_pointer.c.

{
       void*  a1     = *(void**)(args[0]);
       void*  a2     = *(void**)(args[1]);

       *(void**)resp = cls_pointer_fn(a1, a2);
}

Here is the call graph for this function:

Here is the caller graph for this function:

int main ( void  )

Definition at line 32 of file cls_pointer.c.

{
       ffi_cif       cif;
        void *code;
       ffi_closure*  pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
       void*                args[3];
//     ffi_type             cls_pointer_type;
       ffi_type*            arg_types[3];

/*     cls_pointer_type.size = sizeof(void*);
       cls_pointer_type.alignment = 0;
       cls_pointer_type.type = FFI_TYPE_POINTER;
       cls_pointer_type.elements = NULL;*/

       void*  arg1   = (void*)0x12345678;
       void*  arg2   = (void*)0x89abcdef;
       ffi_arg       res           = 0;

       arg_types[0] = &ffi_type_pointer;
       arg_types[1] = &ffi_type_pointer;
       arg_types[2] = NULL;

       CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_pointer,
              arg_types) == FFI_OK);

       args[0] = &arg1;
       args[1] = &arg2;
       args[2] = NULL;

       ffi_call(&cif, FFI_FN(cls_pointer_fn), &res, args);
       /* { dg-output "0x12345678 0x89abcdef: 0x9be02467" } */
       printf("res: 0x%08x\n", (unsigned int) res);
       /* { dg-output "\nres: 0x9be02467" } */

       CHECK(ffi_prep_closure_loc(pcl, &cif, cls_pointer_gn, NULL, code) == FFI_OK);

       res = (ffi_arg)((void*(*)(void*, void*))(code))(arg1, arg2);
       /* { dg-output "\n0x12345678 0x89abcdef: 0x9be02467" } */
       printf("res: 0x%08x\n", (unsigned int) res);
       /* { dg-output "\nres: 0x9be02467" } */

       exit(0);
}

Here is the call graph for this function: