about summary refs log tree commit diff stats
path: root/apps/tile/table.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/table.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/table.mu')
-rw-r--r--apps/tile/table.mu18
1 files changed, 7 insertions, 11 deletions
diff --git a/apps/tile/table.mu b/apps/tile/table.mu
index 53fb5ce7..fc3a5399 100644
--- a/apps/tile/table.mu
+++ b/apps/tile/table.mu
@@ -40,22 +40,20 @@ fn make-binding _self: (addr bind), key: (addr handle array byte), _val: int {
   var self/esi: (addr bind) <- copy _self
   var dest/eax: (addr handle array byte) <- get self, key
   copy-object key, dest
-  var dest2/eax: (addr value) <- get self, value
-  var dest3/eax: (addr int) <- get dest2, scalar-data
+  var dest2/eax: (addr handle value) <- get self, value
+  var dest3/eax: (addr value) <- lookup *dest2
+  var dest4/eax: (addr int) <- get dest3, scalar-data
   var val/ecx: int <- copy _val
-  copy-to *dest3, val
+  copy-to *dest4, val
 }
 
-# TODO: supporting non-integers
-# That'll require radical surgery.
-fn lookup-binding _self: (addr table), key: (addr array byte) -> result/eax: int, found?/ecx: boolean {
+fn lookup-binding _self: (addr table), key: (addr array byte), out: (addr handle value) {
   var self/esi: (addr table) <- copy _self
   var data-ah/esi: (addr handle array bind) <- get self, data
   var _data/eax: (addr array bind) <- lookup *data-ah
   var data/esi: (addr array bind) <- copy _data
   var len/edx: int <- length data
   var i/ebx: int <- copy 0
-  found? <- copy 0  # false
   $lookup-binding:loop: {
     compare i, len
     break-if->=
@@ -70,10 +68,8 @@ fn lookup-binding _self: (addr table), key: (addr array byte) -> result/eax: int
       compare is-match?, 0  # false
       break-if-=
       # found
-      found? <- copy 1  # true
-      var dest2/eax: (addr value) <- get target-bind, value
-      var dest3/eax: (addr int) <- get dest2, scalar-data
-      result <- copy *dest3
+      var target/eax: (addr handle value) <- get target-bind, value
+      copy-object target, out
       break $lookup-binding:loop
     }
     i <- increment