-static void psi_ffi_call(PSI_Context *C, impl_val *ret_val, decl *decl) {
- PSI_LibffiCall *call = decl->call.info;
+static void psi_ffi_call(PSI_Context *C, decl_callinfo *decl_call, impl_vararg *va) {
+ PSI_LibffiCall *call = decl_call->info;
+
+ if (va) {
+ ffi_status rc;
+ ffi_cif signature;
+ size_t i, nfixedargs = decl_call->argc, ntotalargs = nfixedargs + va->args->count;
+ void **params = calloc(2 * ntotalargs + 2, sizeof(void *));
+
+ for (i = 0; i < nfixedargs; ++i) {
+ params[i] = call->params[i];
+ params[i + ntotalargs + 1] = call->params[i + nfixedargs + 1];
+ }
+ 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];
+ }