X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Flibffi.c;h=78b02391f6cbcd3b4adcfb725341d4fe86e5b932;hb=cbdcfd25784d00b309573f5e2de35538e9efa8af;hp=0e948a85257739e376f10ad28e3f0bb32d48ff1c;hpb=b9193a8d80bf7ea8d768b9521bcd298a03974c9d;p=m6w6%2Fext-psi diff --git a/src/libffi.c b/src/libffi.c index 0e948a8..78b0239 100644 --- a/src/libffi.c +++ b/src/libffi.c @@ -91,7 +91,7 @@ static void psi_ffi_callback(ffi_cif *_sig, void *_result, void **_args, void *_ /* prepare args for the userland call */ for (i = 0; i < argc; ++i) { - cb->decl->args->args[i]->ptr = argv[i]; + cb->decl->args->args[i]->let = argv[i]; } for (i = 0; i < cb->args->count; ++i) { psi_do_set(&zargv[i], cb->args->vals[i]); @@ -116,6 +116,12 @@ static void psi_ffi_callback(ffi_cif *_sig, void *_result, void **_args, void *_ if (result != _result) { *(void **)_result = result; } + + zend_fcall_info_args_clear(&iarg->val.zend.cb->fci, 0); + for (i = 0; i < cb->args->count; ++i) { + zval_ptr_dtor(&zargv[i]); + } + free(zargv); } static inline ffi_type *psi_ffi_decl_arg_type(decl_arg *darg); @@ -373,6 +379,26 @@ static void psi_ffi_dtor(PSI_Context *C) PSI_LibffiCallFree(decl->call.info); } } + + } + if (C->impls) { + size_t i, j; + + for (i = 0; i < C->impls->count; ++i) { + impl *impl = C->impls->list[i]; + + for (j = 0; j < impl->stmts->let.count; ++j) { + let_stmt *let = impl->stmts->let.list[j]; + + if (let->val && let->val->kind == PSI_LET_CALLBACK) { + let_callback *cb = let->val->data.callback; + + if (cb->decl && cb->decl->call.info) { + PSI_LibffiCallFree(cb->decl->call.info); + } + } + } + } } free(C->context); }