From b507485f5568a79e0bf72ad86078f742baeaacbe Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Sat, 6 Mar 2021 22:07:11 -0500 Subject: [PATCH] Port dispatch_apply to new calling convention --- include/cyclone/runtime.h | 2 +- runtime.c | 27 +++++++++++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/include/cyclone/runtime.h b/include/cyclone/runtime.h index bca4b6f4..152cecf2 100644 --- a/include/cyclone/runtime.h +++ b/include/cyclone/runtime.h @@ -176,7 +176,7 @@ object Cyc_global_set_cps(void *thd, object cont, object sym, object * glo, obje /**@{*/ object apply(void *data, object cont, object func, object args); void Cyc_apply(void *data, object cont, int argc, object *args); -void dispatch_apply_va(void *data, int argc, object clo, object cont, object func, ...); +void dispatch_apply_va(void *data, object clo, int argc, object *args); object apply_va(void *data, object cont, int argc, object func, ...); void dispatch(void *data, int argc, function_type func, object clo, object cont, object args); diff --git a/runtime.c b/runtime.c index f8f87acc..63ad0878 100644 --- a/runtime.c +++ b/runtime.c @@ -5645,15 +5645,34 @@ void _call_95cc(void *data, object cont, object args) } \ va_end(ap); -void dispatch_apply_va(void *data, int argc, object clo, object cont, object func, ...) +//void dispatch_apply_va(void *data, int argc, object clo, object cont, object func, ...) +void dispatch_apply_va(void *data, object clo, int argc, object *args) { list lis = NULL, prev = NULL; object tmp; + // cargs TODO: check num args to make this safe + object func = args[1]; int i; - va_list ap; argc = argc - 1; // Required for "dispatch" function - do_apply_va - apply(data, cont, func, lis); + if (argc == 2) { + lis = args[2]; + Cyc_check_pair_or_null(data, lis); + } else { + lis = alloca(sizeof(pair_type)); + tmp = args[2]; + set_pair(lis, tmp, NULL); + prev = lis; + for (i = 3; i < argc - 1; i++) { + pair_type *next = alloca(sizeof(pair_type)); + tmp = args[i]; + set_pair(next, tmp, NULL); + cdr(prev) = next; + prev = next; + } + tmp = args[argc]; + cdr(prev) = tmp; + } + apply(data, clo, func, lis); } object apply_va(void *data, object cont, int argc, object func, ...)