about summary refs log tree commit diff stats
path: root/mu.arc
diff options
context:
space:
mode:
Diffstat (limited to 'mu.arc')
-rw-r--r--mu.arc26
1 files changed, 17 insertions, 9 deletions
diff --git a/mu.arc b/mu.arc
index b06d402f..ca4b0216 100644
--- a/mu.arc
+++ b/mu.arc
@@ -267,6 +267,8 @@
 
 (mac results (routine)  ; assignable
   `((((rep ,routine) 'call-stack) 0) 'results))
+(mac reply-args(routine)  ; assignable
+  `((((rep ,routine) 'call-stack) 0) 'reply-args))
 
 (def waiting-for-exact-cycle? (routine)
   (is 'until rep.routine!sleep.0))
@@ -794,13 +796,18 @@
                 reply
                   (do (when arg
                         (prepare-reply arg))
-                      (let results results.routine*
+                      (with (results results.routine*
+                             reply-args reply-args.routine*)
                         (pop-stack routine*)
                         (if empty.routine* (return ninstrs))
                         (let (caller-oargs _ _)  (parse-instr (body.routine* pc.routine*))
                           (trace "reply" repr.arg " " repr.caller-oargs)
-                          (each (dest val)  (zip caller-oargs results)
+                          (each (dest reply-arg val)  (zip caller-oargs reply-args results)
+;?                             (prn dest " / " reply-arg " => " val) ;? 1
                             (when nondummy.dest
+                              (when (pos '(nochange) metadata.reply-arg)
+                                (unless (is dest (m reply-arg))
+                                  (die "'nochange' arg in @repr.reply-args can't bind to @repr.caller-oargs")))
                               (trace "reply" repr.val " => " dest)
                               (setm dest val))))
                         (++ pc.routine*)
@@ -845,7 +852,8 @@
   (= results.routine*
      (accum yield
        (each a args
-         (yield (m a))))))
+         (yield (m a)))))
+  (= reply-args.routine* args))
 
 ; helpers for memory access respecting
 ;   immediate addressing - 'literal' and 'offset'
@@ -2038,15 +2046,15 @@
   (stdin:channel-address <- next-input)
 ;?   (c:character <- copy ((#\a literal))) ;? 1
 ;?   (curr:tagged-value <- save-type c:character) ;? 1
-;?   (stdin:channel-address/deref <- write stdin:channel-address curr:tagged-value) ;? 1
+;?   (stdin:channel-address/deref/nochange <- write stdin:channel-address curr:tagged-value) ;? 1
 ;?   (c:character <- copy ((#\newline literal))) ;? 1
 ;?   (curr:tagged-value <- save-type c:character) ;? 1
-;?   (stdin:channel-address/deref <- write stdin:channel-address curr:tagged-value) ;? 1
+;?   (stdin:channel-address/deref/nochange <- write stdin:channel-address curr:tagged-value) ;? 1
   { begin ;? 1
     (c:character <- read-key k:keyboard-address) ;? 1
     (loop-unless c:character) ;? 1
     (curr:tagged-value <- save-type c:character) ;? 1
-    (stdin:channel-address/deref <- write stdin:channel-address curr:tagged-value) ;? 1
+    (stdin:channel-address/deref/nochange <- write stdin:channel-address curr:tagged-value) ;? 1
     (eof?:boolean <- equal c:character ((#\null literal))) ;? 1
     (break-if eof?:boolean) ;? 1
     (loop) ;? 1
@@ -2063,7 +2071,7 @@
 ;?     ($dump-channel 1093:literal) ;? 1
     ; read characters from stdin until newline, copy into line
     { begin
-      (x:tagged-value stdin:channel-address/deref <- read stdin:channel-address)
+      (x:tagged-value stdin:channel-address/deref/nochange <- read stdin:channel-address)
       (c:character <- maybe-coerce x:tagged-value character:literal)
       (assert c:character)
 ;?       (print-primitive-to-host line:buffer-address) ;? 1
@@ -2095,7 +2103,7 @@
       (curr:tagged-value <- save-type c:character)
 ;?       ($dump-channel 1093:literal) ;? 1
 ;?       ($start-tracing) ;? 1
-      (buffered-stdin:channel-address/deref <- write buffered-stdin:channel-address curr:tagged-value)
+      (buffered-stdin:channel-address/deref/nochange <- write buffered-stdin:channel-address curr:tagged-value)
 ;?       ($stop-tracing) ;? 1
 ;?       ($dump-channel 1093:literal) ;? 1
 ;?       ($quit) ;? 1
@@ -2345,7 +2353,7 @@
   (screen:terminal-address <- next-input)
   (stdout:channel-address <- next-input)
   { begin
-    (x:tagged-value stdout:channel-address/deref <- read stdout:channel-address)
+    (x:tagged-value stdout:channel-address/deref/nochange <- read stdout:channel-address)
     (c:character <- maybe-coerce x:tagged-value character:literal)
     (done?:boolean <- equal c:character ((#\null literal)))
     (break-if done?:boolean)