X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Flibjit.c;h=e1d6cf866252f9bd8ae07d2685bc73e0a786fc61;hp=773f0e02deafc0743bdc06d09f547a6c92730bfe;hb=3f3b862aeb06ebe0e61d8fcc21df0fe88e397688;hpb=207ff7bc85e967235f0ad1ffbf47c0f85f375063 diff --git a/src/libjit.c b/src/libjit.c index 773f0e0..e1d6cf8 100644 --- a/src/libjit.c +++ b/src/libjit.c @@ -163,13 +163,13 @@ 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, &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]; if (set->arg->_zv) { - psi_do_set(set->arg->_zv, set->val->func, set->val->vars); + psi_do_set(set->arg->_zv, set->val); } } @@ -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)