From: Michael Wallner Date: Wed, 28 Nov 2018 13:23:20 +0000 (+0100) Subject: fix calling convention and arg types X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=commitdiff_plain;h=788909f4828147d22a822b736560c1b3643417ec;ds=sidebyside fix calling convention and arg types --- diff --git a/src/libffi.c b/src/libffi.c index 6f808d4..fe2bc61 100644 --- a/src/libffi.c +++ b/src/libffi.c @@ -229,10 +229,15 @@ static bool psi_ffi_init(struct psi_context *C) { ffi_status rc; struct psi_ffi_context *context = pecalloc(1, sizeof(*context), 1); + ffi_abi abi = FFI_DEFAULT_ABI; + +#if HAVE_FFI_FASTCALL + abi = FFI_FASTCALL; +#endif context->params[0] = &ffi_type_pointer; context->params[1] = &ffi_type_pointer; - rc = ffi_prep_cif(&context->signature, FFI_DEFAULT_ABI, 2, &ffi_type_void, + rc = ffi_prep_cif(&context->signature, abi, 2, &ffi_type_void, context->params); if (FFI_OK != rc) { @@ -292,22 +297,6 @@ static void psi_ffi_composite_dtor(struct psi_context *C, darg->engine.info = NULL; darg->engine.type = NULL; - struct psi_plist *args = NULL; - struct psi_decl_type *dtype = psi_decl_type_get_real(darg->type); - - if (dtype->type == PSI_T_STRUCT) { - args = dtype->real.strct->args; - } else if (dtype->type == PSI_T_UNION) { - args = dtype->real.unn->args; - } - - size_t i = 0; - struct psi_decl_arg *tmp; - - while (psi_plist_get(args, i++, &tmp)) { - psi_ffi_composite_dtor(C, tmp); - } - psi_plist_free(info->eles); pefree(info, 1); } diff --git a/src/libjit.c b/src/libjit.c index 0b4989b..37703e4 100644 --- a/src/libjit.c +++ b/src/libjit.c @@ -215,7 +215,7 @@ static bool psi_jit_init(struct psi_context *C) return false; } - context->signature = jit_type_create_signature(jit_abi_cdecl, jit_type_void, + context->signature = jit_type_create_signature(jit_abi_fastcall, jit_type_void, params, 2, 1); if (!context->signature) { jit_context_destroy(context->jit); @@ -252,8 +252,9 @@ static bool psi_jit_composite_init(struct psi_context *C, info = pecalloc(1, sizeof(*info), 1); info->eles = psi_plist_init((psi_plist_dtor) psi_jit_type_free); + psi_context_composite_type_elements(C, darg, &info->eles); info->strct = jit_type_create_struct((jit_type_t *) - psi_context_composite_type_elements(C, darg, &info->eles), + psi_plist_eles(info->eles), psi_plist_count(info->eles), 0); darg->engine.info = info; @@ -272,7 +273,8 @@ static void psi_jit_composite_dtor(struct psi_context *C, darg->engine.type = NULL; jit_type_free(info->strct); - psi_plist_free(info->eles); + /* just free */ + pefree(info->eles, 1); pefree(info, 1); } } @@ -307,7 +309,7 @@ static bool psi_jit_extvar_init(struct psi_context *C, jit_context_build_start(ctx->jit); info->get.signature = jit_type_create_signature(jit_abi_cdecl, - psi_context_decl_arg_full_type(C, evar->getter->func), NULL, 0, 1); + psi_context_decl_arg_call_type(C, evar->getter->func), NULL, 0, 1); if (!info->get.signature) { goto failure; } @@ -319,7 +321,7 @@ static bool psi_jit_extvar_init(struct psi_context *C, info->set.params[0] = psi_context_decl_arg_call_type(C, evar->arg); info->set.signature = jit_type_create_signature(jit_abi_cdecl, - psi_context_decl_arg_full_type(C, evar->setter->func), + psi_context_decl_arg_call_type(C, evar->setter->func), info->set.params, 1, 1); if (!info->set.signature) { goto failure; @@ -565,6 +567,9 @@ static void psi_jit_layoutof_type(struct psi_context *C, void *orig_type, { l->pos = jit_type_get_alignment(orig_type); l->len = jit_type_get_size(orig_type); + + assert(l->pos); + assert(l->len); } static struct psi_context_ops ops = { diff --git a/src/types/decl_type.c b/src/types/decl_type.c index 66fb5f4..f5086f1 100644 --- a/src/types/decl_type.c +++ b/src/types/decl_type.c @@ -345,6 +345,7 @@ void psi_decl_type_dump(struct psi_dump *dump, struct psi_decl_type *t, unsigned case PSI_T_UNION: PSI_DUMP(dump, "union "); if (psi_decl_type_is_anon(t->name, "union")) { + PSI_DUMP(dump, "/*::(%zu, %zu)*/", t->real.unn->align, t->real.unn->size); psi_decl_type_dump_args_with_layout(dump, t->real.unn->args, level); return; } diff --git a/src/types/number.c b/src/types/number.c index c3ec31b..10505df 100644 --- a/src/types/number.c +++ b/src/types/number.c @@ -576,7 +576,7 @@ static inline bool psi_number_validate_number(struct psi_data *data, struct psi_ return true; } } - break; + /* no break */ default: zend_string_release(exp->data.numb); exp->type = PSI_T_INT64;