code wiki / (root) / wasm_test.nx

wasm_test.nx source

↩ module page · 49 lines · 1559 B

1// wasm_test.nx -- self-test for wasm.nx. 2// 3// Builds a trivial IR module `func main() -> i64 { return 10 + 20 }`, 4// runs wat_emit_module over it, verifies the output buffer is non- 5// empty and contains some known WAT tokens. 6 7import "syscalls.nx" 8import "types.nx" 9import "ir.nx" 10import "outbuf.nx" 11import "wasm.nx" 12 13// Contains-substring test (linear scan). Returns 1 on hit, 0 on miss. 14func contains(buf: *u8, buf_len: i64, needle: *u8) -> i64 { 15 var nl: i64 = 0 16 while needle[nl] != 0 { nl = nl + 1 } 17 var i: i64 = 0 18 while i + nl <= buf_len { 19 var j: i64 = 0 20 var ok: i64 = 1 21 while j < nl { 22 if buf[i + j] != needle[j] { ok = 0; j = nl } 23 j = j + 1 24 } 25 if ok == 1 { return 1 } 26 i = i + 1 27 } 28 return 0 29} 30 31func main() -> i64 { 32 let m: *Module = ir_module_new("wat_test" as *u8) 33 let f: *Function = ir_function_new(m, "main" as *u8, 4, ir_type_i64()) 34 let b: *BasicBlock = ir_block_new(f) 35 let c10: i64 = ir_const_i64(f, 10) 36 let c20: i64 = ir_const_i64(f, 20) 37 let sum: i64 = ir_emit_binop(b, OP_ADD, c10, c20, ir_type_i64()) 38 ir_emit_return(b, sum) 39 40 let o: *OutBuf = out_new(4096) 41 wat_emit_module(m, o) 42 43 if o.pos <= 0 { return 1 } 44 if contains(o.buf, o.pos, "(module") == 0 { return 2 } 45 if contains(o.buf, o.pos, "i64.add") == 0 { return 3 } 46 if contains(o.buf, o.pos, "br $exit") == 0 { return 4 } 47 if contains(o.buf, o.pos, "func $main") == 0 { return 5 } 48 return 0 49}