-static void psi_jit_call(PSI_Context *C, impl_val *ret_val, decl *decl) {
- PSI_LibjitCall *call = decl->call.info;
+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);