<> <> <> DIRECTORY PrincOps USING[SD], RTSD USING[sMapStiStd], RTSymbolDefs USING[nullHandle], RTTypesBasicPrivate USING[STDesc, SymbolTableIndex, InitialSTIRangeSize, MapStiStd, LOOPHOLEDTMapStiStd, RSTDesc, RMapStiStd], SafeStorage USING[TypeIndex], UnsafeStorage USING[GetSystemUZone]; SymbolAccessImpl: MONITOR -- protects MapStiStd IMPORTS RTTypesBasicPrivate, UnsafeStorage EXPORTS RTTypesBasicPrivate = BEGIN OPEN RTTypesBasicPrivate, SafeStorage; lastSTIndex: TypeIndex _ 0; TooManyTypes: ERROR = CODE; BlessMapStiStd: PUBLIC ENTRY PROC = { ENABLE UNWIND => NULL; t: LOOPHOLEDTMapStiStd = LOOPHOLE[MapStiStd]; LOOPHOLE[MapStiStd, LOOPHOLEDTMapStiStd] _ NIL; MapStiStd _ NEW[RMapStiStd[InitialSTIRangeSize]]; FOR i: SymbolTableIndex IN [1..lastSTIndex] DO MapStiStd[i] _ NEW[STDesc _ t[i]^] ENDLOOP; LOOPHOLE[LONG[@PrincOps.SD[RTSD.sMapStiStd]], LONG POINTER TO LONG POINTER]^ _ LOOPHOLE[MapStiStd, LONG POINTER]; }; FindSTI: PUBLIC ENTRY PROC[std: STDesc, initializing: BOOL] RETURNS[i: SymbolTableIndex] = { ENABLE UNWIND => NULL; FOR i IN [1..lastSTIndex] DO IF MapStiStd[i].symbolsStamp = std.symbolsStamp AND (std.bcd = NIL OR std.sgi = MapStiStd[i].sgi) THEN { IF MapStiStd[i].sth = RTSymbolDefs.nullHandle THEN { IF initializing THEN LOOPHOLE[MapStiStd, LOOPHOLEDTMapStiStd][i].sth _ std.sth ELSE MapStiStd[i].sth _ std.sth; }; RETURN[i]; }; ENDLOOP; IF lastSTIndex = InitialSTIRangeSize - 1 THEN ERROR TooManyTypes; i _ lastSTIndex _ lastSTIndex + 1; IF initializing THEN LOOPHOLE[MapStiStd, LOOPHOLEDTMapStiStd][i] _ UnsafeStorage.GetSystemUZone[].NEW[STDesc _ std] ELSE MapStiStd[i] _ NEW[STDesc _ std]; }; END.