Parcourir la source

feat(express): verify proc44 exact (WalkPtr view, REPEAT+WHILE)

Eric Streit il y a 2 semaines
Parent
commit
e733e48c82
2 fichiers modifiés avec 33 ajouts et 16 suppressions
  1. 4 0
      SESSION.md
  2. 29 16
      src/compiler/EXPRESS.MOD

+ 4 - 0
SESSION.md

@@ -319,3 +319,7 @@ Next: GENZ80 media hunt; stage-2 pty-driven MCD diff per module.
   Plain ^ derefs (no view pun). score.py: mask all 4-hex targets.
 - Verified now 33: + proc41 ParseFuncCall (22/22 nested). `<> 0` folds to
   unary not_zero (like `= 0`->eq0); CARDINAL() wrap free.
+- Verified now 34: + proc44 Proc44 (52/52). WalkPtr self-closed view resolves
+  the slot-reuse puzzle (w2/w5/w6: WalkPtr); free pointer transfers satisfy
+  ConstToCard/typ (universal solvent); pre-test IF + REPEAT..UNTIL NOT;
+  inner WHILE. Stale ExpandStdProc44 refs (2) await caller audits.

+ 29 - 16
src/compiler/EXPRESS.MOD

@@ -59,6 +59,13 @@ FROM SYSTEM IMPORT ADR, MOVE; (* ADDRESS/WORD/RecordPtr come via DEF imports (le
        typ: RecordPtr;
      END;
      (* N31Ptr/N31 live in EXPRESS.DEF. *)
+     WalkPtr = POINTER TO Walk; (* self-closed walk view: every link field
+       reassigns the cursor slot; w2 unwraps to RecordPtr via free transfer
+       for ConstToCard; w7 exists (unlike 7-word records) *)
+     Walk = RECORD
+       w0: RecordPtr; w1: RecordPtr; w2: WalkPtr; w3: CARDINAL;
+       w4: CARDINAL; w5: WalkPtr; w6: WalkPtr; w7: CARDINAL;
+     END;
 
 VAR
     curDesc: HeadPtr;     (* word2: pointer to current descriptor head *)
@@ -76,7 +83,7 @@ PROCEDURE ParseDesignatorTail; FORWARD;
 PROCEDURE ParseTypeCast(kind: CARDINAL); FORWARD;
 PROCEDURE ParseFuncCall(idx: CARDINAL): ADDRESS; FORWARD;
 PROCEDURE ExpandStdProc43(code: CARDINAL); FORWARD; (* FIXME: 0-arg call site *)
-PROCEDURE ExpandStdProc44(first: CARDINAL); FORWARD;
+PROCEDURE Proc44(p1: WalkPtr); FORWARD;
 PROCEDURE ExpandStdProc45(std: CARDINAL); FORWARD; (* FIXME: 0-arg call site *)
 PROCEDURE ExpandStdProc46; FORWARD;
 PROCEDURE MatchOpClass(allowed: BITSET; errCode: CARDINAL); FORWARD;
@@ -861,24 +868,30 @@ BEGIN
   END;
 END ExpandStdProc43;
 
-(*{08e4} PROCEDURE ExpandStdProc44(first) — const list collector *)
-PROCEDURE ExpandStdProc44(first: CARDINAL);
-VAR save: CARDINAL;
+(* proc44 @0b3c — descriptor-walk const collector (NESTED in proc39:
+   ec/ee calls only; move inside proc39 in nesting pass). *)
+PROCEDURE Proc44(p1: WalkPtr);
+VAR save: CARDINAL; (* local-2 *)
 BEGIN
-  save := curDesc^.extra; (*{08e6-08e8}*)
-  IF Scanner.AcceptSy(1) THEN (*{08e9-08ec}*)
-    PushOperand(curDesc); (*FIXME-ARG*) (*{08ee}*)
-    IF ~ MatchOpClass(1024, 1) THEN (*{08f1-08f5}*) END;
-    IF first # 0 THEN CentralError(TRUE (*FIXME: cond TBD*), 63) END; (*{08f6-08fd} GetConstVal guard *)
-    GetConstVal; ConstToCard(curDesc^.value, 1); (*{08fe-0902}*)
-    LOOP (*{0903-0912} ','-separated consts *)
-      IF first # 0 THEN CentralError(TRUE (*FIXME: cond TBD*), 63) END; (*{090a-0911}*)
+  save := p1^.w3;
+  IF Scanner.AcceptSy(1) THEN
+    curDesc^.typ := NodePtr(p1);
+    MatchOpClass(BITSET{10}, 1);
+    p1 := p1^.w2;
+    REPEAT
+      CentralError(CARDINAL(p1) <> 0, 63);
       GetConstVal;
-      IF ~ Scanner.AcceptSy(1) THEN EXIT END; (*{0917-091e}*)
-    END;
+      ConstToCard(RecordPtr(p1^.w2), 1);
+      WHILE p1^.w7 <> CARDINAL(curDesc^.value) DO
+        p1 := p1^.w6;
+        CentralError(CARDINAL(p1) <> 0, 63);
+      END;
+      save := p1^.w3;
+      p1 := p1^.w5;
+    UNTIL NOT Scanner.AcceptSy(1);
   END;
-  CodeGen.QueueConst(save); (*{0920-0922} restore base *)
-END ExpandStdProc44;
+  CodeGen.QueueConst(save);
+END Proc44;
 
 (*{0926} PROCEDURE ExpandStdProc45(std) — DEALLOCATE(addr) *)
 PROCEDURE ExpandStdProc45(std: CARDINAL);