-- XXDebugContext.mesa Edited by Bruce, October 13, 1980 3:02 PM
DIRECTORY
CoreSwapDefs: FROM "coreswapdefs",
DebugFormat: FROM "debugformat",
DebugUsefulDefs: FROM "debugusefuldefs",
IODefs: FROM "iodefs",
PrincOps: FROM "princops",
RESOut: FROM "resout",
State: FROM "state",
STDebugDefs: FROM "stdebugdefs",
StringDefs: FROM "stringdefs",
Symbols: FROM "symbols",
XXDebugDefs: FROM "xxdebugdefs";
XXDebugContext: PROGRAM
IMPORTS DebugUsefulDefs, RESOut, STDebugDefs, StringDefs, XXDebugDefs
EXPORTS XXDebugDefs =
BEGIN OPEN RESOut, XXDebugDefs, State;
PNil: PROCEDURE [p: POINTER] =
BEGIN
IF p = NIL THEN PString["NIL"L]
ELSE POctal[p];
END;
PNextNil: PROCEDURE [lbl: STRING, p: POINTER, indent: CARDINAL ← 2] =
BEGIN
IF p = NIL THEN {PNext[lbl, 5, indent]; PString[": NIL"L]}
ELSE PNextOctal[lbl, p, indent];
END;
PutTopCtx: PUBLIC PROCEDURE =
BEGIN
gsp: GSHandle = GS[];
level: INTEGER;
esv: CoreSwapDefs.ExternalStateVector;
level ← DebugUsefulDefs.ShortREAD[@gsp.level];
DebugUsefulDefs.ShortCopyREAD[
to: @esv,
nwords: SIZE[CoreSwapDefs.ExternalStateVector],
from: @gsp.ESV];
PCr[];
PString["dLevel: "L]; PUnsigned[level];
PNextUnsigned["uLevel"L, esv.level];
PNextNil["state"L, esv.state];
IF esv.state # NIL THEN
{PString[" ("L]; PrintUserState[esv.state]; PChar[')]};
PutAsContext[TopCtx[]];
END;
PutTos: PUBLIC PROCEDURE =
BEGIN
handle: Handle = TopCtx[];
sp: POINTER TO Stack = DebugUsefulDefs.ShortREAD[@handle.fooStack];
IF sp = NIL THEN {PCr[]; PString["<empty>"]}
ELSE PutAsStack[sp];
END;
PutAsContext: PUBLIC PROCEDURE [handle: State.Handle] =
BEGIN
context: Context;
mop: STRING = [20];
IF handle = NIL THEN RETURN;
DebugUsefulDefs.ShortCopyREAD[to: @context, nwords: SIZE[Context], from: handle];
PCr[];
POctal[handle];
BEGIN OPEN c: context;
PString["↑ = prev: "L]; PNil[c.prev];
PNextOctal["lContext"L, c.lContext];
PNextOctal["gContext"L, c.gContext];
PNextOctal["pContext"L, c.pContext];
PNextOctal["interpretContext"L, c.interpretContext];
PutAsContextType[c.howSet];
PNextNil["fooStack"L, c.fooStack];
END; -- of OPEN context
END;
PutAsContextType: PROC [how: State.ContextType] =
BEGIN
s: STRING ← [20];
StringDefs.AppendString[s, ", howset: "L];
StringDefs.AppendString[s, SELECT how FROM
local => "local"L,
psb => "psb"L,
global => "global"L,
state => "state"L,
ENDCASE => "none"L];
PString[s];
END;
PutAsStack: PUBLIC PROCEDURE [stack: POINTER TO Stack] =
BEGIN
f: DebugFormat.Foo;
IF stack = NIL THEN RETURN;
PCr[];
POctal[stack];
PString["↑ = link: "L];
PNil[DebugUsefulDefs.ShortREAD[@stack.link]];
PNextNil["foo"L, f ← DebugUsefulDefs.ShortREAD[@stack.foo]];
PutAsFoo[f];
END;
PrintUserState: PUBLIC PROCEDURE [StatePtr: POINTER] =
BEGIN
mop: STRING = [20];
state: PrincOps.StateVector;
i, len: CARDINAL;
first: BOOLEAN ← TRUE;
UserCopyRead[
from: StatePtr,
nwords: SIZE[PrincOps.StateVector],
to: @state];
StringDefs.AppendString[mop, "inst: "L];
STDebugDefs.AppendMopcodeName[mop, state.instbyte];
[] ← MakeRoom[mop.length, 2];
PString[mop];
PNextNil["source"L, state.source];
PNextNil["dest"L, state.dest];
PNext["stk: ("L, 3]; PUnsigned[state.stkptr]; PString[")["L];
FOR i IN [0..MIN[state.stkptr+2, 8]) DO
len ← Log8[state.stk[i]] + (IF first THEN 0 ELSE 1);
IF state.stk[i] > 7 THEN len ← len+1;
IF ~first THEN PChar[',];
IF MakeRoom[len, 2] AND ~first THEN PChar[IODefs.SP];
first ← FALSE;
POctal[state.stk[i]];
ENDLOOP;
PChar[']];
END;
PutAsFoo: PUBLIC PROCEDURE [foo: DebugFormat.Foo] =
BEGIN OPEN DebugFormat;
fob: Fob;
IF foo = NIL THEN RETURN;
DebugUsefulDefs.ShortCopyREAD[to: @fob, nwords: SIZE[Fob], from: foo];
PCr[];
POctal[foo];
PString["↑ = hti: "L];
BEGIN OPEN fob;
PNull[hti, Symbols.HTNull];
IF hti # Symbols.HTNull THEN
{PString[" ("L]; STDebugDefs.PutHashString[hti]; PChar[')]};
PNextNull["tsei"L, tsei, Symbols.SENull];
PNext["addr: "L, LongLog8[LOOPHOLE[addr.base]]+2];
PLongNumber[addr.base, [base: 8, zerofill: FALSE, unsigned: TRUE, columns: 0]];
PString["B↑"L];
IF addr.offset # 0 THEN PNextUnsigned["offset"L, addr.offset];
IF words # 0 THEN PNextUnsigned["words"L, words];
IF bits # 0 THEN PNextUnsigned["bits"L, bits];
IF indent # 0 THEN PNextUnsigned["indent"L, indent];
IF nesting # 0 THEN PNextUnsigned["nesting"L, nesting];
IF xfer THEN PNext["xfer"L];
IF there THEN PNext["there"L];
IF typeOnly THEN PNext["typeOnly"L];
IF addr.local THEN PNext["local"L];
IF addr.useStack THEN PNext["useStack"L];
END;
END;
PutAsBB: PUBLIC PROCEDURE [brk: DebugFormat.BBHandle] =
BEGIN OPEN DebugFormat;
bb: BreakBlock;
mop: STRING = [16];
exName: ARRAY EXOI OF STRING = ["entry"L, "exit"L, "octal"L, "in"L];
btName: ARRAY BT OF STRING = ["break"L, "trace"L];
IF brk = NIL THEN RETURN;
DebugUsefulDefs.ShortCopyREAD[to: @bb, nwords: SIZE[BreakBlock], from: brk];
PCr[];
POctal[brk];
PString["↑ = link: "L];
BEGIN OPEN bb;
POctal[link];
PNextOctal["num"L, num];
PNextOctal["gf"L, gf];
IF condition # NIL THEN
BEGIN
PChar[',];
IF MakeRoom[DebugUsefulDefs.ShortREAD[@condition.length]+6, 2] THEN
PChar[IODefs.SP];
PString["cond: "L]; STDebugDefs.PRemoteString[condition];
END;
IF exp # NIL THEN
BEGIN
PChar[',];
IF MakeRoom[DebugUsefulDefs.ShortREAD[@exp.length]+5, 2] THEN
PChar[IODefs.SP];
PString["exp: "L]; STDebugDefs.PRemoteString[exp];
END;
PNextOctal["pc"L, pc];
StringDefs.AppendString[mop, "inst: "L];
STDebugDefs.AppendMopcodeName[mop, inst];
PNext[mop];
PNext[exName[bt.ex]];
PNext[btName[bt.bt]];
END; -- OPEN bb
END;
END.