|
@@ -152,11 +152,12 @@ TYPE
|
|
first: ADDRESS;
|
|
first: ADDRESS;
|
|
END;
|
|
END;
|
|
|
|
|
|
- StackBlock = POINTER{UNSAFE} TO StackBlockDesc;
|
|
|
|
|
|
+ (*StackBlock = POINTER{UNSAFE} TO StackBlockDesc;
|
|
StackBlockDesc= RECORD
|
|
StackBlockDesc= RECORD
|
|
link: StackBlock;
|
|
link: StackBlock;
|
|
pc: ADDRESS;
|
|
pc: ADDRESS;
|
|
END;
|
|
END;
|
|
|
|
+ *)
|
|
|
|
|
|
(* a single pointer -- required as base type TD for array of pointer
|
|
(* a single pointer -- required as base type TD for array of pointer
|
|
Don't rename this. Compiler refers to this TD by name
|
|
Don't rename this. Compiler refers to this TD by name
|
|
@@ -1092,12 +1093,26 @@ BEGIN
|
|
END;
|
|
END;
|
|
END NewBlock;
|
|
END NewBlock;
|
|
|
|
|
|
|
|
+PROCEDURE CheckBP(bp: ADDRESS): ADDRESS;
|
|
|
|
+VAR n: ADDRESS;
|
|
|
|
+BEGIN
|
|
|
|
+ SYSTEM.GET(bp,n);
|
|
|
|
+ IF ODD(n) THEN bp := bp + SIZEOF(ADDRESS) END;
|
|
|
|
+ RETURN bp;
|
|
|
|
+END CheckBP;
|
|
|
|
+
|
|
PROCEDURE SetPC(p: DataBlockU);
|
|
PROCEDURE SetPC(p: DataBlockU);
|
|
-VAR stackDesc: StackBlock;
|
|
|
|
|
|
+VAR bp: ADDRESS;
|
|
BEGIN
|
|
BEGIN
|
|
IF p # NIL THEN
|
|
IF p # NIL THEN
|
|
|
|
+ bp := CheckBP(Machine.CurrentBP());
|
|
|
|
+ SYSTEM.GET(bp, bp);
|
|
|
|
+ bp := CheckBP(bp);
|
|
|
|
+ SYSTEM.GET(bp+SIZEOF(ADDRESS), p.heapBlock.heapBlock);
|
|
|
|
+ (*
|
|
stackDesc := Machine.CurrentBP();
|
|
stackDesc := Machine.CurrentBP();
|
|
p.heapBlock.heapBlock := stackDesc.link.pc;
|
|
p.heapBlock.heapBlock := stackDesc.link.pc;
|
|
|
|
+ *)
|
|
END;
|
|
END;
|
|
END SetPC;
|
|
END SetPC;
|
|
|
|
|