diff options
-rwxr-xr-x | apps/mu | bin | 595336 -> 596276 bytes | |||
-rw-r--r-- | apps/mu.subx | 69 |
2 files changed, 69 insertions, 0 deletions
diff --git a/apps/mu b/apps/mu index 3996cb2b..913cf1b1 100755 --- a/apps/mu +++ b/apps/mu Binary files differdiff --git a/apps/mu.subx b/apps/mu.subx index 04dbebe9..7fbf43e8 100644 --- a/apps/mu.subx +++ b/apps/mu.subx @@ -1804,6 +1804,50 @@ test-return-unavailable-value: 5d/pop-to-ebp c3/return +test-return-literal-to-float: + # . prologue + 55/push-ebp + 89/<- %ebp 4/r32/esp + # setup + (clear-stream _test-input-stream) + (clear-stream $_test-input-buffered-file->buffer) + (clear-stream _test-output-stream) + (clear-stream $_test-output-buffered-file->buffer) + (clear-stream _test-error-stream) + (clear-stream $_test-error-buffered-file->buffer) + # var ed/edx: exit-descriptor = tailor-exit-descriptor(16) + 68/push 0/imm32 + 68/push 0/imm32 + 89/<- %edx 4/r32/esp + (tailor-exit-descriptor %edx 0x10) + # + (write _test-input-stream "fn foo -> _/xmm0: float {\n") + (write _test-input-stream " return 0\n") + (write _test-input-stream "}\n") + # convert + (convert-mu _test-input-buffered-file _test-output-buffered-file _test-error-buffered-file %edx) + # registers except esp clobbered at this point + # restore ed + 89/<- %edx 4/r32/esp + (flush _test-output-buffered-file) + (flush _test-error-buffered-file) +#? # dump _test-error-stream {{{ +#? (write 2 "^") +#? (write-stream 2 _test-error-stream) +#? (write 2 "$\n") +#? (rewind-stream _test-error-stream) +#? # }}} + # check output + (check-stream-equal _test-output-stream "" "F - test-return-literal-to-float: output should be empty") + (check-next-stream-line-equal _test-error-stream "fn foo: return: cannot copy literal '0' to float" "F - test-return-literal-to-float: error message") + # check that stop(1) was called + (check-ints-equal *(edx+4) 2 "F - test-return-literal-to-float: exit status") + # don't restore from ebp + 81 0/subop/add %esp 8/imm32 + # . epilogue + 5d/pop-to-ebp + c3/return + test-convert-return-with-duplicate-values: # . prologue 55/push-ebp @@ -22983,6 +23027,17 @@ check-mu-return-stmt: # stmt: (addr stmt), fn: (addr function), err: (addr buff 75/jump-if-!= break/disp8 (lookup *(eax+4) *(eax+8)) # Type-tree-left Type-tree-left => eax } + # if curr-type is literal and template-type is float, abort + 50/push-eax + { + (is-simple-mu-type? %eax 0) # literal => eax + 3d/compare-eax-and 0/imm32/false + 74/jump-if-= break/disp8 + (is-simple-mu-type? %ecx 0xf) # float => eax + 3d/compare-eax-and 0/imm32/false + 0f 85/jump-if-!= $check-mu-return-stmt:error-literal-to-float/disp32 + } + 58/pop-to-eax # if (curr-type != template-type) abort (type-match? %ecx %eax %edx) # => eax 3d/compare-eax-and 0/imm32/false @@ -23046,6 +23101,20 @@ $check-mu-return-stmt:error2: (stop *(ebp+0x14) 1) # never gets here +$check-mu-return-stmt:error-literal-to-float: + (write-buffered *(ebp+0x10) "fn ") + 8b/-> *(ebp+0xc) 0/r32/eax + (lookup *eax *(eax+4)) # Function-name Function-name => eax + (write-buffered *(ebp+0x10) %eax) + (write-buffered *(ebp+0x10) ": return: cannot copy literal '") + (lookup *edi *(edi+4)) # Stmt-var-value Stmt-var-value => eax + (lookup *eax *(eax+4)) # Var-name Var-name => eax + (write-buffered *(ebp+0x10) %eax) + (write-buffered *(ebp+0x10) "' to float\n") + (flush *(ebp+0x10)) + (stop *(ebp+0x14) 1) + # never gets here + $check-mu-return-stmt:error-too-few-inouts: (write-buffered *(ebp+0x10) "fn ") 8b/-> *(ebp+0xc) 0/r32/eax |