-- file P3.mesa -- last modified by Satterthwaite, December 10, 1982 10:56 am DIRECTORY Alloc: TYPE USING [Notifier], Copier: TYPE USING [SEToken], Inline: TYPE USING [BITAND], Symbols: TYPE USING [ HTIndex, SEIndex, ISEIndex, CSEIndex, RecordSEIndex, RefSEIndex, CTXIndex, IncludedCTXIndex, MDIndex, BTIndex, Closure], Tree: TYPE USING [Index, Link, Map, Scan]; P3: DEFINITIONS IMPORTS Inline = { OPEN Symbols; mark: BOOL = TRUE; -- mark in tree as set by pass 3 -- text literals TextForm: TYPE = {text, rope, ropeText}; -- attributes Attr: TYPE = RECORD [ noAssign: BOOL, noXfer: BOOL, const: BOOL]; emptyAttr: Attr = [noAssign:FALSE, noXfer:FALSE, const:FALSE]; fullAttr: Attr = [noAssign:TRUE, noXfer:TRUE, const:TRUE]; voidAttr: Attr = [noAssign:TRUE, noXfer:TRUE, const:FALSE]; And: PROC [Attr, Attr] RETURNS [Attr] = LOOPHOLE[Inline.BITAND]; -- safety (Cedar) Safety: TYPE = {none, asserted, checked}; -- narrowing operations NarrowOp: TYPE = RECORD [ error, indirect, rtTest, tagTest, computed, unImpl: BOOL←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]]; -- notifiers DeclNotify, MiscNotify, StmtNotify, VRNotify: Alloc.Notifier; ExpANotify, ExpBNotify, ExpCNotify: Alloc.Notifier; -- exported by Pass3B Header: PROC [node: Tree.Index]; SetDefaultImport: PROC [iCtx: IncludedCTXIndex, implicitOK: BOOL←FALSE]; -- exported by Pass3D DeclList: Tree.Scan; FirstId: PROC [Tree.Index] RETURNS [ISEIndex]; InitialExp: PROC [Tree.Link, SEIndex] RETURNS [v: Tree.Link, extended: BOOL]; MakeLongType: PROC [SEIndex, CSEIndex] RETURNS [CSEIndex]; MakeRefType: PROC [cType: SEIndex, hint: CSEIndex, readOnly,counted,var: BOOL←FALSE] RETURNS [RefSEIndex]; ResolveType: PROC [ISEIndex]; ResolveValue: PROC [ISEIndex]; TypeAppl: Tree.Map; TypeExp: Tree.Map; -- exported by Pass3I IdInit: PROC [UNCOUNTED ZONE]; IdReset: Tree.Scan; ArrangeKeys: PROC [ expList: Tree.Link, nextKey: PROC RETURNS [HTIndex], omittedValue: PROC RETURNS [Tree.Link]] RETURNS [CARDINAL]; BaseTree: PROC [Tree.Link, CSEIndex] RETURNS [Tree.Link]; BindTree: PROC [Tree.Link, PROC [ISEIndex] RETURNS [Tree.Link]] RETURNS [Tree.Link]; BumpCount: PROC [ISEIndex]; CheckDisjoint: PROC [ctx1, ctx2: CTXIndex]; ClearRefStack: PROC; CloseBase: PROC [Tree.Link, HTIndex]; ClusterId: PROC [HTIndex, CTXIndex] RETURNS [found: BOOL, sei: ISEIndex]; CompleteRecord: PROC [rSei: RecordSEIndex, depth: Closure←$unit]; CopyTree: Tree.Map; EnterIdList: PROC [IncludedCTXIndex, Tree.Link]; EnterComposite: PROC [type: CSEIndex, t: Tree.Link, init: BOOL]; EnterType: PROC [type: SEIndex, canonical: BOOL←TRUE]; FieldId: PROC [HTIndex, RecordSEIndex] RETURNS [CARDINAL, ISEIndex]; FindSe: PROC [HTIndex] RETURNS [symbol: ISEIndex, base: Tree.Link, indirect: BOOL]; Id: PROC [HTIndex] RETURNS [Tree.Link]; InterfaceId: PROC [HTIndex, CTXIndex] RETURNS [found: BOOL, sei: ISEIndex]; MainIncludedCtx: PROC [MDIndex] RETURNS [IncludedCTXIndex]; MakeIdTable: PROC [CARDINAL]; OpenBase: PROC [Tree.Link, HTIndex] RETURNS [Tree.Link]; OpenPointer: PROC [Tree.Link, CSEIndex] RETURNS [Tree.Link, CSEIndex]; PopCtx: PROC; PushCtx: PROC [CTXIndex]; PushHtCtx: PROC [HTIndex, Tree.Link, BOOL]; PushRecordCtx: PROC [RecordSEIndex, Tree.Link, BOOL]; RecordLhs: PROC [ISEIndex]; RecordMention: PROC [ISEIndex]; SealRefStack: PROC; SearchCtxList: PROC [HTIndex, CTXIndex] RETURNS [found: BOOL, sei: ISEIndex]; Shared: PROC [CTXIndex] RETURNS [BOOL]; TopCtx: PROC RETURNS [CTXIndex]; UnsealRefStack: PROC; UpdateTreeAttr: PROC [Tree.Link] RETURNS [attr: Attr]; -- exported by Pass3M CatchPhrase: PROC [Tree.Link] RETURNS [unwindCaught: BOOL]; CopyLock: PROC RETURNS [Tree.Link]; FindLockParams: PROC RETURNS [formal, actual: ISEIndex]; LockVar: PROC [Tree.Link] RETURNS [Tree.Link]; MakeFrameRecord: PROC [Tree.Link] RETURNS [CSEIndex]; MiscStmt: PROC [Tree.Index] RETURNS [Tree.Link]; MiscXfer: PROC [Tree.Index, CSEIndex] RETURNS [Tree.Link]; TextRep: PROC [SEIndex] RETURNS [TextForm]; XferForFrame: PROC [CTXIndex] RETURNS [CSEIndex]; InsertCatchLabel: SIGNAL [catchSeen, exit: BOOL]; -- exported by Pass3S pathNP: VAR NPUse; BodyList: PROC [firstBti: BTIndex]; BumpArgRefs: PROC [record: RecordSEIndex, write: BOOL]; Case: PROC [Tree.Index, Tree.Map]; CheckLocals: PROC [Tree.Link] RETURNS [localsOnly: BOOL]; SafetyAttr: PROC [Tree.Index] RETURNS [Safety]; SetSafety: PROC [Safety]; Scope: PROC [Tree.Index, Tree.Map]; Stmt: Tree.Map; -- exported by Pass3V DiscriminatedType: PROC [CSEIndex, Tree.Link] RETURNS [CSEIndex]; Discrimination: PROC [Tree.Index, Tree.Map]; Narrowing: PROC [type, target: CSEIndex] RETURNS [NarrowOp]; SelectVariantType: PROC [SEIndex, HTIndex] RETURNS [ISEIndex]; SequenceField: PROC [RecordSEIndex] RETURNS [ISEIndex]; VariantUnionType: PROC [SEIndex] RETURNS [CSEIndex]; -- exported by Pass3Xa phraseNP: VAR NPUse; All: PROC [node: Tree.Index, target: CSEIndex, init: BOOL←FALSE]; Apply: PROC [Tree.Index, CSEIndex, BOOL] RETURNS [Tree.Index]; Assignment: PROC [Tree.Index]; CheckScope: PROC [Tree.Link, CSEIndex] RETURNS [Tree.Link]; Dot: PROC [Tree.Index, CSEIndex] RETURNS [Tree.Index]; Extract: PROC [Tree.Index]; FieldDefault: PROC [ISEIndex] RETURNS [Tree.Link]; Initialization: PROC [CSEIndex, Tree.Link] RETURNS [Tree.Link]; InterfaceCtx: PROC [CSEIndex, Tree.Link] RETURNS [CTXIndex]; MatchFields: PROC [ record: RecordSEIndex, expList: Tree.Link, init: BOOL←FALSE, scopeCheck: BOOL←TRUE] RETURNS [Tree.Link]; -- exported by Pass3Xb ExpInit: PROC [UNCOUNTED ZONE]; ExpReset: PROC; Exp: PROC [Tree.Link, CSEIndex] RETURNS [Tree.Link]; Interval: PROC [Tree.Link, CSEIndex, BOOL]; ForceType: PROC [Tree.Link, CSEIndex] RETURNS [Tree.Link]; RAttr: PROC RETURNS [Attr]; Rhs: PROC [Tree.Link, CSEIndex] RETURNS [Tree.Link]; RPop: PROC; RPush: PROC [CSEIndex, Attr]; RType: PROC RETURNS [CSEIndex]; VoidExp: Tree.Map; -- exported by Pass3Xc AddrOp: PROC [Tree.Index, CSEIndex]; Range: PROC [Tree.Link, CSEIndex] RETURNS [Tree.Link]; Span: PROC [CSEIndex] RETURNS [first, last: Copier.SEToken]; }.