|
@@ -52,6 +52,12 @@ FROM SYSTEM IMPORT ADR, MOVE; (* ADDRESS/WORD/RecordPtr come via DEF imports (le
|
|
|
|
|
|
|
|
(* Desc/DescPtr/Head/Node come from EXPRESS.DEF; Words is module-local. *)
|
|
(* Desc/DescPtr/Head/Node come from EXPRESS.DEF; Words is module-local. *)
|
|
|
TYPE Words = POINTER TO ARRAY [0..9] OF WORD;
|
|
TYPE Words = POINTER TO ARRAY [0..9] OF WORD;
|
|
|
|
|
+ SymPtr = POINTER TO Sym; (* scope-symbol view over link0/1/2 slots *)
|
|
|
|
|
+ Sym = RECORD
|
|
|
|
|
+ next: SymPtr;
|
|
|
|
|
+ kind: CARDINAL;
|
|
|
|
|
+ typ: RecordPtr;
|
|
|
|
|
+ END;
|
|
|
|
|
|
|
|
VAR
|
|
VAR
|
|
|
curDesc: HeadPtr; (* word2: pointer to current descriptor head *)
|
|
curDesc: HeadPtr; (* word2: pointer to current descriptor head *)
|
|
@@ -67,7 +73,7 @@ VAR
|
|
|
(* Forward refs to group-defined procedures used before definition *)
|
|
(* Forward refs to group-defined procedures used before definition *)
|
|
|
PROCEDURE ParseDesignatorTail; FORWARD;
|
|
PROCEDURE ParseDesignatorTail; FORWARD;
|
|
|
PROCEDURE ParseTypeCast(kind: CARDINAL); FORWARD;
|
|
PROCEDURE ParseTypeCast(kind: CARDINAL); FORWARD;
|
|
|
-PROCEDURE ParseFuncCall(idx: CARDINAL): RecordPtr; FORWARD;
|
|
|
|
|
|
|
+PROCEDURE ParseFuncCall(idx: CARDINAL): ADDRESS; FORWARD;
|
|
|
PROCEDURE ExpandStdProc43(code: CARDINAL); FORWARD; (* FIXME: 0-arg call site *)
|
|
PROCEDURE ExpandStdProc43(code: CARDINAL); FORWARD; (* FIXME: 0-arg call site *)
|
|
|
PROCEDURE ExpandStdProc44(first: CARDINAL); FORWARD;
|
|
PROCEDURE ExpandStdProc44(first: CARDINAL); FORWARD;
|
|
|
PROCEDURE ExpandStdProc45(std: CARDINAL); FORWARD; (* FIXME: 0-arg call site *)
|
|
PROCEDURE ExpandStdProc45(std: CARDINAL); FORWARD; (* FIXME: 0-arg call site *)
|
|
@@ -663,40 +669,28 @@ BEGIN
|
|
|
END;
|
|
END;
|
|
|
END ParseSetCons;
|
|
END ParseSetCons;
|
|
|
|
|
|
|
|
-(*{06bb} PROCEDURE ParseFuncCall(idx) : CARDINAL — stdproc table walk *)
|
|
|
|
|
-PROCEDURE ParseFuncCall(idx: CARDINAL): RecordPtr;
|
|
|
|
|
-VAR e: CARDINAL;
|
|
|
|
|
|
|
+(*{06bb} PROCEDURE ParseFuncCall(idx): ADDRESS — scope-chain walk.
|
|
|
|
|
+ e: SymPtr view (next/kind/typ over link0/link1/link2 slots).
|
|
|
|
|
+ (FIXME-NEST: MCD nests proc41 in proc40 (ec + plain fct_leave).) *)
|
|
|
|
|
+PROCEDURE ParseFuncCall(idx: CARDINAL): ADDRESS;
|
|
|
|
|
+VAR e: SymPtr;
|
|
|
BEGIN
|
|
BEGIN
|
|
|
- e := SymTab.word8^[idx]; (*{06bd-06c2} FIXME: SymTab has no word8 export *)
|
|
|
|
|
- WHILE e # 0 DO (*{06c4}*)
|
|
|
|
|
- IF STACK[1] = 16 THEN RETURN STACK[2] END; (*{06c6-06cf} FIXME: raw stack *)
|
|
|
|
|
- e := STACK[0]; (*{06d1-06d6}*)
|
|
|
|
|
|
|
+ e := SymPtr(SymTab.scopeChain^[idx]); (*{0915}*)
|
|
|
|
|
+ WHILE CARDINAL(e) <> 0 DO (*{091a}*)
|
|
|
|
|
+ IF e^.kind = 16 THEN RETURN e^.typ END; (*{091e}*)
|
|
|
|
|
+ e := e^.next; (*{0929}*)
|
|
|
END;
|
|
END;
|
|
|
- RETURN 0; (*{06d6-06d8}*)
|
|
|
|
|
|
|
+ RETURN 0; (*{092e}*)
|
|
|
END ParseFuncCall;
|
|
END ParseFuncCall;
|
|
|
-
|
|
|
|
|
-(*{06da} PROCEDURE ParseTypeCast(kind) — 1 param *)
|
|
|
|
|
PROCEDURE ParseTypeCast(kind: CARDINAL);
|
|
PROCEDURE ParseTypeCast(kind: CARDINAL);
|
|
|
-VAR d: CARDINAL;
|
|
|
|
|
-BEGIN
|
|
|
|
|
- IF FRAME^.tag # 0 THEN (*{06dc-06de} FIXME: raw frame; parenthesized operand present *)
|
|
|
|
|
- d := FRAME^.tag-4; INC(d); (*{06e0-06e6}*)
|
|
|
|
|
- IF Scanner.AcceptSy(2) THEN (*{06e7-06ea}*)
|
|
|
|
|
- BoolCondHelper; (*{06ec} local proc12 *)
|
|
|
|
|
- IF kind >= 0 THEN ConstToCard(Compiler.CardType, 2); (*{06ee-06f5}*)
|
|
|
|
|
- ELSE ConstToInt(Compiler.IntType, 2); (*{06f8-06fb}*)
|
|
|
|
|
- END;
|
|
|
|
|
- ELSE CodeGen.QueueConst(kind); (*{06fe-0700}*)
|
|
|
|
|
- END;
|
|
|
|
|
- END;
|
|
|
|
|
-END ParseTypeCast;
|
|
|
|
|
|
|
+BEGIN HALT; END ParseTypeCast; (* TEMP-STUB: uplevel proc40 frame; audit later *)
|
|
|
|
|
|
|
|
(*{087f} PROCEDURE ExpandStdProc43(code) — scalar transfer const builder *)
|
|
(*{087f} PROCEDURE ExpandStdProc43(code) — scalar transfer const builder *)
|
|
|
PROCEDURE ExpandStdProc43(code: CARDINAL);
|
|
PROCEDURE ExpandStdProc43(code: CARDINAL);
|
|
|
-VAR buf, tmp: Desc; k, i: CARDINAL;
|
|
|
|
|
|
|
+VAR buf: ARRAY [0..3] OF WORD; tmp: ARRAY [0..1] OF WORD; k, i: CARDINAL;
|
|
|
BEGIN
|
|
BEGIN
|
|
|
- buf := curDesc; tmp := curDesc; (*{0881-0888} reserve *)
|
|
|
|
|
- k := TypeKindOf(); (*{0889-088a} local proc27 *)
|
|
|
|
|
|
|
+ k := TypeKindOf; (*{0adf} local proc27 *)
|
|
|
|
|
+ k := TypeKindOf; (*{0889-088a} local proc27 *)
|
|
|
IF k <= 1 THEN (*{088b-088d} short ordinal: bias into const *)
|
|
IF k <= 1 THEN (*{088b-088d} short ordinal: bias into const *)
|
|
|
CodeGen.QueueConst(code-k*32768); RETURN; (*{088f-0896}*)
|
|
CodeGen.QueueConst(code-k*32768); RETURN; (*{088f-0896}*)
|
|
|
END;
|
|
END;
|
|
@@ -813,7 +807,7 @@ BEGIN
|
|
|
CASE t3 OF (*{0a9c,0b79} switch 90..105 *)
|
|
CASE t3 OF (*{0a9c,0b79} switch 90..105 *)
|
|
|
90..95:
|
|
90..95:
|
|
|
ParseExpression; Proc6; (*FIXME-PROC6*) (*{0aa1} proc12/6 *)
|
|
ParseExpression; Proc6; (*FIXME-PROC6*) (*{0aa1} proc12/6 *)
|
|
|
- k := TypeKindOf(); (*{0aa1-0aa3} local proc27 *)
|
|
|
|
|
|
|
+ k := TypeKindOf; (*{0aa1-0aa3} local proc27 *)
|
|
|
IF ~ MatchOpClass(388, t2) THEN (*{0aa4-0aa8}*) END;
|
|
IF ~ MatchOpClass(388, t2) THEN (*{0aa4-0aa8}*) END;
|
|
|
IF t3 # 4 THEN CodeGen.EmitTypedOp(13+t3, k); (*{0aac-0ab2}*)
|
|
IF t3 # 4 THEN CodeGen.EmitTypedOp(13+t3, k); (*{0aac-0ab2}*)
|
|
|
ELSE
|
|
ELSE
|
|
@@ -1146,7 +1140,7 @@ BEGIN
|
|
|
EmitOp(); (* proc6 *) (*{0ed4}*)
|
|
EmitOp(); (* proc6 *) (*{0ed4}*)
|
|
|
MatchOpClass(rkind, op); (* proc9 *) (*{0ed5-0ed7}*)
|
|
MatchOpClass(rkind, op); (* proc9 *) (*{0ed5-0ed7}*)
|
|
|
FoldConstOp(buf); (* proc35 FIXME: kind result TBD *) (*{0ed8-0ed9}*)
|
|
FoldConstOp(buf); (* proc35 FIXME: kind result TBD *) (*{0ed8-0ed9}*)
|
|
|
- rkind := TypeKindOf(); (* proc27 FIXME: 0-arg vs use *) (*{0edb}*)
|
|
|
|
|
|
|
+ rkind := TypeKindOf; (* proc27 FIXME: 0-arg vs use *) (*{0edb}*)
|
|
|
IF op = 63 THEN op := 61 END; (*{0ede-0ee2}*)
|
|
IF op = 63 THEN op := 61 END; (*{0ede-0ee2}*)
|
|
|
IF (curDesc^.mode = 0) AND (buf.raw[1] = 0) THEN (*{0ee7-0eef} both const *)
|
|
IF (curDesc^.mode = 0) AND (buf.raw[1] = 0) THEN (*{0ee7-0eef} both const *)
|
|
|
CodeGen.DiscardPending; (*{0ef2}*)
|
|
CodeGen.DiscardPending; (*{0ef2}*)
|
|
@@ -1204,7 +1198,7 @@ BEGIN
|
|
|
EmitRangeCheck; (* nested proc49 *) (*{1038}*)
|
|
EmitRangeCheck; (* nested proc49 *) (*{1038}*)
|
|
|
EmitOp(); (* proc6 *) (*{103a}*)
|
|
EmitOp(); (* proc6 *) (*{103a}*)
|
|
|
MatchOpClass(388, 59); (* proc9 *) (*{103b-1040}*)
|
|
MatchOpClass(388, 59); (* proc9 *) (*{103b-1040}*)
|
|
|
- t := TypeKindOf(); (* proc27 FIXME: 0-arg; t role TBD *) (*{1041-1043}*)
|
|
|
|
|
|
|
+ t := TypeKindOf; (* proc27 FIXME: 0-arg; t role TBD *) (*{1041-1043}*)
|
|
|
IF t = NIL THEN t := Compiler.CardType; ConstToCard(t, 59); END; (*{1044-104c} FIXME *)
|
|
IF t = NIL THEN t := Compiler.CardType; ConstToCard(t, 59); END; (*{1044-104c} FIXME *)
|
|
|
IF curDesc^.mode = 0 THEN (* const negation *) (*{104d-1050}*)
|
|
IF curDesc^.mode = 0 THEN (* const negation *) (*{104d-1050}*)
|
|
|
CodeGen.DiscardPending; (*{1052}*)
|
|
CodeGen.DiscardPending; (*{1052}*)
|
|
@@ -1261,7 +1255,7 @@ BEGIN
|
|
|
EmitOp(); (* proc6 *) (*{1118}*)
|
|
EmitOp(); (* proc6 *) (*{1118}*)
|
|
|
MatchOpClass(404, op); (* proc9 *) (*{1119-111e}*)
|
|
MatchOpClass(404, op); (* proc9 *) (*{1119-111e}*)
|
|
|
FoldConstOp(buf); (* proc35 FIXME: kind result TBD *) (*{111f}*)
|
|
FoldConstOp(buf); (* proc35 FIXME: kind result TBD *) (*{111f}*)
|
|
|
- t := TypeKindOf(); (* proc27 FIXME *) (*{1121}*)
|
|
|
|
|
|
|
+ t := TypeKindOf; (* proc27 FIXME *) (*{1121}*)
|
|
|
IF (curDesc^.mode = 0) AND (buf.raw[1] = 0) THEN (*{1124-112c}*)
|
|
IF (curDesc^.mode = 0) AND (buf.raw[1] = 0) THEN (*{1124-112c}*)
|
|
|
CodeGen.DiscardPending; (*{112e}*)
|
|
CodeGen.DiscardPending; (*{112e}*)
|
|
|
CodeGen.DiscardPending; (*{1130}*)
|
|
CodeGen.DiscardPending; (*{1130}*)
|
|
@@ -1356,7 +1350,7 @@ BEGIN
|
|
|
EmitOp(); (* proc6 *) (*{12c8}*)
|
|
EmitOp(); (* proc6 *) (*{12c8}*)
|
|
|
MatchOpClass(cls, op); (* proc9 *) (*{12c9-12cb}*)
|
|
MatchOpClass(cls, op); (* proc9 *) (*{12c9-12cb}*)
|
|
|
FoldConstOp(buf); (* proc35 *) (*{12cc-12cd}*)
|
|
FoldConstOp(buf); (* proc35 *) (*{12cc-12cd}*)
|
|
|
- rkind := TypeKindOf(); (* proc27 FIXME *) (*{12cf-12d1}*)
|
|
|
|
|
|
|
+ rkind := TypeKindOf; (* proc27 FIXME *) (*{12cf-12d1}*)
|
|
|
IF (curDesc^.mode = 0) AND (buf.raw[1] = 0) THEN (*{12d2-12da}*)
|
|
IF (curDesc^.mode = 0) AND (buf.raw[1] = 0) THEN (*{12d2-12da}*)
|
|
|
CodeGen.DiscardPending; (*{12dc}*)
|
|
CodeGen.DiscardPending; (*{12dc}*)
|
|
|
CodeGen.DiscardPending; (*{12de}*)
|
|
CodeGen.DiscardPending; (*{12de}*)
|