-- file P3S.mesa
-- last modified by Satterthwaite, December 10, 1982 10:57 am

DIRECTORY
  P3: TYPE USING [Attr, NPUse, Safety],
  Symbols: TYPE USING [
    CSEIndex, RecordSEIndex, CTXIndex, BTIndex, ContextLevel],
  Tree: TYPE USING [Index, Link];

P3S: DEFINITIONS = {
  OPEN Symbols;
  
 -- shared state variables for pass 3

  BodyData: TYPE = RECORD [	-- shared communication record
    level: Symbols.ContextLevel,	-- current level
    bodyNode: Tree.Index,		-- current body
    argCtx: Symbols.CTXIndex,		-- ctx for inputRecord
    inputRecord: RecordSEIndex,		-- input record for current body
    returnRecord: RecordSEIndex,	-- return record for current body
    entry: BOOL,				-- set for entry procedures
    lockHeld: BOOL,			-- set for entry or internal procedures

    noXfers: BOOL,				-- set by embedded xfer (except return)

    reachable: BOOL,
    labelList: Tree.Link,		-- list of accessible labels
    loopDepth: CARDINAL,		-- depth of loop nesting

    catchDepth: CARDINAL,		-- depth of catch phrase nesting
    unwindEnabled: BOOL,		-- set iff in scope of unwind
    resumeFlag: BOOL,			-- set iff a resume is legal
    resumeRecord: RecordSEIndex];	-- for current catch phrase


  ImplicitInfo: TYPE = RECORD [		-- info about subtree used as an expr
    type: CSEIndex,
    tree: Tree.Link,
    attr: P3.Attr];
    
  SelfInfo: TYPE = RECORD [		-- info about x in x.op[args] => op[x, args]
    tree: Tree.Link,
    type: CSEIndex,
    attr: P3.Attr,
    np: P3.NPUse];


 -- exported by Pass3S
  
  safety: READONLY P3.Safety;
  currentBody: VAR BodyData;
  currentScope: READONLY BTIndex;
  
 -- exported by Pass3Xa
  
  implicitRecord: VAR RecordSEIndex;	-- type of extraction record
  markCatch: VAR BOOL;			-- reset in Stmt, set in CatchPhrase
  continued: VAR BOOL;
  self: VAR SelfInfo;
  
 -- exported by Pass3Xb
 
  implicit: VAR ImplicitInfo;		-- implied interpretation of Tree.Null
   
  }.