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:
 | 
						|
 |