about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--apps/tile/environment.mu24
-rw-r--r--apps/tile/word.mu21
2 files changed, 37 insertions, 8 deletions
diff --git a/apps/tile/environment.mu b/apps/tile/environment.mu
index 53e7bc63..b5cacb86 100644
--- a/apps/tile/environment.mu
+++ b/apps/tile/environment.mu
@@ -599,6 +599,8 @@ $process-sandbox-define:body: {
     #
     copy-unbound-words-to-args functions
     #
+    var empty-word: (handle word)
+    copy-handle empty-word, final-line-contents
     construct-call functions, final-line-contents
     # clear partial-name-for-function
     var empty-word: (handle word)
@@ -698,19 +700,25 @@ fn bound? w: (addr word), functions-ah: (addr handle function) -> result/ebx: bo
 }
 
 # construct a call to `f` with copies of exactly its args
-fn construct-call _f-ah: (addr handle function), out: (addr handle word) {
+fn construct-call _f-ah: (addr handle function), _dest-ah: (addr handle word) {
   var f-ah/eax: (addr handle function) <- copy _f-ah
   var _f/eax: (addr function) <- lookup *f-ah
   var f/esi: (addr function) <- copy _f
+  # append args in reverse
+  var args-ah/eax: (addr handle word) <- get f, args
+  var dest-ah/edi: (addr handle word) <- copy _dest-ah
+  copy-words-in-reverse args-ah, dest-ah
+  # append name
+  {
+    var dest/eax: (addr word) <- lookup *dest-ah
+    compare dest, 0
+    break-if-=
+    dest-ah <- get dest, next
+    loop
+  }
   var name-ah/eax: (addr handle array byte) <- get f, name
   var name/eax: (addr array byte) <- lookup *name-ah
-  var dest/edi: (addr handle word) <- copy out
-  allocate-word-with dest, name
-  var tmp/eax: (addr word) <- lookup *dest
-  dest <- get tmp, next
-  var _args-ah/eax: (addr handle word) <- get f, args
-  var args-ah/esi: (addr handle word) <- copy _args-ah
-  copy-words args-ah, dest
+  allocate-word-with dest-ah, name
 }
 
 fn word-index _words: (addr handle word), _n: int, out: (addr handle word) {
diff --git a/apps/tile/word.mu b/apps/tile/word.mu
index e6167820..80fd6f3e 100644
--- a/apps/tile/word.mu
+++ b/apps/tile/word.mu
@@ -279,6 +279,27 @@ fn copy-words _src-ah: (addr handle word), _dest-ah: (addr handle word) {
   copy-words next-src-ah, next-dest-ah
 }
 
+fn copy-words-in-reverse _src-ah: (addr handle word), _dest-ah: (addr handle word) {
+  var src-ah/eax: (addr handle word) <- copy _src-ah
+  var _src-a/eax: (addr word) <- lookup *src-ah
+  var src-a/esi: (addr word) <- copy _src-a
+  compare src-a, 0
+  break-if-=
+  # recurse
+  var next-src-ah/ecx: (addr handle word) <- get src-a, next
+  var dest-ah/edi: (addr handle word) <- copy _dest-ah
+  copy-words-in-reverse next-src-ah, dest-ah
+  # copy at end
+  {
+    var dest-a/eax: (addr word) <- lookup *dest-ah
+    compare dest-a, 0
+    break-if-=
+    dest-ah <- get dest-a, next
+    loop
+  }
+  copy-word src-a, dest-ah
+}
+
 fn copy-word _src-a: (addr word), _dest-ah: (addr handle word) {
   var dest-ah/eax: (addr handle word) <- copy _dest-ah
   allocate dest-ah