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-11-11 22:58:29 -0800
committerKartik Agaram <vc@akkartik.com>2020-11-11 23:25:55 -0800
commit307745bcc2efbd4c5b8191b45d5e1885be1c0089 (patch)
treea0da43e2258fea744143b24e2560e042c481125a /apps/tile/table.mu
parent7d15b0884eb57657b130b98f3701544fedaf4b7f (diff)
downloadmu-307745bcc2efbd4c5b8191b45d5e1885be1c0089.tar.gz
7225
Both manual tests described in commit 7222 now work.

To make them work I had to figure out how to copy a file. It
requires a dependency on a new syscall: lseek.
Diffstat (limited to 'apps/tile/table.mu')
-rw-r--r--apps/tile/table.mu54
1 files changed, 44 insertions, 10 deletions
diff --git a/apps/tile/table.mu b/apps/tile/table.mu
index 42b2e3c8..8b8b93f3 100644
--- a/apps/tile/table.mu
+++ b/apps/tile/table.mu
@@ -4,33 +4,67 @@ fn initialize-table _self: (addr table), n: int {
   populate data-ah, n
 }
 
-fn shallow-copy-table-values _src: (addr table), dest: (addr table) {
+fn deep-copy-table _src: (addr table), _dest: (addr table) {
+#?   print-string 0, "deep-copy-table\n"
   var src/eax: (addr table) <- copy _src
-#?   print-string 0, "before copy: "
-#?   dump-table src
   var src-data-ah/eax: (addr handle array bind) <- get src, data
   var _src-data/eax: (addr array bind) <- lookup *src-data-ah
   var src-data/esi: (addr array bind) <- copy _src-data
   var n/ecx: int <- length src-data
+  var dest/eax: (addr table) <- copy _dest
   initialize-table dest, n
+  var dest-data-ah/eax: (addr handle array bind) <- get dest, data
+  var _dest-data/eax: (addr array bind) <- lookup *dest-data-ah
+  var dest-data/edi: (addr array bind) <- copy _dest-data
   var i/eax: int <- copy 0
   {
     compare i, n
     break-if->=
-    {
+#?     print-string 0, "iter\n"
+    $deep-copy:element: {
       var offset/edx: (offset bind) <- compute-offset src-data, i
       var src-bind/ecx: (addr bind) <- index src-data, offset
-      var key-ah/ebx: (addr handle array byte) <- get src-bind, key
-      var key/eax: (addr array byte) <- lookup *key-ah
-      compare key, 0
+      var dest-bind/edx: (addr bind) <- index dest-data, offset
+      var src-key-ah/ebx: (addr handle array byte) <- get src-bind, key
+      var src-key/eax: (addr array byte) <- lookup *src-key-ah
+      compare src-key, 0
       break-if-=
-      var val-ah/eax: (addr handle value) <- get src-bind, value
-      var val/eax: (addr value) <- lookup *val-ah
-      bind-in-table dest, key-ah, val
+      # copy key
+      var dest-key-ah/eax: (addr handle array byte) <- get dest-bind, key
+      copy-object src-key-ah, dest-key-ah
+      # deep copy value
+      var src-val-ah/eax: (addr handle value) <- get src-bind, value
+      var _src-val/eax: (addr value) <- lookup *src-val-ah
+      var src-val/ecx: (addr value) <- copy _src-val
+#?       {
+#?         print-string 0, "src type: "
+#?         var foo/eax: (addr int) <- get src-val, type
+#?         print-int32-decimal 0, *foo
+#?         print-string 0, "\n"
+#?       }
+      var dest-val-ah/eax: (addr handle value) <- get dest-bind, value
+      allocate dest-val-ah
+      var dest-val/eax: (addr value) <- lookup *dest-val-ah
+#?       {
+#?         var foo/eax: int <- copy dest-val
+#?         print-string 0, "iter: "
+#?         print-int32-hex 0, foo
+#?         print-string 0, "\n"
+#?       }
+#?       print-string 0, "deep copy value {\n"
+      deep-copy-value src-val, dest-val
+#?       {
+#?         print-string 0, "dest: "
+#?         var foo/eax: (addr int) <- get dest-val, type
+#?         print-int32-decimal 0, *foo
+#?         print-string 0, "\n"
+#?       }
+#?       print-string 0, "}\n"
     }
     i <- increment
     loop
   }
+#?   print-string 0, "end deep-copy-table\n"
 }
 
 fn bind-in-table _self: (addr table), key: (addr handle array byte), val: (addr value) {