deimos-lang/sketching/goal_one.dm
2024-11-26 23:34:30 -06:00

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: