X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Flibffi.c;h=514394f4047f506650473e367a724a7c729d4d8b;hp=0e948a85257739e376f10ad28e3f0bb32d48ff1c;hb=70f215a31fab4be1fe3e80125eb401e11eb02b9f;hpb=b9193a8d80bf7ea8d768b9521bcd298a03974c9d diff --git a/src/libffi.c b/src/libffi.c index 0e948a8..514394f 100644 --- a/src/libffi.c +++ b/src/libffi.c @@ -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); }