-- file P3.Mesa
-- last modified by Satterthwaite, December 17, 1979 1:44 PM
DIRECTORY
Symbols: FROM "symbols"
USING [
HTIndex, SEIndex, ISEIndex, CSEIndex, RecordSEIndex,
CTXIndex, IncludedCTXIndex, BTIndex, ContextLevel],
Table: FROM "table" USING [Notifier],
Tree: FROM "tree" USING [Index, Link, Map, Scan];
P3: DEFINITIONS =
BEGIN
OPEN Symbols;
Mark: BOOLEAN = TRUE; -- mark in tree as set by pass 3
CircuitCheck: TYPE = SIGNAL [loopNode: Tree.Index] RETURNS [BOOLEAN];
CircuitSignal: TYPE = SIGNAL [loopNode: Tree.Index];
-- attributes
Attr: TYPE = RECORD [
noAssign: BOOLEAN,
noXfer: BOOLEAN,
const: BOOLEAN];
EmptyAttr: Attr = [noAssign:FALSE, noXfer:FALSE, const:FALSE];
FullAttr: Attr = [noAssign:TRUE, noXfer:TRUE, const:TRUE];
VoidAttr: Attr = [noAssign:TRUE, noXfer:TRUE, const:FALSE];
-- parameter use bookkeeping (for subst by name)
NPUse: TYPE = {none, ref, set, refset, unsafe}; -- (name) param use
NPMap: TYPE = ARRAY NPUse OF ARRAY NPUse OF NPUse;
SetNP: ARRAY NPUse OF NPUse = [set, refset, set, refset, unsafe];
MergeNP: NPMap =
[[ none, ref, set, refset, unsafe],
[ ref, ref, unsafe, unsafe, unsafe],
[ set, unsafe, set, unsafe, unsafe],
[refset, unsafe, unsafe, unsafe, unsafe],
[unsafe, unsafe, unsafe, unsafe, unsafe]];
SequenceNP: NPMap =
[[ none, ref, set, refset, unsafe],
[ ref, ref, refset, refset, unsafe],
[ set, unsafe, set, unsafe, unsafe],
[refset, unsafe, refset, unsafe, unsafe],
[unsafe, unsafe, unsafe, unsafe, unsafe]];
BoundNP: NPMap =
[[ none, ref, set, refset, unsafe],
[ ref, ref, unsafe, refset, unsafe],
[ set, unsafe, set, refset, unsafe],
[refset, refset, refset, refset, unsafe],
[unsafe, unsafe, unsafe, unsafe, unsafe]];
-- state info
BodyData: TYPE = RECORD[ -- shared communication record
level: Symbols.ContextLevel, -- current level
bodyNode: Tree.Index, -- current body
inputRecord: RecordSEIndex, -- input record for current body
returnRecord: RecordSEIndex, -- return record for current body
entry: BOOLEAN, -- set for entry procedures
reachable: BOOLEAN,
labelList: Tree.Link, -- list of accessible labels
loopDepth: CARDINAL, -- depth of loop nesting
catchDepth: CARDINAL, -- depth of catch phrase nesting
unwindEnabled: BOOLEAN, -- set iff in scope of unwind
resumeFlag: BOOLEAN, -- set iff a resume is legal
resumeRecord: RecordSEIndex]; -- for current catch phrase
-- notifiers
DeclNotify, IdNotify, MiscNotify, StmtNotify: Table.Notifier;
ExpANotify, ExpBNotify: Table.Notifier;
-- exported by Pass3B
Directory: Tree.Scan;
ModulePrefix: Tree.Scan;
-- exported by Pass3D
Bundling: PROCEDURE [CSEIndex] RETURNS [CARDINAL];
CanonicalType: PROCEDURE [CSEIndex] RETURNS [CSEIndex];
DeclList: Tree.Scan;
DefaultInit: PROCEDURE [SEIndex] RETURNS [Tree.Link];
IdentifiedType: PROCEDURE [CSEIndex] RETURNS [BOOLEAN];
MakeLongType: PROCEDURE [SEIndex, CSEIndex] RETURNS [CSEIndex];
MakePointerType: PROCEDURE [cType: SEIndex, hint: CSEIndex, readOnly: BOOLEAN←FALSE]
RETURNS [CSEIndex];
OrderedType: PROCEDURE [SEIndex] RETURNS [BOOLEAN];
ResolveType: PROCEDURE [ISEIndex];
ResolveValue: PROCEDURE [ISEIndex];
TargetType: PROCEDURE [CSEIndex] RETURNS [CSEIndex];
TypeExp: Tree.Map;
TypeForTree: PROCEDURE [Tree.Link] RETURNS [SEIndex];
Unbundle: PROCEDURE [RecordSEIndex] RETURNS [CSEIndex];
VoidItem: PROCEDURE [Tree.Link] RETURNS [BOOLEAN];
Voidable: PROCEDURE [SEIndex] RETURNS [BOOLEAN];
CheckTypeLoop: CircuitCheck;
-- exported by Pass3I
IdInit: PROCEDURE;
IdFinish: Tree.Scan;
ArrangeKeys: PROCEDURE [
expList: Tree.Link,
ctx: CTXIndex,
startSei, endSei: ISEIndex,
omittedKey: PROCEDURE [ISEIndex] RETURNS [Tree.Link]]
RETURNS [CARDINAL];
BaseTree: PROCEDURE [Tree.Link, CSEIndex] RETURNS [Tree.Link];
BumpCount: PROCEDURE [ISEIndex];
CheckDisjoint: PROCEDURE [ctx1, ctx2: CTXIndex];
ClearRefStack: PROCEDURE;
CloseBase: PROCEDURE [Tree.Link, HTIndex];
CompleteRecord: PROCEDURE [RecordSEIndex];
DefinedId: PROCEDURE [HTIndex, CSEIndex] RETURNS [BOOLEAN, ISEIndex];
EnterIdList: PROCEDURE [IncludedCTXIndex, Tree.Link];
FieldId: PROCEDURE [HTIndex, RecordSEIndex] RETURNS [CARDINAL, ISEIndex];
FindSe: PROCEDURE [HTIndex] RETURNS [symbol: ISEIndex, base: Tree.Link, indirect: BOOLEAN];
Id: PROCEDURE [HTIndex] RETURNS [Tree.Link];
MakeIdTable: PROCEDURE [CARDINAL];
OpenBase: PROCEDURE [Tree.Link, HTIndex] RETURNS [Tree.Link];
OpenPointer: PROCEDURE [Tree.Link, CSEIndex] RETURNS [Tree.Link, CSEIndex];
PopCtx: PROCEDURE;
PushCtx: PROCEDURE [CTXIndex];
PushHtCtx: PROCEDURE [HTIndex, Tree.Link, BOOLEAN];
PushRecordCtx: PROCEDURE [RecordSEIndex, Tree.Link, BOOLEAN];
RecordLhs: PROCEDURE [ISEIndex];
RecordMention: PROCEDURE [ISEIndex];
SealRefStack: PROCEDURE;
SearchCtxList: PROCEDURE [HTIndex, CTXIndex] RETURNS [BOOLEAN, ISEIndex];
TopCtx: PROCEDURE RETURNS [CTXIndex];
UnsealRefStack: PROCEDURE;
UpdateTreeAttr: PROCEDURE [Tree.Link] RETURNS [attr: Attr];
-- exported by Pass3M
CatchPhrase: PROCEDURE [Tree.Link] RETURNS [unwindCaught: BOOLEAN];
CopyLock: PROCEDURE RETURNS [Tree.Link];
FindLockParams: PROCEDURE RETURNS [formal, actual: ISEIndex];
LockVar: PROCEDURE [Tree.Link] RETURNS [Tree.Link];
MakeFrameRecord: PROCEDURE [Tree.Link] RETURNS [CSEIndex];
MiscStmt: PROCEDURE [Tree.Index] RETURNS [Tree.Link];
MiscXfer: PROCEDURE [Tree.Index, CSEIndex] RETURNS [Tree.Link];
XferForFrame: PROCEDURE [CTXIndex] RETURNS [CSEIndex];
InsertCatchLabel: SIGNAL [catchSeen, exit: BOOLEAN];
-- exported by Pass3S
currentArgCtx: CTXIndex;
pathNP: NPUse;
BodyList: PROCEDURE [firstBti: BTIndex];
BumpArgRefs: PROCEDURE [record: RecordSEIndex, write: BOOLEAN];
Case: PROCEDURE [Tree.Index, Tree.Map];
CheckLocals: PROCEDURE [Tree.Link] RETURNS [localsOnly: BOOLEAN];
Stmt: Tree.Map;
-- exported by Pass3V
DiscriminatedType: PROCEDURE [CSEIndex, Tree.Link] RETURNS [CSEIndex];
Discrimination: PROCEDURE [Tree.Index, Tree.Map];
SelectVariantType: PROCEDURE [SEIndex, HTIndex] RETURNS [ISEIndex];
VariantUnionType: PROCEDURE [SEIndex] RETURNS [CSEIndex];
-- exported by Pass3Xa
phraseNP: NPUse;
All: PROCEDURE [Tree.Index, CSEIndex];
Apply: PROCEDURE [Tree.Index, CSEIndex, BOOLEAN];
Assignment: PROCEDURE [Tree.Index];
Dot: PROCEDURE [Tree.Index];
Extract: PROCEDURE [Tree.Index];
LongPath: PROCEDURE [Tree.Link] RETURNS [BOOLEAN];
MatchFields: PROCEDURE [RecordSEIndex, Tree.Link, BOOLEAN] RETURNS [Tree.Link];
OperandInline: PROCEDURE [Tree.Link] RETURNS [BOOLEAN];
OperandInternal: PROCEDURE [Tree.Link] RETURNS [BOOLEAN];
OperandLhs: PROCEDURE [Tree.Link] RETURNS [BOOLEAN];
UpArrow: PROCEDURE [Tree.Index];
-- exported by Pass3Xb
ExpInit: PROCEDURE;
Exp: PROCEDURE [Tree.Link, CSEIndex] RETURNS [Tree.Link];
Interval: PROCEDURE [Tree.Link, CSEIndex, BOOLEAN];
ForceType: PROCEDURE [Tree.Link, CSEIndex] RETURNS [Tree.Link];
OperandType: PROCEDURE [Tree.Link] RETURNS [CSEIndex];
Range: PROCEDURE [Tree.Link, CSEIndex] RETURNS [Tree.Link];
RAttr: PROCEDURE RETURNS [Attr];
Rhs: PROCEDURE [Tree.Link, CSEIndex] RETURNS [Tree.Link];
RPop: PROCEDURE;
RPush: PROCEDURE [CSEIndex, Attr];
RType: PROCEDURE RETURNS [CSEIndex];
VoidExp: Tree.Map;
-- exported by Pass3Xc
Addr: PROCEDURE [Tree.Index, CSEIndex];
DescOp: PROCEDURE [Tree.Index, CSEIndex];
Span: PROCEDURE [CSEIndex] RETURNS [first, last: ISEIndex];
-- exported by Pass3P
Postlude: PROCEDURE;
-- the global frames
Pass3B, Pass3D, Pass3I, Pass3M, Pass3S, Pass3V, Pass3P: PROGRAM;
Pass3Xa, Pass3Xb, Pass3Xc: PROGRAM;
END.