68 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| enum Option<T> {
 | |
|     Some(item: T),
 | |
|     None
 | |
| }
 | |
| 
 | |
| fn make_one() = Some(1)
 | |
| 
 | |
| fn main() {
 | |
|     if (make_one() is Some(num)) {
 | |
|         println(num)
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Bytecode?
 | |
| 
 | |
| // Start with some magic number
 | |
| // Then a header. Each string starts with a length
 | |
| 
 | |
| header {
 | |
|     module_name: default
 | |
|     symbol_table_addr: 25 // example
 | |
|     symbol_table_length: 104 // example
 | |
|     version: 0.1.0
 | |
| }
 | |
| 
 | |
| symbols {
 | |
|     #   type    addr    len     name
 | |
|     0   fn      0       4       Some
 | |
|     1   fn      30      8       make_one
 | |
|     2   fn      39      4       main
 | |
| }
 | |
| 
 | |
| layout Option {
 | |
|     [0]: byte // tag
 | |
|         - 0: Some
 | |
|         - 1: None
 | |
|     [1-8]: *Any // ptr to Any
 | |
| }
 | |
| 
 | |
| fn Some(r0: *Any) -> *Option
 | |
|     alloc r1, 5         // allocate 5 bytes and put address into r1
 | |
|     mov [r1], 0         // move 0 into the (heap) location pointed to by r1
 | |
|     mov [r1 + 1], r0    // move the value of r0 into the location pointed to by r1 + 1
 | |
|     mov r0, r1          // move the value of r1 (the address of the struct) into r0
 | |
|     ret                 // return r0
 | |
| len: 30
 | |
| 
 | |
| fn make_one:
 | |
|     mov r0, 1
 | |
|     call Some
 | |
| len: 9
 | |
| 
 | |
| fn main:
 | |
|     call make_one       // op(1) + len(4) + name(8) = 13
 | |
|     cmp_int 0, [r0]     // op(1) + r(1) + offset(4) + operand(4) = 10
 | |
|     jne .end            // op(1) + offset(4)
 | |
|     mov r1, [r0 + 1]    // op(1) + dest_r(1) + src_r(1) + src_offset(4) = 7
 | |
|     mov r2, r1          // op(1) + dest_r(1) + src_r(1)
 | |
|     mov r0, r1          // op(1) + dest_r(1) + src_r(1)
 | |
|     call_ext println    // op(1) + len(4) + name(7)
 | |
|     free r2, 5          // op(1) + r(1) + size(4)
 | |
| 
 | |
|     .end
 | |
|     mov r0, 0           // op(1) + r(1) + value(4)
 | |
|     ret                 // op(1)
 | |
| len:
 | |
| 
 | 
