|
|
@@ -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);
|