-- file Pass4.Mesa -- last modified by Satterthwaite, 3-Nov-81 14:02:20 DIRECTORY Alloc: TYPE USING [Notifier, AddNotify, DropNotify], ComData: TYPE USING [matched, monitored, table, tC0, tC1, textIndex, zone], CompilerUtil: TYPE USING [], P4: TYPE USING [ Repr, none, BCDNotify, DeclNotify, LayoutNotify, ExpANotify, ExpBNotify, ExpCNotify, OpsNotify, StmtNotify, AssignEntries, AssignImports, Body, DeclItem, ExpInit, ExpReset, FinishBCD, InitBCD, MatchBCD, ProcessDirectory, ProcessExports, ProcessImports, VarInit], Symbols: TYPE USING [ Base, CSEIndex, RecordSEIndex, RecordSENull, RootBti, typeANY], Tree: TYPE USING [Base, Index, Link, NullIndex, treeType], TreeOps: TYPE USING [FreeNode, GetNode]; Pass4: PROGRAM IMPORTS Alloc, TreeOps, P4, dataPtr: ComData EXPORTS CompilerUtil = PUBLIC { OPEN TreeOps, Symbols; tb: Tree.Base; -- tree base address (local copy) seb: Symbols.Base; -- se table base (local copy) ctxb: Symbols.Base; -- context table base (local copy) tTRUE: Tree.Link; tFALSE: Tree.Link; P4Notify: Alloc.Notifier = { -- called by allocator whenever table area is repacked tb ← base[Tree.treeType]; P4.BCDNotify[base]; P4.DeclNotify[base]; P4.LayoutNotify[base]; P4.StmtNotify[base]; P4.OpsNotify[base]; P4.ExpANotify[base]; P4.ExpBNotify[base]; P4.ExpCNotify[base]}; -- intermediate result bookkeeping returnRecord, resumeRecord: RecordSEIndex; implicitType: CSEIndex; -- assumed type of empty implicitBias: INTEGER; -- assumed bias of empty implicitRep: P4.Repr; -- assumed representation of empty lockNode: Tree.Index; resident: BOOLEAN; -- overall control P4Unit: PROC [unit: Tree.Link] = { node: Tree.Index; (dataPtr.table).AddNotify[P4Notify]; tTRUE ← dataPtr.tC1; tFALSE ← dataPtr.tC0; node ← GetNode[unit]; P4.ExpInit[dataPtr.zone]; Module[node ! P4.VarInit => {RESUME [TRUE]}]; P4.ExpReset[]; FreeNode[node]; (dataPtr.table).DropNotify[P4Notify]}; Module: PRIVATE PROC [node: Tree.Index] = { subNode: Tree.Index = GetNode[tb[node].son[6]]; saveIndex: CARDINAL = dataPtr.textIndex; implicitType ← typeANY; implicitBias ← 0; implicitRep ← P4.none; resumeRecord ← RecordSENull; dataPtr.textIndex ← tb[subNode].info; P4.InitBCD[tb[subNode].son[1], dataPtr.zone]; dataPtr.textIndex ← tb[node].info; lockNode ← IF ~dataPtr.monitored THEN Tree.NullIndex ELSE GetNode[tb[node].son[5]]; resident ← tb[node].attr1; P4.AssignEntries[Symbols.RootBti]; P4.AssignImports[tb[node].son[2]]; P4.DeclItem[tb[node].son[6]]; P4.Body[Symbols.RootBti]; P4.ProcessDirectory[tb[node].son[1]]; P4.ProcessImports[tb[node].son[2]]; tb[node].son[3] ← P4.ProcessExports[tb[node].son[3]]; P4.FinishBCD[tb[subNode].son[1]]; IF dataPtr.matched THEN dataPtr.matched ← P4.MatchBCD[]; dataPtr.textIndex ← saveIndex}; }.