about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--092stack.subx3
-rw-r--r--apps/mu.subx27
2 files changed, 24 insertions, 6 deletions
diff --git a/092stack.subx b/092stack.subx
index b49b00fb..a0bafe5e 100644
--- a/092stack.subx
+++ b/092stack.subx
@@ -110,6 +110,7 @@ test-clear-stack:
     5d/pop-to-ebp
     c3/return
 
+# TODO: make this generic
 push:  # s: (addr stack), n: int
     # . prologue
     55/push-ebp
@@ -230,6 +231,7 @@ test-push:
     5d/pop-to-ebp
     c3/return
 
+# TODO: make this generic
 pop:  # s: (addr stack) -> n/eax: int
     # . prologue
     55/push-ebp
@@ -334,6 +336,7 @@ test-pop:
     5d/pop-to-ebp
     c3/return
 
+# TODO: make this generic
 top:  # s: (addr stack) -> n/eax: int
     # . prologue
     55/push-ebp
diff --git a/apps/mu.subx b/apps/mu.subx
index dcfedf2b..d428682b 100644
--- a/apps/mu.subx
+++ b/apps/mu.subx
@@ -1675,7 +1675,7 @@ test-convert-function-with-var-in-nested-block:
     5d/pop-to-ebp
     c3/return
 
-_failing-test-convert-function-with-multiple-vars-in-nested-blocks:
+test-convert-function-with-multiple-vars-in-nested-blocks:
     # . prologue
     55/push-ebp
     89/<- %ebp 4/r32/esp
@@ -7629,6 +7629,13 @@ push-output-and-maybe-emit-spill:  # out: (addr buffered-file), stmt: (addr reg-
     # v->block-depth = *Curr-block-depth
     8b/-> *Curr-block-depth 0/r32/eax
     89/<- *(ecx+0x10) 0/r32/eax  # Var-block-depth
+#?     (write-buffered Stderr "var ")
+#?     (lookup *ecx *(ecx+4))
+#?     (write-buffered Stderr %eax)
+#?     (write-buffered Stderr " at depth ")
+#?     (print-int32-buffered Stderr *(ecx+0x10))
+#?     (write-buffered Stderr Newline)
+#?     (flush Stderr)
     # ensure that v is in a register
     81 7/subop/compare *(ecx+0x18) 0/imm32  # Var-register
     0f 84/jump-if-= $push-output-and-maybe-emit-spill:abort/disp32
@@ -7872,6 +7879,8 @@ emit-cleanup-code-until-depth:  # out: (addr buffered-file), vars: (addr stack (
     52/push-edx
     53/push-ebx
     56/push-esi
+#?     (write-buffered Stderr "--- cleanup\n")
+#?     (flush Stderr)
     # ecx = vars
     8b/-> *(ebp+0xc) 1/r32/ecx
     # var esi: int = vars->top
@@ -7891,6 +7900,11 @@ $emit-cleanup-code-until-depth:loop:
       # var v/ebx: (addr var) = lookup(*curr)
       (lookup *esi *(esi+4))  # => eax
       89/<- %ebx 0/r32/eax
+#?       (lookup *ebx *(ebx+4))  # Var-name
+#?       (write-buffered Stderr "var ")
+#?       (write-buffered Stderr %eax)
+#?       (write-buffered Stderr Newline)
+#?       (flush Stderr)
       # if (v->block-depth < until-block-depth) break
       39/compare *(ebx+0x10) 2/r32/edx  # Var-block-depth
       0f 8c/jump-if-< break/disp32
@@ -7915,12 +7929,12 @@ $emit-cleanup-code-until-depth:reclaim-var-in-register:
       # otherwise v is on the stack
       {
         75/jump-if-!= break/disp8
-$emit-cleanup-code-until-depth:reclaim-var-on-stack:
+$emit-cleanup-code-until-depth:var-on-stack:
         (size-of %ebx)  # => eax
         # don't emit code for labels
         3d/compare-eax-and 0/imm32
         74/jump-if-= break/disp8
-        #
+$emit-cleanup-code-until-depth:reclaim-var-on-stack:
         (emit-indent *(ebp+8) *Curr-block-depth)
         (write-buffered *(ebp+8) "81 0/subop/add %esp ")
         (print-int32-buffered *(ebp+8) %eax)
@@ -8178,10 +8192,11 @@ clean-up-blocks:  # vars: (addr stack (handle var)), until-block-depth: int
     {
 $clean-up-blocks:reclaim-loop:
       # if (vars->top <= 0) break
-      81 7/subop/compare *esi 0/imm32  # Stack-top
+      8b/-> *esi 0/r32/eax  # Stack-top
+      3d/compare-eax-and 0/imm32
       7e/jump-if-<= break/disp8
-      # var v/eax: (handle var) = top(vars)
-      (top %esi)  # => eax
+      # var v/eax: (addr var) = lookup(vars[vars->top-8])
+      (lookup *(esi+eax) *(esi+eax+4))  # vars + 8 + vars->top - 8 => eax
       # if (v->block-depth < until-block-depth) break
       39/compare *(eax+0x10) 1/r32/ecx  # Var-block-depth
       7c/jump-if-< break/disp8