file Pass4.Mesa
last modified by Satterthwaite, October 4, 1982 10:24 am
DIRECTORY
Alloc: TYPE USING [Notifier, AddNotify, DropNotify],
ComData: TYPE USING [matched, monitored, table, tC0, tC1, textIndex, zone],
CompilerUtil: TYPE USING [],
P4: TYPE USING [
Attr, voidAttr,
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 = {
OPEN TreeOps, Symbols;
tb: Tree.Base; -- tree base address (local copy)
tTRUE: PUBLIC Tree.Link;
tFALSE: PUBLIC Tree.Link;
P4Notify: PUBLIC 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: PUBLIC RecordSEIndex;
implicitType: PUBLIC CSEIndex; -- assumed type of empty
implicitBias: PUBLIC INTEGER;  -- assumed bias of empty
implicitAttr: PUBLIC P4.Attr;  -- assumed attributes of empty
lockNode: PUBLIC Tree.Index;
resident: PUBLIC BOOL;
overall control
P4Unit: PUBLIC PROC [unit: Tree.Link] = {
node: Tree.Index;
(dataPtr.table).AddNotify[P4Notify];
tTRUE ← dataPtr.tC1; tFALSE ← dataPtr.tC0;
implicitType ← typeANY; implicitBias ← 0; implicitAttr ← P4.voidAttr;
resumeRecord ← RecordSENull;
P4.ExpInit[dataPtr.zone];
node ← GetNode[unit];
Module[node ! P4.VarInit => {RESUME [TRUE]}];
P4.ExpReset[];
FreeNode[node];
(dataPtr.table).DropNotify[P4Notify]};
Module: PROC [node: Tree.Index] = {
subNode: Tree.Index = GetNode[tb[node].son[6]];
saveIndex: CARDINAL = dataPtr.textIndex;
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};
}.