code wiki / _hdl_build / nx_doc_heal_let_gate.nx
nx_doc_heal_let_gate.nx source
↩ module page · 56 lines · 3540 B
1import "nx_gate_gn.nx"
2// nx_doc_heal_let_gate.nx -- liar-kill gate for the Doctor's let-reassign auto-fixer (autonomous FIX). MUST-FIX: a
3// `let` that is reassigned -> rewritten to `var` (incl. the exact `hit1` case that bit this session). MUST-NOT-BREAK:
4// a clean `let` (never reassigned), a `==` comparison, and a `NAME[i] = ...` index-assignment are all left untouched
5// (no false rewrites). expect_exit: 0
6import "nx_syscalls.nx"
7import "nx_doc_heal_let.nx"
8
9func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
10func slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
11func gfind(hay: *u8, hl: i64, needle: *u8) -> i64 {
12 let nl: i64 = slen(needle); if nl == 0 { return 0-1 }
13 var i: i64 = 0
14 while i + nl <= hl { var k: i64=0; var hit: i64=1; while k<nl { if hay[i+k]!=needle[k]{hit=0;k=nl}else{k=k+1} } if hit==1 {return i} i=i+1 }
15 return 0-1
16}
17func ghas(hay: *u8, hl: i64, needle: *u8) -> i64 { if gfind(hay, hl, needle) >= 0 { return 1 } return 0 }
18
19func main() -> i64 {
20 gp("=== nx_doc_heal_let_gate: Doctor auto-fix of let-reassign (var) -- must-fix + must-not-break ===\n" as *u8)
21 let out: *u8 = sys_mmap(8192)
22 var pass: i64 = 0; var fail: i64 = 0
23
24 // KAT1 must-fix: reassigned let -> var
25 let s1: *u8 = "func f() -> i64 { let x: i64 = 0; x = 1; return x }" as *u8
26 let c1: i64 = dhl_heal(s1, slen(s1), out, 8192)
27 if ghas(out, slen(out), "var x: i64 = 0" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat1-not-fixed\n" as *u8) }
28 if gfind(out, slen(out), "let x" as *u8) < 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat1-let-remains\n" as *u8) }
29 if c1 >= 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat1-no-change\n" as *u8) }
30
31 // KAT2 must-not-break: a clean let (never reassigned) stays let
32 let s2: *u8 = "func g() -> i64 { let y: i64 = 5; return y + 1 }" as *u8
33 let c2: i64 = dhl_heal(s2, slen(s2), out, 8192)
34 if ghas(out, slen(out), "let y: i64 = 5" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat2-clean-touched\n" as *u8) }
35 if c2 == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat2-spurious-change\n" as *u8) }
36
37 // KAT3 must-not-break: `==` comparison is not an assignment
38 let s3: *u8 = "func h() -> i64 { let z: i64 = 0; if z == 1 { return 2 } return z }" as *u8
39 let c3: i64 = dhl_heal(s3, slen(s3), out, 8192)
40 if c3 == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat3-eqeq-mistaken\n" as *u8) }
41
42 // KAT4 must-not-break: a NAME[i] = ... index-assignment does NOT reassign the binding
43 let s4: *u8 = "func k() -> i64 { let p: *u8 = z(); p[0] = 5 as u8; return 0 }" as *u8
44 let c4: i64 = dhl_heal(s4, slen(s4), out, 8192)
45 if c4 == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat4-index-mistaken\n" as *u8) }
46
47 // KAT5 the exact session case: `let hit1 ... hit1 = 1`
48 let s5: *u8 = "let hit1: i64 = 0; if r == 1 { hit1 = 1 }" as *u8
49 let c5: i64 = dhl_heal(s5, slen(s5), out, 8192)
50 if ghas(out, slen(out), "var hit1" as *u8) == 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat5-not-fixed\n" as *u8) }
51 if c5 >= 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat5-no-change\n" as *u8) }
52
53 gp("DOC-HEAL-LET-GATE pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
54 if fail == 0 { gp(" verdict=GREEN (autonomous FIX: reassigned let->var; clean let / == / index-assign untouched)\n" as *u8); sys_exit(0); return 0 }
55 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1
56}