- PSI_LibjitData *data = _data;
- size_t i;
- void **arg_prm = NULL;
- impl_val ret_val;
-
- if (SUCCESS != psi_parse_args(*(zend_execute_data **)_args[0], data->impl)) {
- return;
- }
-
- if (data->impl->decl->args->count) {
- arg_prm = malloc(data->impl->decl->args->count * sizeof(*arg_prm));
-
- for (i = 0; i < data->impl->decl->args->count; ++i) {
- decl_arg *darg = data->impl->decl->args->args[i];
-
- arg_prm[i] = psi_do_let(darg);
- }
- }
-
- jit_apply(data->signature, data->impl->decl->dlptr, arg_prm, data->impl->decl->args->count, &ret_val);
-
- 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);
- }
- }
-
- for (i = 0; i < data->impl->stmts->fre.count; ++i) {
- free_stmt *fre = data->impl->stmts->fre.list[i];
-
- psi_do_free(fre);
- }
-
- psi_do_clean(data->impl);
-
- if (arg_prm) {
- free(arg_prm);
- }