code wiki / _hdl_build / nx_doc_heal_let_gate.nx

nx_doc_heal_let_gate.nx source

↩ module page · 64 lines · 3931 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" 8import "nx_gate_verdict.nx" 9 10func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 11func slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n } 12func gfind(hay: *u8, hl: i64, needle: *u8) -> i64 { 13 let nl: i64 = slen(needle); if nl == 0 { return 0-1 } 14 var i: i64 = 0 15 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 } 16 return 0-1 17} 18func ghas(hay: *u8, hl: i64, needle: *u8) -> i64 { if gfind(hay, hl, needle) >= 0 { return 1 } return 0 } 19 20func main() -> i64 { 21 gp("=== nx_doc_heal_let_gate: Doctor auto-fix of let-reassign (var) -- must-fix + must-not-break ===\n" as *u8) 22 let out: *u8 = sys_mmap(8192) 23 var pass: i64 = 0; var fail: i64 = 0 24 25 // KAT1 must-fix: reassigned let -> var 26 let s1: *u8 = "func f() -> i64 { let x: i64 = 0; x = 1; return x }" as *u8 27 let c1: i64 = dhl_heal(s1, slen(s1), out, 8192) 28 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) } 29 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) } 30 if c1 >= 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat1-no-change\n" as *u8) } 31 32 // KAT2 must-not-break: a clean let (never reassigned) stays let 33 let s2: *u8 = "func g() -> i64 { let y: i64 = 5; return y + 1 }" as *u8 34 let c2: i64 = dhl_heal(s2, slen(s2), out, 8192) 35 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) } 36 if c2 == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat2-spurious-change\n" as *u8) } 37 38 // KAT3 must-not-break: `==` comparison is not an assignment 39 let s3: *u8 = "func h() -> i64 { let z: i64 = 0; if z == 1 { return 2 } return z }" as *u8 40 let c3: i64 = dhl_heal(s3, slen(s3), out, 8192) 41 if c3 == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat3-eqeq-mistaken\n" as *u8) } 42 43 // KAT4 must-not-break: a NAME[i] = ... index-assignment does NOT reassign the binding 44 let s4: *u8 = "func k() -> i64 { let p: *u8 = z(); p[0] = 5 as u8; return 0 }" as *u8 45 let c4: i64 = dhl_heal(s4, slen(s4), out, 8192) 46 if c4 == 0 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat4-index-mistaken\n" as *u8) } 47 48 // KAT5 the exact session case: `let hit1 ... hit1 = 1` 49 let s5: *u8 = "let hit1: i64 = 0; if r == 1 { hit1 = 1 }" as *u8 50 let c5: i64 = dhl_heal(s5, slen(s5), out, 8192) 51 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) } 52 if c5 >= 1 { pass=pass+1 } else { fail=fail+1; gp(" FAIL kat5-no-change\n" as *u8) } 53 54 gp("DOC-HEAL-LET-GATE pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail) 55 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 56 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 57 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 58 let ctr__dry: *i64 = gv_ctr() 59 ctr__dry[0] = pass 60 ctr__dry[1] = pass + fail 61 let rc__dry: i64 = gv_verdict("DOC-HEAL-LET-GATE" as *u8, ctr__dry, "autonomous FIX: reassigned let->var; clean let / == / index-assign untouched)" as *u8) 62 sys_exit(rc__dry) 63 return rc__dry 64}