X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Flibffi.c;h=13eab49d5ecbd958b804cac32525a05c8c968de9;hp=428a7e647e8441a9a499728fcbb2f38bb349c9a8;hb=c5f1eb3b7e969dde73a6e485a19d5a2766651970;hpb=29137b5f19713219a1b9b5fdf54ad94a34d6fde0 diff --git a/src/libffi.c b/src/libffi.c index 428a7e6..13eab49 100644 --- a/src/libffi.c +++ b/src/libffi.c @@ -71,7 +71,29 @@ static void psi_ffi_closure_free(void *c) #endif } -static void psi_ffi_handler(ffi_cif *signature, void *_result, void **_args, void *_data); +static void psi_ffi_handler(ffi_cif *_sig, void *_result, void **_args, void *_data) +{ + psi_call(*(zend_execute_data **)_args[0], *(zval **)_args[1], _data); +} + +static void psi_ffi_callback(ffi_cif *_sig, void *_result, void **_args, void *_data) +{ + unsigned argc = _sig->nargs; + void **argv = _args; + ffi_arg *res = _result; + decl *decl = _data; + size_t i; + + // prepare args for the userland call + for (i = 0; i < decl->args->count; ++i) { + + } + // marshal return value of the userland call + switch (decl->func->type->type) { + + } +} + static inline ffi_type *psi_ffi_decl_arg_type(decl_arg *darg); typedef struct PSI_LibffiContext { @@ -319,11 +341,6 @@ static inline PSI_LibffiContext *PSI_LibffiContextInit(PSI_LibffiContext *L) { return L; } -static void psi_ffi_handler(ffi_cif *_sig, void *_result, void **_args, void *_data) -{ - psi_call(*(zend_execute_data **)_args[0], *(zval **)_args[1], _data); -} - static void psi_ffi_init(PSI_Context *C) { C->context = PSI_LibffiContextInit(NULL);