about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xlinux/mubin608477 -> 608842 bytes
-rw-r--r--linux/mu.subx62
-rw-r--r--shell/environment.mu25
3 files changed, 68 insertions, 19 deletions
diff --git a/linux/mu b/linux/mu
index c5823b80..cd11865e 100755
--- a/linux/mu
+++ b/linux/mu
Binary files differdiff --git a/linux/mu.subx b/linux/mu.subx
index ecdb7b43..c90df5ba 100644
--- a/linux/mu.subx
+++ b/linux/mu.subx
@@ -2264,6 +2264,29 @@ test-convert-function-call-with-literal-string-arg:
     5d/pop-to-ebp
     c3/return
 
+test-convert-function-call-with-literal-string-arg-and-type-parameter-in-signature:
+    # . 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)
+    #
+    (write _test-input-stream "fn foo {\n")
+    (write _test-input-stream "  string-func \"abc\"\n")
+    (write _test-input-stream "}\n")
+    (write _test-input-stream "sig string-func in: (addr array _)\n")
+    # convert
+    (convert-mu _test-input-buffered-file _test-output-buffered-file Stderr 0)
+    # no errors
+    # not bothering checking output
+    # . epilogue
+    89/<- %esp 5/r32/ebp
+    5d/pop-to-ebp
+    c3/return
+
 test-convert-function-call-with-null-addr:
     # . prologue
     55/push-ebp
@@ -26417,7 +26440,7 @@ type-match?:  # def: (addr type-tree), call: (addr type-tree), type-parameters:
     # . prologue
     55/push-ebp
     89/<- %ebp 4/r32/esp
-    # if (call is literal and def is numberlike) return true
+    # if call is literal and def is numberlike, return true
     {
 $type-match?:check-literal-int:
       (simple-mu-type? *(ebp+0xc) 0)  # literal => eax
@@ -26429,16 +26452,13 @@ $type-match?:check-literal-int:
       b8/copy-to-eax 1/imm32/true
       e9/jump $type-match?:end/disp32
     }
-    # if (call is literal-string and def is string) return true
+    # if call is literal-string, match against (addr array byte)
     {
 $type-match?:check-literal-string:
       (simple-mu-type? *(ebp+0xc) 0x10)  # literal-string => eax
       3d/compare-eax-and 0/imm32/false
       74/jump-if-= break/disp8
-      (mu-string-type? *(ebp+8))  # => eax
-      3d/compare-eax-and 0/imm32/false
-      74/jump-if-= break/disp8
-      b8/copy-to-eax 1/imm32/true
+      (type-component-match? *(ebp+8) Addr-type-string *(ebp+0x10))  # => eax
       e9/jump $type-match?:end/disp32
     }
 $type-match?:baseline:
@@ -28795,7 +28815,6 @@ $emit-subx-stmt:primitive:
       e9/jump $emit-subx-stmt:end/disp32
     }
     # - otherwise emit a call
-    # TODO: type-checking
 $emit-subx-stmt:call:
     (emit-call *(ebp+8) *(ebp+0xc))
 $emit-subx-stmt:end:
@@ -35255,6 +35274,14 @@ Type-addr:  # (payload type-tree)
     0/imm32/right:null
     0/imm32/right:null
 
+Type-array:  # (payload type-tree)
+    0x11/imm32/alloc-id:fake:payload
+    1/imm32/is-atom
+    3/imm32/value:array
+    0/imm32/left:unused
+    0/imm32/right:null
+    0/imm32/right:null
+
 Type-byte:  # (payload type-tree)
     0x11/imm32/alloc-id:fake:payload
     1/imm32/is-atom
@@ -35271,6 +35298,27 @@ Type-float:  # (payload type-tree)
     0/imm32/right:null
     0/imm32/right:null
 
