enum Option { 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: