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}