~ chicken-core (chicken-5) fc545f526db842f095c076ea89e592cd42e92fbe
commit fc545f526db842f095c076ea89e592cd42e92fbe Author: Peter Bex <peter@more-magic.net> AuthorDate: Sat Oct 17 16:45:26 2015 +0200 Commit: Evan Hanson <evhan@foldling.org> CommitDate: Mon Oct 26 09:37:10 2015 +1300 Make memory demand for rest-args list more precise. When allocating a list for holding rest args, instead of demanding memory corresponding to the total argument count, we should only demand memory for the rest arguments. This now matches the allocation that corresponds to the demand, just before calling C_build_rest(). Signed-off-by: Evan Hanson <evhan@foldling.org> diff --git a/c-backend.scm b/c-backend.scm index 0473797b..25e0b97a 100644 --- a/c-backend.scm +++ b/c-backend.scm @@ -790,7 +790,7 @@ (lambda (ubt) (gen #t (utype (cdr ubt)) #\space (car ubt) #\;)) ubtemps))) - (cond [(eq? 'toplevel id) + (cond ((eq? 'toplevel id) (let ([ldemand (foldl (lambda (n lit) (+ n (literal-size lit))) 0 literals)] [llen (length literals)] ) (gen #t "C_word *a;" @@ -817,14 +817,14 @@ (gen #t "C_initialize_lf(lf," llen ");") (literal-frame) (gen #t "C_register_lf2(lf," llen ",create_ptable());")) - (gen #\{) ) ] - [rest + (gen #\{))) + (rest (gen #t "C_word *a;") (when (and (not unsafe) (not no-argc-checks) (> n 2) (not empty-closure)) (gen #t "if(c<" n ") C_bad_min_argc_2(c," n ",t0);") ) (when insert-timer-checks (gen #t "C_check_for_interrupt;")) - (gen #t "if(!C_demand(c*C_SIZEOF_PAIR+" demand ")){") ] - [else + (gen #t "if(!C_demand((c-" n ")*C_SIZEOF_PAIR +" demand ")){")) + (else (cond [(and (not direct) (> demand 0)) (if looping (gen #t "C_word *a;" @@ -846,7 +846,7 @@ (if (and looping (> demand 0)) (gen #t "if(!C_stack_probe(a)){") (gen #t "if(!C_stack_probe(&a)){") ) ) - (else (gen #\{)))]) + (else (gen #\{))))) (cond ((and (not (eq? 'toplevel id)) (not direct) (or rest external (> demand 0)) )Trap