Route the 16 routable bare-primsize GUARD sites (is-primitive / struct-vs-prim dispatch) through the #101 aliasprimsize SSoT helper. Byte-NEUTRAL by construction: an alias-narrow name is already neutralized downstream by the same arm, so routing emits no new asm (the empty-flip-set ken oracled). Shape-A exclude-prim-early (3): cgenutil sretretsize / structparamsize / structfloatclass — `primsize>0 return` then structlookup→nil returns the same value; route returns it early, same. Shape-B prim-guard-then-structlookup (13): cgenutil 4604/4650 + cgenexpr 4136/10244 + the 9-site CALL/assign cluster — primsize==0 →structlookup→nil→fall to normal; route skips the block→same normal. Install the peellint bare-primsize FINALE (B7 lint-fuse contract): tools/peellint now rejects any bare primsize() in the ww stage outside the annotated whitelist. Evasion-hardened per the B7 lesson — a character scan (comments + string/char literals stripped first) and a LEFT+RIGHT word-bounded match of the bare `primsize` TOKEN (not just `primsize(`), so the aliasprimsize() wrapper is never a hit and every compiling spelling reds: the call primsize(nm), the paren-wrap (primsize)(nm), the function-value bind `let p = primsize`, and any line-split. ww-only (the C stage dealiases via type_chase_named, no primsize symbol). Two independent exemption windows (peel-ok vs primsize-ok) so neither rule blinds the other. Runs as a make-test dep. Whitelist the 6 designed exemptions with primsize-ok WHY-annotations: machinery — aliasprimsize body (SSoT chase) | typenodeprimresolved + exprprimresolved (#11/#33 prim-resolver chasers) | cgcast leaf-loop + cgenexpr #11 deref-store (own ps==0 fallback; route would regress #11) | the primsize oracle/definition itself (nothing below to chase). structural — elemsizeof x2 + paramfieldsize (chase lives in the -c twin elemsizeofc; threading c is the dormant #110). Empty-flip-set proof: zero C bytes; cstage binaries bit-identical; bootstrap byte-id 990-997 + 950 all green (w6c == w6c_ww on the full selfhost, self-rebuild identical); combined.ww (w6c + wwdump) regen idempotent; sizelint 0; peellint 0 (raw-peel AND bare-primsize over the whole tree = the close-by-construction proof, zero unwhitelisted survivors). Tests: 944_peellint_gate +14 rows (bare / space-before-paren / name-at-EOL split / string-blind opener / paren-wrap / fn-value-bind RED; aliasprimsize wrapper + primsize-ok annotated GREEN; corrupt annotation RED; independent peel/primsize windows; C-file out-of-scope). Closes the #101 primsize-alias family by construction. #109.
This commit is contained in:
@@ -867,6 +867,9 @@ fn cgcast(c: *cgen, n: *node) void = {
|
||||
else { if (lk == nkind.N_TENUM) { leaf_tn = leaf_tn.lhs; }
|
||||
else { if (lk == nkind.N_TNAME) {
|
||||
let lnm: str = leaf_tn.str;
|
||||
// primsize-ok (#101/#109): this IS an alias chase loop
|
||||
// — primsize is the leaf-primitive break test the loop
|
||||
// wraps (aliaslookup advances the cursor on a miss).
|
||||
if (primsize(lnm) > 0) { break; };
|
||||
let lal: *node = aliaslookup(c, lnm);
|
||||
if (lal == nil) { leaf_tn = nil; }
|
||||
@@ -4133,7 +4136,7 @@ fn cgdot(c: *cgen, n: *node) void = {
|
||||
if (streq(ofi.fname, innerfld)) {
|
||||
let oft: *node = ofi.tnode;
|
||||
if (oft != nil) { if (oft.kind == nkind.N_TNAME) {
|
||||
if (primsize(oft.str) == 0) {
|
||||
if (aliasprimsize(c, oft.str) == 0) {
|
||||
let isi: *structinfo = structlookup(c, oft.str);
|
||||
if (isi != nil) {
|
||||
let ffi: *fieldinfo = isi.fields;
|
||||
@@ -7654,6 +7657,9 @@ fn cgassign(c: *cgen, n: *node) void = {
|
||||
else { if (streq(pe.str, "f64")) { elemfloat = true; }
|
||||
else { if (streq(pe.str, "f32")) { elemfloat = true; elemf32 = true; }
|
||||
else {
|
||||
// primsize-ok (#101/#109): this site OWNS its own ps==0
|
||||
// typenodeprimresolved chase below — routing through
|
||||
// aliasprimsize would double-resolve and regress #11.
|
||||
let ps: i32 = primsize(pe.str);
|
||||
// #11: primsize is name-keyed and
|
||||
// misses a `!`/enum/name alias
|
||||
@@ -8871,7 +8877,7 @@ fn cgassign(c: *cgen, n: *node) void = {
|
||||
&& n.rhs.kind == nkind.N_CALL
|
||||
&& fi.tnode != nil
|
||||
&& fi.tnode.kind == nkind.N_TNAME
|
||||
&& primsize(fi.tnode.str) == 0) {
|
||||
&& aliasprimsize(c, fi.tnode.str) == 0) {
|
||||
let ssi: *structinfo = structlookup(c, fi.tnode.str);
|
||||
if (ssi != nil) {
|
||||
let ssz: i32 = structabisize(ssi);
|
||||
@@ -8926,7 +8932,7 @@ fn cgassign(c: *cgen, n: *node) void = {
|
||||
&& n.rhs.kind == nkind.N_STRUCTLIT
|
||||
&& fi.tnode != nil
|
||||
&& fi.tnode.kind == nkind.N_TNAME
|
||||
&& primsize(fi.tnode.str) == 0) {
|
||||
&& aliasprimsize(c, fi.tnode.str) == 0) {
|
||||
let ssi: *structinfo = structlookup(c, fi.tnode.str);
|
||||
if (ssi != nil) {
|
||||
cgstructlitfill(c, ssi, n.rhs, 1, lc.off, "",
|
||||
@@ -8939,7 +8945,7 @@ fn cgassign(c: *cgen, n: *node) void = {
|
||||
&& n.rhs.kind == nkind.N_IDENT
|
||||
&& fi.tnode != nil
|
||||
&& fi.tnode.kind == nkind.N_TNAME
|
||||
&& primsize(fi.tnode.str) == 0) {
|
||||
&& aliasprimsize(c, fi.tnode.str) == 0) {
|
||||
let ssi: *structinfo = structlookup(c, fi.tnode.str);
|
||||
let srhs: *local = localfindnode(c, n.rhs.str);
|
||||
if (ssi != nil) { if (srhs != nil) {
|
||||
@@ -9105,7 +9111,7 @@ fn cgassign(c: *cgen, n: *node) void = {
|
||||
&& n.rhs.kind == nkind.N_CALL
|
||||
&& fi.tnode != nil
|
||||
&& fi.tnode.kind == nkind.N_TNAME
|
||||
&& primsize(fi.tnode.str) == 0) {
|
||||
&& aliasprimsize(c, fi.tnode.str) == 0) {
|
||||
let ssi: *structinfo = structlookup(c, fi.tnode.str);
|
||||
if (ssi != nil) {
|
||||
let ssz: i32 = structabisize(ssi);
|
||||
@@ -9156,7 +9162,7 @@ fn cgassign(c: *cgen, n: *node) void = {
|
||||
&& n.rhs.kind == nkind.N_STRUCTLIT
|
||||
&& fi.tnode != nil
|
||||
&& fi.tnode.kind == nkind.N_TNAME
|
||||
&& primsize(fi.tnode.str) == 0) {
|
||||
&& aliasprimsize(c, fi.tnode.str) == 0) {
|
||||
let ssi: *structinfo = structlookup(c, fi.tnode.str);
|
||||
if (ssi != nil) {
|
||||
cgstructlitfill(c, ssi, n.rhs, 0, 0, "",
|
||||
@@ -9169,7 +9175,7 @@ fn cgassign(c: *cgen, n: *node) void = {
|
||||
&& n.rhs.kind == nkind.N_IDENT
|
||||
&& fi.tnode != nil
|
||||
&& fi.tnode.kind == nkind.N_TNAME
|
||||
&& primsize(fi.tnode.str) == 0) {
|
||||
&& aliasprimsize(c, fi.tnode.str) == 0) {
|
||||
let ssi: *structinfo = structlookup(c, fi.tnode.str);
|
||||
let srhs: *local = localfindnode(c, n.rhs.str);
|
||||
if (ssi != nil) { if (srhs != nil) {
|
||||
@@ -9394,7 +9400,7 @@ fn cgassign(c: *cgen, n: *node) void = {
|
||||
&& n.rhs.kind == nkind.N_CALL
|
||||
&& fi.tnode != nil
|
||||
&& fi.tnode.kind == nkind.N_TNAME
|
||||
&& primsize(fi.tnode.str) == 0) {
|
||||
&& aliasprimsize(c, fi.tnode.str) == 0) {
|
||||
let ssi: *structinfo = structlookup(c, fi.tnode.str);
|
||||
if (ssi != nil) {
|
||||
let ssz: i32 = structabisize(ssi);
|
||||
@@ -9449,7 +9455,7 @@ fn cgassign(c: *cgen, n: *node) void = {
|
||||
&& n.rhs.kind == nkind.N_STRUCTLIT
|
||||
&& fi.tnode != nil
|
||||
&& fi.tnode.kind == nkind.N_TNAME
|
||||
&& primsize(fi.tnode.str) == 0) {
|
||||
&& aliasprimsize(c, fi.tnode.str) == 0) {
|
||||
let ssi: *structinfo = structlookup(c, fi.tnode.str);
|
||||
if (ssi != nil) {
|
||||
cgstructlitfill(c, ssi, n.rhs, 2, 0, bn,
|
||||
@@ -9462,7 +9468,7 @@ fn cgassign(c: *cgen, n: *node) void = {
|
||||
&& n.rhs.kind == nkind.N_IDENT
|
||||
&& fi.tnode != nil
|
||||
&& fi.tnode.kind == nkind.N_TNAME
|
||||
&& primsize(fi.tnode.str) == 0) {
|
||||
&& aliasprimsize(c, fi.tnode.str) == 0) {
|
||||
let ssi: *structinfo = structlookup(c, fi.tnode.str);
|
||||
let srhs: *local = localfindnode(c, n.rhs.str);
|
||||
if (ssi != nil) { if (srhs != nil) {
|
||||
@@ -10241,7 +10247,7 @@ fn cgassign(c: *cgen, n: *node) void = {
|
||||
if (streq(ofi.fname, innerfld)) {
|
||||
let oft: *node = ofi.tnode;
|
||||
if (oft != nil) { if (oft.kind == nkind.N_TNAME) {
|
||||
if (primsize(oft.str) == 0) {
|
||||
if (aliasprimsize(c, oft.str) == 0) {
|
||||
let isi: *structinfo = structlookup(c, oft.str);
|
||||
if (isi != nil) {
|
||||
let ffi: *fieldinfo = isi.fields;
|
||||
|
||||
Reference in New Issue
Block a user