about summary refs log tree commit diff stats
path: root/apps/mu.subx
diff options
context:
space:
mode:
Diffstat (limited to 'apps/mu.subx')
-rw-r--r--apps/mu.subx60
1 files changed, 34 insertions, 26 deletions
diff --git a/apps/mu.subx b/apps/mu.subx
index 2c54d141..6aa2333c 100644
--- a/apps/mu.subx
+++ b/apps/mu.subx
@@ -358,9 +358,43 @@ Tree-right:  # (addr tree type-id)
 Tree-size:  # (addr int)
   8/imm32
 
+# Types
+
 Max-type-id:
   0x10000/imm32
 
+Type-id:  # (stream (address array byte))
+  0x18/imm32/write
+  0/imm32/read
+  0x100/imm32/length
+  # data
+  "literal"/imm32  # 0
+  "int"/imm32  # 1
+  "addr"/imm32  # 2
+  "array"/imm32  # 3
+  "handle"/imm32  # 4
+  "bool"/imm32  # 5
+  0/imm32
+  0/imm32
+  # 0x20
+  0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
+  0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
+  0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
+  0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
+  0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
+  0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
+  0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
+
+# Types contain vars with types, but can't specify registers.
+Typeinfo-id:  # type-id
+  0/imm32
+Typeinfo-fields:  # (handle list var)
+  4/imm32
+Typeinfo-next:  # (handle typeinfo)
+  8/imm32
+Typeinfo-size:  # (addr int)
+  0xc/imm32
+
 == code
 
 Entry:
@@ -2896,32 +2930,6 @@ $pos-slice:end:
     5d/pop-to-ebp
     c3/return
 
-== data
-
-Type-id:  # (stream (address array byte))
-  0x18/imm32/write
-  0/imm32/read
-  0x100/imm32/length
-  # data
-  "literal"/imm32  # 0
-  "int"/imm32  # 1
-  "addr"/imm32  # 2
-  "array"/imm32  # 3
-  "handle"/imm32  # 4
-  "bool"/imm32  # 5
-  0/imm32
-  0/imm32
-  # 0x20
-  0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
-  0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
-  0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
-  0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
-  0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
-  0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
-  0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32
-
-== code
-
 test-parse-var-with-type:
     # . prologue
     55/push-ebp
olor: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
# Example reading commandline arguments: compute length of first arg.

fn main argc : int, argv : (array (ref array char)) -> [
  var tmp : (index char)
  tmp <- index 1, %size(ref array char)
  var tmp2 : (address (ref array char))
  tmp2 <- advance argv, tmp
  var s/EBX : (ref array char)
  s/EBX <- copy *tmp2
  var result/EAX : int
  result/EAX <- ascii_length s/EBX
  call exit, result/EAX
]

fn ascii_length s : (ref array char) -> result : int [
  var result/EBX : int
  result/EBX <- copy 0
  {
    var tmp0/EDI : (offset char)
    tmp0/EDI <- index result/EBX, %size(char)
    var tmp/EDX : (address char)
    tmp/EDX <- advance *s, tmp0/EDI
    var c/ECX : char
    c/ECX <- copy *tmp
    compare c/ECX, 0
    break-if-equal
    loop
  }
  return result/EBX
]

fn exit x : int [
  code/EBX <- copy x
  code/EAX <- copy 1/exit
  syscall
]