diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-11-11 22:58:29 -0800 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-11-11 23:25:55 -0800 |
commit | 307745bcc2efbd4c5b8191b45d5e1885be1c0089 (patch) | |
tree | a0da43e2258fea744143b24e2560e042c481125a /apps/tile/table.mu | |
parent | 7d15b0884eb57657b130b98f3701544fedaf4b7f (diff) | |
download | mu-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.mu | 54 |
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) { |