diff --git a/runtime.c b/runtime.c index 3deec36c..ebd38297 100644 --- a/runtime.c +++ b/runtime.c @@ -3248,12 +3248,14 @@ void apply_va(void *data, object cont, int argc, object func, ...) apply(data, cont, func, tmp); } -#define stack_append(lis, value) { \ +// Prepend value to the given list +#define stack_prepend(lis, value) { \ pair_type *tmp2 = alloca(sizeof(pair_type)); \ set_pair(tmp2, value, lis); \ lis = tmp2; \ } +// Prepend each element of src to dest list #define stack_list_prepend(src, dest) { \ while (src) { \ pair_type *tmp2 = alloca(sizeof(pair_type)); \ @@ -3269,8 +3271,6 @@ void dispatch_apply_va(void *data, int argc, object clo, object cont, object fun int i; va_list ap; argc = argc - 1; // Required for "dispatch" function - // TODO: pack all this up in a macro, and use it for apply_va also - // TODO: validate last arg is a list va_start(ap, func); if (argc == 2) { // Fast path, nothing to append @@ -3281,46 +3281,19 @@ void dispatch_apply_va(void *data, int argc, object clo, object cont, object fun tmp = va_arg(ap, object); if (tmp == NULL){ continue; - } else if (is_object_type(tmp)) { - if (type_of(tmp) == pair_tag) { - l = tmp; - stack_list_prepend(l, lis); - //while (l) { - // pair_type *tmp2 = alloca(sizeof(pair_type)); - // set_pair(tmp2, car(l), lis); - // lis = tmp2; - // l = cdr(l); - //} - } else { - stack_append(lis, tmp); - //pair_type *tmp2 = alloca(sizeof(pair_type)); - //set_pair(tmp2, tmp, lis); - //lis = tmp2; - } + } else if (is_object_type(tmp) && type_of(tmp) == pair_tag) { + l = tmp; + stack_list_prepend(l, lis); } else { - stack_append(lis, tmp); - //pair_type *tmp2 = alloca(sizeof(pair_type)); - //set_pair(tmp2, tmp, lis); - //lis = tmp2; + stack_prepend(lis, tmp); } } // Reverse lis l = lis; lis = NULL; stack_list_prepend(l, lis); - //while (l) { - // pair_type *tmp2 = alloca(sizeof(pair_type)); - // set_pair(tmp2, car(l), lis); - // lis = tmp2; - // l = cdr(l); - //} } va_end(ap); - //fprintf(stdout, "DEBUG applying argc %d, func ", argc); - //Cyc_display(func, stdout); - //fprintf(stdout, " to values "); - //Cyc_display(lis, stdout); - //fprintf(stdout, "\n"); apply(data, cont, func, lis); }