about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--shell/evaluate.mu9
-rw-r--r--shell/sandbox.mu2
-rw-r--r--shell/trace.mu12
3 files changed, 22 insertions, 1 deletions
diff --git a/shell/evaluate.mu b/shell/evaluate.mu
index 170a1713..580a9ac3 100644
--- a/shell/evaluate.mu
+++ b/shell/evaluate.mu
@@ -2,6 +2,15 @@
 # we never modify `in` or `env`
 # ignore 'screen-cell' on a first reading; it's a hack for sandboxes
 fn evaluate _in: (addr handle cell), out: (addr handle cell), env-h: (handle cell), globals: (addr global-table), trace: (addr trace), screen-cell: (addr handle cell), keyboard-cell: (addr handle cell) {
+  # errors? skip
+  {
+    compare trace, 0
+    break-if-=
+    var error?/eax: boolean <- has-errors? trace
+    compare error?, 0/false
+    break-if-=
+    return
+  }
   var in/esi: (addr handle cell) <- copy _in
 #?   dump-cell in
 #?   {
diff --git a/shell/sandbox.mu b/shell/sandbox.mu
index 944bc88d..1d9e2289 100644
--- a/shell/sandbox.mu
+++ b/shell/sandbox.mu
@@ -29,7 +29,7 @@ fn initialize-sandbox _self: (addr sandbox), screen-and-keyboard?: boolean {
   }
   #
   var trace-ah/eax: (addr handle trace) <- get self, trace
-#?   allocate trace-ah
+  allocate trace-ah
   var trace/eax: (addr trace) <- lookup *trace-ah
   initialize-trace trace, 0x8000/lines, 0x80/visible-lines
   var cursor-in-data?/eax: (addr boolean) <- get self, cursor-in-data?
diff --git a/shell/trace.mu b/shell/trace.mu
index 410429e6..267b3ebe 100644
--- a/shell/trace.mu
+++ b/shell/trace.mu
@@ -89,11 +89,23 @@ fn trace _self: (addr trace), label: (addr array byte), message: (addr stream by
   var data-ah/eax: (addr handle array trace-line) <- get self, data
   var data/eax: (addr array trace-line) <- lookup *data-ah
   var index-addr/edi: (addr int) <- get self, first-free
+  {
+    compare *index-addr, 0x8000/lines
+    break-if-<
+    return
+  }
   var index/ecx: int <- copy *index-addr
   var offset/ecx: (offset trace-line) <- compute-offset data, index
   var dest/eax: (addr trace-line) <- index data, offset
   var depth/ecx: (addr int) <- get self, curr-depth
   rewind-stream message
+  {
+    compare *index-addr, 0x7ffe/lines
+    break-if-<
+    initialize-trace-line 0/depth, "error", message, dest
+    increment *index-addr
+    return
+  }
   initialize-trace-line *depth, label, message, dest
   increment *index-addr
 }