diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-03-16 20:08:09 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-03-16 20:08:09 -0700 |
commit | d74778b6bf799cadf2f8de8b06e6e70e2ea733bb (patch) | |
tree | 1ecc732ef39711fe43339286029e41425499a645 | |
parent | 193cf80ca30c3f99fba965ed8dade31eddb8e098 (diff) | |
download | txr-d74778b6bf799cadf2f8de8b06e6e70e2ea733bb.tar.gz txr-d74778b6bf799cadf2f8de8b06e6e70e2ea733bb.tar.bz2 txr-d74778b6bf799cadf2f8de8b06e6e70e2ea733bb.zip |
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.
-rw-r--r-- | share/txr/stdlib/compiler.tl | 6 |
1 files 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 |