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}