diff options
author | Kartik Agaram <vc@akkartik.com> | 2020-05-20 18:01:11 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2020-05-20 18:08:31 -0700 |
commit | 765c02d137035813d30d3d2dd18e75147a3ff437 (patch) | |
tree | 801dd9ffd41376b5d98611b54163caa0a132e352 /apps | |
parent | 504929a142df92b8710c7994329308fdd8a4cd5c (diff) | |
download | mu-765c02d137035813d30d3d2dd18e75147a3ff437.tar.gz |
mu.subx: 25 failing tests remaining
This was again hard to debug, because: - the mapping between recursive calls to emit-subx-stmt-list and the nested blocks of code in the output kept blowing my stack, and - I kept expecting the problem to be there, or in the data attached to variables. But it was in the `emit-cleanup-code-until-depth` for the previous/inner block, in code I thought I'd already fixed (`clean-up-blocks`) that accidentally worked for previous tests. Part of the problem here is that my library for the stack sucks. It's only for 4-byte elements, but I'm using it for 8-byte elements (handles). Which leads to double-pushes and double-pops and -- here -- an insidiously wrong call to `top`. Anyways: halfway there!
Diffstat (limited to 'apps')
-rw-r--r-- | apps/mu.subx | 27 |
1 files changed, 21 insertions, 6 deletions
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 |