X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Flibffi.c;h=627c97f5a27e5d01384bd659930af49312c3af74;hb=6b2e6562e64a263a42910d28e23b6ca94f3ecb65;hp=81dc2381d4eed9a6c36e1c9c4cd9b113acd72169;hpb=e472b48ff23ab19da6a8719db243ac8788eb34f4;p=m6w6%2Fext-psi diff --git a/src/libffi.c b/src/libffi.c index 81dc238..627c97f 100644 --- a/src/libffi.c +++ b/src/libffi.c @@ -270,25 +270,22 @@ 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) { + if (!real->real.strct->engine.type) { ffi_type *strct = calloc(1, sizeof(ffi_type)); strct->type = FFI_TYPE_STRUCT; strct->size = 0; - strct->elements = psi_ffi_struct_type_elements(real->strct); + strct->elements = psi_ffi_struct_type_elements(real->real.strct); - real->strct->engine.type = strct; - real->strct->engine.dtor = psi_ffi_struct_type_dtor; + real->real.strct->engine.type = strct; + real->real.strct->engine.dtor = psi_ffi_struct_type_dtor; } - return real->strct->engine.type; + return real->real.strct->engine.type; case PSI_T_UNION: - return psi_ffi_decl_arg_type(real->unn->args->args[0]); + return psi_ffi_decl_arg_type(real->real.unn->args->args[0]); default: return psi_ffi_token_type(real->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; }