From d74778b6bf799cadf2f8de8b06e6e70e2ea733bb Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 16 Mar 2018 20:08:09 -0700 Subject: compiler: fix wrong, undersized frame size in closure. * share/txr/stdlib/compiler.tl (compiler comp-lambda): Frame size can't be calculated from nfixed, because that doesn't account for the extra variables in optional parameters. It can't be calculated from the number of lexical variables either, because parameters that are special variables consume vXXYY frame entries without being counted as lexicals. Rather, the accurate frame size is given to us by the value of the counter in the newly created environment. --- share/txr/stdlib/compiler.tl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl index 684224a0..7842f558 100644 --- a/share/txr/stdlib/compiler.tl +++ b/share/txr/stdlib/compiler.tl @@ -251,8 +251,7 @@ (let* ((opt-pars (mapcar [iffi atom list] raw-opt-pars)) (nenv (if need-frame (new env up env co me) env)) (nreq (len req-pars)) - (nfixed (+ nreq (len opt-pars))) - (frsize (+ nfixed (if rest-par 1 0)))) + (nfixed (+ nreq (len opt-pars)))) (flet ((spec-sub (sym) (cond ((special-var-p sym) @@ -298,7 +297,8 @@ (benv (if specials (new env up nenv co me) nenv)) (bfrag me.(comp-progn benv body)) (oreg me.(alloc-treg)) - (lskip (gensym "l-"))) + (lskip (gensym "l-")) + (frsize nenv.v-cntr)) me.(free-treg bfrag.oreg) (new (frag oreg ^((close ,oreg ,frsize ,lskip ,nfixed ,nreq -- cgit v1.2.3