-- 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.