about summary refs log tree commit diff stats
path: root/apps/tile/value-stack.mu
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-09-26 21:58:47 -0700
committerKartik Agaram <vc@akkartik.com>2020-09-26 21:59:50 -0700
commitebb93c6d58ab087c581948acfc054e91a02047f9 (patch)
treec856a4a1e4ca7565983b2f5caf2a709bd1a3e31b /apps/tile/value-stack.mu
parent65e6633b79e97fdbaab37a47b8246d2726ae5907 (diff)
downloadmu-ebb93c6d58ab087c581948acfc054e91a02047f9.tar.gz
6870
Emit a stack of not ints but more complex objects containing the int payload.

Function calls again segfaulting.
Diffstat (limited to 'apps/tile/value-stack.mu')
-rw-r--r--apps/tile/value-stack.mu64
1 files changed, 53 insertions, 11 deletions
diff --git a/apps/tile/value-stack.mu b/apps/tile/value-stack.mu
index f43cd25d..126ed036 100644
--- a/apps/tile/value-stack.mu
+++ b/apps/tile/value-stack.mu
@@ -1,3 +1,5 @@
+# support for non-int values is untested
+
 type value-stack {
   data: (handle array value)
   top: int
@@ -17,7 +19,22 @@ fn clear-value-stack _self: (addr value-stack) {
   copy-to *top, 0
 }
 
-fn push-value-stack _self: (addr value-stack), _val: value {
+fn push-int-to-value-stack _self: (addr value-stack), _val: int {
+  var self/esi: (addr value-stack) <- copy _self
+  var top-addr/ecx: (addr int) <- get self, top
+  var data-ah/edx: (addr handle array value) <- get self, data
+  var data/eax: (addr array value) <- lookup *data-ah
+  var top/edx: int <- copy *top-addr
+  var dest-offset/edx: (offset value) <- compute-offset data, top
+  var dest-addr/edx: (addr value) <- index data, dest-offset
+  var dest-addr2/eax: (addr int) <- get dest-addr, scalar-data
+  var val/esi: int <- copy _val
+#?   print-int32-hex-to-real-screen val
+  copy-to *dest-addr2, val
+  increment *top-addr
+}
+
+fn push-value-stack _self: (addr value-stack), val: (addr value) {
   var self/esi: (addr value-stack) <- copy _self
   var top-addr/ecx: (addr int) <- get self, top
   var data-ah/edx: (addr handle array value) <- get self, data
@@ -25,28 +42,28 @@ fn push-value-stack _self: (addr value-stack), _val: value {
   var top/edx: int <- copy *top-addr
   var dest-offset/edx: (offset value) <- compute-offset data, top
   var dest-addr/edx: (addr value) <- index data, dest-offset
-  var val/eax: value <- copy _val
-  copy-to *dest-addr, val
-  add-to *top-addr, 1
+  copy-object val, dest-addr
+  increment *top-addr
 }
 
-fn pop-value-stack _self: (addr value-stack) -> val/eax: value {
-$pop-value-stack:body: {
+fn pop-int-from-value-stack _self: (addr value-stack) -> val/eax: int {
+$pop-int-from-value-stack:body: {
   var self/esi: (addr value-stack) <- copy _self
   var top-addr/ecx: (addr int) <- get self, top
   {
     compare *top-addr, 0
     break-if->
     val <- copy -1
-    break $pop-value-stack:body
+    break $pop-int-from-value-stack:body
   }
-  subtract-from *top-addr, 1
+  decrement *top-addr
   var data-ah/edx: (addr handle array value) <- get self, data
   var data/eax: (addr array value) <- lookup *data-ah
   var top/edx: int <- copy *top-addr
   var dest-offset/edx: (offset value) <- compute-offset data, top
   var result-addr/eax: (addr value) <- index data, dest-offset
-  val <- copy *result-addr
+  var result-addr2/eax: (addr int) <- get result-addr, scalar-data
+  val <- copy *result-addr2
 }
 }
 
@@ -56,8 +73,8 @@ $value-stack-empty?:body: {
   var top/eax: (addr int) <- get self, top
   compare *top, 0
   {
-    break-if-=
-    result <- copy 1  # false
+    break-if-!=
+    result <- copy 1  # true
     break $value-stack-empty?:body
   }
   result <- copy 0  # false
@@ -69,3 +86,28 @@ fn value-stack-length _self: (addr value-stack) -> result/eax: int {
   var top-addr/eax: (addr int) <- get self, top
   result <- copy *top-addr
 }
+
+fn value-stack-max-width _self: (addr value-stack) -> result/eax: int {
+  var self/esi: (addr value-stack) <- copy _self
+  var data-ah/edi: (addr handle array value) <- get self, data
+  var _data/eax: (addr array value) <- lookup *data-ah
+  var data/edi: (addr array value) <- copy _data
+  var top-addr/ecx: (addr int) <- get self, top
+  var i/ebx: int <- copy 0
+  result <- copy 0
+  {
+    compare i, *top-addr
+    break-if->=
+    var o/edx: (offset value) <- compute-offset data, i
+    var g/edx: (addr value) <- index data, o
+    var g2/edx: (addr int) <- get g, scalar-data
+    var w/ecx: int <- int-width-decimal *g2
+    compare w, result
+    {
+      break-if-<=
+      result <- copy w
+    }
+    i <- increment
+    loop
+  }
+}