-- FindProcImpl.mesa -- Sweet, 6-Oct-83 16:59:47 DIRECTORY FindProc MFile USING [Handle]; FindProc: PROGRAM IMPORTS LoadState EXPORTS FindProc = { Lookup: PUBLIC PROC [ gFrame: LONG POINTER, procName: LONG STRING, objectFile: MFile.Handle _ NIL] RETURNS [p: PROCEDURE = { procSS: String.SubStringDescriptor _ [ base: procName, offset: 0, length: procName.length]; bcd: BcdOps.BcdBase; info: LoadStateFormat.ModuleInfo; frame: PrincOps.GlobalFrameHandle _ SpecialRuntime.GlobalFrameFromProgram[gFrame]; loadState: LoadStateFormat.Handle; bcdInfo: LoadState.LPBcdInfoTable _ NIL; link: PrincOps.ControlLink; mtb, enb, sgb, ftb: Table.Base; mti: BcdDefs.MTIndex; mth: BcdOps.MTHandle; ssb: LONG POINTER TO BcdDefs.PackedString; ep: CARDINAL; fileName: STRING _ [60]; fileVersion: BcdDefs.VersionStamp; symsBase, symsPages: CARDINAL; BEGIN -- make bcdInfo visible in exits Runtime.ValidateGlobalFrame[frame ! Runtime.InvalidFrame => GO TO notFound]; [loadState, bcdInfo] _ LoadState.LockBcdInfo[]; BEGIN ENABLE UNWIND => IF bcdInfo # NIL THEN LoadState.UnlockBcdInfo[]; info _ LoadState.GetModuleInfo[frame]; bcd _ bcdInfo[info.index].base; mtb _ bcd + bcd.mtOffset; sgb _ bcd + bcd.sgOffset; ftb _ bcd + bcd.ftOffset; ssb _ LOOPHOLE[bcd + bcd.ssOffset]; mti _ BcdDefs.MTIndex.FIRST + (info.cgfi - 1) * BcdDefs.MTRecord.SIZE; mth _ @mtb[mti]; fileVersion _ ftb[mth.file].version; AppendName[fileName, ssb, ftb[sgb[mth.sseg].file].name ! String.StringBoundsFault => GO TO notFound]; symsBase LoadState.UnlockBcdInfo[]; info _ LoadState.GetModuleInfo[frame]; bcd _ bcdInfo[info.index].base; enb _ bcd + bcd.enOffset; END; -- ENABLE UNWIND IF bcdInfo # NIL THEN LoadState.UnlockBcdInfo[]; RETURN [LOOPHOLE[link]]; EXITS notFound => {IF bcdInfo # NIL THEN LoadState.UnlockBcdInfo[]; RETURN [NIL]}; END; -- make bcdInfo visible in exits }; SubStringForName: PROC [ ss: String.SubString, ssb: LONG POINTER TO BcdDefs.PackedString, name: BcdDefs.NameRecord] = { ss.base _ @ssb.string; ssb.offset _ name; ssb.length _ ssb.size[name]}; AppendName: PROC [ str: LONG STRING, ssb: LONG POINTER TO BcdDefs.PackedString, name: BcdDefs.NameRecord] = { desc: String.SubStrinDescriptor; SubStringForName[@desc, ssb, name]; String.AppendSubString[str, @desc]}; }.