DIRECTORY BcdDefs USING[SGIndex, SGNull, BcdBase], RCMap USING[Index, nullIndex, Limit], Rope USING[ROPE], SafeStorage USING[TypeIndex, Type, nullType], RTSymbolDefs USING[SymbolTableHandle, nullHandle, SymbolIndex, nullSymbolIndex], TimeStamp USING[Stamp], TypeStrings USING[TypeString]; RTTypesBasicPrivate: DEFINITIONS = BEGIN OPEN SafeStorage, RTSymbolDefs; MapTiTd: TMapTiTd; -- The Runtime Type Table: maps TypeIndex to TypeDesc RMapTiTd: TYPE = RECORD[ptds: SEQUENCE length: NAT OF PTypeDesc]; TMapTiTd: TYPE = LONG POINTER TO RMapTiTd; PTypeDesc: TYPE = LONG POINTER TO TypeDesc; TypeDesc: TYPE = MACHINE DEPENDENT RECORD [ equivalentTypePad: [0..3] _ 0, equivalentType: Type _ nullType, -- nullType means not "canonicalized" finalized: BOOL _ FALSE, numberPackageRefs: NAT _ 0, -- ucode does not depend on stuff below rcmx: RCMap.Index _ RCMap.nullIndex, fill: [0..LAST[CARDINAL]/RCMap.Limit] _ 0, utf: UniqueTypeFinger, symbolAccess: SymbolAccess, next: PTypeDesc _ NIL, -- link in list of types with the same ts hash myTypePad: [0..3] _ 0, myType: Type, -- a back pointer(logically) typeStructure: TypeStructure, extension: PTypeExtension _ NIL -- LOOPHOLE ]; SymbolAccess: TYPE = RECORD[ sti: SymbolTableIndex _ 0, sei: SymbolIndex _ nullSymbolIndex ]; SymbolTableIndex: TYPE = NAT; -- index into MapStiStd PTypeExtension: TYPE = LONG POINTER TO TypeExtension; -- LOOPHOLE RTypeExtension: TYPE = REF TypeExtension; TypeExtension: TYPE = RECORD [ next: RTypeExtension, -- link in the list of them; stay honest finalizationSet: REF _ NIL, attachment: REF ANY _ NIL ]; MapStiStd: TMapStiStd; -- The map from SymbolTableIndex to STDesc. DELICATE intialization. TMapStiStd: TYPE = REF RMapStiStd; RMapStiStd: TYPE = RECORD[stiv: SEQUENCE length: SymbolTableIndex OF RSTDesc]; LOOPHOLEDTMapStiStd: TYPE = LONG POINTER TO LOOPHOLEDRMapStiStd; LOOPHOLEDRMapStiStd: TYPE = RECORD[stiv: SEQUENCE length: SymbolTableIndex OF PSTDesc]; InitialSTIRangeSize: CARDINAL = 1000B; RSTDesc: TYPE = REF STDesc; PSTDesc: TYPE = LONG POINTER TO STDesc; STDesc: TYPE = RECORD [ symbolsStamp: TimeStamp.Stamp, bcd: BcdDefs.BcdBase _ NIL, sgi: BcdDefs.SGIndex _ BcdDefs.SGNull, sth: SymbolTableHandle _ nullHandle ]; TypeStructure: TYPE = TypeStrings.TypeString; UniqueTypeFinger: TYPE = RECORD[ umid: TimeStamp.Stamp, -- of original defining module seIndex: SymbolIndex]; -- type seIndex therein useCanonicalTypeMicroCode: BOOL; -- exported variable GetLastTypeIndex: PROC RETURNS[TypeIndex]; NumberPackageRefs: PROC[type: Type] RETURNS[NAT] = INLINE{RETURN[MapTiTd[type].numberPackageRefs]}; MapTiRcmx: PROC[ti: TypeIndex] RETURNS[RCMap.Index] = INLINE{RETURN[MapTiTd[ti].rcmx]}; PutForFinalization: PROC[type: Type, ref: REF ANY] RETURNS[done: BOOLEAN]; AssignComposite: PROC[rhs, lhs: LONG POINTER, type: Type, nwords: CARDINAL]; AssignCompositeNew: PROC[rhs, lhs: LONG POINTER, type: Type, nwords: CARDINAL]; FreeCollectibleObject: PROC[refObj: REF ANY]; -- nilifies REFs within MapRefs: PROC[ptr: LONG POINTER, rcmx: RCMap.Index, procLeaf: PROC[p: REF ANY]]; MapRefOffsets: PROC[ref: REF ANY, procLeaf: PROC[offset: LONG CARDINAL]]; DoFREEify: PROC[ptr: LONG POINTER, rcmx: RCMap.Index, procLeaf: PROC[p: REF ANY]]; GetMapTiTd: PROC RETURNS[TMapTiTd]; NotifyAtomRecType: PROC[type: Type]; AcquireTypeForLoader: PROC[ utf: UniqueTypeFinger, std: STDesc, sei: SymbolIndex, ts: TypeStructure, rcmi: RCMap.Index, canonicalize: BOOLEAN _ FALSE, initializing: BOOL _ FALSE -- TRUE => create MapStiStd entry from uncounted storage ] RETURNS[Type]; MakeNewType: PROC[ utf: UniqueTypeFinger, std: STDesc, sei: SymbolIndex, ts: TypeStructure, rcmx: RCMap.Index, canonicalize: BOOLEAN _ FALSE, initializing: BOOLEAN _ FALSE, type: Type _ nullType] RETURNS[Type]; FindSTI: PROC[std: STDesc, initializing: BOOL _ FALSE] RETURNS[i: SymbolTableIndex]; BlessMapStiStd: PROC; -- copy initial (uncounted) MapStiStd to counted storage FindCanonicalPTD: PROC[ts: TypeStructure] RETURNS[ptd: PTypeDesc]; FindPTD: PROC[utf: UniqueTypeFinger, ts: TypeStructure _ NIL] RETURNS[ptd: PTypeDesc]; Enter: PROC[inner: PROC]; NotImplemented: ERROR[msg: Rope.ROPE]; END. †RTTypesBasicPrivate.Mesa last edited June 17, 1983 8:35 am by Paul Rovner Types Access to symbol table information A STDesc describes options for finding the bits of a particular symbol table as follows: If bcd=NIL, the symbolsStamp identifies a compiler-created .bcd file with version=symbolsStamp, and sth is a valid SymbolTableHandle. else if sgi # SGNull, the symbolsStamp matches a (possibly composite) .bcd or .symbols file version stamp, and the sgi identifies the symbol table within bcd. else if sgi = SGNull, the symbolsStamp matches an entry in bcd's file table, which identifies a compiler-created .bcd file with version=symbolsStamp. support for NARROW and runtime type-equivalence determination: canonical types. Procedures for supporting RTTypes i.e., create MapStiStd entry from uncounted storage initializing = TRUE => create MapStiStd entry from uncounted storage ERRORs Κ˜Jšœ™Jšœ0™0J˜šΟk ˜ Jšœœ˜(Jšœœ˜%Jšœœœ˜Jšœ œ˜-Jšœ œ>˜PJšœ œ˜Jšœ œ ˜—J˜Jšœ œ˜!Jšœœœ˜'J™Jšœ™™JšœΟc5˜IJš œ œœœ œœ ˜AJš œ œœœœ ˜*Jš œ œœœœ ˜+J˜š œ œœ œœ˜+Jšœ˜Jšœ"ž%˜GJšœ œœ˜Jšœœž'˜EJšœ$˜$Jšœ œœ˜,Jšœ˜Jšœ˜Jšœœž.˜FJšœ˜Jšœž˜1Jšœ˜Jšœœž ˜,Jšœ˜—J˜šœœœ˜Jšœ˜Jšœ"˜"Jšœ˜—Jšœœœž˜6J˜Jš œœœœœž ˜BJšœœœ˜)šœœœ˜Jšœž(˜?Jšœœœ˜Jšœ œœ˜Jšœ˜—J™Jšœ"™"JšœžC˜ZJšœ œœ ˜"Jš œ œœœœ ˜NJ˜Jš œœœœœ˜@šœ˜Jšœœœœ ˜=—Jšœœ ˜&™šœX™XJšœ…™…Jšœž™žJšœ•™•——Jšœ œœ˜Jš œ œœœœ˜'šœœœ˜Jšœ˜Jšœœ˜Jšœ&˜&Jšœ#˜#Jšœ˜—J˜Jšœœ˜-JšœO™OJ˜šœœœ˜ Jšœž˜5Jšœž˜/J˜—Jšœœž˜6—J˜J˜Jšœ ™ ˜JšΟnœœœ ˜*J˜šŸœœ œœ˜3Jšœœ#˜0—J˜šŸ œœœ˜6Jšœœ˜!—J˜Jš Ÿœœœœœœ˜JJ˜Jš Ÿœœ œœœ˜LJ˜Jš Ÿœœ œœœ˜OJ˜Jš Ÿœœ œœž˜FJ˜JšŸœœœœœœœ˜PJ˜JšŸ œœœœ œ œœ˜IJ˜JšŸ œœœœœœœ˜RJ˜JšŸ œœœ ˜#J˜JšŸœœ ˜$J˜šŸœœ˜Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœœœ˜Jšœœœž8˜TJšœ˜Jšœ˜—J™Jšœ™šŸ œœ˜Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœœœ˜Jšœœœ˜Jšœ3™3Jšœ˜Jšœ˜—J˜š Ÿœœœœœ˜TJšœE™E—J˜JšŸΠbn œœž8˜OJ˜JšŸœœœ˜BJ˜JšŸœœ,œœ˜VJ˜JšŸœœœ˜—˜šœ™Jšœœ œ˜&Iproc˜——Jšœ˜J˜J˜—…—di