From 67c00ae7ed9a0bd2928f2552934deae5054e1025 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Thu, 30 Jun 2016 00:09:17 -0400 Subject: [PATCH] WIP version of dispatch_apply_va --- include/cyclone/runtime.h | 2 ++ runtime.c | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/include/cyclone/runtime.h b/include/cyclone/runtime.h index ce55e66e..7ce35156 100644 --- a/include/cyclone/runtime.h +++ b/include/cyclone/runtime.h @@ -126,6 +126,8 @@ object Cyc_get_cvar(object var); object Cyc_set_cvar(object var, object value); object apply(void *data, object cont, object func, object args); void Cyc_apply(void *data, int argc, closure cont, object prim, ...); +void dispatch_apply_va(void *data, int argc, object clo, object cont, object func, ...); +void apply_va(void *data, object cont, int argc, object func, ...); object Cyc_string_cmp(void *data, object str1, object str2); void dispatch_string_91append(void *data, int argc, object clo, object cont, object str1, ...); diff --git a/runtime.c b/runtime.c index 6ef0f96b..15af73b0 100644 --- a/runtime.c +++ b/runtime.c @@ -2893,13 +2893,16 @@ void __121_123(void *data, object cont, object args) args); } -//object apply_va(void *data, int argc, object clo, object cont, object func, ...); void _apply(void *data, object cont, object args) { - Cyc_check_num_args(data, "apply", 2, args); - apply(data, cont, car(args), cadr(args)); - //object argc = Cyc_length(data, args); - //dispatch(data, obj_obj2int(argc), (function_type)apply_va, cont, cont, args); +// Cyc_check_num_args(data, "apply", 2, args); +// apply(data, cont, car(args), cadr(args)); + object argc = Cyc_length(data, args); + + //fprintf(stdout, "_apply received args: "); + //Cyc_display(args, stdout); + //fprintf(stdout, "\n"); + dispatch(data, obj_obj2int(argc), (function_type)dispatch_apply_va, cont, cont, args); } void _assoc(void *data, object cont, object args) @@ -3227,8 +3230,7 @@ void _call_95cc(void *data, object cont, object args) return_closcall2(data, __glo_call_95cc_scheme_base, cont, car(args)); } -// TODO: Experimenting with supporting varargs for (apply). does not work yet -object apply_va(void *data, int argc, object clo, object cont, object func, ...) +void apply_va(void *data, object cont, int argc, object func, ...) { object tmp = NULL; int i; @@ -3238,6 +3240,29 @@ object apply_va(void *data, int argc, object clo, object cont, object func, ...) tmp = va_arg(ap, object); } va_end(ap); +// fprintf(stdout, "DEBUG applying argc %d, func ", argc); +// Cyc_display(func, stdout); +// fprintf(stdout, " to values "); +// Cyc_display(tmp, stdout); +// fprintf(stdout, "\n"); + apply(data, cont, func, tmp); +} + +void dispatch_apply_va(void *data, int argc, object clo, object cont, object func, ...) +{ + object tmp = NULL; + int i; + va_list ap; + va_start(ap, func); + for (i = 1; i < argc - 1; i++) { + tmp = va_arg(ap, object); + } + va_end(ap); +// fprintf(stdout, "DEBUG applying argc %d, func ", argc); +// Cyc_display(func, stdout); +// fprintf(stdout, " to values "); +// Cyc_display(tmp, stdout); +// fprintf(stdout, "\n"); apply(data, cont, func, tmp); }