code wiki / _hdl_build / nx_oo_extract.nx

nx_oo_extract.nx source

↩ module page · 239 lines · 10878 B

1// nx_oo_extract.nx -- BYTE-PROVEN OO DUP-FUNCTION EXTRACTOR (the real "object-oriented without losing 2// functionality" operation, unblocked by the 2026-07-21 byte-equiv proof). Moves a function that is 3// DUPLICATED byte-identically across N consumers into a shared base lib, repoints each consumer to 4// import it, and COMMITS only if EVERY consumer's rebuild is BYTE-IDENTICAL to before (else REVERTS all). 5// never-brick + rule-13 (originals backed up). Every refusal carries verdict+reason+fix (operator law). 6// argv: <funcname> <baselib-srcpath> <buildonly-elf> <consumer-srcpath1> [consumer-srcpath2 ...] 7// exit: 0 EXTRACTED | 1 REFUSED(reverted) | 2 usage/precondition | 3 io/build error(reverted) 8// license_tier: ORIGINAL No hw writes (Rule 26). 9import "nx_seat_drive_lib.nx" 10import "nx_seg_store.nx" 11import "nx_deploy_lib.nx" 12import "nx_syscalls.nx" 13 14const OE_CAP: i64 = 2097152 15const OE_MAXC: i64 = 128 16 17func oe_read(path: *u8, buf: *u8, cap: i64) -> i64 { 18 let fd: i64 = sys_openat_rd(path) 19 if fd < 0 { return 0 - 1 } 20 var n: i64 = 0 21 var r: i64 = sys_read(fd, buf, cap - 1) 22 while r > 0 { n = n + r; if n >= cap - 1 { r = 0 } else { r = sys_read(fd, buf + n, cap - 1 - n) } } 23 sys_close(fd) 24 return n 25} 26func oe_isid(c: i64) -> i64 { 27 if c >= 97 { if c <= 122 { return 1 } } 28 if c >= 65 { if c <= 90 { return 1 } } 29 if c >= 48 { if c <= 57 { return 1 } } 30 if c == 95 { return 1 } 31 return 0 32} 33func oe_eq(a: *u8, an: i64, b: *u8, bn: i64) -> i64 { if an != bn { return 0 } var i: i64 = 0; while i < an { if a[i] != b[i] { return 0 } i = i + 1 } return 1 } 34// find func <fname>( at a line start; out[0]=body-start(the 'f'), out[1]=body-end(next func or n); ret 1/0 35func oe_find_func(buf: *u8, n: i64, fname: *u8, out: *i64) -> i64 { 36 var nl: i64 = 0 37 while fname[nl] != (0 as u8) { nl = nl + 1 } 38 var i: i64 = 0 39 var bol: i64 = 1 40 var fstart: i64 = 0 - 1 41 while i < n { 42 if bol == 1 { 43 // match "func <fname>(" 44 var m: i64 = 1 45 if i + 5 + nl + 1 > n { m = 0 } 46 if m == 1 { if buf[i] != (102 as u8) { m = 0 } } 47 if m == 1 { if buf[i+1] != (117 as u8) { m = 0 } } 48 if m == 1 { if buf[i+2] != (110 as u8) { m = 0 } } 49 if m == 1 { if buf[i+3] != (99 as u8) { m = 0 } } 50 if m == 1 { if buf[i+4] != (32 as u8) { m = 0 } } 51 if m == 1 { 52 var k: i64 = 0 53 while k < nl { if buf[i+5+k] != fname[k] { m = 0; k = nl } else { k = k + 1 } } 54 } 55 if m == 1 { if buf[i+5+nl] != (40 as u8) { m = 0 } } 56 if m == 1 { 57 if fstart < 0 { 58 fstart = i 59 } else { 60 out[0] = fstart; out[1] = i; return 1 61 } 62 } else { 63 // any OTHER func line after we found ours ends the range 64 var isfunc: i64 = 1 65 if i + 5 > n { isfunc = 0 } 66 if isfunc == 1 { if buf[i] != (102 as u8) { isfunc = 0 } } 67 if isfunc == 1 { if buf[i+1] != (117 as u8) { isfunc = 0 } } 68 if isfunc == 1 { if buf[i+2] != (110 as u8) { isfunc = 0 } } 69 if isfunc == 1 { if buf[i+3] != (99 as u8) { isfunc = 0 } } 70 if isfunc == 1 { if buf[i+4] != (32 as u8) { isfunc = 0 } } 71 if isfunc == 1 { if fstart >= 0 { out[0] = fstart; out[1] = i; return 1 } } 72 } 73 } 74 let c: i64 = buf[i] as i64 75 if c == 10 { bol = 1 } else { bol = 0 } 76 i = i + 1 77 } 78 if fstart >= 0 { out[0] = fstart; out[1] = n; return 1 } 79 return 0 80} 81// build target (basename of srcpath minus .nx) via buildonly; snapshot /tmp/<target>.sov.elf -> snappath 82func oe_build_snap(buildelf: *u8, target: *u8, snappath: *u8, buf: *u8) -> i64 { 83 let art: *u8 = sys_mmap(512) 84 var o: i64 = sd_cat(art, 0, "/tmp/" as *u8) 85 o = sd_cat(art, o, target) 86 o = sd_cat(art, o, ".sov.elf" as *u8) 87 sys_unlinkat(art) 88 let av: *i64 = sys_mmap(16) as *i64 89 av[0] = target as i64 90 dep_run_capture(buildelf, av, 1, "/tmp/oe_build.log" as *u8) 91 let n: i64 = oe_read(art, buf, OE_CAP) 92 if n > 0 { if (snappath as i64) != 0 { ss_writefile(snappath, buf, n) } } 93 return n 94} 95// basename of a path (after last '/') into out; returns len 96func oe_base(path: *u8, out: *u8) -> i64 { 97 var last: i64 = 0 - 1 98 var i: i64 = 0 99 while path[i] != (0 as u8) { if path[i] == (47 as u8) { last = i } i = i + 1 } 100 var o: i64 = 0 101 var j: i64 = last + 1 102 while path[j] != (0 as u8) { out[o] = path[j]; o = o + 1; j = j + 1 } 103 out[o] = 0 as u8 104 return o 105} 106// target = basename minus ".nx" 107func oe_target(path: *u8, out: *u8) -> i64 { 108 let bl: i64 = oe_base(path, out) 109 if bl >= 3 { if out[bl-3] == (46 as u8) { out[bl-3] = 0 as u8; return bl - 3 } } 110 return bl 111} 112 113func main(argc: i64, argv: *i64) -> i64 { 114 if argc < 5 { sd_w("usage: nx_oo_extract <funcname> <baselib-srcpath> <buildonly-elf> <consumer-src...>\n" as *u8); sys_exit(2); return 2 } 115 let fname: *u8 = argv[1] as *u8 116 let basepath: *u8 = argv[2] as *u8 117 let buildelf: *u8 = argv[3] as *u8 118 let nc: i64 = argc - 4 119 120 let basebn: *u8 = sys_mmap(256) 121 oe_base(basepath, basebn) 122 123 // PASS 1: read each consumer, find funcname, extract body; verify ALL bodies byte-identical 124 let cbuf: *u8 = sys_mmap(OE_CAP) 125 let body0: *u8 = sys_mmap(OE_CAP) 126 var body0n: i64 = 0 127 let rng: *i64 = sys_mmap(16) as *i64 128 var ci: i64 = 0 129 while ci < nc { 130 let cp: *u8 = argv[4 + ci] as *u8 131 let cn: i64 = oe_read(cp, cbuf, OE_CAP) 132 if cn <= 0 { sd_w("NX-OO-EXTRACT verdict=ABORTED reason=consumer-unreadable:" as *u8); sd_w(cp); sd_w(" fix=verify-the-consumer-source-path\n" as *u8); sys_exit(2); return 2 } 133 if oe_find_func(cbuf, cn, fname, rng) != 1 { 134 sd_w("NX-OO-EXTRACT verdict=ABORTED reason=function-" as *u8); sd_w(fname); sd_w("-not-defined-in:" as *u8); sd_w(cp) 135 sd_w(" fix=only-pass-consumers-that-DEFINE-the-function(check-funcmine-output)\n" as *u8); sys_exit(2); return 2 136 } 137 let bs: i64 = rng[0] 138 let be: i64 = rng[1] 139 if ci == 0 { 140 body0n = be - bs 141 var t: i64 = 0 142 while t < body0n { body0[t] = cbuf[bs + t]; t = t + 1 } 143 } else { 144 if oe_eq(((cbuf as i64) + bs) as *u8, be - bs, body0, body0n) == 0 { 145 sd_w("NX-OO-EXTRACT verdict=REFUSED reason=the-" as *u8); sd_w(fname); sd_w("-bodies-are-NOT-byte-identical-across-consumers" as *u8) 146 sd_w(" fix=only-byte-identical-duplicates-can-be-safely-extracted;-if-they-differ-they-are-DIVERGENT-resolve-by-rename-not-extraction. no-changes-made\n" as *u8) 147 sys_exit(1); return 1 148 } 149 } 150 ci = ci + 1 151 } 152 153 // PASS 2: snapshot each consumer's build (BEFORE) + backup its source 154 let tgt: *u8 = sys_mmap(256) 155 let snap: *u8 = sys_mmap(512) 156 let bak: *u8 = sys_mmap(512) 157 ci = 0 158 while ci < nc { 159 let cp: *u8 = argv[4 + ci] as *u8 160 oe_target(cp, tgt) 161 var so: i64 = sd_cat(snap, 0, "/tmp/oo_" as *u8); so = sd_cat(snap, so, tgt); so = sd_cat(snap, so, ".before" as *u8) 162 let bn: i64 = oe_build_snap(buildelf, tgt, snap, cbuf) 163 if bn <= 0 { 164 sd_w("NX-OO-EXTRACT verdict=ABORTED reason=consumer-" as *u8); sd_w(tgt); sd_w("-does-not-build-standalone(no-baseline-artifact)" as *u8) 165 sd_w(" fix=byte-proof-needs-a-buildable-holder;-for-non-buildable-holders(gates)-use-the-BEHAVIOURAL-proof-variant. no-changes-made\n" as *u8) 166 sys_exit(3); return 3 167 } 168 // backup source 169 let cn: i64 = oe_read(cp, cbuf, OE_CAP) 170 var bo: i64 = sd_cat(bak, 0, cp); bo = sd_cat(bak, bo, ".oobak" as *u8) 171 ss_writefile(bak, cbuf, cn) 172 ci = ci + 1 173 } 174 175 // PASS 3: write the base lib (header + the extracted function body) 176 let lib: *u8 = sys_mmap(OE_CAP) 177 var lo: i64 = sd_cat(lib, 0, "// AUTO-EXTRACTED shared base (nx_oo_extract). license_tier: ORIGINAL No hw writes (Rule 26).\n" as *u8) 178 var t2: i64 = 0 179 while t2 < body0n { lib[lo] = body0[t2]; lo = lo + 1; t2 = t2 + 1 } 180 ss_writefile(basepath, lib, lo) 181 182 // PASS 4: edit each consumer (prepend import, remove the func def) 183 let nf: *u8 = sys_mmap(OE_CAP) 184 ci = 0 185 while ci < nc { 186 let cp: *u8 = argv[4 + ci] as *u8 187 let cn: i64 = oe_read(cp, cbuf, OE_CAP) 188 oe_find_func(cbuf, cn, fname, rng) 189 let bs: i64 = rng[0] 190 let be: i64 = rng[1] 191 var no: i64 = sd_cat(nf, 0, "import \"" as *u8); no = sd_cat(nf, no, basebn); no = sd_cat(nf, no, "\"\n" as *u8) 192 var t3: i64 = 0 193 while t3 < bs { nf[no] = cbuf[t3]; no = no + 1; t3 = t3 + 1 } 194 t3 = be 195 while t3 < cn { nf[no] = cbuf[t3]; no = no + 1; t3 = t3 + 1 } 196 ss_writefile(cp, nf, no) 197 ci = ci + 1 198 } 199 200 // PASS 5: rebuild each consumer, compare to snapshot 201 var changed: i64 = 0 202 let bufb: *u8 = sys_mmap(OE_CAP) 203 ci = 0 204 while ci < nc { 205 let cp: *u8 = argv[4 + ci] as *u8 206 oe_target(cp, tgt) 207 var so: i64 = sd_cat(snap, 0, "/tmp/oo_" as *u8); so = sd_cat(snap, so, tgt); so = sd_cat(snap, so, ".before" as *u8) 208 let an: i64 = oe_build_snap(buildelf, tgt, 0 as *u8, cbuf) 209 let sn: i64 = oe_read(snap, bufb, OE_CAP) 210 if an <= 0 { changed = changed + 1; sd_w("OO-CHANGED(build-broke) " as *u8); sd_w(tgt); sd_w("\n" as *u8) } else { 211 if oe_eq(cbuf, an, bufb, sn) == 0 { changed = changed + 1; sd_w("OO-CHANGED " as *u8); sd_w(tgt); sd_w("\n" as *u8) } 212 } 213 ci = ci + 1 214 } 215 216 if changed == 0 { 217 sd_w("NX-OO-EXTRACT verdict=EXTRACTED reason=" as *u8); sd_w(fname) 218 sd_w("-moved-to-" as *u8); sd_w(basebn) 219 sd_w("-and-all-" as *u8) 220 let ob: *u8 = sys_mmap(32); sd_num(ob, 0, nc); sd_w(ob) 221 sd_w("-consumers-rebuilt-BYTE-IDENTICAL(behaviour-preserved) fix=none-committed;-remove-the-.oobak-backups-when-satisfied\n" as *u8) 222 sys_exit(0); return 0 223 } 224 // any consumer changed -> REVERT everything 225 ci = 0 226 while ci < nc { 227 let cp: *u8 = argv[4 + ci] as *u8 228 var bo: i64 = sd_cat(bak, 0, cp); bo = sd_cat(bak, bo, ".oobak" as *u8) 229 let cn: i64 = oe_read(bak, cbuf, OE_CAP) 230 if cn > 0 { ss_writefile(cp, cbuf, cn) } 231 ci = ci + 1 232 } 233 sys_unlinkat(basepath) 234 sd_w("NX-OO-EXTRACT verdict=REFUSED reason=" as *u8) 235 let ob2: *u8 = sys_mmap(32); sd_num(ob2, 0, changed); sd_w(ob2) 236 sd_w("-consumer(s)-changed-after-extraction(behaviour-NOT-preserved) fix=extraction-not-byte-safe-here-see-OO-CHANGED-lines;-all-consumers-RESTORED-from-.oobak-and-the-base-lib-removed(safe)\n" as *u8) 237 sys_exit(1) 238 return 1 239}