X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Flibjit.c;h=e1d6cf866252f9bd8ae07d2685bc73e0a786fc61;hp=ee9b1f341bb7d5380f4fb069d711f4ee74702b76;hb=596f215b67dd267284df4fe0e11f0ca4d197bfc1;hpb=d9a7378b795f32b91e110bd163c019aa30e79084 diff --git a/src/libjit.c b/src/libjit.c index ee9b1f3..e1d6cf8 100644 --- a/src/libjit.c +++ b/src/libjit.c @@ -163,7 +163,7 @@ static void psi_jit_handler(jit_type_t _sig, void *result, void **_args, void *_ jit_apply(data->signature, data->impl->decl->dlptr, arg_prm, data->impl->decl->args->count, &ret_val); - psi_do_return(data->impl->stmts->ret.list[0], &ret_val, *(zval **)_args[1]); + psi_do_return(*(zval **)_args[1], data->impl->stmts->ret.list[0], &ret_val); for (i = 0; i < data->impl->stmts->set.count; ++i) { set_stmt *set = data->impl->stmts->set.list[i]; @@ -230,10 +230,39 @@ static zend_function_entry *psi_jit_compile(PSI_Context *C) return zfe; } +static void psi_jit_call(PSI_Context *C, impl_val *ret_val, decl *decl, impl_val **args) { + jit_type_t signature, *types; + void **argps; + size_t i; + + /* FIXME: cache in decl */ + + types = calloc(decl->args->count + 1, sizeof(*types)); + argps = calloc(decl->args->count + 1, sizeof(*argps)); + for (i = 0; i < decl->args->count; ++i) { + decl_arg *darg = decl->args->args[i]; + + types[i] = psi_jit_decl_arg_type(darg); + argps[i] = args[i]; + } + + signature = jit_type_create_signature( + psi_jit_abi(decl->abi->convention), + psi_jit_decl_arg_type(decl->func), + types, decl->args->count, 1); + jit_apply(signature, decl->dlptr, argps, decl->args->count, ret_val); + + jit_type_free(signature); + free(types); + free(argps); + +} + static PSI_ContextOps ops = { psi_jit_init, psi_jit_dtor, psi_jit_compile, + psi_jit_call, }; PSI_ContextOps *PSI_Libjit(void)