-- SymsHot.Mesa Edited by: -- Bruce September 11, 1980 11:23 AM -- Sandman July 18, 1980 8:50 AM DIRECTORY DSymOps USING [AddItem, AttachSyms], DSyms USING [GFHandle, HTIndex, Item, MDIndex, NoFGT], Frames, Gf USING [Check, Frame], Lookup USING [Fail, HTIndex, HtiToString], MachineDefs USING [GFHandle], Symbols USING [HTIndex, HTNull, MDIndex, MDNull, MDRecord, mdType, OwnMdi], SymbolTable USING [Missing], Table USING [Base, Bounds]; SymsHot: PROGRAM IMPORTS DSymOps, DSyms, Frames, Gf, Lookup, SymbolTable, Table EXPORTS DSymOps, DSyms = BEGIN OPEN DSymOps, DSyms, MachineDefs; Shared: PUBLIC SIGNAL = CODE; Head: PUBLIC Item _ NIL; ZeroMdi: ERROR = CODE; SymbolTableProblem: ERROR = CODE; Enumerate: PUBLIC PROC [proc: PROCEDURE [Item] RETURNS [BOOLEAN]] RETURNS [syms: Item] = BEGIN last: Item; FOR syms _ Head, syms.link UNTIL syms = NIL DO IF proc[syms] THEN BEGIN IF syms = Head THEN RETURN; last.link _ syms.link; syms.link _ Head; Head _ syms; RETURN END; last _ syms; ENDLOOP; END; FindMod: PUBLIC PROC [name: HTIndex] RETURNS [Item] = BEGIN OPEN Symbols; mdb: Table.Base; length: CARDINAL; mdi: MDIndex; [mdb,length] _ Table.Bounds[Symbols.mdType]; FOR mdi _ OwnMdi, mdi+SIZE[MDRecord] UNTIL LOOPHOLE[mdi,CARDINAL] = length DO IF mdb[mdi].moduleId = name THEN RETURN[FindMdi[mdi]]; ENDLOOP; RETURN[NIL]; END; FindMdi: PUBLIC PROC [mdi: MDIndex] RETURNS [Item] = BEGIN Find: PROC [d: Item] RETURNS[BOOLEAN] = BEGIN WITH sym: d SELECT FROM hash => RETURN[FALSE]; mod => IF mdi # sym.mdi THEN RETURN[FALSE] ELSE {IF sym.shared THEN ERROR Shared; RETURN[TRUE]}; ENDCASE => ERROR; END; RETURN[Enumerate[Find]]; END; FindFrame: PUBLIC PROC [gf: MachineDefs.GFHandle] RETURNS [i: Item] = BEGIN Find: PROC [d: Item] RETURNS[BOOLEAN] = {RETURN[gf = d.gf]}; RETURN[Enumerate[Find]]; END; ModuleMdi: PUBLIC PROC [hti: HTIndex, fgt: BOOLEAN _ FALSE] RETURNS [MDIndex] = BEGIN syms: Item; gf: GFHandle _ NIL; mod: STRING _ [40]; Lookup.HtiToString[hti,mod]; gf _ Gf.Frame[mod ! Lookup.Fail => CONTINUE]; IF (syms _ FindMod[hti]) = NIL THEN BEGIN IF gf = NIL THEN {AttachSyms[gf,mod]; syms _ FindMod[hti]} ELSE syms _ AddItem[hti,gf]; END; SetSegment[syms,fgt]; WITH syms SELECT FROM mod => IF mdi = LOOPHOLE[0] THEN ERROR ZeroMdi ELSE RETURN[mdi]; ENDCASE => ERROR SymbolTable.Missing[NIL]; END; SetUp: PROC [gf: GFHandle, fgt: BOOLEAN _ FALSE] RETURNS [syms: Item] = BEGIN Gf.Check[gf]; IF (syms _ FindFrame[gf]) = NIL THEN syms _ AddItem[Symbols.HTNull,gf]; SetSegment[syms,fgt]; END; GFrameMdi: PUBLIC PROC [gf: GFHandle, fgt: BOOLEAN _ FALSE] RETURNS [MDIndex] = BEGIN syms: Item = SetUp[gf,fgt]; WITH syms SELECT FROM mod => IF mdi = LOOPHOLE[0] THEN ERROR ZeroMdi ELSE RETURN[mdi]; ENDCASE => ERROR SymbolTable.Missing[NIL]; END; Stopping: PUBLIC PROC [gf: GFHandle, fgt: BOOLEAN _ FALSE] RETURNS [BOOLEAN] = BEGIN syms: Item = SetUp[gf,fgt]; RETURN[syms.stopping]; END; CrossJumped: PUBLIC PROC [gf: GFHandle, fgt: BOOLEAN _ FALSE] RETURNS [BOOLEAN] = BEGIN syms: Item = SetUp[gf,fgt]; RETURN[syms.crossJumped]; END; GFrameHti: PUBLIC PROC [gf: GFHandle, fgt: BOOLEAN _ FALSE] RETURNS [HTIndex] = BEGIN mdi: MDIndex _ Symbols.MDNull; i: Item; mdi _ GFrameMdi[gf,fgt !SymbolTable.Missing => CONTINUE]; IF mdi # Symbols.MDNull THEN RETURN[Table.Bounds[Symbols.mdType].base[mdi].moduleId]; i _ FindFrame[gf]; WITH i SELECT FROM hash => RETURN[hti]; ENDCASE => ERROR SymbolTableProblem; END; SetSegment: PUBLIC PROC [syms: Item, fgt: BOOLEAN] = BEGIN IF ~fgt OR syms.fgtAvailable THEN RETURN; WITH syms SELECT FROM hash => ERROR SymbolTable.Missing[NIL]; mod => ERROR NoFGT; ENDCASE; END; END.