fix argument handling bug in fl_map1

need to pop after _applyn; functions might rewrite the stack to
contain non-values.
This commit is contained in:
Jeff Bezanson 2013-06-10 19:12:53 -04:00 committed by Lassi Kortela
parent 3ebbcbc353
commit 2eef9d5a5d
1 changed files with 4 additions and 3 deletions

View File

@ -2185,6 +2185,7 @@ value_t fl_map1(value_t *args, u_int32_t nargs)
Stack[argSP+i] = cdr_(Stack[argSP+i]); Stack[argSP+i] = cdr_(Stack[argSP+i]);
} }
v = _applyn(nargs-1); v = _applyn(nargs-1);
POPN(nargs);
PUSH(v); PUSH(v);
v = mk_cons(); v = mk_cons();
car_(v) = POP(); cdr_(v) = NIL; car_(v) = POP(); cdr_(v) = NIL;
@ -2192,19 +2193,19 @@ value_t fl_map1(value_t *args, u_int32_t nargs)
fl_gc_handle(&first); fl_gc_handle(&first);
fl_gc_handle(&last); fl_gc_handle(&last);
while (iscons(Stack[argSP+1])) { while (iscons(Stack[argSP+1])) {
Stack[SP-nargs] = Stack[argSP]; PUSH(Stack[argSP]);
for(i=1; i < nargs; i++) { for(i=1; i < nargs; i++) {
Stack[SP-nargs+i] = car(Stack[argSP+i]); PUSH(car(Stack[argSP+i]));
Stack[argSP+i] = cdr_(Stack[argSP+i]); Stack[argSP+i] = cdr_(Stack[argSP+i]);
} }
v = _applyn(nargs-1); v = _applyn(nargs-1);
POPN(nargs);
PUSH(v); PUSH(v);
v = mk_cons(); v = mk_cons();
car_(v) = POP(); cdr_(v) = NIL; car_(v) = POP(); cdr_(v) = NIL;
cdr_(last) = v; cdr_(last) = v;
last = v; last = v;
} }
POPN(nargs);
fl_free_gc_handles(2); fl_free_gc_handles(2);
} }
return first; return first;