+Addr-type-string:  # (addr type-tree)
+  0/imm32/not-atom
+  0x11/imm32/alloc-id:fake
+  Type-addr/imm32/left
+  0x11/imm32/alloc-id:fake
+  _Addr-type-string:array/imm32/right
+_Addr-type-string:array:  # (payload type-tree)
+  0x11/imm32/alloc-id:fake:payload
+  0/imm32/not-atom
+  0x11/imm32/alloc-id:fake
+  Type-array/imm32/left
+  0x11/imm32/alloc-id:fake
+  _Addr-type-string:byte/imm32/right
+_Addr-type-string:byte:  # (payload type-tree)
+  0x11/imm32/alloc-id:fake:payload
+  0/imm32/not-atom
+  0x11/imm32/alloc-id:fake
+  Type-byte/imm32/left
+  0/imm32/right:null
+  0/imm32/right:null
+
 == code
 emit-subx-primitive:  # out: (addr buffered-file), stmt: (addr stmt), primitive: (addr primitive), err: (addr buffered-file), ed: (addr exit-descriptor)
     # . prologue
diff --git a/shell/environment.mu b/shell/environment.mu
index f4417625..b2cc06c6 100644
--- a/shell/environment.mu
+++ b/shell/environment.mu
@@ -10,7 +10,7 @@ type environment {
   sandbox: sandbox
   # some state for a modal dialog for navigating between functions
   partial-function-name: (handle gap-buffer)
-  function-not-found?: boolean
+  function-modal-error: (handle array byte)
   #
   cursor-in-globals?: boolean
   cursor-in-function-modal?: boolean
@@ -240,8 +240,8 @@ fn edit-environment _self: (addr environment), key: grapheme, data-disk: (addr d
       break-if-!=
       var cursor-in-function-modal-a/eax: (addr boolean) <- get self, cursor-in-function-modal?
       copy-to *cursor-in-function-modal-a, 0/false
-      var function-not-found?/eax: (addr boolean) <- get self, function-not-found?
-      copy-to *function-not-found? 0/false
+      var function-modal-error-ah/eax: (addr handle array byte) <- get self, function-modal-error
+      clear-object function-modal-error-ah
       return
     }
     # enter = switch to function name and exit modal dialog
@@ -258,8 +258,8 @@ fn edit-environment _self: (addr environment), key: grapheme, data-disk: (addr d
         var cursor-in-globals-a/eax: (addr boolean) <- get self, cursor-in-globals?
         copy-to *cursor-in-globals-a, 0/false
         # reset error state
-        var function-not-found?/eax: (addr boolean) <- get self, function-not-found?
-        copy-to *function-not-found? 0/false
+        var function-modal-error-ah/eax: (addr handle array byte) <- get self, function-modal-error
+        clear-object function-modal-error-ah
         # done with function modal
         var cursor-in-function-modal-a/eax: (addr boolean) <- get self, cursor-in-function-modal?
         copy-to *cursor-in-function-modal-a, 0/false
@@ -275,14 +275,14 @@ fn edit-environment _self: (addr environment), key: grapheme, data-disk: (addr d
       {
         compare index, 0
         break-if->=
-        var function-not-found?/eax: (addr boolean) <- get self, function-not-found?
-        copy-to *function-not-found? 1/true
+        var function-modal-error-ah/eax: (addr handle array byte) <- get self, function-modal-error
+        copy-array-object "no such function", function-modal-error-ah
         return
       }
       # otherwise clear modal state
       clear-gap-buffer partial-function-name
-      var function-not-found?/eax: (addr boolean) <- get self, function-not-found?
-      copy-to *function-not-found? 0/false
+      var function-modal-error-ah/eax: (addr handle array byte) <- get self, function-modal-error
+      clear-object function-modal-error-ah
       # switch focus to function at index
       var globals-cursor-index/eax: (addr int) <- get globals, cursor-index
       copy-to *globals-cursor-index, index
@@ -658,10 +658,11 @@ fn render-function-modal screen: (addr screen), _self: (addr environment) {
   subtract-from xmin, 4
   increment ymin
   {
-    var function-not-found?/eax: (addr boolean) <- get self, function-not-found?
-    compare *function-not-found?, 0/false
+    var function-modal-error-ah/eax: (addr handle array byte) <- get self, function-modal-error
+    var function-modal-error/eax: (addr array byte) <- lookup *function-modal-error-ah
+    compare function-modal-error, 0
     break-if-=
-    var dummy/eax: int <- draw-text-rightward screen, "no such function", xmin, xmax, ymin, 4/fg=error, 0xf/bg=modal
+    var dummy/eax: int <- draw-text-rightward screen, function-modal-error, xmin, xmax, ymin, 4/fg=error, 0xf/bg=modal
   }
   increment ymin
   var dummy/eax: int <- copy 0