This commit is contained in:
Justin Ethier 2016-06-29 22:41:42 -04:00
parent 63e476839f
commit 4f65fdb6e2

View file

@ -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) {
} else if (is_object_type(tmp) && 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 {
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);
}