-- NameImpl.Mesa Edited by: Johnsson July 18, 1980 10:43 AM
DIRECTORY
BcdDefs USING [MTIndex],
BcdOps USING [BcdBase, MTHandle, NameString, ProcessModules],
DebugUsefulDefs USING [UserAborted],
DLoadState USING [Acquire, AcquireBcd, MapRealToConfig, ReleaseBcd, Release],
Strings USING [AppendSubString, SubStringDescriptor],
Frames USING [Invalid],
Gf USING [GFI, Handle, Original],
MachineDefs USING [ConfigIndex, GFHandle, GFTIndex, NullConfig],
UserInput USING [userAbort];
NameImpl: PROGRAM
IMPORTS
BcdOps, DebugUsefulDefs, Strings, Frames, Gf, DLoadState, UserInput
EXPORTS DebugUsefulDefs =
BEGIN OPEN Gf, MachineDefs;
Name: PUBLIC PROCEDURE [name: STRING, gf: MachineDefs.GFHandle ← NIL] =
BEGIN
config: ConfigIndex;
cgfi: GFTIndex;
ssb: BcdOps.NameString;
bcd: BcdOps.BcdBase;
FindModule: PROC [mth: BcdOps.MTHandle, mti: BcdDefs.MTIndex] RETURNS [BOOLEAN] =
BEGIN
ssd: Strings.SubStringDescriptor;
IF cgfi IN [mth.gfi..mth.gfi+mth.ngfi) THEN {
ssd ← [base: @ssb.string, offset: mth.name, length: ssb.size[mth.name]];
Strings.AppendSubString[name, @ssd];
RETURN[TRUE]};
IF UserInput.userAbort THEN SIGNAL DebugUsefulDefs.UserAborted;
RETURN[FALSE]
END;
[] ← DLoadState.Acquire[];
[cgfi,config] ← DLoadState.MapRealToConfig[Gf.GFI[Gf.Original[gf]]];
IF config = NullConfig THEN {
DLoadState.Release[]; ERROR Frames.Invalid[gf]};
bcd ← DLoadState.AcquireBcd[config];
ssb ← LOOPHOLE[bcd+bcd.ssOffset];
[] ← BcdOps.ProcessModules[bcd, FindModule ! UNWIND => Cleanup[bcd]];
Cleanup[bcd];
END;
Cleanup: PROC [bcd: BcdOps.BcdBase] =
{DLoadState.ReleaseBcd[bcd]; DLoadState.Release[]};
END.