DIRECTORY A3: TYPE USING [AccessMode, CanonicalType, LhsMode, LifeTime], Alloc: TYPE USING [Notifier], ComData: TYPE USING [typeINT, typeSTRING], P3: TYPE USING [phraseNP, RecordLhs, SetNP], P3S: TYPE USING [currentBody], Symbols: TYPE USING [ Base, SEIndex, ISEIndex, CSEIndex, ContextLevel, CTXIndex, CBTIndex, CSENull, CTXNull, CBTNull, lG, lZ, typeANY, bodyType, ctxType, seType], SymbolOps: TYPE USING [UnderType, XferMode], Tree: TYPE USING [Base, Index, Link, NullIndex, treeType], TreeOps: TYPE USING [GetInfo, ListLength, NthSon, OpName]; Attr3b: PROGRAM IMPORTS A3, P3, P3S, SymbolOps, TreeOps, dataPtr: ComData EXPORTS A3 = { OPEN SymbolOps, Symbols, TreeOps, A: A3; tb: Tree.Base; -- tree base address (local copy) seb: Base; -- se table base address (local copy) ctxb: Base; -- context table base address (local copy) bb: Base; -- body table base address (local copy) TreeNotify: PUBLIC Alloc.Notifier = { seb _ base[seType]; ctxb _ base[ctxType]; bb _ base[bodyType]; tb _ base[Tree.treeType]}; TypeForTree: PUBLIC PROC [t: Tree.Link] RETURNS [SEIndex] = { RETURN [WITH t SELECT FROM symbol => index, subtree => SELECT tb[index].name FROM cdot, discrimTC => TypeForTree[tb[index].son[2]], ENDCASE => tb[index].info, ENDCASE => typeANY]}; InterfaceVar: PROC [t: Tree.Link] RETURNS [BOOL] = INLINE { RETURN [WITH t SELECT FROM symbol => (ctxb[seb[index].idCtx].ctxType = imported), ENDCASE => FALSE]}; WritableRef: PROC [t: Tree.Link] RETURNS [A.LhsMode] = { P3.phraseNP _ P3.SetNP[P3.phraseNP]; RETURN [A.AccessMode[A.CanonicalType[OperandType[t]]]]}; VarLhsMode: ARRAY A.LhsMode OF A.LhsMode = [ none: $none, uncounted: $counted, counted: $counted]; OperandLhs: PUBLIC PROC [t: Tree.Link] RETURNS [A.LhsMode] = { WITH t SELECT FROM symbol => { sei: ISEIndex = index; ctx: CTXIndex = seb[sei].idCtx; level: ContextLevel; IF ctx = CTXNull THEN level _ lZ ELSE { ctxb[ctx].varUpdated _ TRUE; IF (level _ ctxb[ctx].level) < P3S.currentBody.level THEN P3.phraseNP _ P3.SetNP[P3.phraseNP]}; P3.RecordLhs[sei]; RETURN [SELECT TRUE FROM seb[sei].immutable => $none, (level = lG) => $counted, ENDCASE => $uncounted]}; subtree => { node: Tree.Index = index; RETURN [IF node = Tree.NullIndex THEN $none ELSE SELECT tb[node].name FROM $dot => WITH tb[node].son[2] SELECT FROM symbol => SELECT TRUE FROM seb[index].immutable => $none, (ctxb[seb[index].idCtx].level = lG) => VarLhsMode[WritableRef[tb[node].son[1]]], ENDCASE => WritableRef[tb[node].son[1]], ENDCASE => none, $uparrow => IF InterfaceVar[tb[node].son[1]] THEN VarLhsMode[WritableRef[tb[node].son[1]]] ELSE WritableRef[tb[node].son[1]], $dindex => WritableRef[tb[node].son[1]], $reloc => WritableRef[tb[node].son[2]], $dollar => WITH tb[node].son[2] SELECT FROM symbol => IF ~seb[index].immutable THEN OperandLhs[tb[node].son[1]] ELSE $none, ENDCASE => $none, $index, $seqindex, $loophole, $cast, $openx, $pad, $chop => OperandLhs[tb[node].son[1]], $cdot => OperandLhs[tb[node].son[2]], $apply => IF ListLength[tb[node].son[1]] = 1 THEN $uncounted ELSE $none, ENDCASE => $none]}; ENDCASE => RETURN [$none]}; OperandInline: PUBLIC PROC [t: Tree.Link] RETURNS [BOOL] = { bti: CBTIndex; RETURN [SELECT XferMode[OperandType[t]] FROM $proc => (bti_BodyForTree[t]) # CBTNull AND bb[bti].inline, ENDCASE => FALSE]}; OperandLevel: PUBLIC PROC [t: Tree.Link] RETURNS [level: A.LifeTime] = { SELECT OpName[t] FROM $cdot, $nil => level _ $global; ENDCASE => { bti: CBTIndex = BodyForTree[t]; level _ SELECT TRUE FROM (bti = CBTNull) => $unknown, (bb[bti].level <= lG+1) => $global, ENDCASE => $local}; RETURN}; OperandInternal: PUBLIC PROC [t: Tree.Link] RETURNS [BOOL] = { WITH t SELECT FROM symbol => { bti: CBTIndex = BodyForTree[t]; RETURN [bti # CBTNull AND bb[bti].internal]}; subtree => RETURN [SELECT OpName[t] FROM $dot, $cdot, $assignx => OperandInternal[NthSon[t, 2]], $ifx => OperandInternal[NthSon[t, 2]] OR OperandInternal[NthSon[t, 3]], ENDCASE => FALSE]; -- should check casex, bindx also ENDCASE => RETURN [FALSE]}; OperandType: PUBLIC PROC [t: Tree.Link] RETURNS [CSEIndex] = { RETURN [WITH e:t SELECT FROM symbol => UnderType[seb[e.index].idType], literal => WITH e.index SELECT FROM string => dataPtr.typeSTRING, ENDCASE => dataPtr.typeINT, subtree => tb[e.index].info, ENDCASE => CSENull]}; LongPath: PUBLIC PROC [t: Tree.Link] RETURNS [long: BOOL] = { WITH t SELECT FROM subtree => { node: Tree.Index = index; long _ IF node = Tree.NullIndex THEN FALSE ELSE SELECT tb[node].name FROM $loophole, $cast, $openx, $pad, $chop => LongPath[tb[node].son[1]], -- $dot, $uparrow, $dindex, $reloc, $seqindex, $dollar, $index => -- ENDCASE => tb[node].attr2}; ENDCASE => long _ FALSE; RETURN}; BodyForTree: PUBLIC PROC [t: Tree.Link] RETURNS [CBTIndex] = { node: Tree.Index; WITH t SELECT FROM symbol => { sei: ISEIndex = index; SELECT TRUE FROM seb[sei].mark4 => RETURN [IF seb[sei].constant THEN seb[sei].idInfo ELSE CBTNull]; seb[sei].immutable => { node _ seb[sei].idValue; IF OpName[tb[node].son[3]] = $body THEN RETURN [GetInfo[tb[node].son[3]]]}; ENDCASE}; subtree => { node _ index; SELECT tb[node].name FROM $cdot, $dot, $dollar => RETURN [BodyForTree[tb[node].son[2]]]; ENDCASE}; ENDCASE; RETURN [CBTNull]}; }. file Attr3b.mesa last modified by Satterthwaite, January 10, 1983 9:57 am last modified by Donahue, 10-Dec-81 11:23:00 called by allocator whenever table area is repacked tree manipulation utilities N.B. assumes t evaluated by P3.TypeLink or P3.Exp Ê¥˜Jšœ™Jšœ8™8Jšœ,™,J˜šÏk ˜ Jšœœœ0˜>Jšœœœ ˜Jšœ œœ˜*Jšœœœ˜,Jšœœœ˜šœ œœ˜J˜DJ˜G—Jšœ œœ˜,Jšœœœ*˜:Jšœ œœ'˜:J˜—šœ˜š˜J˜ J˜—Jšœ˜Jšœœ˜(J˜JšœÏc!˜0Jšœ ž%˜0Jšœ ž*˜6Jšœ ž'˜1J˜šœ œ˜%Jšœ3™3J˜*J˜J˜J˜J˜—Jšœ™˜šÏn œœœœ˜=Jšœ1™1šœœœ˜J˜˜ šœ˜J˜1Jšœ˜——Jšœ˜J˜J˜——š Ÿ œœœœœ˜;šœœœ˜J˜6Jšœœ˜J˜——šŸ œœœœ ˜8J˜$Jšœœ œ"˜8J˜—š œ œœ œœ ˜,J˜5J˜—š Ÿ œœœœœ ˜>šœœ˜˜ J˜J˜J˜Jšœœ ˜ šœ˜Jšœœ˜šœ3˜9J˜%——J˜šœœœ˜J˜J˜Jšœ˜——˜ J˜šœœœ˜0šœ˜˜šœœ˜ ˜ šœœ˜J˜˜&J˜)—Jšœ!˜(——Jšœ ˜——˜ šœ˜ Jšœ)˜-Jšœ˜"——J˜(J˜'˜ šœœ˜ ˜ šœ˜Jšœ˜ Jšœ˜ ——Jšœ ˜——˜;J˜—J˜%Jšœ œ!œ œ˜HJšœ ˜———Jšœœ ˜J˜——š Ÿ œœœœœ˜šœœ˜˜ J˜Jšœœ˜-—˜ šœœ ˜J˜7Jšœ&œ˜GJšœœž!˜4——Jšœœœ˜J˜J˜——šŸ œœœœ˜>šœœœ˜J˜)˜ šœ œ˜J˜Jšœ˜——J˜Jšœ˜J˜J˜——š Ÿœœœœœ˜=šœœ˜˜ J˜šœœ˜Jšœ˜ šœœ˜J˜CJšžD˜DJšœ˜———Jšœ œ˜—Jšœ˜J˜J˜—šŸ œœœœ˜>J˜šœœ˜˜ J˜šœœ˜˜Jšœœœœ ˜A—˜J˜Jšœ!œœ˜K—Jšœ˜ ——˜ J˜ šœ˜Jšœœ ˜>Jšœ˜ ——Jšœ˜—Jšœ ˜J˜—J˜J˜J˜———…—\