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], TypeHash USING [TypeKey], TypeStrings USING[TypeString]; RTTypesBasicPrivate: DEFINITIONS = BEGIN MapTiTd: TMapTiTd; -- The Runtime Type Table: maps SafeStorage.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: SafeStorage.Type _ SafeStorage.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: SafeStorage.Type, -- a back pointer(logically) typekey: TypeHash.TypeKey, extension: PTypeExtension _ NIL -- LOOPHOLE ]; SymbolAccess: TYPE = RECORD[ sti: SymbolTableIndex _ 0, sei: RTSymbolDefs.SymbolIndex _ RTSymbolDefs.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 = 4000B; 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: RTSymbolDefs.SymbolTableHandle _ RTSymbolDefs.nullHandle ]; TypeStructure: TYPE = TypeStrings.TypeString; UniqueTypeFinger: TYPE = RECORD[ umid: TimeStamp.Stamp, -- of original defining module seIndex: RTSymbolDefs.SymbolIndex -- type seIndex therein ]; useCanonicalTypeMicroCode: BOOL; -- exported variable GetLastTypeIndex: PROC RETURNS[SafeStorage.TypeIndex]; NumberPackageRefs: PROC[type: SafeStorage.Type] RETURNS[NAT] = INLINE { RETURN[MapTiTd[type].numberPackageRefs]; }; MapTiRcmx: PROC[ti: SafeStorage.TypeIndex] RETURNS[RCMap.Index] = INLINE { RETURN[MapTiTd[ti].rcmx]; }; PutForFinalization: PROC[type: SafeStorage.Type, ref: REF ANY] RETURNS[done: BOOLEAN]; AssignComposite: PROC[rhs, lhs: LONG POINTER, type: SafeStorage.Type, nwords: CARDINAL]; AssignCompositeNew: PROC[rhs, lhs: LONG POINTER, type: SafeStorage.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: SafeStorage.Type]; AcquireTypeForLoader: PROC[utf: UniqueTypeFinger, std: STDesc, sei: RTSymbolDefs.SymbolIndex, ts: TypeStrings.TypeString, rcmi: RCMap.Index, canonicalize: BOOLEAN _ FALSE, initializing: BOOL _ FALSE -- TRUE => create MapStiStd entry from uncounted storage ] RETURNS[SafeStorage.Type]; MakeNewType: PROC[utf: UniqueTypeFinger, std: STDesc, sei: RTSymbolDefs.SymbolIndex, ts: TypeStrings.TypeString, rcmx: RCMap.Index, canonicalize: BOOLEAN _ FALSE, initializing: BOOLEAN _ FALSE, -- i.e. create MapStiStd entry from uncounted storage type: SafeStorage.Type _ SafeStorage.nullType] RETURNS[SafeStorage.Type]; FindSTI: PROC[std: STDesc, initializing: BOOL _ FALSE] RETURNS[i: SymbolTableIndex]; BlessMapStiStd: PROC; -- copy initial (uncounted) MapStiStd to counted storage FindCanonicalPTD: PROC[ts: TypeStrings.TypeString] RETURNS[ptd: PTypeDesc]; FindPTD: PROC[utf: UniqueTypeFinger, ts: TypeStrings.TypeString _ NIL] RETURNS[ptd: PTypeDesc]; Enter: PROC[inner: PROC]; NotImplemented: ERROR[msg: Rope.ROPE]; END. CHANGE LOG 0RTTypesBasicPrivate.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Paul Rovner, June 17, 1983 8:35 am Richard Koo, July 4, 1984 11:06:00 am PDT Russ Atkinson (RRA) February 1, 1985 12:38:55 pm PST Beach, February 22, 1985 3:02:36 pm PST Doug Wyatt, February 24, 1985 8:51:25 pm PST 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 initializing = TRUE => create MapStiStd entry from uncounted storage Errors Changes made by Koo on July 4, 1984 11:06:16 am PDT The type of ts in TypeDesc is changed from TypeStrings.TypeString to TypeHash.TypeKey and the arguments to FindCanonicalPTD, FindPTD, and MakeNewType are changed to reflect the change in TypeDesc. Κέ˜codešœ™Kšœ Οmœ1™˜PKšœ žœ˜Kšœ žœ ˜Kšœ žœ ˜—K˜KšΠblœž œ˜!Kšœž˜headšœ™KšœΟcA˜TKš œ žœžœžœ žœžœ ˜AKš œ žœžœžœžœ ˜*Kš œ žœžœžœžœ ˜+K˜š œ žœžœž œžœ˜*Kšœ˜Kšœ9 %˜^Kšœ žœžœ˜Kšœžœ '˜CKšœ$˜$Kšœ žœžœ˜,Kšœ˜Kšœ˜Kšœžœ .˜EKšœ˜Kšœ ˜6Kšœ˜Kšœžœ  ˜+Kšœ˜—K˜šœžœžœ˜Kšœ˜Kšœ<˜Kšœžœžœ˜Kšœ žœžœž˜Kšœ˜—K™Kšœ"™"Kšœ C˜ZKšœ žœžœ ˜"Kš œ žœžœžœžœ ˜NK˜Kš œžœžœžœžœ˜@šœžœžœ˜#Kšœžœžœ ˜4—Kšœžœ ˜&K™Kšœ žœžœ˜Kš œ žœžœžœžœ˜'šœžœžœ˜Kšœ˜Kšœžœ˜Kšœ&˜&Kšœ=˜=Kšœ˜šœX™XKšœžœ{™…Kšœž™žKšœ•™•—K˜—K˜Kšœžœ˜-K™šœ žœ=™OK™—šœžœžœ˜ Kšœ ˜5Kšœ! ˜9Kšœ˜K˜—Kšœžœ ˜5—šœ ™ šΟnœžœžœ˜6K˜—š ’œžœžœžœžœ˜GKšžœ"˜(Kšœ˜K˜—š’ œžœžœžœ˜JKšžœ˜Kšœ˜K˜—š ’œžœžœžœžœžœ˜VK˜—š ’œžœ žœžœ#žœ˜YK˜—š ’œžœ žœžœ#žœ˜\K˜—š ’œžœ žœžœ ˜EK˜—š’œžœžœžœžœžœžœ˜PK˜—š’ œžœžœžœ žœ žœžœ˜IK˜—š’ œžœžœžœžœžœžœ˜RK˜—š’ œžœžœ ˜#K˜—š’œžœ˜0K˜—š’œžœžœ žœžœžœžœžœžœžœžœžœ ‘ 2œžœ˜žK™—K™Kšœ™š’ œžœžœ žœžœžœžœžœžœžœžœžœ 5žœ.žœ˜ΑK˜—š ’œžœžœžœžœ˜TKšœžœ2™EK˜—š’Πbn œžœ 8˜OK˜—š’œžœžœ˜KK˜—š’œžœ5žœžœ˜_K˜—š’œžœžœ˜K˜——šœ™Kšœžœ žœ˜&—K˜Kšžœ˜K˜šžœž˜ K˜šœ3™3Kšœk’œ’œ’ œ0™Ε—K˜K˜K˜K˜K˜K˜K˜K˜K˜K™—K˜—…—ΚΧ