|
@@ -297,7 +297,7 @@ END PutAttr;
|
|
|
PROCEDURE GetAttr(VAR node: T1; idx: CARDINAL);
|
|
PROCEDURE GetAttr(VAR node: T1; idx: CARDINAL);
|
|
|
(* proc22 @0281 — load a scope entry back into a heap node (inverse of PutAttr).
|
|
(* proc22 @0281 — load a scope entry back into a heap node (inverse of PutAttr).
|
|
|
Entry word1 = static node pointer or memoized node (returned as-is). *)
|
|
Entry word1 = static node pointer or memoized node (returned as-is). *)
|
|
|
-VAR e: Words; new: T1; nw: Words; sub: T1;
|
|
|
|
|
|
|
+VAR e: Words; new: T1; nw: Words;
|
|
|
BEGIN
|
|
BEGIN
|
|
|
node := NIL; (*{/*0283*/}*)
|
|
node := NIL; (*{/*0283*/}*)
|
|
|
IF idx = 0 THEN RETURN END; (*{/*0286*/}*)
|
|
IF idx = 0 THEN RETURN END; (*{/*0286*/}*)
|
|
@@ -318,10 +318,10 @@ BEGIN
|
|
|
| 99, 100:
|
|
| 99, 100:
|
|
|
UnlinkScope(ADR(nw^[5]), e^[5]); (*{/*02c4*/}*)
|
|
UnlinkScope(ADR(nw^[5]), e^[5]); (*{/*02c4*/}*)
|
|
|
| 101:
|
|
| 101:
|
|
|
- sub := T1(nw^[5]); GetAttr(sub, e^[5]); nw^[5] := CARDINAL(sub); (* in-place reload; VAR needs a real variable (v1.00 OOMs on CARDINAL actual) *)
|
|
|
|
|
|
|
+ new := T1(nw^[5]); GetAttr(new, e^[5]); (* tail: result discarded, memoization is the effect (original jump_stack) *)
|
|
|
| 102:
|
|
| 102:
|
|
|
- sub := T1(nw^[5]); GetAttr(sub, e^[5]); nw^[5] := CARDINAL(sub);
|
|
|
|
|
- sub := T1(nw^[6]); GetAttr(sub, e^[6]); nw^[6] := CARDINAL(sub);
|
|
|
|
|
|
|
+ new := T1(nw^[5]); GetAttr(new, e^[5]);
|
|
|
|
|
+ new := T1(nw^[6]); GetAttr(new, e^[6]);
|
|
|
nw^[7] := e^[7];
|
|
nw^[7] := e^[7];
|
|
|
ELSE (* 92..98: nothing beyond words 1..4 *)
|
|
ELSE (* 92..98: nothing beyond words 1..4 *)
|
|
|
END;
|
|
END;
|
|
@@ -414,21 +414,21 @@ BEGIN
|
|
|
nw^[5] := CARDINAL(nm2);
|
|
nw^[5] := CARDINAL(nm2);
|
|
|
RETURN;
|
|
RETURN;
|
|
|
END;
|
|
END;
|
|
|
- IF sentry^[4] >= 5 THEN (*{/*037b*/}*)
|
|
|
|
|
- IF rp = NIL THEN (*{/*0381*/}*)
|
|
|
|
|
- Scanner.GetStack(mark); (*{/*0385*/}*)
|
|
|
|
|
- nw^[6] := 0; (*{/*0389*/}*)
|
|
|
|
|
- nm2 := ADDRESS(nw) + 12; (* address of nw^[6] without ADR(indexed) (expression-heap spike on v1.00) *)
|
|
|
|
|
- UnlinkScope(nm2, sentry^[6]); (*{/*038c*/}*)
|
|
|
|
|
- IF (sentry^[4] = 5) AND (stgFlag <> 0) THEN (*{/*0393*/} global25 *)
|
|
|
|
|
- Compiler.allocHook(ADDRESS(new), mark); (* hook ADDRESS set by PASS1 (store dword27); was allocateSignature (a type symbol) — wrong target {/*039d*/} *)
|
|
|
|
|
- END;
|
|
|
|
|
- ELSE
|
|
|
|
|
- vw := Words(rp);
|
|
|
|
|
- nw^[6] := vw^[6]; (*{/*03a5*/}*)
|
|
|
|
|
|
|
+ IF (sentry^[4] >= 5) AND (rp = NIL) THEN (*{/*037b*/}{/*0381*/} single-depth: nested IF OOMs on v1.00 *)
|
|
|
|
|
+ Scanner.GetStack(mark); (*{/*0385*/}*)
|
|
|
|
|
+ nw^[6] := 0; (*{/*0389*/}*)
|
|
|
|
|
+ nm2 := ADDRESS(nw) + 12; (* address of nw^[6] without ADR(indexed) (expression-heap spike on v1.00) *)
|
|
|
|
|
+ UnlinkScope(nm2, sentry^[6]); (*{/*038c*/}*)
|
|
|
|
|
+ IF (sentry^[4] = 5) AND (stgFlag <> 0) THEN (*{/*0393*/} global25 *)
|
|
|
|
|
+ Compiler.allocHook(ADDRESS(new), mark); (* hook ADDRESS set by PASS1 (store dword27); was allocateSignature (a type symbol) — wrong target {/*039d*/} *)
|
|
|
END;
|
|
END;
|
|
|
RETURN;
|
|
RETURN;
|
|
|
END;
|
|
END;
|
|
|
|
|
+ IF (sentry^[4] >= 5) AND (rp # NIL) THEN
|
|
|
|
|
+ vw := Words(rp);
|
|
|
|
|
+ nw^[6] := vw^[6]; (*{/*03a5*/}*)
|
|
|
|
|
+ RETURN;
|
|
|
|
|
+ END;
|
|
|
IF (sentry^[4] = 1) AND (CARDINAL(new^.link2) = CARDINAL(Compiler.LongrealType)) THEN
|
|
IF (sentry^[4] = 1) AND (CARDINAL(new^.link2) = CARDINAL(Compiler.LongrealType)) THEN
|
|
|
(* COMPILER.word11; 8-byte real value {/*03ab*/} *)
|
|
(* COMPILER.word11; 8-byte real value {/*03ab*/} *)
|
|
|
nm2 := ADR(nw^[5]); (* temp: VAR formal rejects ADR() results (proven "Variable expected"); original pushes computed address directly *)
|
|
nm2 := ADR(nw^[5]); (* temp: VAR formal rejects ADR() results (proven "Variable expected"); original pushes computed address directly *)
|