DIRECTORY AMTypes USING[UnderType, Error, Index, Class, NComponents, IndexToType], Basics USING[bitsPerWord], BrandXSymbolDefs USING [SymbolConstructorIndex, SymbolIdIndex, nullSymbolIndex, typeCodeForCHAR, StandardSymbolContextIndex, typeCodeForINT], BrandYSymbolDefs USING [SymbolConstructorIndex, SymbolIdIndex, nullSymbolIndex, typeCodeForCHAR, StandardSymbolContextIndex, typeCodeForINT], Rope USING [ROPE, Text], RTCommon USING [ShortenLongCardinal], RTSymbolDefs USING [SymbolTableBase, SymbolConstructorIndex, Brand, SymbolIdIndex, SymbolIndex], RTSymbolOps USING [EnumerateCtxIseis, SEUnderType, ISEConstant, IDCardinalValue, SETagIDP], RTSymbols USING [GetTypeSymbols, ReleaseSTB], RTTCache USING[RefEntry, LookupRef, FillRefEntry, IntEntry, LookupInt, FillIntEntry], RTTypesPrivate USING [], SafeStorage USING[Type, nullType, fhType, gfhType, unspecType, GetCanonicalType]; AMTypesBImpl: PROGRAM IMPORTS AMTypes, RTCommon, RTTCache, RTSymbolOps, RTSymbols, SafeStorage EXPORTS AMTypes, RTTypesPrivate = BEGIN OPEN AMTypes, Basics, bx: BrandXSymbolDefs, by: BrandYSymbolDefs, Rope, RTSymbolDefs, RTSymbolOps, RTSymbols, SafeStorage; BitsForTypeInfo: TYPE = RECORD [bft: LONG CARDINAL, argumentRecord, interfaceRecord: BOOL]; VariableType: PUBLIC SAFE PROC[type: Type] RETURNS [v: Type, c: Class] = TRUSTED { type _ UnderType[type]; IF TypeClass[type] # record AND TypeClass[type] # structure THEN RETURN[v: nullType, c: nil]; {nc: Index = NComponents[type]; IF nc = 0 THEN RETURN[v: nullType, c: nil]; v _ UnderType[IndexToType[type, nc]]}; c _ TypeClass[v]; SELECT c FROM union, sequence => RETURN; ENDCASE => RETURN[v: nullType, c: nil]; }; Size: PUBLIC SAFE PROC [type: Type, length: CARDINAL _ 0--for sequence-containing records--] RETURNS [ans: CARDINAL _ 0 --number of words--] = TRUSTED { stb: SymbolTableBase; uType: Type = UnderType[type]; sei: SymbolIndex; entry: RTTCache.IntEntry _ NIL; int: INT; IF type = nullType THEN RETURN[2]; SELECT type FROM fhType, gfhType => ERROR Error[reason: typeFault, type: type]; ENDCASE; IF length = 0 THEN { entry _ RTTCache.LookupInt[type, Size]; int _ entry.int; IF int >= 0 THEN RETURN [int]}; [stb, sei] _ GetTypeSymbols[type]; WITH stb SELECT FROM t: SymbolTableBase.x => { ENABLE UNWIND => ReleaseSTB[stb]; csei: bx.SymbolConstructorIndex = t.e.UnderType[NARROW[sei, SymbolIndex.x].e]; WITH ser: t.e.seb[csei] SELECT FROM record => IF ser.argument THEN { FOR isei: bx.SymbolIdIndex _ t.e.FirstCtxSe[ser.fieldCtx], t.e.NextSe[isei] UNTIL isei = bx.nullSymbolIndex DO ans _ MAX[ans, t.e.FnField[isei].offset.wd*bitsPerWord + t.e.seb[isei].idInfo] ENDLOOP; ans _ ans/bitsPerWord + (IF ans MOD bitsPerWord # 0 THEN 1 ELSE 0); GO TO gotAnswer; }; definition => { proc: PROC[stb: SymbolTableBase, isei: SymbolIdIndex] RETURNS[stop: BOOL] = { IF NARROW[stb, SymbolTableBase.x].e.LinkMode[NARROW[isei, SymbolIdIndex.x].e] # manifest THEN ans _ MAX[ans, IDCardinalValue[stb, isei]]; RETURN[FALSE]; }; [] _ EnumerateCtxIseis[stb, [x[ser.defCtx]], proc]; ans _ ans + 1; GO TO gotAnswer; }; ENDCASE; -- not argument record or interface record SELECT TypeClass[uType] FROM union, sequence=> ERROR Error[reason: typeFault, type: type]; record, structure => { sType: Type; sClass: Class; [v: sType, c: sClass] _ VariableType[uType]; SELECT sClass FROM sequence=> { sstb: SymbolTableBase; ssei: SymbolIndex; [sstb, ssei] _ GetTypeSymbols[sType]; {ENABLE UNWIND => ReleaseSTB[sstb]; scsei: bx.SymbolConstructorIndex = NARROW[SEUnderType[sstb, ssei], SymbolConstructorIndex.x].e; WITH ser: NARROW[sstb, SymbolTableBase.x].e.seb[scsei] SELECT FROM sequence => { bpe: LONG CARDINAL = NARROW[sstb, SymbolTableBase.x].e.BitsPerElement[ type: ser.componentType, packed: ser.packed]; ans _ RTCommon.ShortenLongCardinal[ (bpe*length+bitsPerWord-1)/bitsPerWord]}; ENDCASE=>ERROR; }; ReleaseSTB[sstb]}; ENDCASE}; ENDCASE; ans _ ans + t.e.WordsForType[csei]; EXITS gotAnswer => {}; }; t: SymbolTableBase.y => { ENABLE UNWIND => ReleaseSTB[stb]; csei: by.SymbolConstructorIndex = t.e.UnderType[NARROW[sei, SymbolIndex.y].e]; WITH ser: t.e.seb[csei] SELECT FROM record => IF ser.argument THEN { FOR isei: by.SymbolIdIndex _ t.e.FirstCtxSe[ser.fieldCtx], t.e.NextSe[isei] UNTIL isei = by.nullSymbolIndex DO ans _ MAX[ans, t.e.FnField[isei].offset.wd*bitsPerWord + t.e.seb[isei].idInfo] ENDLOOP; ans _ ans/bitsPerWord + (IF ans MOD bitsPerWord # 0 THEN 1 ELSE 0); GO TO gotAnswer; }; definition => {proc: PROC[stb: SymbolTableBase, isei: SymbolIdIndex] RETURNS[stop: BOOL] = {IF NARROW[stb, SymbolTableBase.y].e.LinkMode[NARROW[isei, SymbolIdIndex.y].e] # manifest THEN ans _ MAX[ans, IDCardinalValue[stb, isei]]; RETURN[FALSE]}; [] _ EnumerateCtxIseis[stb, [y[ser.defCtx]], proc]; ans _ ans + 1; GO TO gotAnswer; }; ENDCASE; -- not argument record or interface record SELECT TypeClass[uType] FROM union, sequence=> ERROR Error[reason: typeFault, type: type]; record, structure => { sType: Type; sClass: Class; [v: sType, c: sClass] _ VariableType[uType]; SELECT sClass FROM sequence=> { sstb: SymbolTableBase; ssei: SymbolIndex; [sstb, ssei] _ GetTypeSymbols[sType]; {ENABLE UNWIND => ReleaseSTB[sstb]; scsei: by.SymbolConstructorIndex = NARROW[SEUnderType[sstb, ssei], SymbolConstructorIndex.y].e; WITH ser: NARROW[sstb, SymbolTableBase.y].e.seb[scsei] SELECT FROM sequence => { bpe: LONG CARDINAL = NARROW[sstb, SymbolTableBase.y].e.BitsPerElement[ type: ser.componentType, packed: ser.packed]; ans _ RTCommon.ShortenLongCardinal [ (bpe*length+bitsPerWord-1)/bitsPerWord]}; ENDCASE => ERROR; }; ReleaseSTB[sstb]}; ENDCASE}; ENDCASE; ans _ ans + t.e.WordsForType[csei]; EXITS gotAnswer => {}; }; -- end ENABLE UNWIND ENDCASE => ERROR; ReleaseSTB[stb]; IF entry # NIL THEN [] _ RTTCache.FillIntEntry[entry, ans]; }; -- end Size IsPainted: PUBLIC SAFE PROC[type: Type] RETURNS[ans: BOOL] = TRUSTED { RETURN[SELECT TypeClass[UnderType[type]] FROM enumerated, record => TRUE, ENDCASE => FALSE]; }; TypeClass: PUBLIC SAFE PROC[type: Type] RETURNS[ans: Class] = TRUSTED { stb: SymbolTableBase; sei: SymbolIndex; entry: RTTCache.IntEntry; int: INT; SELECT type FROM fhType => RETURN[localFrame]; nullType => RETURN[nil]; gfhType => RETURN[globalFrame]; unspecType => RETURN[unspecified]; ENDCASE; entry _ RTTCache.LookupInt[type, TypeClass]; int _ entry.int; IF int >= 0 THEN {card: CARDINAL _ int; RETURN [LOOPHOLE[card]]}; [stb, sei] _ GetTypeSymbols[type]; { ENABLE UNWIND => ReleaseSTB[stb]; IF SETagIDP[stb, sei] THEN {ans _ definition; GO TO answer}; IF GetCanonicalType[type] = GetCanonicalType[CODE[ROPE]] OR GetCanonicalType[type] = GetCanonicalType[CODE[Text]] THEN {ans _ rope; GO TO answer}; WITH stb SELECT FROM t: SymbolTableBase.x => ans _ (WITH ser: t.e.seb[t.e.UnderType[NARROW[sei, SymbolIndex.x].e]] SELECT FROM basic => SelectBasicClass[x, ser.code], record => (IF ser.painted THEN record ELSE structure), definition => record, real => real, union => union, array => array, opaque => opaque, sequence => sequence, relative => relativePointer, ref => (IF ser.counted OR ser.basing THEN ERROR ELSE pointer), arraydesc => descriptor, long => (WITH rse: t.e.seb[t.e.UnderType[ser.rangeType] ] SELECT FROM ref => (IF rse.counted THEN (IF rse.list THEN list ELSE WITH z: t.e.seb[t.e.UnderType[rse.refType]] SELECT FROM opaque => IF t.e.seb[z.id].idCtx IN bx.StandardSymbolContextIndex THEN atom ELSE ref ENDCASE => ref) ELSE (IF rse.basing THEN basePointer ELSE longPointer)), basic => (IF rse.code = bx.typeCodeForINT THEN longInteger ELSE ERROR), arraydesc => longDescriptor, subrange => (WITH rrse: t.e.seb[t.e.UnderType[rse.rangeType] ] SELECT FROM basic => (IF rrse.code = bx.typeCodeForINT AND rse.origin = 0 AND rse.range = LAST[CARDINAL] THEN longCardinal ELSE ERROR), ENDCASE => ERROR), ENDCASE => ERROR), enumerated => enumerated, subrange => (WITH rse: t.e.seb[t.e.UnderType[ser.rangeType] ] SELECT FROM basic => (IF rse.code = bx.typeCodeForINT AND ser.origin = 0 AND ser.range = LAST[CARDINAL] THEN cardinal ELSE subrange), ENDCASE => subrange), subrange => subrange, transfer => (SELECT ser.mode FROM proc => procedure, port => port, signal => signal, error => error, process => process, program => program, ENDCASE => ERROR), zone => (IF ser.counted THEN countedZone ELSE uncountedZone), mode => type, any => any, ENDCASE => ERROR Error[reason: typeFault, type: type]); t: SymbolTableBase.y => ans _ (WITH ser: t.e.seb[t.e.UnderType[NARROW[sei, SymbolIndex.y].e]] SELECT FROM basic => SelectBasicClass[y, ser.code], record => (IF ser.painted THEN record ELSE structure), definition => record, real => real, union => union, array => array, opaque => opaque, sequence => sequence, relative => relativePointer, ref => (IF ser.counted OR ser.basing THEN ERROR ELSE pointer), arraydesc => descriptor, long => (WITH rse: t.e.seb[t.e.UnderType[ser.rangeType] ] SELECT FROM ref => (IF rse.counted THEN (IF rse.list THEN list ELSE WITH z: t.e.seb[t.e.UnderType[rse.refType]] SELECT FROM opaque => IF t.e.seb[z.id].idCtx IN by.StandardSymbolContextIndex THEN atom ELSE ref ENDCASE => ref) ELSE (IF rse.basing THEN basePointer ELSE longPointer)), basic => (IF rse.code = by.typeCodeForINT THEN longInteger ELSE ERROR), arraydesc => longDescriptor, subrange => (WITH rrse: t.e.seb[t.e.UnderType[rse.rangeType] ] SELECT FROM basic => (IF rrse.code = by.typeCodeForINT AND rse.origin = 0 AND rse.range = LAST[CARDINAL] THEN longCardinal ELSE ERROR), ENDCASE => ERROR), ENDCASE => ERROR), enumerated => enumerated, subrange => (WITH rse: t.e.seb[t.e.UnderType[ser.rangeType] ] SELECT FROM basic => (IF rse.code = by.typeCodeForINT AND ser.origin = 0 AND ser.range = LAST[CARDINAL] THEN cardinal ELSE subrange), ENDCASE => subrange), subrange => subrange, transfer => (SELECT ser.mode FROM proc => procedure, port => port, signal => signal, error => error, process => process, program => program, ENDCASE => ERROR), zone => (IF ser.counted THEN countedZone ELSE uncountedZone), mode => type, any => any, ENDCASE => ERROR Error[reason: typeFault, type: type]); ENDCASE => ERROR; ReleaseSTB[stb]; EXITS answer => ReleaseSTB[stb]}; [] _ RTTCache.FillIntEntry[entry, LOOPHOLE[ans, CARDINAL]]; }; -- end TypeClass IsInterface: PUBLIC SAFE PROC[type: Type] RETURNS[ans: BOOL _ FALSE] = TRUSTED{ stb: SymbolTableBase; sei: SymbolIndex; entry: RTTCache.RefEntry; info: REF BOOL; IF type = nullType THEN RETURN[FALSE]; entry _ RTTCache.LookupRef[type, LOOPHOLE[IsInterface]]; info _ NARROW[entry.ref, REF BOOL]; IF info # NIL THEN RETURN[info^]; [stb, sei] _ GetTypeSymbols[type]; {ENABLE UNWIND => ReleaseSTB[stb]; csei: SymbolConstructorIndex = SEUnderType[stb, sei]; WITH stb SELECT FROM t: SymbolTableBase.x => WITH ser: t.e.seb[NARROW[csei, SymbolConstructorIndex.x].e] SELECT FROM definition => ans _ TRUE; ENDCASE; t: SymbolTableBase.y => WITH ser: t.e.seb[NARROW[csei, SymbolConstructorIndex.y].e] SELECT FROM definition => ans _ TRUE; ENDCASE; ENDCASE => ERROR; }; -- end ENABLE UNWIND ReleaseSTB[stb]; [] _ RTTCache.FillRefEntry[entry, NEW[BOOL _ ans]]; }; BitsForType: PUBLIC PROC [type: Type] RETURNS [bft: LONG CARDINAL, argumentRecord, interfaceRecord: BOOL] = { stb: SymbolTableBase; sei: SymbolIndex; entry: RTTCache.RefEntry; info: REF BitsForTypeInfo; IF type = nullType THEN RETURN[2*bitsPerWord, FALSE, FALSE]; -- NIL entry _ RTTCache.LookupRef[type, LOOPHOLE[BitsForType]]; info _ NARROW[entry.ref]; IF info # NIL THEN RETURN [info.bft, info.argumentRecord, info.interfaceRecord]; [stb, sei] _ GetTypeSymbols[type]; { ENABLE UNWIND => ReleaseSTB[stb]; csei: SymbolConstructorIndex = SEUnderType[stb, sei]; WITH stb SELECT FROM t: SymbolTableBase.x => WITH ser: t.e.seb[NARROW[csei, SymbolConstructorIndex.x].e] SELECT FROM record => { w: LONG CARDINAL = t.e.WordsForType[NARROW[csei, SymbolConstructorIndex.x].e]; argumentRecord _ ser.argument; interfaceRecord _ FALSE; IF w > 1 THEN bft _ w * bitsPerWord ELSE bft _ t.e.BitsForType[NARROW[csei, SymbolConstructorIndex.x].e]; }; definition => { ans: CARDINAL _ 0; proc: PROC[stb: SymbolTableBase, isei: SymbolIdIndex] RETURNS[stop: BOOL] = { IF NOT ISEConstant[stb, isei] THEN ans _ MAX[ans, IDCardinalValue[stb, isei]]; RETURN[FALSE]; }; [] _ EnumerateCtxIseis[stb, [x[ser.defCtx]], proc]; argumentRecord _ FALSE; interfaceRecord _ TRUE; bft _ (ans + 1)*bitsPerWord; }; subrange => { w: LONG CARDINAL = t.e.WordsForType[NARROW[csei, SymbolConstructorIndex.x].e]; argumentRecord _ FALSE; interfaceRecord _ FALSE; IF w > 1 THEN bft _ w * bitsPerWord ELSE bft _ t.e.BitsForType[NARROW[csei, SymbolConstructorIndex.x].e]; IF bft = 0 THEN { IF ser.empty THEN bft _ bitsPerWord ELSE ERROR Error[reason: typeFault, type: type]; }; }; ENDCASE => { w: LONG CARDINAL = t.e.WordsForType[NARROW[csei, SymbolConstructorIndex.x].e]; argumentRecord _ FALSE; interfaceRecord _ FALSE; IF w > 1 THEN bft _ w * bitsPerWord ELSE bft _ t.e.BitsForType[NARROW[csei, SymbolConstructorIndex.x].e]; IF bft = 0 THEN ERROR Error[reason: typeFault, type: type]; }; t: SymbolTableBase.y => WITH ser: t.e.seb[NARROW[csei, SymbolConstructorIndex.y].e] SELECT FROM record => { w: LONG CARDINAL = t.e.WordsForType[NARROW[csei, SymbolConstructorIndex.y].e]; argumentRecord _ ser.argument; interfaceRecord _ FALSE; IF w > 1 THEN bft _ w * bitsPerWord ELSE bft _ t.e.BitsForType[NARROW[csei, SymbolConstructorIndex.y].e]; }; definition => { ans: CARDINAL _ 0; proc: PROC[stb: SymbolTableBase, isei: SymbolIdIndex] RETURNS[stop: BOOL] = { IF NOT ISEConstant[stb, isei] THEN ans _ MAX[ans, IDCardinalValue[stb, isei]]; RETURN[FALSE]}; [] _ EnumerateCtxIseis[stb, [y[ser.defCtx]], proc]; argumentRecord _ FALSE; interfaceRecord _ TRUE; bft _ (ans + 1)*bitsPerWord}; subrange => { w: LONG CARDINAL = t.e.WordsForType[NARROW[csei, SymbolConstructorIndex.y].e]; argumentRecord _ FALSE; interfaceRecord _ FALSE; IF w > 1 THEN bft _ w * bitsPerWord ELSE bft _ t.e.BitsForType[NARROW[csei, SymbolConstructorIndex.y].e]; IF bft = 0 THEN { IF ser.empty THEN bft _ bitsPerWord ELSE ERROR Error[reason: typeFault, type: type]; }; }; ENDCASE => { w: LONG CARDINAL = t.e.WordsForType[NARROW[csei, SymbolConstructorIndex.y].e]; argumentRecord _ FALSE; interfaceRecord _ FALSE; IF w > 1 THEN bft _ w * bitsPerWord ELSE bft _ t.e.BitsForType[NARROW[csei, SymbolConstructorIndex.y].e]; IF bft = 0 THEN ERROR Error[reason: typeFault, type: type]; }; ENDCASE => ERROR; }; ReleaseSTB[stb]; info _ NEW[BitsForTypeInfo _ [bft, argumentRecord, interfaceRecord]]; [] _ RTTCache.FillRefEntry[entry, info]; }; -- end BitsForType IsOverlaid: PUBLIC SAFE PROC [type: Type--union--] RETURNS [ans: BOOL _ FALSE] = TRUSTED { stb: SymbolTableBase; sei: SymbolIndex; class: Class = TypeClass[UnderType[type]]; entry: RTTCache.IntEntry _ NIL; IF class = nil THEN RETURN; entry _ RTTCache.LookupInt[type, IsOverlaid]; IF entry.int # -1 THEN RETURN[entry.int = 1]; -- 1 => TRUE, 2 => FALSE IF class = record OR class = structure THEN type _ IndexToType[type, NComponents[type]]; [stb, sei] _ GetTypeSymbols[type]; { ENABLE UNWIND => ReleaseSTB[stb]; WITH stb SELECT FROM t: SymbolTableBase.x => WITH ser: t.e.seb[t.e.UnderType[NARROW[sei, SymbolIndex.x].e]] SELECT FROM union => ans _ ser.overlaid; ENDCASE; t: SymbolTableBase.y => WITH ser: t.e.seb[t.e.UnderType[NARROW[sei, SymbolIndex.y].e]] SELECT FROM union => ans _ ser.overlaid; ENDCASE; ENDCASE => ERROR; }; ReleaseSTB[stb]; IF entry # NIL THEN [] _ RTTCache.FillIntEntry[entry, (IF ans THEN 1 ELSE 2)]; }; IsComputed: PUBLIC SAFE PROC [type: Type--union, sequence--] RETURNS [ans: BOOL _ FALSE] = TRUSTED { stb: SymbolTableBase; sei: SymbolIndex; class: Class = TypeClass[UnderType[type]]; entry: RTTCache.IntEntry _ NIL; IF class = nil THEN RETURN; entry _ RTTCache.LookupInt[type, IsComputed]; IF entry.int # -1 THEN RETURN[entry.int = 1]; -- 1 => TRUE, 2 => FALSE IF class = record OR class = structure THEN type _ IndexToType[type, NComponents[type]]; [stb, sei] _ GetTypeSymbols[type]; { ENABLE UNWIND => ReleaseSTB[stb]; WITH stb SELECT FROM t: SymbolTableBase.x => WITH ser: t.e.seb[t.e.UnderType[NARROW[sei, SymbolIndex.x].e]] SELECT FROM union => ans _ NOT ser.controlled; sequence => ans _ NOT ser.controlled; ENDCASE; t: SymbolTableBase.y => WITH ser: t.e.seb[t.e.UnderType[NARROW[sei, SymbolIndex.y].e]] SELECT FROM union => ans _ NOT ser.controlled; sequence => ans _ NOT ser.controlled; ENDCASE; ENDCASE => ERROR; }; ReleaseSTB[stb]; IF entry # NIL THEN [] _ RTTCache.FillIntEntry[entry, (IF ans THEN 1 ELSE 2)]; }; IsOrdered: PUBLIC SAFE PROC[type: Type] RETURNS [ans: BOOL] = TRUSTED { stb: SymbolTableBase; sei: SymbolIndex; [stb, sei] _ GetTypeSymbols[type]; { ENABLE UNWIND => ReleaseSTB[stb]; WITH stb SELECT FROM t: SymbolTableBase.x => WITH ser: t.e.seb[t.e.UnderType[NARROW[sei, SymbolIndex.x].e]] SELECT FROM long => ans _ WITH rse: t.e.seb[t.e.UnderType[ser.rangeType]] SELECT FROM ref => rse.ordered, enumerated => rse.ordered, basic => rse.ordered, ENDCASE => ERROR Error[reason: typeFault, type: type]; ref => ans _ ser.ordered; enumerated => ans _ ser.ordered; basic => ans _ ser.ordered; ENDCASE => ERROR Error[reason: typeFault, type: type]; t: SymbolTableBase.y => WITH ser: t.e.seb[t.e.UnderType[NARROW[sei, SymbolIndex.y].e]] SELECT FROM long => ans _ WITH rse: t.e.seb[t.e.UnderType[ser.rangeType]] SELECT FROM ref => rse.ordered, enumerated => rse.ordered, basic => rse.ordered, ENDCASE => ERROR Error[reason: typeFault, type: type]; ref => ans _ ser.ordered; enumerated => ans _ ser.ordered; basic => ans _ ser.ordered; ENDCASE => ERROR Error[reason: typeFault, type: type]; ENDCASE => ERROR; }; ReleaseSTB[stb]; }; IsMachineDependent: PUBLIC SAFE PROC [type: Type--record, structure, union, enumerated, sequence--] RETURNS[ans: BOOL] = TRUSTED { stb: SymbolTableBase; sei: SymbolIndex; [stb, sei] _ GetTypeSymbols[type]; { ENABLE UNWIND => ReleaseSTB[stb]; WITH stb SELECT FROM t: SymbolTableBase.x => WITH ser: t.e.seb[t.e.UnderType[NARROW[sei, SymbolIndex.x].e]] SELECT FROM union => ans _ ser.machineDep; definition => ans _ FALSE; enumerated => ans _ ser.machineDep; record => ans _ ser.machineDep; sequence => ans _ ser.machineDep; ENDCASE => ERROR Error[reason: typeFault, type: type]; t: SymbolTableBase.y => WITH ser: t.e.seb[t.e.UnderType[NARROW[sei, SymbolIndex.y].e]] SELECT FROM union => ans _ ser.machineDep; definition => ans _ FALSE; enumerated => ans _ ser.machineDep; record => ans _ ser.machineDep; sequence => ans _ ser.machineDep; ENDCASE => ERROR Error[reason: typeFault, type: type]; ENDCASE => ERROR; }; ReleaseSTB[stb]; }; SelectBasicClass: PROC[brand: Brand, code: [0..16)] RETURNS[Class] = { SELECT brand FROM x => SELECT code FROM bx.typeCodeForINT => RETURN[integer]; bx.typeCodeForCHAR => RETURN[character]; ENDCASE => ERROR; y => SELECT code FROM by.typeCodeForINT => RETURN[integer]; by.typeCodeForCHAR => RETURN[character]; ENDCASE => ERROR; ENDCASE => ERROR; }; END. üAMTypesBImpl.Mesa NOTE do Equal, AsGoodAs try to avoid acquisition of already acquired symbol tables status stuff is wrong. Paul Rovner, November 16, 1983 8:39 pm Russ Atkinson, May 11, 1984 2:09:21 pm PDT T Y P E S must be the same as the return type of BitsForType P U B L I C P R O C E D U R E S max for unions Could overflow! check for argument records and interface records check for argument records and interface records the Type itself is the color. Record and enumerated types are painted. ÊN˜šœ™šœ™Jšœ:™:Jšœ™—Jšœ&™&Jšœ*™*J˜—šÏk ˜ Jšœœ;˜HJšœœ˜šœ˜Jšœv˜v—šœ˜Jšœv˜v—Jšœœœ˜Jšœ œ˜%šœ ˜J˜M—šœ ˜J˜I—Jšœ œ˜-Jšœ œG˜UJšœœ˜Jšœ œ@˜QJ˜—šœ˜JšœA˜HJšœ˜šœœ˜ Jšœu˜uJ˜——šœ ™ šœœ˜Jšœœœ#œ˜—šœœ'œ˜Bšœ ˜ šœœœ˜šœ+˜1Jšœ-˜-——˜#J˜)——Jšœœ˜—J˜—J˜—Jšœ˜ ——Jšœ˜—J˜#Jšœ˜Jšœ˜—šœ˜Jšœœ˜!Jšœ0œ˜NJ˜Jšœ0™0šœœ˜#˜ šœ œ˜šœH˜KJšœ˜"JšœœE˜NJšœ˜—Jš œœœœœ˜CJšœœ ˜Jšœ˜——˜ šœœ,œœ˜Lšœœœ˜Jšœœ˜>Jšœ œœ"˜;Jšœœ˜—J˜3J˜Jšœœ ˜Jšœ˜——JšœŸ*˜4J˜—šœ˜Jšœœ&˜=˜J˜ J˜J˜,šœ˜˜ J˜J˜J˜%šœœœ˜#˜ Jšœœ6˜>—šœœ'œ˜Bšœ ˜ šœœœ˜šœ+˜1Jšœ-˜-——˜$J˜)——Jšœœ˜—J˜—J˜—Jšœ˜ ——Jšœ˜—J˜#Jšœ˜JšœŸ˜—Jšœœ˜J˜Jšœ˜J˜Jšœ œœ(˜;JšœŸ ˜J˜——šž œœœœ œœœ˜FJšœF™Fšœœ˜-Jšœœ˜Jšœœ˜—šœ˜J˜——š ž œœœœ œœ˜GJ˜J˜J˜J˜Jšœœ˜ šœ˜Jšœ œ ˜Jšœ œ˜Jšœ œ˜Jšœœ˜"Jšœ˜—J˜,J˜Jš œ œœœœ ˜AJ˜J˜"Jšœœœ˜#˜Jšœœœœ ˜<šœ+œœ˜8Jšœ+œ˜8Jšœœœ ˜ —šœœ˜˜J˜šœœœœ˜KJ˜'Jšœ œ œœ ˜6J˜J˜ J˜J˜J˜J˜J˜Jš œœ œ œœœ ˜>J˜˜šœœ-œ˜=šœœ ˜šœœ ˜Jšœ˜ šœœ(œ˜<˜ šœœ˜7Jšœœ˜——Jšœ˜——Jšœœ œ œ˜8—Jš œ œœ œœ˜GJ˜˜ šœœ.œ˜>šœ œœ˜=Jšœ œœ˜Jšœœœ˜—Jšœœ˜——Jšœœ˜——J˜˜ šœœ-œ˜=šœ œœ˜J˜˜šœœ-œ˜=šœœ ˜šœœ ˜Jšœ˜ šœœ(œ˜<˜ šœœ˜7Jšœœ˜——Jšœ˜——Jšœœ œ œ˜8—Jš œ œœ œœ˜GJ˜˜ šœœ.œ˜>šœ œœ˜=Jšœ œœ˜Jšœœœ˜—Jšœœ˜——Jšœœ˜——J˜˜ šœœ-œ˜=šœ œœ˜Jšœœœ˜J˜J˜J˜"šœœœ˜#šœœ˜˜šœœœ˜JJ˜Jšœœ˜J˜#J˜J˜!Jšœœ&˜6——˜šœœœ˜JJ˜Jšœœ˜J˜#J˜J˜!Jšœœ&˜6——Jšœœ˜—J˜—J˜˜J˜——šžœœœ ˜Fšœ˜šœœ˜Jšœœ ˜%Jšœœ ˜(Jšœœ˜—šœœ˜Jšœœ ˜%Jšœœ ˜(Jšœœ˜—Jšœœ˜—J˜J˜—Jšœ˜J˜J˜J˜—…—I¸c