about summary refs log tree commit diff stats
path: root/shell/eval.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-03-07 10:55:09 -0800
committerKartik K. Agaram <vc@akkartik.com>2021-03-07 10:55:11 -0800
commit5b50feaeee6e754b451a45f1a914cb1eaa733a5f (patch)
tree792188772c0577e7d5a1c3067bdef57ea6c3cf17 /shell/eval.mu
parent410782c79e66fa97c44f487cef0400632edbbff1 (diff)
downloadmu-5b50feaeee6e754b451a45f1a914cb1eaa733a5f.tar.gz
7862 - shell: more informative traces for eval
Also a bugfix in dealing with streams in cells that is becoming part of
a pattern.
Diffstat (limited to 'shell/eval.mu')
-rw-r--r--shell/eval.mu26
1 files changed, 24 insertions, 2 deletions
diff --git a/shell/eval.mu b/shell/eval.mu
index 813b1b87..211789c8 100644
--- a/shell/eval.mu
+++ b/shell/eval.mu
@@ -1,9 +1,20 @@
 # env is an alist of ((sym . val) (sym . val) ...)
 # we never modify `in` or `env`
 fn evaluate _in: (addr handle cell), out: (addr handle cell), env-h: (handle cell), trace: (addr trace) {
-  trace-text trace, "eval", "evaluate"
+  var in/esi: (addr handle cell) <- copy _in
+  # trace "evaluate " in " in environment " env {{{
+  {
+    var stream-storage: (stream byte 0x40)
+    var stream/ecx: (addr stream byte) <- address stream-storage
+    write stream, "evaluate "
+    print-cell in, stream, 0/no-trace
+    write stream, " in environment "
+    var env-ah/eax: (addr handle cell) <- address env-h
+    print-cell env-ah, stream, 0/no-trace
+    trace trace, "eval", stream
+  }
+  # }}}
   trace-lower trace
-  var in/eax: (addr handle cell) <- copy _in
   var in-addr/eax: (addr cell) <- lookup *in
   {
     var is-nil?/eax: boolean <- is-nil? in-addr
@@ -79,6 +90,16 @@ fn evaluate _in: (addr handle cell), out: (addr handle cell), env-h: (handle cel
 #?   dump-cell args-ah
 #?   abort "aaa"
   apply function-ah, args-ah, out, env-h, trace
+  trace-higher trace
+  # trace "=> " out {{{
+  {
+    var stream-storage: (stream byte 0x40)
+    var stream/ecx: (addr stream byte) <- address stream-storage
+    write stream, "=> "
+    print-cell out, stream, 0/no-trace
+    trace trace, "eval", stream
+  }
+  # }}}
 }
 
 fn apply _f-ah: (addr handle cell), args-ah: (addr handle cell), out: (addr handle cell), env-h: (handle cell), trace: (addr trace) {
@@ -456,6 +477,7 @@ fn cell-isomorphic? _a: (addr cell), _b: (addr cell), trace: (addr trace) -> _/e
     var a-val/eax: (addr stream byte) <- lookup *a-val-ah
     var tmp-array: (handle array byte)
     var tmp-ah/edx: (addr handle array byte) <- address tmp-array
+    rewind-stream a-val
     stream-to-array a-val, tmp-ah
     var tmp/eax: (addr array byte) <- lookup *tmp-ah
     var match?/eax: boolean <- stream-data-equal? b-val, tmp