Explorar o código

feat(compiler): apply frame re-read verdicts batch A

ParseDesignatorBase rewritten to true 4-formal shape (finA, finB,
probeA, probeB; ok1..id2 dropped as unused); DefineProgramModule
body gains local fromSeen (param1 dead confirmed); ParseFactor
mirror rejected; D1/D2 reduced to names-only dispute.
Eric Streit hai 1 semana
pai
achega
bd69b8af91
Modificáronse 4 ficheiros con 19 adicións e 20 borrados
  1. 8 9
      src/compiler/EXPRESS.MOD
  2. 3 4
      src/compiler/FRONTEND.md
  3. 7 7
      src/compiler/PASS1.MOD
  4. 1 0
      src/compiler/SYMTAB.MOD

+ 8 - 9
src/compiler/EXPRESS.MOD

@@ -129,7 +129,7 @@ PROCEDURE LoadOperand; FORWARD;
 PROCEDURE StoreOperand; FORWARD;
 PROCEDURE CheckRelationTypes(t1: ADDRESS); FORWARD; (* audit: op unused in body *)
 PROCEDURE FoldRelation(): ADDRESS; FORWARD;
-PROCEDURE ParseFactor(p1, p2, p3, p4, p5: CARDINAL); FORWARD; (* audit: name-to-slot mirrored pK->param(6-K); def+calls positionally consistent *)
+PROCEDURE ParseFactor(p1, p2, p3, p4, p5: CARDINAL); FORWARD; (* re-read: pK = paramK confirmed (InsertEntry-arg=param5, p2#0=param2, p3=9 test=param3); mirror hypothesis REJECTED, def stands *)
 PROCEDURE EvalConstExpr; FORWARD;
 PROCEDURE ParseSetOrCastTail; FORWARD;
 PROCEDURE ParseAssignment; FORWARD;
@@ -138,7 +138,7 @@ PROCEDURE IsSet(t2, t1: Compiler.RecordPtr): BOOLEAN; FORWARD;
 PROCEDURE BaseTypeOf(t2, t1: Compiler.RecordPtr): BOOLEAN; FORWARD;
 PROCEDURE CheckAssignable; FORWARD;
 PROCEDURE ParseSelector(sel: Compiler.RecordPtr; needVal: BOOLEAN; base: Compiler.RecordPtr); FORWARD;
-PROCEDURE ParseDesignatorBase(VAR ok1, ok2: BOOLEAN; VAR id1, id2: CARDINAL; p1, p2: CARDINAL): BOOLEAN; FORWARD; (* FIXME 3/4-arg sites; audit: fct_leave 132 = 4 words, not 6 formals *)
+PROCEDURE ParseDesignatorBase(finA, finB, probeA, probeB: CARDINAL): BOOLEAN; FORWARD; (* re-read: 4 formals (fct_leave 132); param4/param3 = final operands (formals 1-2), param2/param1 = probe keys (formals 3-4); ok1..id2 dropped (unused); probeA/B assignment by call order TBD *)
 PROCEDURE GetTypeDesc(src: ADDRESS; dest: ADDRESS; mode: CARDINAL); FORWARD;
 PROCEDURE CheckAssignmentCompat(dst: ADDRESS); FORWARD;
 
@@ -351,16 +351,15 @@ BEGIN
 END MatchOpClass;
 
 (* proc21 @02d0 — ~ParseDesignatorBase *)
-PROCEDURE ParseDesignatorBase(VAR ok1, ok2: BOOLEAN;
-  VAR id1, id2: CARDINAL; p1, p2: CARDINAL): BOOLEAN;
+PROCEDURE ParseDesignatorBase(finA, finB, probeA, probeB: CARDINAL): BOOLEAN;
 VAR
   found1, found2: BOOLEAN; (* local-6, local-7 *)
   w8, w9: CARDINAL;        (* local-8, local-9 *)
   f1, f2: CARDINAL;        (* local-2, local-3 *)
 BEGIN
   {/* 02d0 */} (* double PASS1.CondInsert probe for qualified pair *)
-  Pass1.CondInsert(p2, ADR(w8), ADR(f1), ADR(found1));
-  Pass1.CondInsert(p1, ADR(w9), ADR(f2), ADR(found2));
+  Pass1.CondInsert(probeB, ADR(w8), ADR(f1), ADR(found1));
+  Pass1.CondInsert(probeA, ADR(w9), ADR(f2), ADR(found2));
   {/* 02e6 */} (* walk while both found *)
   WHILE found1 AND found2 DO
     IF w8 <> w9 THEN RETURN FALSE END;
@@ -369,11 +368,11 @@ BEGIN
       f1 := f1^.word5; f2 := f2^.word5;
     END;
     IF f1 <> f2 THEN RETURN FALSE END;
-    Pass1.InsertEntry(p2, ADR(w8), ADR(f1), ADR(found1));
-    Pass1.InsertEntry(p1, ADR(w9), ADR(f2), ADR(found2));
+    Pass1.InsertEntry(probeB, ADR(w8), ADR(f1), ADR(found1));
+    Pass1.InsertEntry(probeA, ADR(w9), ADR(f2), ADR(found2));
   END;
   {/* 0324 */} (* match iff same head and same tail selector *)
-  RETURN (found1 = found2) AND (p2 = p1);
+  RETURN (found1 = found2) AND (finA = finB);
 END ParseDesignatorBase;
 
 (* proc36 @032f — ~CheckAssignable *)

+ 3 - 4
src/compiler/FRONTEND.md

@@ -159,10 +159,9 @@ Declared FORWARD in EXPRESS.MOD = remaining body work. AAAAAA heads = Z80 stubs.
   word9 exitEmitted.
 
 ## Corrections 2026-10-03 (PASS1 body evidence)
-* D1/D2 dispute: proc15 (@0411, 0-param, type-symbol dispatch in every TYPE
-  position) reads as ParseType, proc19 (@02e6, 3-param ident-list loop) reads
-  as ParseFormalParams — possibly SWAPPED vs the tables above. PASS1.MOD keeps
-  map names (proc15=ParseFormalParams, proc19=ParseType); MCD diff decides.
+* D1/D2 (re-read verdict 2026-10-04): arity is frame-correct as mapped
+  (0-param @0411, 3-param @02e6 — only @02e6 can host the 3-push call sites);
+  dispute is NAMES-only (proc15=ParseType vs ParseFormalParams). Map kept.
 * D3/D4: proc17 builds ARRAY descriptors, proc18 parses [lo..hi] SUBRANGEs
   (kept as ParseConstDecl/ParseVarDecl pending const/var-decl cross-check).
 * proc9 = ParseProcBody (parses procedure bodies, NO file calls) — NOT the

+ 7 - 7
src/compiler/PASS1.MOD

@@ -10,10 +10,11 @@
 
    OPEN DISPUTES (MCD diff decides):
    - D1/D2: proc15 (@0411, 0-param, type-symbol dispatch in every TYPE
-     position) reads as ParseType, while proc19 (@02e6, 3-param, ident-list
-     loop) reads as ParseFormalParams — i.e. possibly SWAPPED vs the map
-     used here (proc15=ParseFormalParams, proc19=ParseType). Group 2's
-     detailed enum/pointer/record/array reading of @02e6-0410 is kept.
+     position) vs proc19 (@02e6, 3-param, ident-list loop). Re-read verdict:
+     arity is frame-correct as mapped (0-param proc15, 3-param proc19 — only
+     @02e6 can host the 3-push call sites), so the dispute is NAMES-only:
+     either (proc15=ParseType, proc19=ParseFormalParams) or the reverse.
+     Map names kept; MCD diff or call-graph analysis decides.
    - D3/D4: proc17 body builds ARRAY descriptors, proc18 parses [lo..hi]
      SUBRANGEs — kept as ParseConstDecl/ParseVarDecl (map names) pending
      group-3 cross-check of where real const/var decls live (cf. proc23?).
@@ -349,9 +350,8 @@ BEGIN
   RETURN desc; (*{02e2-02e3}*)
 END ParseVarDecl;
 (* PASS1 group 2 @02e6-0783.
-   DISPUTE D1/D2 (group 1): proc15 reads as ParseType, proc19 as
-   ParseFormalParams. Group 2's detailed readings kept with map names;
-   MCD diff decides. See header. *)
+   D1/D2 (re-read verdict): arity is frame-correct as mapped (0-param @0411,
+   3-param @02e6); dispute is NAMES-only. Map names kept. See header. *)
 
 (* proc19 @02e6 — ~ParseType (map name; see D2). 3 formals. *)
 PROCEDURE ParseType(owner: ADDRESS; VAR typ: ADDRESS; limit: CARDINAL): ADDRESS;

+ 1 - 0
src/compiler/SYMTAB.MOD

@@ -750,6 +750,7 @@ PROCEDURE DefineProgramModule(setAddr: ADDRESS; tag: CARDINAL); (*FIXME: audit U
    moduleTable^[16] (a Symbol slot) with T1 chain operations; treat as
    first-draft sketch, not ground truth. *)
 VAR dup: BOOLEAN; mark, node, tmp: T1; i: CARDINAL;
+    fromSeen: CARDINAL; (* local-3 per re-read (was misread as formal); param1 is dead *)
 BEGIN
   modStage^[16].word := 0; (*{/*089a*/} FIXME: group wrote moduleTable^[16] := 0 *)
   Scanner.GetSym;