-- PackTree.Mesa
-- last edited by Lewis on 22-Oct-81 18:42:49
-- last edited by Satterthwaite, January 12, 1983 11:40 am
DIRECTORY
CodePackProcs: TYPE USING [ModuleIndex, nullModuleIndex],
HashTypes: TYPE USING [HTIndex, htNull],
Symbols: TYPE USING [STIndex],
Table: TYPE USING [Base, Finger, Limit, Selector, chunkType];
Tree, Literals: DEFINITIONS={
treeType: Table.Selector~Table.chunkType;
Base: TYPE~Table.Base;
Finger: TYPE~Table.Finger;
Limit: CARDINAL~Table.Limit;
Link: TYPE~RECORD [
SELECT tag: * FROM
subtree => [index: Tree.Index],
hash => [index: HashTypes.HTIndex],
symbol => [index: Symbols.STIndex],
literal => [index: CodePackProcs.ModuleIndex] -- procs in a code pack
ENDCASE];
null: Tree.Link~[subtree[index: Tree.nullIndex]];
nullId: Tree.Link~[hash[index: HashTypes.htNull]];
ProcsLink: TYPE~Tree.Link.literal;
nullProcs: ProcsLink~[literal[index: CodePackProcs.nullModuleIndex]];
Index: TYPE~Base RELATIVE POINTER [0..Limit) TO Tree.Node;
nullIndex: Tree.Index~Tree.Index.FIRST;
Node: TYPE~MACHINE DEPENDENT RECORD [
free (0: 0..0): BOOL, -- reserved for allocator
name (0: 1..5): NodeName,
nSons (0: 6..15): [0..maxNSons],
info (1): CARDINAL, -- (source file index)
shared (2: 0..0): BOOL,
attrs (2: 1..15): PACKED ARRAY AttrId OF BOOL←ALL[FALSE],
cp (3): Tree.Index, -- enclosing code pack node if component desc
seg (4): Tree.Index, -- enclosing segment node if component desc
son (5): ARRAY [1..1) OF Tree.Link];
Info: TYPE~CARDINAL;
AttrId: TYPE~{
superceded, -- if code pack, seg, frame pack node superceded
placed, -- if code pack, seg placed
exceptMAIN, -- if code pack excludes MAIN procs
exceptEV, -- if code pack excludes entry vectors
exceptCatch}; -- if code pack excludes catch phrases
maxNSons: CARDINAL~1777b; -- largest list without null terminator
NodeName: TYPE~{
-- general tree constructor
list,
-- declarations
codeSeg,
codePack, unnamedCodePack, discardCodePack,
framePack,
merge, -- merge segment
mergeFP, -- merge frame pack
-- component descriptions
allComp, -- ComponentDesc ::= Component
compItems, -- ComponentDesc ::= Component [ItemList]
exceptItems, -- ComponentDesc ::= Component EXCEPT [ItemList]
exceptPacks, -- ComponentDesc ::= Component EXCEPT PackList
itemsExceptPacks, -- ComponentDesc ::= Component [ItemList] EXCEPT PackList
exceptPacksItems, -- ComponentDesc ::= Component EXCEPT PackList, [ItemList]
mainOfPL, -- ComponentDesc ::= MAIN OF PackList
evOfPL, -- ComponentDesc ::= ENTRY VECTOR OF PackList
catchOfPL, -- ComponentDesc ::= CATCH CODE OF PackList
-- expressions
component,
main,
ev,
catch,
-- nil
none
};
-- tree manipulation
Id: TYPE~RECORD [baseP: Finger, link: Tree.Link];
Scan: TYPE~PROC [t: Tree.Link];
Map: TYPE~PROC [t: Tree.Link] RETURNS [v: Tree.Link];
Test: TYPE~PROC [t: Tree.Link] RETURNS [BOOL];
-- Literals: (for proto- modules)
LitIndex: TYPE~CodePackProcs.ModuleIndex;
}.