summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-03-29 07:02:30 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-03-29 07:02:30 -0700
commit2637c2ab87f46bb876eeae310ddf551397507e69 (patch)
treeb5cad142a4d73aabfaff31795b2004ce801291dc
parentdf265a44458b97ca132520fef5aa66a261cf06d2 (diff)
downloadtxr-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.tl7
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)))))