about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--mu.arc44
1 files changed, 19 insertions, 25 deletions
diff --git a/mu.arc b/mu.arc
index 1cccdc9c..225957be 100644
--- a/mu.arc
+++ b/mu.arc
@@ -66,7 +66,8 @@
             (and dump-trace* (no dump-trace*!whitelist) (~pos label dump-trace*!blacklist)))
     (apply prn label ": " args))
   (enq (list label (apply tostring:prn args))
-       traces*))
+       traces*)
+  (car args))
 
 (redef tr args  ; why am I still returning to prn when debugging? Will this help?
   (do1 nil
@@ -581,7 +582,7 @@
                     (case (v arg.0)
                       for-some-cycles
                         (let wakeup-time (+ curr-cycle* (v arg.1))
-                          (trace "run" "sleeping until " wakeup-time)
+                          (trace "run" "sleeping until " wakeup-time)  ; TODO
                           (= rep.routine*!sleep `(for-some-cycles ,wakeup-time)))
                       until-location-changes
                         (= rep.routine*!sleep `(until-location-changes ,(addr arg.1) ,(m arg.1)))
@@ -964,37 +965,30 @@
               (recur cdr.instr)
               (pop stack)
               (continue))
-            (let (oarg op arg)  (parse-instr instr)
-              (trace "c{1" pc " " op " " oarg)
+            (with ((oarg op arg)  (parse-instr instr)
+                   yield-new-instr  (fn (new-instr)
+                                      (trace "c{1" "@pc X " instr " => " new-instr)
+                                      (yield new-instr))
+                   yield-unchanged  (fn ()
+                                      (trace "c{1}" "@pc ✓ " instr)
+                                      (yield instr)))
+              (when (in op 'break 'break-if 'break-unless 'loop 'loop-if 'loop-unless)
+                (assert (is oarg nil) "@op: can't take oarg in @instr"))
               (case op
                 break
-                  (do
-                    (assert (is oarg nil) "break: can't take oarg in @instr")
-                    (yield `(((jump)) ((,(close-offset pc locs (and arg (v arg.0))) offset)))))
+                  (yield-new-instr `(((jump)) ((,(close-offset pc locs (and arg (v arg.0))) offset))))
                 break-if
-                  (do
-                    (assert (is oarg nil) "break-if: can't take oarg in @instr")
-                    (yield `(((jump-if)) ,arg.0 ((,(close-offset pc locs (and cdr.arg (v arg.1))) offset)))))
+                  (yield-new-instr `(((jump-if)) ,arg.0 ((,(close-offset pc locs (and cdr.arg (v arg.1))) offset))))
                 break-unless
-                  (do
-                    (assert (is oarg nil) "break-unless: can't take oarg in @instr")
-                    (yield `(((jump-unless)) ,arg.0 ((,(close-offset pc locs (and cdr.arg (v arg.1))) offset)))))
+                  (yield-new-instr `(((jump-unless)) ,arg.0 ((,(close-offset pc locs (and cdr.arg (v arg.1))) offset))))
                 loop
-                  (do
-                    (assert (is oarg nil) "loop: can't take oarg in @instr")
-                    (yield `(((jump)) ((,(open-offset pc stack (and arg (v arg.0))) offset)))))
+                  (yield-new-instr `(((jump)) ((,(open-offset pc stack (and arg (v arg.0))) offset))))
                 loop-if
-                  (do
-                    (trace "cvt0" "loop-if: " instr " => " (- stack.0 1))
-                    (assert (is oarg nil) "loop-if: can't take oarg in @instr")
-                    (yield `(((jump-if)) ,arg.0 ((,(open-offset pc stack (and cdr.arg (v arg.1))) offset)))))
+                  (yield-new-instr `(((jump-if)) ,arg.0 ((,(open-offset pc stack (and cdr.arg (v arg.1))) offset))))
                 loop-unless
-                  (do
-                    (trace "cvt0" "loop-if: " instr " => " (- stack.0 1))
-                    (assert (is oarg nil) "loop-unless: can't take oarg in @instr")
-                    (yield `(((jump-unless)) ,arg.0 ((,(open-offset pc stack (and cdr.arg (v arg.1))) offset)))))
+                  (yield-new-instr `(((jump-unless)) ,arg.0 ((,(open-offset pc stack (and cdr.arg (v arg.1))) offset))))
                 ;else
-                  (yield instr)))
+                  (yield-unchanged)))
             (++ pc))))))))
 
 (def close-offset (pc locs nblocks)