-- CGenDebugLabels.mesa Edited by Sweet, October 14, 1980 4:32 PM
DIRECTORY
AllocDebugDefs USING [TableBase],
CGenDebugDefs USING [LabelStack],
CodeDefs USING [LabelInfoIndex, LabelInfoNull, LabelInfoRecord],
DebugUsefulDefs USING [ShortCopyREAD],
RESOut USING [
Log10, PChar, PCr, PDecimal, PNext, PNextNull, PNextUnsigned, PString,
PUnsigned],
STDebugDefs USING [PSTSubString, showLinks, SubStringForHash],
StringDefs USING [
AppendChar, AppendDecimal, AppendString, SubStringDescriptor],
Table USING [Base];
CGenDebugLabels: PROGRAM
IMPORTS
AllocDebugDefs, STDebugDefs, CGenDebugDefs, DebugUsefulDefs, RESOut,
StringDefs
EXPORTS CGenDebugDefs =
BEGIN OPEN STDebugDefs, CodeDefs, CGenDebugDefs, AllocDebugDefs, RESOut;
PutAsLabelInfoIndex: PUBLIC PROCEDURE [lii: CodeDefs.LabelInfoIndex] =
BEGIN
lir: LabelInfoRecord;
cb: Table.Base ← TableBase[];
DebugUsefulDefs.ShortCopyREAD[
to: @lir,
from: @cb[lii],
nwords: SIZE[LabelInfoRecord]];
PCr[]; PString["cb["L];
PDecimal[LOOPHOLE[lii]];
PString["] = "L];
IF lir.free THEN
BEGIN
PString["FREE!"L];
RETURN
END;
PString["level: "L]; PUnsigned[lir.catchLevel];
WITH li: lir SELECT FROM
named =>
BEGIN
desc: StringDefs.SubStringDescriptor;
SubStringForHash[@desc, li.hti];
PNext["hti: "L, Log10[li.hti]+3+desc.length];
PUnsigned[li.hti]; PString[" ("L];
PSTSubString[@desc]; PChar[')];
PNextUnsigned["cci"L, li.cci];
END;
stmt =>
BEGIN
PNextUnsigned["RETRY"L, li.retry];
PNextUnsigned["CONT"L, li.continue];
END;
loop =>
BEGIN
PNextUnsigned["LOOP"L, li.loop];
PNextUnsigned["EXIT"L, li.exit];
END;
ENDCASE;
IF STDebugDefs.showLinks THEN PNextNull["thread"L, lir.thread, LabelInfoNull];
END;
PutLabelState: PUBLIC PROCEDURE =
BEGIN OPEN CodeDefs;
lii: LabelInfoIndex;
lir: LabelInfoRecord;
cb: Table.Base = AllocDebugDefs.TableBase[];
desc: StringDefs.SubStringDescriptor;
extra: CARDINAL;
first: BOOLEAN ← TRUE;
name: STRING ← [30];
PCr[];
PString["labelStack: "L];
lii ← LabelStack[];
IF lii = LabelInfoNull THEN
BEGIN PString["empty"L]; RETURN END;
WHILE lii # LabelInfoNull DO
name.length ← 0; extra ← 0;
DebugUsefulDefs.ShortCopyREAD[to: @lir, from: @cb[lii],
nwords: SIZE[LabelInfoRecord]];
BEGIN OPEN StringDefs;
AppendChar[name, '(]; AppendDecimal[name, LOOPHOLE[lii]];
AppendString[name, ") "L];
END;
WITH li: lir SELECT FROM
named =>
BEGIN
SubStringForHash[@desc, li.hti];
extra ← desc.length + 2 + Log10[LOOPHOLE[li.hti]];
END;
loop => extra ← 6 + Log10[LOOPHOLE[li.loop]];
stmt => extra ← 7 + Log10[LOOPHOLE[li.retry]];
ENDCASE;
IF first THEN
BEGIN PString[name]; first ← FALSE; END
ELSE PNext[name, extra];
WITH li: lir SELECT FROM
named =>
BEGIN
PSTSubString[@desc];
PString[": "L];
PUnsigned[LOOPHOLE[li.cci]];
END;
loop =>
BEGIN
PString["LOOP: "L];
PUnsigned[LOOPHOLE[li.loop]];
PNextUnsigned["EXIT"L, li.exit];
END;
stmt =>
BEGIN
PString["RETRY: "L];
PUnsigned[LOOPHOLE[li.retry]];
PNextUnsigned["CONT"L, li.continue];
END;
ENDCASE;
lii ← lir.thread;
ENDLOOP;
END;
END.