code wiki / _hdl_build / _sig_index_authored.nx
_sig_index_authored.nx source
↩ module page · 276 lines · 13733 B
1// AUTHORED BY THE NISHI BUILDER (nx_module_author sig-index template) -- S3 component catalog.
2// Typed signature table of every func in runtime/*.nx; tutoring: specs/2026-06-09-tutoring-code-synthesis-rung1.md
3// STRUCT-FREE dirent walk by LAW: NxDirent struct-on-stack miscompiles under nx_cc_sovereign
4// (sig11, issue filed 2026-06-09, repro _si_walk_probe vs _si_walk_probe2) -- raw-offset helpers instead.
5import "nx_syscalls.nx"
6func si_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
7func _si_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
8func _si_num(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=48+(m%10);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
9func _si_fputs(fd2: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd2,s,n); return 0 }
10func _si_fnum(fd2: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(fd2,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=48+(m%10);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd2,bb,k); return 0 }
11func si_ws(c: i64) -> i64 { if c == 32 { return 1 } if c == 9 { return 1 } if c == 13 { return 1 } if c == 10 { return 1 } return 0 }
12func si_tok_eq(buf: *u8, i: i64, e: i64, t: *u8) -> i64 {
13 var k: i64 = 0
14 while i + k < e {
15 if t[k] == (0 as u8) { return 0 }
16 if buf[i + k] != t[k] { return 0 }
17 k = k + 1
18 }
19 if t[k] == (0 as u8) { return 1 }
20 return 0
21}
22func si_type_code(buf: *u8, i: i64, e: i64) -> i64 {
23 if si_tok_eq(buf, i, e, "i64" as *u8) == 1 { return 1 }
24 if si_tok_eq(buf, i, e, "*u8" as *u8) == 1 { return 2 }
25 if si_tok_eq(buf, i, e, "*i64" as *u8) == 1 { return 3 }
26 if si_tok_eq(buf, i, e, "u8" as *u8) == 1 { return 4 }
27 if si_tok_eq(buf, i, e, "nx_int" as *u8) == 1 { return 5 }
28 if si_tok_eq(buf, i, e, "nx_size" as *u8) == 1 { return 6 }
29 if si_tok_eq(buf, i, e, "nx_idx" as *u8) == 1 { return 7 }
30 if si_tok_eq(buf, i, e, "nx_exit" as *u8) == 1 { return 8 }
31 if si_tok_eq(buf, i, e, "*nx_int" as *u8) == 1 { return 9 }
32 return 99
33}
34func si_read(path: *u8, buf: *u8, cap: i64) -> i64 {
35 let fd2: i64 = sys_openat_rd(path)
36 if fd2 < 0 { return 0 - 1 }
37 var total: i64 = 0
38 var go: i64 = 1
39 while go == 1 {
40 let base: i64 = buf as i64
41 let n: i64 = sys_read(fd2, (base + total) as *u8, cap - total)
42 if n <= 0 { go = 0 } else { total = total + n }
43 if total >= cap { go = 0 }
44 }
45 sys_close(fd2)
46 return total
47}
48func si_scan(buf: *u8, n: i64, recs: *i64, maxrec: i64, pool: *u8, poolmax: i64, state: *i64) -> i64 {
49 var added: i64 = 0
50 var i: i64 = 0
51 while i < n {
52 var matched: i64 = 0
53 if i + 5 < n {
54 if buf[i] == (102 as u8) { if buf[i+1] == (117 as u8) { if buf[i+2] == (110 as u8) { if buf[i+3] == (99 as u8) { if buf[i+4] == (32 as u8) { matched = 1 } } } } }
55 }
56 if matched == 1 {
57 var j: i64 = i + 5
58 while j < n { if si_ws(buf[j] as i64) == 0 { break } j = j + 1 }
59 let ns: i64 = j
60 while j < n { if buf[j] == (40 as u8) { break } if si_ws(buf[j] as i64) == 1 { break } j = j + 1 }
61 let ne: i64 = j
62 while j < n { if si_ws(buf[j] as i64) == 0 { break } j = j + 1 }
63 var ok: i64 = 0
64 if j < n { if buf[j] == (40 as u8) { ok = 1 } }
65 if ne <= ns { ok = 0 }
66 if ne - ns > 120 { ok = 0 }
67 if ok == 1 {
68 j = j + 1
69 var arity: i64 = 0
70 var t1: i64 = 0
71 var t2: i64 = 0
72 var t3: i64 = 0
73 var t4: i64 = 0
74 var stop: i64 = 0
75 let lim: i64 = j + 2400
76 while stop == 0 {
77 if j >= n { stop = 2 }
78 if stop == 0 { if j > lim { stop = 2 } }
79 if stop == 0 {
80 let c: i64 = buf[j] as i64
81 if si_ws(c) == 1 { j = j + 1 }
82 else { if c == 44 { j = j + 1 }
83 else { if c == 41 { stop = 1 }
84 else {
85 var guard: i64 = 0
86 var cont: i64 = 1
87 while cont == 1 {
88 if j >= n { cont = 0 } else {
89 if buf[j] == (58 as u8) { cont = 0 } else {
90 if buf[j] == (41 as u8) { cont = 0 } else {
91 if guard > 240 { cont = 0 } else { j = j + 1; guard = guard + 1 } } } }
92 }
93 var okc: i64 = 0
94 if j < n { if buf[j] == (58 as u8) { okc = 1 } }
95 if okc == 0 { stop = 2 }
96 else {
97 j = j + 1
98 while j < n { if si_ws(buf[j] as i64) == 0 { break } j = j + 1 }
99 let ts: i64 = j
100 while j < n { if buf[j] == (44 as u8) { break } if buf[j] == (41 as u8) { break } if si_ws(buf[j] as i64) == 1 { break } j = j + 1 }
101 let code: i64 = si_type_code(buf, ts, j)
102 arity = arity + 1
103 if arity == 1 { t1 = code }
104 if arity == 2 { t2 = code }
105 if arity == 3 { t3 = code }
106 if arity == 4 { t4 = code }
107 }
108 } } }
109 }
110 }
111 if stop == 1 {
112 j = j + 1
113 while j < n { if buf[j] == (32 as u8) { j = j + 1 } else { break } }
114 var ret: i64 = 0
115 if j + 1 < n { if buf[j] == (45 as u8) { if buf[j+1] == (62 as u8) {
116 j = j + 2
117 while j < n { if buf[j] == (32 as u8) { j = j + 1 } else { break } }
118 let rs: i64 = j
119 while j < n { if si_ws(buf[j] as i64) == 1 { break } if buf[j] == (123 as u8) { break } j = j + 1 }
120 ret = si_type_code(buf, rs, j)
121 } } }
122 if state[0] < maxrec { if state[1] + (ne - ns) + 2 < poolmax {
123 let r: i64 = state[0]
124 recs[r*8+0] = state[1]
125 recs[r*8+1] = arity
126 recs[r*8+2] = ret
127 recs[r*8+3] = t1
128 recs[r*8+4] = t2
129 recs[r*8+5] = t3
130 recs[r*8+6] = t4
131 recs[r*8+7] = 0
132 var q: i64 = ns
133 var p: i64 = state[1]
134 while q < ne { pool[p] = buf[q]; p = p + 1; q = q + 1 }
135 pool[p] = 0 as u8
136 state[1] = p + 1
137 state[0] = r + 1
138 added = added + 1
139 var h: i64 = state[2]
140 q = ns
141 while q < ne { h = h * 131 + (buf[q] as i64); q = q + 1 }
142 h = h * 31 + arity
143 h = h * 31 + ret
144 h = h * 31 + t1
145 h = h * 31 + t2
146 h = h * 31 + t3
147 h = h * 31 + t4
148 state[2] = h
149 } }
150 }
151 }
152 }
153 while i < n { if buf[i] == (10 as u8) { break } i = i + 1 }
154 i = i + 1
155 }
156 return added
157}
158func si_build(recs: *i64, maxrec: i64, pool: *u8, poolmax: i64, state: *i64, fstate: *i64) -> i64 {
159 state[0] = 0
160 state[1] = 0
161 state[2] = 0
162 fstate[0] = 0
163 let dfd: i64 = sys_openat_rd("runtime" as *u8)
164 if dfd < 0 { return 0 - 1 }
165 let dirbuf: *u8 = sys_mmap(1048640)
166 let pathbuf: *u8 = sys_mmap(4096)
167 let filebuf: *u8 = sys_mmap(4194320)
168 var done: i64 = 0
169 while done == 0 {
170 let nb: i64 = sys_getdents64(dfd, dirbuf, 1048576)
171 if nb <= 0 { done = 1 }
172 else {
173 var off: i64 = 0
174 while off < nb {
175 let dbase: i64 = dirbuf as i64
176 let rec: *u8 = (dbase + off) as *u8
177 let rl: i64 = dirent_reclen(rec)
178 if rl <= 0 { off = nb }
179 else {
180 let name: *u8 = dirent_name(rec)
181 let nl: i64 = si_slen(name)
182 var isnx: i64 = 0
183 if nl > 3 {
184 if name[nl-3] == (46 as u8) { if name[nl-2] == (110 as u8) { if name[nl-1] == (120 as u8) { isnx = 1 } } }
185 }
186 if isnx == 1 {
187 var p: i64 = 0
188 let pre: *u8 = "runtime/" as *u8
189 while pre[p] != (0 as u8) { pathbuf[p] = pre[p]; p = p + 1 }
190 var q: i64 = 0
191 while q < nl { pathbuf[p] = name[q]; p = p + 1; q = q + 1 }
192 pathbuf[p] = 0 as u8
193 let fl: i64 = si_read(pathbuf, filebuf, 4194304)
194 if fl > 0 {
195 si_scan(filebuf, fl, recs, maxrec, pool, poolmax, state)
196 fstate[0] = fstate[0] + 1
197 }
198 }
199 off = off + rl
200 }
201 }
202 }
203 }
204 sys_close(dfd)
205 return 0
206}
207func si_name_eq(pool: *u8, off: i64, name: *u8) -> i64 {
208 var k: i64 = 0
209 while name[k] != (0 as u8) { if pool[off+k] != name[k] { return 0 } k = k + 1 }
210 if pool[off+k] == (0 as u8) { return 1 }
211 return 0
212}
213func si_find(recs: *i64, m: i64, pool: *u8, name: *u8) -> i64 {
214 var r: i64 = 0
215 while r < m { if si_name_eq(pool, recs[r*8+0], name) == 1 { return r } r = r + 1 }
216 return 0 - 1
217}
218func si_check(recs: *i64, m: i64, pool: *u8, name: *u8, arity: i64, ret: i64, t1: i64) -> i64 {
219 let r: i64 = si_find(recs, m, pool, name)
220 if r < 0 { _si_puts(" KAT MISS " as *u8); _si_puts(name); _si_puts("\n" as *u8); return 0 }
221 var ok: i64 = 1
222 if recs[r*8+1] != arity { ok = 0 }
223 if recs[r*8+2] != ret { ok = 0 }
224 if recs[r*8+3] != t1 { ok = 0 }
225 if ok == 0 { _si_puts(" KAT BAD " as *u8); _si_puts(name); _si_puts(" arity=" as *u8); _si_num(recs[r*8+1]); _si_puts(" ret=" as *u8); _si_num(recs[r*8+2]); _si_puts(" t1=" as *u8); _si_num(recs[r*8+3]); _si_puts("\n" as *u8) }
226 return ok
227}
228func main() -> i64 {
229 _si_puts("=== BUILDER-AUTHORED SIG-INDEX: S3 component catalog (typed func signatures) ===\n" as *u8)
230 let recs: *i64 = sys_mmap(16777216) as *i64
231 let pool: *u8 = sys_mmap(16777216)
232 let state: *i64 = sys_mmap(64) as *i64
233 let fstate: *i64 = sys_mmap(64) as *i64
234 if si_build(recs, 262144, pool, 16777216, state, fstate) < 0 { _si_puts(" open dir FAILED\n" as *u8); sys_exit(1); return 1 }
235 let m: i64 = state[0]
236 let h1: i64 = state[2]
237 _si_puts(" pass1: files=" as *u8); _si_num(fstate[0]); _si_puts(" funcs=" as *u8); _si_num(m); _si_puts(" poolB=" as *u8); _si_num(state[1]); _si_puts("\n" as *u8)
238 let ofd: i64 = sys_openat_wr("/tmp/nishi_sig_index.txt" as *u8, 0x1a4)
239 if ofd >= 0 {
240 var r: i64 = 0
241 while r < m {
242 let base: i64 = pool as i64
243 _si_fputs(ofd, (base + recs[r*8+0]) as *u8)
244 _si_fputs(ofd, "|" as *u8); _si_fnum(ofd, recs[r*8+1])
245 _si_fputs(ofd, "|" as *u8); _si_fnum(ofd, recs[r*8+2])
246 _si_fputs(ofd, "|" as *u8); _si_fnum(ofd, recs[r*8+3])
247 _si_fputs(ofd, "," as *u8); _si_fnum(ofd, recs[r*8+4])
248 _si_fputs(ofd, "," as *u8); _si_fnum(ofd, recs[r*8+5])
249 _si_fputs(ofd, "," as *u8); _si_fnum(ofd, recs[r*8+6])
250 _si_fputs(ofd, "\n" as *u8)
251 r = r + 1
252 }
253 sys_close(ofd)
254 _si_puts(" index written: /tmp/nishi_sig_index.txt\n" as *u8)
255 }
256 var pass: i64 = 1
257 if m < 5000 { pass = 0; _si_puts(" KAT BAD corpus too small\n" as *u8) }
258 if si_check(recs, m, pool, "nx_dns_build_query" as *u8, 6, 1, 2) == 0 { pass = 0 }
259 if si_check(recs, m, pool, "sys_getdents64" as *u8, 3, 1, 1) == 0 { pass = 0 }
260 if si_check(recs, m, pool, "nx_open_rd" as *u8, 1, 1, 2) == 0 { pass = 0 }
261 if si_check(recs, m, pool, "nx_bm25_doclen" as *u8, 2, 1, 2) == 0 { pass = 0 }
262 if si_check(recs, m, pool, "nx_dirent_name_len" as *u8, 1, 1, 99) == 0 { pass = 0 }
263 let recs2: *i64 = sys_mmap(16777216) as *i64
264 let pool2: *u8 = sys_mmap(16777216)
265 let state2: *i64 = sys_mmap(64) as *i64
266 let fstate2: *i64 = sys_mmap(64) as *i64
267 si_build(recs2, 262144, pool2, 16777216, state2, fstate2)
268 if state2[0] != m { pass = 0; _si_puts(" KAT BAD pass2 count differs\n" as *u8) }
269 if state2[2] != h1 { pass = 0; _si_puts(" KAT BAD pass2 hash differs\n" as *u8) }
270 _si_puts(" determinism pass2: funcs=" as *u8); _si_num(state2[0]); _si_puts(" hash-match=" as *u8)
271 if state2[2] == h1 { _si_puts("Y\n" as *u8) } else { _si_puts("N\n" as *u8) }
272 if pass == 1 { _si_puts(" SIG-INDEX GATE: PASS (catalog + spot-KATs + determinism)\n" as *u8); sys_exit(0); return 0 }
273 _si_puts(" SIG-INDEX GATE: FAIL\n" as *u8)
274 sys_exit(1)
275 return 1
276}