-
- data = PSI_LibffiDataAlloc(ctx, D->impls->list[i]);
- zf->fname = D->impls->list[i]->func->name + (D->impls->list[i]->func->name[0] == '\\');
- zf->num_args = D->impls->list[i]->func->args->count;
- zf->handler = data->code;
- zf->arg_info = data->arginfo;
- ++j;
+ for (i = 0; i < va->args->count; ++i) {
+ params[nfixedargs + i] = psi_ffi_impl_type(va->types[i]);
+ params[nfixedargs + i + ntotalargs + 1] = &va->values[i];
+ }
+#ifdef PSI_HAVE_FFI_PREP_CIF_VAR
+ rc = ffi_prep_cif_var(&signature, call->signature.abi,
+ nfixedargs, ntotalargs,
+ call->signature.rtype, (ffi_type **) params);
+#else
+ /* FIXME: test in config.m4; assume we can just call anyway */
+ rc = ffi_prep_cif(&signature, call->signature.abi, ntotalargs,
+ call->signature.rtype, (ffi_type **) params);
+#endif
+ ZEND_ASSERT(FFI_OK == rc);
+ ffi_call(&signature, FFI_FN(decl_call->sym), decl_call->rval, ¶ms[ntotalargs + 1]);
+ free(params);
+ } else {
+ ffi_call(&call->signature, FFI_FN(decl_call->sym), decl_call->rval, decl_call->args);