code wiki / (root) / _selfhost_compile_if.nx

_selfhost_compile_if.nx source

↩ module page · 78 lines · 2283 B

1// _selfhost_compile_if.nx -- compile `if 1 { return 42 } return 7` via 2// the NishiLang-in-NishiLang pipeline. Expected runtime exit: 42 3// (the conditional is truthy so the then-branch runs and short- 4// circuits past the return 7). 5 6import "syscalls.nx" 7import "nx_nlex.nx" 8import "nx_nparse.nx" 9import "nx_nir.nx" 10import "nx_nx86.nx" 11 12func main() -> i64 { 13 let src: *u8 = sys_mmap(64) 14 // func main() -> i64 { if 1 { return 42 } return 7 } 15 src[0] = 102 as u8 // f 16 src[1] = 117 as u8 // u 17 src[2] = 110 as u8 // n 18 src[3] = 99 as u8 // c 19 src[4] = 32 as u8 20 src[5] = 109 as u8 // m 21 src[6] = 97 as u8 22 src[7] = 105 as u8 23 src[8] = 110 as u8 24 src[9] = 40 as u8 // ( 25 src[10] = 41 as u8 // ) 26 src[11] = 32 as u8 27 src[12] = 45 as u8 // - 28 src[13] = 62 as u8 // > 29 src[14] = 32 as u8 30 src[15] = 105 as u8 // i 31 src[16] = 54 as u8 // 6 32 src[17] = 52 as u8 // 4 33 src[18] = 32 as u8 34 src[19] = 123 as u8 // { 35 src[20] = 32 as u8 36 src[21] = 105 as u8 // i 37 src[22] = 102 as u8 // f 38 src[23] = 32 as u8 39 src[24] = 49 as u8 // 1 40 src[25] = 32 as u8 41 src[26] = 123 as u8 // { 42 src[27] = 32 as u8 43 src[28] = 114 as u8 // r 44 src[29] = 101 as u8 45 src[30] = 116 as u8 46 src[31] = 117 as u8 47 src[32] = 114 as u8 48 src[33] = 110 as u8 49 src[34] = 32 as u8 50 src[35] = 52 as u8 // 4 51 src[36] = 50 as u8 // 2 52 src[37] = 32 as u8 53 src[38] = 125 as u8 // } 54 src[39] = 32 as u8 55 src[40] = 114 as u8 // r 56 src[41] = 101 as u8 57 src[42] = 116 as u8 58 src[43] = 117 as u8 59 src[44] = 114 as u8 60 src[45] = 110 as u8 61 src[46] = 32 as u8 62 src[47] = 55 as u8 // 7 63 src[48] = 32 as u8 64 src[49] = 125 as u8 65 66 let lex: *NxNLexer = nx_nlex_new(src, 50, 64) 67 nx_nlex_run(lex) 68 let parser: *NxNParser = nx_nparse_new(lex, 64) 69 let func_idx: i64 = nx_nparse_run(parser) 70 if func_idx < 0 { return 1 } 71 let ir: *NxIrFunc = nx_nir_lower_func(parser, func_idx, 64) 72 if ir == (0 as *NxIrFunc) { return 2 } 73 74 let asm: *NxAsmBuf = nx_asm_new(4096) 75 nx_nx86_emit_func(asm, src, ir) 76 sys_write(1, asm.buf, asm.len) 77 return 0 78}