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}