+static void psi_jit_call(PSI_Context *C, decl_callinfo *decl_call, impl_vararg *va) {
+ PSI_LibjitCall *call = decl_call->info;
+
+ if (va) {
+ jit_type_t 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_jit_impl_type(va->types[i]);
+ params[nfixedargs + i + ntotalargs + 1] = &va->values[i];
+ }
+
+ signature = jit_type_create_signature(
+ jit_type_get_abi(call->signature),
+ jit_type_get_return(call->signature),
+ (jit_type_t *) params, ntotalargs, 1);
+ ZEND_ASSERT(signature);
+
+ jit_apply(signature, decl_call->sym, ¶ms[ntotalargs + 1],
+ nfixedargs, *decl_call->rval);
+ jit_type_free(signature);
+ free(params);
+ } else {
+ jit_apply(call->signature, decl_call->sym, decl_call->args,
+ decl_call->argc, *decl_call->rval);
+ }
+}
+