support delimter separated pathlist
[m6w6/ext-psi] / src / libjit.c
index 773f0e02deafc0743bdc06d09f547a6c92730bfe..e1d6cf866252f9bd8ae07d2685bc73e0a786fc61 100644 (file)
@@ -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)