about summary refs log tree commit diff stats
path: root/baremetal/shell
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-02-24 10:51:06 -0800
committerKartik K. Agaram <vc@akkartik.com>2021-02-24 10:51:06 -0800
commit56dd4530cc0e2676b12825ade2054cee6a71ff54 (patch)
tree9c0cc258621ea784bd966c964ec2f213521142d3 /baremetal/shell
parentabf3eb86b69af9d5d2be1d1f4f8f36f785f9a5be (diff)
downloadmu-56dd4530cc0e2676b12825ade2054cee6a71ff54.tar.gz
7800
Diffstat (limited to 'baremetal/shell')
-rw-r--r--baremetal/shell/trace.mu189
1 files changed, 101 insertions, 88 deletions
diff --git a/baremetal/shell/trace.mu b/baremetal/shell/trace.mu
index 241ce095..5e0a2003 100644
--- a/baremetal/shell/trace.mu
+++ b/baremetal/shell/trace.mu
@@ -3,7 +3,8 @@
 
 type trace {
   curr-depth: int  # depth that will be assigned to next line appended
-  data: (handle stream trace-line)
+  data: (handle array trace-line)
+  first-free: int
   cursor-y: int  # row index on screen
 }
 
@@ -15,49 +16,54 @@ type trace-line {
 
 fn initialize-trace _self: (addr trace), capacity: int {
   var self/eax: (addr trace) <- copy _self
-  var trace-ah/eax: (addr handle stream trace-line) <- get self, data
-  populate-stream trace-ah, capacity
+  var trace-ah/eax: (addr handle array trace-line) <- get self, data
+  populate trace-ah, capacity
 }
 
 fn clear-trace _self: (addr trace) {
   var self/eax: (addr trace) <- copy _self
-  var trace-ah/eax: (addr handle stream trace-line) <- get self, data
-  var trace/eax: (addr stream trace-line) <- lookup *trace-ah
-  clear-stream trace  # leaks memory
+  var len/edx: (addr int) <- get self, first-free
+  copy-to *len, 0
+  # might leak memory; existing elements won't be used anymore
 }
 
 fn has-errors? _self: (addr trace) -> _/eax: boolean {
   var self/eax: (addr trace) <- copy _self
-  var trace-ah/eax: (addr handle stream trace-line) <- get self, data
-  var _trace/eax: (addr stream trace-line) <- lookup *trace-ah
-  var trace/esi: (addr stream trace-line) <- copy _trace
-  rewind-stream trace
+  var max/edx: (addr int) <- get self, first-free
+  var trace-ah/eax: (addr handle array trace-line) <- get self, data
+  var _trace/eax: (addr array trace-line) <- lookup *trace-ah
+  var trace/esi: (addr array trace-line) <- copy _trace
+  var i/ecx: int <- copy 0
   {
-    var done?/eax: boolean <- stream-empty? trace
-    compare done?, 0/false
-    break-if-!=
-    var curr-storage: trace-line
-    var curr/eax: (addr trace-line) <- address curr-storage
-    read-from-stream trace, curr
+    compare i, *max
+    break-if->=
+    var offset/eax: (offset trace-line) <- compute-offset trace, i
+    var curr/eax: (addr trace-line) <- index trace, offset
     var curr-label-ah/eax: (addr handle array byte) <- get curr, label
     var curr-label/eax: (addr array byte) <- lookup *curr-label-ah
     var is-error?/eax: boolean <- string-equal? curr-label, "error"
     compare is-error?, 0/false
-    loop-if-=
-    return 1/true
+    {
+      break-if-=
+      return 1/true
+    }
+    i <- increment
+    loop
   }
   return 0/false
 }
 
-fn trace _self: (addr trace), label: (addr array byte), data: (addr stream byte) {
+fn trace _self: (addr trace), label: (addr array byte), message: (addr stream byte) {
   var self/esi: (addr trace) <- copy _self
-  var line-storage: trace-line
-  var line/ecx: (addr trace-line) <- address line-storage
-  var depth/eax: (addr int) <- get self, curr-depth
-  initialize-trace-line *depth, label, data, line
-  var dest-ah/eax: (addr handle stream trace-line) <- get self, data
-  var dest/eax: (addr stream trace-line) <- lookup *dest-ah
-  write-to-stream dest, line
+  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
+  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
+  initialize-trace-line *depth, label, message, dest
+  increment *index-addr
 }
 
 fn trace-text self: (addr trace), label: (addr array byte), s: (addr array byte) {
@@ -98,77 +104,84 @@ fn trace-higher _self: (addr trace) {
 }
 
 fn render-trace screen: (addr screen), _self: (addr trace), xmin: int, ymin: int, xmax: int, ymax: int, show-cursor?: boolean -> _/ecx: int {
-  var already-hiding-lines?/ebx: boolean <- copy 0/false
+  var already-hiding-lines?: boolean
   var y/ecx: int <- copy ymin
-  var self/eax: (addr trace) <- copy _self
-  # initialize cursor-y if necessary
-  compare show-cursor?, 0/false
-  {
-    break-if-=
-    var cursor-y/eax: (addr int) <- get self, cursor-y
-    compare *cursor-y, y
-    break-if->=
-    copy-to *cursor-y, y
-  }
-  var trace-ah/eax: (addr handle stream trace-line) <- get self, data
-  var _trace/eax: (addr stream trace-line) <- lookup *trace-ah
-  var trace/esi: (addr stream trace-line) <- copy _trace
-  rewind-stream trace
+  var self/esi: (addr trace) <- copy _self
+  clamp-cursor-to-top self, y
+  var trace-ah/eax: (addr handle array trace-line) <- get self, data
+  var _trace/eax: (addr array trace-line) <- lookup *trace-ah
+  var trace/edi: (addr array trace-line) <- copy _trace
+  var i/edx: int <- copy 0
+  var max-addr/ebx: (addr int) <- get self, first-free
+  var max/ebx: int <- copy *max-addr
   $render-trace:loop: {
-    var done?/eax: boolean <- stream-empty? trace
-    compare done?, 0/false
-    break-if-!=
-    var curr-storage: trace-line
-    var curr/edx: (addr trace-line) <- address curr-storage
-    read-from-stream trace, curr
-    var curr-label-ah/eax: (addr handle array byte) <- get curr, label
-    var curr-label/eax: (addr array byte) <- lookup *curr-label-ah
-    var bg/edi: int <- copy 0/black
-    compare show-cursor?, 0/false
-    {
-      break-if-=
-      var self/eax: (addr trace) <- copy _self
-      var cursor-y/eax: (addr int) <- get self, cursor-y
-      compare *cursor-y, y
-      break-if-!=
-      bg <- copy 7/grey
-    }
-    # always display errors
-    var is-error?/eax: boolean <- string-equal? curr-label, "error"
-    {
-      compare is-error?, 0/false
-      break-if-=
-      var curr-data-ah/eax: (addr handle array byte) <- get curr, data
-      var _curr-data/eax: (addr array byte) <- lookup *curr-data-ah
-      var curr-data/edx: (addr array byte) <- copy _curr-data
-      var x/eax: int <- copy xmin
-      x, y <- draw-text-wrapping-right-then-down screen, curr-data, xmin, ymin, xmax, ymax, x, y, 0xc/fg=trace-error, bg
-      y <- increment
-      already-hiding-lines? <- copy 0/false
-      loop $render-trace:loop
-    }
-    # otherwise ignore the rest
-    compare already-hiding-lines?, 0/false
-    {
-      break-if-!=
-      var x/eax: int <- copy xmin
-      x, y <- draw-text-wrapping-right-then-down screen, "...", xmin, ymin, xmax, ymax, x, y, 9/fg=trace, bg
-      y <- increment
-      already-hiding-lines? <- copy 1/true
+    compare i, max
+    break-if->=
+    $render-trace:iter: {
+      var offset/edx: (offset trace-line) <- compute-offset trace, i
+      var curr/edx: (addr trace-line) <- index trace, offset
+      var curr-label-ah/eax: (addr handle array byte) <- get curr, label
+      var curr-label/eax: (addr array byte) <- lookup *curr-label-ah
+      var bg/edi: int <- copy 0/black
+      compare show-cursor?, 0/false
+      {
+        break-if-=
+        var self/eax: (addr trace) <- copy _self
+        var cursor-y/eax: (addr int) <- get self, cursor-y
+        compare *cursor-y, y
+        break-if-!=
+        bg <- copy 7/grey
+      }
+      # always display errors
+      var is-error?/eax: boolean <- string-equal? curr-label, "error"
+      {
+        compare is-error?, 0/false
+        break-if-=
+        var curr-data-ah/eax: (addr handle array byte) <- get curr, data
+        var _curr-data/eax: (addr array byte) <- lookup *curr-data-ah
+        var curr-data/edx: (addr array byte) <- copy _curr-data
+        var x/eax: int <- copy xmin
+        x, y <- draw-text-wrapping-right-then-down screen, curr-data, xmin, ymin, xmax, ymax, x, y, 0xc/fg=trace-error, bg
+        y <- increment
+        copy-to already-hiding-lines?, 0/false
+        break $render-trace:iter
+      }
+      # otherwise ignore the rest
+      compare already-hiding-lines?, 0/false
+      {
+        break-if-!=
+        var x/eax: int <- copy xmin
+        x, y <- draw-text-wrapping-right-then-down screen, "...", xmin, ymin, xmax, ymax, x, y, 9/fg=trace, bg
+        y <- increment
+        copy-to already-hiding-lines?, 1/true
+      }
     }
+    i <- increment
     loop
   }
   # prevent cursor from going too far down
-  {
-    var self/eax: (addr trace) <- copy _self
-    var cursor-y/eax: (addr int) <- get self, cursor-y
-    compare *cursor-y, y
-    break-if-<=
-    copy-to *cursor-y, y
-  }
+  clamp-cursor-to-bottom _self, y
   return y
 }
 
+fn clamp-cursor-to-top _self: (addr trace), _y: int {
+  var y/ecx: int <- copy _y
+  var self/esi: (addr trace) <- copy _self
+  var cursor-y/eax: (addr int) <- get self, cursor-y
+  compare *cursor-y, y
+  break-if->=
+  copy-to *cursor-y, y
+}
+
+fn clamp-cursor-to-bottom _self: (addr trace), _y: int {
+  var y/ecx: int <- copy _y
+  var self/esi: (addr trace) <- copy _self
+  var cursor-y/eax: (addr int) <- get self, cursor-y
+  compare *cursor-y, y
+  break-if-<=
+  copy-to *cursor-y, y
+}
+
 fn test-render-trace-empty {
   var t-storage: trace
   var t/esi: (addr trace) <- address t-storage