DIRECTORY
Alloc: TYPE USING [Notifier],
Code:
TYPE
USING [
bodyComRetLabel, bodyOutRecord, bodyRetLabel, curctxlvl, fileLoc,
firstTemp, framesz, inlineFileLoc, mainBody, tempcontext, tempstart],
CodeDefs:
TYPE
USING [
Base, codeType, Lexeme, FrameStateRecord, StackIndex, StatementStateRecord, TempStateRecord],
ComData: TYPE USING [bodyIndex, globalFrameSize, mainCtx],
FOpCodes: TYPE USING [qFF],
Log: TYPE USING [Error, ErrorSei],
P5: TYPE USING [PushLex],
P5U: TYPE USING [LabelAlloc, Out0, WordsForString],
PrincOps: TYPE USING [MaxFrameSize],
Stack: TYPE USING [Dump, New, Prefix],
SymbolOps: TYPE USING [CtxLevel, MakeCtxSe, NewCtx, NextSe, SetCtxLevel, SetSeLink],
Symbols:
TYPE
USING [
Base, BitAddress, bodyType, ContextLevel, CTXNull, ctxType, HTNull, ISEIndex, ISENull, lZ,
seType, typeANY, WordLength];
BitAddress: TYPE = Symbols.BitAddress;
ISEIndex: TYPE = Symbols.ISEIndex;
ISENull: ISEIndex = Symbols.ISENull;
WordLength: CARDINAL = Symbols.WordLength;
seb: Symbols.Base; -- semantic entry base (local copy)
ctxb: Symbols.Base; -- context entry base (local copy)
cb: CodeDefs.Base; -- code base (local copy)
bb: Symbols.Base; -- body table base (local copy)
PushTempState:
PUBLIC
PROC
RETURNS [p: TempStateRecord] =
BEGIN
p.heaplist ← PushHeapList[];
p.pendtemplist ← pendTempList; pendTempList ← ISENull;
RETURN
END;
PopTempState:
PUBLIC
PROC [p: TempStateRecord] =
BEGIN
PurgePendTempList[];
PurgeHeapList[p.heaplist];
pendTempList ← p.pendtemplist;
END;
PushFrameState:
PUBLIC
PROC [p:
POINTER
TO FrameStateRecord, newfs:
CARDINAL] =
BEGIN
p^ ← [pendtemplist: pendTempList,
heaplist: heapList, tempctxlvl: SymbolOps.CtxLevel[CPtr.tempcontext],
firstTemp: CPtr.firstTemp, tempstart: CPtr.tempstart,
framesz: CPtr.framesz];
pendTempList ← heapList ← ISENull;
SymbolOps.SetCtxLevel[CPtr.tempcontext, CPtr.curctxlvl];
CPtr.firstTemp ← CPtr.tempstart ← CPtr.framesz ← newfs;
END;