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