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}