flush
[m6w6/ext-psi] / src / libffi.c
index 13eab49d5ecbd958b804cac32525a05c8c968de9..221e2c24507689b02549a5fd65f6a3551c853685 100644 (file)
@@ -81,17 +81,46 @@ static void psi_ffi_callback(ffi_cif *_sig, void *_result, void **_args, void *_
        unsigned argc = _sig->nargs;
        void **argv = _args;
        ffi_arg *res = _result;
-       decl *decl = _data;
-       size_t i;
+       let_stmt *let;
+       decl_arg *darg = let->var->arg;
+       decl *decl_cb = darg->type->func;
+       let_callback *cb = let->val->data.callback;
+       impl_arg *iarg = cb->func->arg;
+       size_t i, argc = cb->args->count;
+       zval return_value, *argv = calloc(argc, sizeof(*argv));
 
        // prepare args for the userland call
-       for (i = 0; i < decl->args->count; ++i) {
+       for (i = 0; i < decl_cb->args->count; ++i) {
 
        }
+       for (i = 0; i < cb->args->count; ++i) {
+               psi_do_set(&argv[i], cb->args->vals[i]);
+       }
+       zend_fcall_info_argp(iarg->val.zend.cb->fci, argc, argv);
+       zend_fcall_info_call(&iarg->val.zend.cb->fci, &iarg->val.zend.cb->fcc,
+                       &return_value, NULL);
        // marshal return value of the userland call
-       switch (decl->func->type->type) {
-
+       switch (cb->func->type) {
+       case PSI_T_BOOLVAL:
+               break;
+       case PSI_T_INTVAL:
+               break;
+       case PSI_T_FLOATVAL:
+               break;
+       case PSI_T_PATHVAL:
+       case PSI_T_STRVAL:
+               break;
+       case PSI_T_STRLEN:
+               break;
+       case PSI_T_ARRVAL:
+               break;
+       case PSI_T_OBJVAL:
+               break;
+       case PSI_T_CALLBACK:
+               break;
+       EMPTY_SWITCH_DEFAULT_CASE();
        }
+       darg->ptr = psi_let_val(cb->func->type, iarg, darg->ptr, real_decl_type(darg->type)->strct, &darg->mem);
 }
 
 static inline ffi_type *psi_ffi_decl_arg_type(decl_arg *darg);
@@ -286,8 +315,9 @@ static inline ffi_type *psi_ffi_decl_type(decl_type *type) {
                        PSI_LibffiCall *call = PSI_LibffiCallAlloc(&PSI_G(context), real->func);
                        ffi_status rc;
 
-                       rc = psi_ffi_prep_closure(&real->func->call.closure.data, &real->func->call.sym,
-                                       &call->signature, psi_ffi_handler, NULL);
+                       rc = psi_ffi_prep_closure(
+                                       (void *) &real->func->call.closure.data,
+                                       &real->func->call.sym, &call->signature, psi_ffi_handler, NULL);
                        if (FFI_OK == rc) {
                                real->func->call.info = call;
                                real->func->call.closure.dtor = psi_ffi_closure_free;