summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)))))