summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--stdlib/compiler.tl8
1 files changed, 6 insertions, 2 deletions
diff --git a/stdlib/compiler.tl b/stdlib/compiler.tl
index 7ad727e0..37e2b684 100644
--- a/stdlib/compiler.tl
+++ b/stdlib/compiler.tl
@@ -1703,7 +1703,9 @@
(defmeth compiler comp-tree-case (me oreg env form)
(mac-param-bind form (op obj . cases) form
- (let* ((nenv (new env up env co me))
+ (let* ((tpos *tail-pos*)
+ (*tail-pos* nil)
+ (nenv (new env up env co me))
(obj-immut-var nenv.(extend-var (gensym)))
(obj-var nenv.(extend-var (gensym)))
(err-blk (gensym))
@@ -1711,8 +1713,9 @@
(ctx-form (rlcp-tree ^'(,op) form))
(treg me.(maybe-alloc-treg oreg))
(objfrag me.(compile treg env obj))
+ (ncases (len cases))
(cfrags (collect-each ((c cases)
- (i (range 1)))
+ (i 1))
(mac-param-bind form (params . body) c
(let* ((src (expand ^(block ,err-blk
(set ,obj-var.sym
@@ -1722,6 +1725,7 @@
params nil obj-var.sym :
err-blk
body))))
+ (*tail-pos* (if (eq c ncases) tpos))
(cfrag me.(compile treg nenv src)))
(new (frag treg
^(,*cfrag.code