X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Flibffi.c;h=19afda09baa803e8edef148f8742cc5265905194;hb=b9bd15b69df3c3284ca38ed761d20dd8b084d5f3;hp=81dc2381d4eed9a6c36e1c9c4cd9b113acd72169;hpb=e472b48ff23ab19da6a8719db243ac8788eb34f4;p=m6w6%2Fext-psi diff --git a/src/libffi.c b/src/libffi.c index 81dc238..19afda0 100644 --- a/src/libffi.c +++ b/src/libffi.c @@ -270,9 +270,6 @@ static inline ffi_type *psi_ffi_decl_type(decl_type *type) { decl_type *real = real_decl_type(type); switch (real->type) { - case PSI_T_FUNCTION: - return &ffi_type_pointer; - case PSI_T_STRUCT: if (!real->strct->engine.type) { ffi_type *strct = calloc(1, sizeof(ffi_type)); @@ -319,6 +316,13 @@ static inline PSI_LibffiContext *PSI_LibffiContextInit(PSI_LibffiContext *L) { return L; } +static inline void PSI_LibffiContextFree(PSI_LibffiContext **L) { + if (*L) { + free(*L); + *L = NULL; + } +} + static void psi_ffi_init(PSI_Context *C) { C->context = PSI_LibffiContextInit(NULL); @@ -357,7 +361,7 @@ static void psi_ffi_dtor(PSI_Context *C) } } } - free(C->context); + PSI_LibffiContextFree((void *) &C->context); } static zend_function_entry *psi_ffi_compile(PSI_Context *C) @@ -379,10 +383,11 @@ static zend_function_entry *psi_ffi_compile(PSI_Context *C) continue; } - call = PSI_LibffiCallAlloc(C, impl->decl); - if (FFI_OK != PSI_LibffiCallInitClosure(C, call, impl)) { - PSI_LibffiCallFree(call); - continue; + if ((call = PSI_LibffiCallAlloc(C, impl->decl))) { + if (FFI_OK != PSI_LibffiCallInitClosure(C, call, impl)) { + PSI_LibffiCallFree(call); + continue; + } } zf->fname = impl->func->name + (impl->func->name[0] == '\\'); @@ -394,16 +399,17 @@ static zend_function_entry *psi_ffi_compile(PSI_Context *C) for (c = 0; c < impl->stmts->let.count; ++c) { let_stmt *let = impl->stmts->let.list[c]; - if (let->val->kind == PSI_LET_CALLBACK) { + if (let->val && let->val->kind == PSI_LET_CALLBACK) { let_callback *cb = let->val->data.callback; - call = PSI_LibffiCallAlloc(C, cb->decl); - if (FFI_OK != PSI_LibffiCallInitCallbackClosure(C, call, cb)) { - PSI_LibffiCallFree(call); - continue; - } + if ((call = PSI_LibffiCallAlloc(C, cb->decl))) { + if (FFI_OK != PSI_LibffiCallInitCallbackClosure(C, call, cb)) { + PSI_LibffiCallFree(call); + continue; + } - cb->decl->call.sym = call->code; + cb->decl->call.sym = call->code; + } } } } @@ -411,9 +417,6 @@ static zend_function_entry *psi_ffi_compile(PSI_Context *C) for (i = 0; i < C->decls->count; ++i) { decl *decl = C->decls->list[i]; -// if (decl->impl) { -// continue; -// } if (decl->call.info) { continue; }