diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-03-29 07:02:30 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-03-29 07:02:30 -0700 |
commit | 2637c2ab87f46bb876eeae310ddf551397507e69 (patch) | |
tree | b5cad142a4d73aabfaff31795b2004ce801291dc | |
parent | df265a44458b97ca132520fef5aa66a261cf06d2 (diff) | |
download | txr-2637c2ab87f46bb876eeae310ddf551397507e69.tar.gz txr-2637c2ab87f46bb876eeae310ddf551397507e69.tar.bz2 txr-2637c2ab87f46bb876eeae310ddf551397507e69.zip |
compiler: enforce register balance.
* share/txr/stdlib/compiler.tl (compiler check-treg-leak): New
method.
(usr:compile-toplevel): Free the top-level output register,
then call check-treg-leak to verify all were returned.
-rw-r--r-- | share/txr/stdlib/compiler.tl | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl index 34c0134d..a1bae8cc 100644 --- a/share/txr/stdlib/compiler.tl +++ b/share/txr/stdlib/compiler.tl @@ -166,6 +166,11 @@ (defmeth compiler free-tregs (me tregs) (mapdo (meth me free-treg) tregs)) +(defmeth compiler check-treg-leak (me) + (let ((balance (- (pred me.treg-cntr) (len me.tregs)))) + (unless (zerop balance) + (error "t-register leak in compiler: ~s outstanding" balance)))) + (defmeth compiler new-env (me env) (when (>= env.lev me.nlev) (set me.nlev (succ env.lev)))) @@ -1251,5 +1256,7 @@ (xexp (prog1 (expand* exp) (unless *load-recursive* (release-deferred-warnings)))) (frag co.(compile oreg (new env co co) xexp))) + co.(free-treg oreg) + co.(check-treg-leak) as.(asm ^(,*frag.code (end ,frag.oreg))) (vm-make-desc co.nlev co.treg-cntr as.buf co.(get-datavec) co.(get-funvec))))) |