{
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) {
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);
}
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);
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;
darg->engine.type = NULL;
jit_type_free(info->strct);
- psi_plist_free(info->eles);
+ /* just free */
+ pefree(info->eles, 1);
pefree(info, 1);
}
}
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;
}
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;
{
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 = {