From 2637c2ab87f46bb876eeae310ddf551397507e69 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 29 Mar 2018 07:02:30 -0700 Subject: 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. --- share/txr/stdlib/compiler.tl | 7 +++++++ 1 file changed, 7 insertions(+) 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))))) -- cgit v1.2.3