summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/txr/stdlib/compiler.tl18
1 files changed, 18 insertions, 0 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl
index e6f7acda..b01482b5 100644
--- a/share/txr/stdlib/compiler.tl
+++ b/share/txr/stdlib/compiler.tl
@@ -162,6 +162,8 @@
(cond me.(comp-cond oreg env form))
(if me.(comp-if oreg env form))
(block me.(comp-block oreg env form))
+ (return-from me.(comp-return-from oreg env form))
+ (return me.(comp-return oreg env form))
((let let*) me.(comp-let oreg env form))
(lambda me.(comp-lambda oreg env form))
(sys:for-op me.(comp-for oreg env form))
@@ -326,6 +328,22 @@
bfrag.fvars
bfrag.ffuns)))))
+(defmeth compiler comp-return-from (me oreg env form)
+ (mac-param-bind form (op name value) form
+ (let* ((nreg (if (null name)
+ nil
+ me.(get-dreg name)))
+ (vfrag me.(compile oreg env value)))
+ (new (frag oreg
+ ^(,*vfrag.code
+ (ret ,nreg ,vfrag.oreg))
+ vfrag.fvars
+ vfrag.ffuns)))))
+
+(defmeth compiler comp-return (me oreg env form)
+ (mac-param-bind form (op value) form
+ me.(comp-return-from oreg env ^(,op nil ,value))))
+
(defmeth compiler comp-let (me oreg env form)
(mac-param-bind form (sym raw-vis . body) form
(let* ((vis (mapcar [iffi atom list] raw-vis))