123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621 |
- MODULE StdDebug;
- (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Std/Mod/Debug.odc *)
- (* DO NOT EDIT *)
- IMPORT SYSTEM,
- Kernel, Strings, Fonts, Services, Ports, Views, Properties, Dialog, Containers, StdFolds,
- TextModels, TextMappers, TextViews, TextRulers;
-
- CONST
- refViewSize = 9 * Ports.point;
-
- heap = 1; source = 2; module = 3; modules = 4; (* RefView types *)
-
- TYPE
- Name = Kernel.Name;
- ArrayPtr = POINTER TO RECORD
- last, t, first: INTEGER; (* gc header *)
- len: ARRAY 16 OF INTEGER (* dynamic array length table *)
- END;
- RefView = POINTER TO RefViewDesc;
- RefViewDesc = RECORD
- type: SHORTINT;
- command: SHORTINT;
- back: RefView;
- adr: INTEGER;
- desc: Kernel.Type;
- ptr: ArrayPtr;
- name: Name
- END;
-
- Action = POINTER TO RECORD (Services.Action)
- text: TextModels.Model
- END;
-
- Cluster = POINTER TO RECORD [untagged] (* must correspond to Kernel.Cluster *)
- size: INTEGER;
- next: Cluster
- END;
-
-
- VAR
- out: TextMappers.Formatter;
- path: ARRAY 4 OF Ports.Point;
- empty: Name;
- PROCEDURE NewRuler (): TextRulers.Ruler;
- CONST mm = Ports.mm;
- VAR r: TextRulers.Ruler;
- BEGIN
- r := TextRulers.dir.New(NIL);
- TextRulers.SetRight(r, 140 * mm);
- TextRulers.AddTab(r, 4 * mm); TextRulers.AddTab(r, 34 * mm); TextRulers.AddTab(r, 80 * mm);
- RETURN r
- END NewRuler;
- PROCEDURE OpenViewer (t: TextModels.Model; title: Views.Title; ruler:TextRulers.Ruler);
- VAR v: TextViews.View; c: Containers.Controller;
- BEGIN
- Dialog.MapString(title, title);
- v := TextViews.dir.New(t);
- v.SetDefaults(ruler, TextViews.dir.defAttr);
- c := v.ThisController();
- IF c # NIL THEN
- c.SetOpts(c.opts - {Containers.noFocus, Containers.noSelection} + {Containers.noCaret})
- END;
- Views.OpenAux(v, title)
- END OpenViewer;
-
- PROCEDURE OpenFold (hidden: ARRAY OF CHAR);
- VAR fold: StdFolds.Fold; t: TextModels.Model; w: TextMappers.Formatter;
- BEGIN
- Dialog.MapString(hidden, hidden);
- t := TextModels.dir.New();
- w.ConnectTo(t); w.WriteString(hidden);
- fold := StdFolds.dir.New(StdFolds.expanded, "", t);
- out.WriteView(fold)
- END OpenFold;
-
- PROCEDURE CloseFold (collaps: BOOLEAN);
- VAR fold: StdFolds.Fold; m: TextModels.Model;
- BEGIN
- fold := StdFolds.dir.New(StdFolds.expanded, "", NIL);
- out.WriteView(fold);
- IF collaps THEN fold.Flip(); m := out.rider.Base(); out.SetPos(m.Length()) END
- END CloseFold;
-
- PROCEDURE WriteHex (n: INTEGER);
- BEGIN
- out.WriteIntForm(n, TextMappers.hexadecimal, 9, "0", TextMappers.showBase)
- END WriteHex;
-
- PROCEDURE WriteString (adr, len, base: INTEGER; zterm, unicode: BOOLEAN);
- CONST beg = 0; char = 1; code = 2;
- VAR ch: CHAR; sc: SHORTCHAR; val, mode: INTEGER; str: ARRAY 16 OF CHAR;
- BEGIN
- mode := beg;
- IF base = 2 THEN SYSTEM.GET(adr, ch); val := ORD(ch) ELSE SYSTEM.GET(adr, sc); val := ORD(sc) END;
- IF zterm & (val = 0) THEN out.WriteSString('""')
- ELSE
- REPEAT
- IF (val >= ORD(" ")) & (val < 7FH) OR (val > 0A0H) & (val < 100H) OR unicode & (val >= 100H) THEN
- IF mode # char THEN
- IF mode = code THEN out.WriteSString(", ") END;
- out.WriteChar(22X); mode := char
- END;
- out.WriteChar(CHR(val))
- ELSE
- IF mode = char THEN out.WriteChar(22X) END;
- IF mode # beg THEN out.WriteSString(", ") END;
- mode := code; Strings.IntToStringForm(val, Strings.hexadecimal, 1, "0", FALSE, str);
- IF str[0] > "9" THEN out.WriteChar("0") END;
- out.WriteString(str); out.WriteChar("X")
- END;
- INC(adr, base); DEC(len);
- IF base = 2 THEN SYSTEM.GET(adr, ch); val := ORD(ch) ELSE SYSTEM.GET(adr, sc); val := ORD(sc) END
- UNTIL (len = 0) OR zterm & (val = 0)
- END;
- IF mode = char THEN out.WriteChar(22X) END
- END WriteString;
-
- PROCEDURE OutString (s: ARRAY OF CHAR);
- VAR str: Dialog.String;
- BEGIN
- Dialog.MapString(s, str);
- out.WriteString(str)
- END OutString;
- (* ------------------- variable display ------------------- *)
-
- PROCEDURE FormOf (t: Kernel.Type): SHORTCHAR;
- BEGIN
- IF SYSTEM.VAL(INTEGER, t) DIV 256 = 0 THEN
- RETURN SHORT(CHR(SYSTEM.VAL(INTEGER, t)))
- ELSE
- RETURN SHORT(CHR(16 + t.id MOD 4))
- END
- END FormOf;
-
- PROCEDURE LenOf (t: Kernel.Type; ptr: ArrayPtr): INTEGER;
- BEGIN
- IF t.size # 0 THEN RETURN t.size
- ELSIF ptr # NIL THEN RETURN ptr.len[t.id DIV 16 MOD 16 - 1]
- ELSE RETURN 0
- END
- END LenOf;
-
- PROCEDURE SizeOf (t: Kernel.Type; ptr: ArrayPtr): INTEGER;
- BEGIN
- CASE FormOf(t) OF
- | 0BX: RETURN 0
- | 1X, 2X, 4X: RETURN 1
- | 3X, 5X: RETURN 2
- | 8X, 0AX: RETURN 8
- | 11X: RETURN t.size
- | 12X: RETURN LenOf(t, ptr) * SizeOf(t.base[0], ptr)
- ELSE RETURN 4
- END
- END SizeOf;
- PROCEDURE WriteName (t: Kernel.Type; ptr: ArrayPtr);
- VAR name: Kernel.Name; f: SHORTCHAR;
- BEGIN
- f := FormOf(t);
- CASE f OF
- | 0X: OutString("#Dev:Unknown")
- | 1X: out.WriteSString("BOOLEAN")
- | 2X: out.WriteSString("SHORTCHAR")
- | 3X: out.WriteSString("CHAR")
- | 4X: out.WriteSString("BYTE")
- | 5X: out.WriteSString("SHORTINT")
- | 6X: out.WriteSString("INTEGER")
- | 7X: out.WriteSString("SHORTREAL")
- | 8X: out.WriteSString("REAL")
- | 9X: out.WriteSString("SET")
- | 0AX: out.WriteSString("LONGINT")
- | 0BX: out.WriteSString("ANYREC")
- | 0CX: out.WriteSString("ANYPTR")
- | 0DX: out.WriteSString("POINTER")
- | 0EX: out.WriteSString("PROCEDURE")
- | 0FX: out.WriteSString("STRING")
- | 10X..13X:
- Kernel.GetTypeName(t, name);
- IF name = "!" THEN
- IF f = 11X THEN out.WriteSString("RECORD")
- ELSIF f = 12X THEN out.WriteSString("ARRAY")
- ELSE OutString("#Dev:Unknown")
- END
- ELSIF (t.id DIV 256 # 0) & (t.mod.refcnt >= 0) THEN
- out.WriteSString(t.mod.name); out.WriteChar("."); out.WriteSString(name)
- ELSIF f = 11X THEN
- out.WriteSString(t.mod.name); out.WriteSString(".RECORD")
- ELSIF f = 12X THEN
- out.WriteSString("ARRAY "); out.WriteInt(LenOf(t, ptr)); t := t.base[0];
- WHILE (FormOf(t) = 12X) & ((t.id DIV 256 = 0) OR (t.mod.refcnt < 0)) DO
- out.WriteSString(", "); out.WriteInt(LenOf(t, ptr)); t := t.base[0]
- END;
- out.WriteSString(" OF "); WriteName(t, ptr)
- ELSIF f = 13X THEN
- out.WriteSString("POINTER")
- ELSE
- out.WriteSString("PROCEDURE")
- END
- | 20X: out.WriteSString("COM.IUnknown")
- | 21X: out.WriteSString("COM.GUID")
- | 22X: out.WriteSString("COM.RESULT")
- ELSE OutString("#Dev:UnknownFormat"); out.WriteInt(ORD(f))
- END
- END WriteName;
-
- PROCEDURE WriteGuid (a: INTEGER);
- PROCEDURE Hex (a: INTEGER);
- VAR x: SHORTCHAR;
- BEGIN
- SYSTEM.GET(a, x);
- out.WriteIntForm(ORD(x), TextMappers.hexadecimal, 2, "0", FALSE)
- END Hex;
- BEGIN
- out.WriteChar("{");
- Hex(a + 3); Hex(a + 2); Hex(a + 1); Hex(a);
- out.WriteChar("-");
- Hex(a + 5); Hex(a + 4);
- out.WriteChar("-");
- Hex(a + 7); Hex(a + 6);
- out.WriteChar("-");
- Hex(a + 8);
- Hex(a + 9);
- out.WriteChar("-");
- Hex(a + 10);
- Hex(a + 11);
- Hex(a + 12);
- Hex(a + 13);
- Hex(a + 14);
- Hex(a + 15);
- out.WriteChar("}")
- END WriteGuid;
-
- PROCEDURE^ ShowVar (ad, ind: INTEGER; f, c: SHORTCHAR; desc: Kernel.Type; ptr: ArrayPtr;
- back: RefView; VAR name, sel: Name);
-
- PROCEDURE ShowRecord (a, ind: INTEGER; desc: Kernel.Type; back: RefView; VAR sel: Name);
- VAR dir: Kernel.Directory; obj: Kernel.Object; name: Kernel.Name; i, j, n: INTEGER; base: Kernel.Type;
- BEGIN
- WriteName(desc, NIL); out.WriteTab;
- IF desc.mod.refcnt >= 0 THEN
- OpenFold("#Dev:Fields");
- n := desc.id DIV 16 MOD 16; j := 0;
- WHILE j <= n DO
- base := desc.base[j];
- IF base # NIL THEN
- dir := base.fields; i := 0;
- WHILE i < dir.num DO
- obj := SYSTEM.VAL(Kernel.Object, SYSTEM.ADR(dir.obj[i]));
- Kernel.GetObjName(base.mod, obj, name);
- ShowVar(a + obj.offs, ind, FormOf(obj.struct), 1X, obj.struct, NIL, back, name, sel);
- INC(i)
- END
- END;
- INC(j)
- END;
- out.WriteSString(" "); CloseFold((ind > 1) OR (sel # ""))
- ELSE
- OutString("#Dev:Unloaded")
- END
- END ShowRecord;
-
- PROCEDURE ShowArray (a, ind: INTEGER; desc: Kernel.Type; ptr: ArrayPtr; back: RefView; VAR sel: Name);
- VAR f: SHORTCHAR; i, n, m, size, len: INTEGER; name: Kernel.Name; eltyp, t: Kernel.Type;
- vi: SHORTINT; vs: BYTE; str: Dialog.String; high: BOOLEAN;
- BEGIN
- WriteName(desc, ptr); out.WriteTab;
- len := LenOf(desc, ptr); eltyp := desc.base[0]; f := FormOf(eltyp); size := SizeOf(eltyp, ptr);
- IF (f = 2X) OR (f = 3X) THEN (* string *)
- n := 0; m := len; high := FALSE;
- IF f = 2X THEN
- REPEAT SYSTEM.GET(a + n, vs); INC(n) UNTIL (n = 32) OR (n = len) OR (vs = 0);
- REPEAT DEC(m); SYSTEM.GET(a + m, vs) UNTIL (m = 0) OR (vs # 0)
- ELSE
- REPEAT
- SYSTEM.GET(a + n * 2, vi); INC(n);
- IF vi DIV 256 # 0 THEN high := TRUE END
- UNTIL (n = len) OR (vi = 0);
- n := MIN(n, 32);
- REPEAT DEC(m); SYSTEM.GET(a + m * 2, vi) UNTIL (m = 0) OR (vi # 0)
- END;
- WriteString(a, n, size, TRUE, TRUE);
- INC(m, 2);
- IF m > len THEN m := len END;
- IF high OR (m > n) THEN
- out.WriteSString(" "); OpenFold("...");
- out.WriteLn;
- IF high & (n = 32) THEN
- WriteString(a, m, size, TRUE, TRUE);
- out.WriteLn; out.WriteLn
- END;
- WriteString(a, m, size, FALSE, FALSE);
- IF m < len THEN out.WriteSString(", ..., 0X") END;
- out.WriteSString(" "); CloseFold(TRUE)
- END
- ELSE
- t := eltyp;
- WHILE FormOf(t) = 12X DO t := t.base[0] END;
- IF FormOf(t) # 0X THEN
- OpenFold("#Dev:Elements");
- i := 0;
- WHILE i < len DO
- Strings.IntToString(i, str);
- name := "[" + SHORT(str$) + "]";
- ShowVar(a, ind, f, 1X, eltyp, ptr, back, name, sel);
- INC(i); INC(a, size)
- END;
- out.WriteSString(" "); CloseFold(TRUE)
- END
- END
- END ShowArray;
-
- PROCEDURE ShowProcVar (a: INTEGER);
- VAR vli, n, ref: INTEGER; m: Kernel.Module; name: Kernel.Name;
- BEGIN
- SYSTEM.GET(a, vli);
- Kernel.SearchProcVar(vli, m, vli);
- IF m = NIL THEN
- IF vli = 0 THEN out.WriteSString("NIL")
- ELSE WriteHex(vli)
- END
- ELSE
- IF m.refcnt >= 0 THEN
- out.WriteSString(m.name); ref := m.refs;
- REPEAT Kernel.GetRefProc(ref, n, name) UNTIL (n = 0) OR (vli < n);
- IF vli < n THEN out.WriteChar("."); out.WriteSString(name) END
- ELSE
- OutString("#Dev:ProcInUnloadedMod");
- out.WriteSString(m.name); out.WriteSString(" !!!")
- END
- END
- END ShowProcVar;
- PROCEDURE ShowPointer (a: INTEGER; f: SHORTCHAR; desc: Kernel.Type; back: RefView; VAR sel: Name);
- VAR adr, x: INTEGER; ptr: ArrayPtr; c: Cluster; btyp: Kernel.Type;
- BEGIN
- SYSTEM.GET(a, adr);
- IF f = 13X THEN btyp := desc.base[0] ELSE btyp := NIL END;
- IF adr = 0 THEN out.WriteSString("NIL")
- ELSIF f = 20X THEN
- out.WriteChar("["); WriteHex(adr); out.WriteChar("]");
- out.WriteChar(" "); c := SYSTEM.VAL(Cluster, Kernel.Root());
- WHILE (c # NIL) & ((adr < SYSTEM.VAL(INTEGER, c)) OR (adr >= SYSTEM.VAL(INTEGER, c) + c.size)) DO c := c.next END;
- IF c # NIL THEN
- ptr := SYSTEM.VAL(ArrayPtr, adr)
- END
- ELSE
- IF (f = 13X) OR (f = 0CX) THEN x := adr - 4 ELSE x := adr END;
- IF ((adr < -4) OR (adr >= 65536)) & Kernel.IsReadable(x, adr + 16) THEN
- out.WriteChar("["); WriteHex(adr); out.WriteChar("]");
- IF (f = 13X) OR (f = 0CX) THEN
- out.WriteChar(" "); c := SYSTEM.VAL(Cluster, Kernel.Root());
- WHILE (c # NIL) & ((adr < SYSTEM.VAL(INTEGER, c)) OR (adr >= SYSTEM.VAL(INTEGER, c) + c.size)) DO
- c := c.next
- END;
- IF c # NIL THEN
- ptr := SYSTEM.VAL(ArrayPtr, adr);
- IF (f = 13X) & (FormOf(btyp) = 12X) THEN (* array *)
- adr := SYSTEM.ADR(ptr.len[btyp.id DIV 16 MOD 16])
- END
- ELSE OutString("#Dev:IllegalPointer")
- END
- END
- ELSE OutString("#Dev:IllegalAddress"); WriteHex(adr)
- END
- END
- END ShowPointer;
-
- PROCEDURE ShowSelector (ref: RefView);
- VAR b: RefView; n: SHORTINT; a, a0: TextModels.Attributes;
- BEGIN
- b := ref.back; n := 1;
- IF b # NIL THEN
- WHILE (b.name = ref.name) & (b.back # NIL) DO INC(n); b := b.back END;
- ShowSelector(b);
- IF n > 1 THEN out.WriteChar("(") END;
- out.WriteChar(".")
- END;
- out.WriteSString(ref.name);
- IF ref.type = heap THEN out.WriteChar("^") END;
- IF n > 1 THEN
- out.WriteChar(")");
- a0 := out.rider.attr; a := TextModels.NewOffset(a0, 2 * Ports.point);
- out.rider.SetAttr(a);
- out.WriteInt(n); out.rider.SetAttr(a0)
- END
- END ShowSelector;
-
- PROCEDURE ShowVar (ad, ind: INTEGER; f, c: SHORTCHAR; desc: Kernel.Type; ptr: ArrayPtr; back: RefView;
- VAR name, sel: Name);
- VAR i, j, vli, a: INTEGER; tsel: Name; a0: TextModels.Attributes;
- vc: SHORTCHAR; vsi: BYTE; vi: SHORTINT; vr: SHORTREAL; vlr: REAL; vs: SET;
- BEGIN
- out.WriteLn; out.WriteTab; i := 0;
- WHILE i < ind DO out.WriteSString(" "); INC(i) END;
- a := ad; i := 0; j := 0;
- IF sel # "" THEN
- WHILE sel[i] # 0X DO tsel[i] := sel[i]; INC(i) END;
- IF (tsel[i-1] # ":") & (name[0] # "[") THEN tsel[i] := "."; INC(i) END
- END;
- WHILE name[j] # 0X DO tsel[i] := name[j]; INC(i); INC(j) END;
- tsel[i] := 0X;
- a0 := out.rider.attr;
- IF c = 3X THEN (* varpar *)
- SYSTEM.GET(ad, a);
- out.rider.SetAttr(TextModels.NewStyle(a0, {Fonts.italic}))
- END;
- IF name[0] # "[" THEN out.WriteChar(".") END;
- out.WriteSString(name);
- out.rider.SetAttr(a0); out.WriteTab;
- IF (c = 3X) & (a >= 0) & (a < 65536) THEN
- out.WriteTab; out.WriteSString("NIL VARPAR")
- ELSIF f = 11X THEN
- Kernel.GetTypeName(desc, name);
- IF (c = 3X) & (name[0] # "!") THEN SYSTEM.GET(ad + 4, desc) END; (* dynamic type *)
- ShowRecord(a, ind + 1, desc, back, tsel)
- ELSIF (c = 3X) & (f = 0BX) THEN (* VAR anyrecord *)
- SYSTEM.GET(ad + 4, desc);
- ShowRecord(a, ind + 1, desc, back, tsel)
- ELSIF f = 12X THEN
- IF (desc.size = 0) & (ptr = NIL) THEN SYSTEM.GET(ad, a) END; (* dyn array val par *)
- IF ptr = NIL THEN ptr := SYSTEM.VAL(ArrayPtr, ad - 8) END;
- ShowArray(a, ind + 1, desc, ptr, back, tsel)
- ELSE
- IF desc = NIL THEN desc := SYSTEM.VAL(Kernel.Type, ORD(f)) END;
- WriteName(desc, NIL); out.WriteTab;
- CASE f OF
- | 0X: (* SYSTEM.GET(a, vli); WriteHex(vli) *)
- | 1X: SYSTEM.GET(a, vc);
- IF vc = 0X THEN out.WriteSString("FALSE")
- ELSIF vc = 1X THEN out.WriteSString("TRUE")
- ELSE OutString("#Dev:Undefined"); out.WriteInt(ORD(vc))
- END
- | 2X: WriteString(a, 1, 1, FALSE, FALSE)
- | 3X: WriteString(a, 1, 2, FALSE, TRUE);
- SYSTEM.GET(a, vi);
- IF vi DIV 256 # 0 THEN out.WriteString(" "); WriteString(a, 1, 2, FALSE, FALSE) END
- | 4X: SYSTEM.GET(a, vsi); out.WriteInt(vsi)
- | 5X: SYSTEM.GET(a, vi); out.WriteInt(vi)
- | 6X: SYSTEM.GET(a, vli); out.WriteInt(vli)
- | 7X: SYSTEM.GET(a, vr); out.WriteReal(vr)
- | 8X: SYSTEM.GET(a, vlr); out.WriteReal(vlr)
- | 9X: SYSTEM.GET(a, vs); out.WriteSet(vs)
- | 0AX: SYSTEM.GET(a, vli); SYSTEM.GET(a + 4, i);
- IF (vli >= 0) & (i = 0) OR (vli < 0) & (i = -1) THEN out.WriteInt(vli)
- ELSE out.WriteIntForm(i, TextMappers.hexadecimal, 8, "0", TextMappers.hideBase); WriteHex(vli)
- END
- | 0CX, 0DX, 13X, 20X: ShowPointer(a, f, desc, back, tsel)
- | 0EX, 10X: ShowProcVar(a)
- | 0FX: WriteString(a, 256, 1, TRUE, FALSE)
- | 21X: WriteGuid(a)
- | 22X: SYSTEM.GET(a, vli); WriteHex(vli)
- ELSE
- END
- END
- END ShowVar;
-
- PROCEDURE ShowStack;
- VAR ref, end, i, j, x, a, b, c: INTEGER; m, f: SHORTCHAR; mod: Kernel.Module; name, sel: Kernel.Name;
- d: Kernel.Type;
- BEGIN
- a := Kernel.pc; b := Kernel.fp; c := 100;
- REPEAT
- mod := Kernel.modList;
- WHILE (mod # NIL) & ((a < mod.code) OR (a >= mod.code + mod.csize)) DO mod := mod.next END;
- IF mod # NIL THEN
- DEC(a, mod.code);
- IF mod.refcnt >= 0 THEN
- out.WriteChar(" "); out.WriteSString(mod.name); ref := mod.refs;
- REPEAT Kernel.GetRefProc(ref, end, name) UNTIL (end = 0) OR (a < end);
- IF a < end THEN
- out.WriteChar("."); out.WriteSString(name);
- sel := mod.name$; i := 0;
- WHILE sel[i] # 0X DO INC(i) END;
- sel[i] := "."; INC(i); j := 0;
- WHILE name[j] # 0X DO sel[i] := name[j]; INC(i); INC(j) END;
- sel[i] := ":"; sel[i+1] := 0X;
- out.WriteSString(" ["); WriteHex(a);
- out.WriteSString("] ");
- i := Kernel.SourcePos(mod, 0);
- IF name # "$$" THEN
- Kernel.GetRefVar(ref, m, f, d, x, name);
- WHILE m # 0X DO
- IF name[0] # "@" THEN ShowVar(b + x, 0, f, m, d, NIL, NIL, name, sel) END;
- Kernel.GetRefVar(ref, m, f, d, x, name)
- END
- END;
- out.WriteLn
- ELSE out.WriteSString(".???"); out.WriteLn
- END
- ELSE
- out.WriteChar("("); out.WriteSString(mod.name);
- out.WriteSString(") (pc="); WriteHex(a);
- out.WriteSString(", fp="); WriteHex(b); out.WriteChar(")");
- out.WriteLn
- END
- ELSE
- out.WriteSString("<system> (pc="); WriteHex(a);
- out.WriteSString(", fp="); WriteHex(b); out.WriteChar(")");
- out.WriteLn
- END;
- IF (b >= Kernel.fp) & (b < Kernel.stack) THEN
- SYSTEM.GET(b+4, a); (* stacked pc *)
- SYSTEM.GET(b, b); (* dynamic link *)
- DEC(a); DEC(c)
- ELSE c := 0
- END
- UNTIL c = 0
- END ShowStack;
- PROCEDURE (a: Action) Do; (* delayed trap window open *)
- BEGIN
- Kernel.SetTrapGuard(TRUE);
- OpenViewer(a.text, "#Dev:Trap", NewRuler());
- Kernel.SetTrapGuard(FALSE);
- END Do;
- PROCEDURE GetTrapMsg(OUT msg: ARRAY OF CHAR);
- VAR ref, end, a: INTEGER; mod: Kernel.Module; name: Kernel.Name; head, tail, errstr: ARRAY 32 OF CHAR;
- key: ARRAY 128 OF CHAR;
- BEGIN
- a := Kernel.pc; mod := Kernel.modList;
- WHILE (mod # NIL) & ((a < mod.code) OR (a >= mod.code + mod.csize)) DO mod := mod.next END;
- IF mod # NIL THEN
- DEC(a, mod.code); ref := mod.refs;
- REPEAT Kernel.GetRefProc(ref, end, name) UNTIL (end = 0) OR (a < end);
- IF a < end THEN
- Kernel.SplitName (mod.name$, head, tail);
- IF head = "" THEN head := "System" END;
- Strings.IntToString(Kernel.err, errstr);
- key := tail + "." + name + "." + errstr;
- Dialog.MapString("#" + head + ":" + key, msg);
- (* IF key # msg THEN out.WriteString(" " + msg) END; *)
- IF key = msg THEN msg := "" END;
- END
- END
- END GetTrapMsg;
- PROCEDURE Trap;
- VAR a0: TextModels.Attributes; action: Action; msg: ARRAY 512 OF CHAR;
- BEGIN
- out.ConnectTo(TextModels.dir.New());
- a0 := out.rider.attr;
- out.rider.SetAttr(TextModels.NewWeight(a0, Fonts.bold));
- IF Kernel.err = 129 THEN out.WriteSString("invalid WITH")
- ELSIF Kernel.err = 130 THEN out.WriteSString("invalid CASE")
- ELSIF Kernel.err = 131 THEN out.WriteSString("function without RETURN")
- ELSIF Kernel.err = 132 THEN out.WriteSString("type guard")
- ELSIF Kernel.err = 133 THEN out.WriteSString("implied type guard")
- ELSIF Kernel.err = 134 THEN out.WriteSString("value out of range")
- ELSIF Kernel.err = 135 THEN out.WriteSString("index out of range")
- ELSIF Kernel.err = 136 THEN out.WriteSString("string too long")
- ELSIF Kernel.err = 137 THEN out.WriteSString("stack overflow")
- ELSIF Kernel.err = 138 THEN out.WriteSString("integer overflow")
- ELSIF Kernel.err = 139 THEN out.WriteSString("division by zero")
- ELSIF Kernel.err = 140 THEN out.WriteSString("infinite real result")
- ELSIF Kernel.err = 141 THEN out.WriteSString("real underflow")
- ELSIF Kernel.err = 142 THEN out.WriteSString("real overflow")
- ELSIF Kernel.err = 143 THEN out.WriteSString("undefined real result")
- ELSIF Kernel.err = 144 THEN out.WriteSString("not a number")
- ELSIF Kernel.err = 200 THEN out.WriteSString("keyboard interrupt")
- ELSIF Kernel.err = 201 THEN
- out.WriteSString("NIL dereference")
- ELSIF Kernel.err = 202 THEN
- out.WriteSString("illegal instruction: ");
- out.WriteIntForm(Kernel.val, TextMappers.hexadecimal, 5, "0", TextMappers.showBase)
- ELSIF Kernel.err = 203 THEN
- IF (Kernel.val >= -4) & (Kernel.val < 65536) THEN out.WriteSString("NIL dereference (read)")
- ELSE out.WriteSString("illegal memory read (ad = "); WriteHex(Kernel.val); out.WriteChar(")")
- END
- ELSIF Kernel.err = 204 THEN
- IF (Kernel.val >= -4) & (Kernel.val < 65536) THEN out.WriteSString("NIL dereference (write)")
- ELSE out.WriteSString("illegal memory write (ad = "); WriteHex(Kernel.val); out.WriteChar(")")
- END
- ELSIF Kernel.err = 205 THEN
- IF (Kernel.val >= -4) & (Kernel.val < 65536) THEN out.WriteSString("NIL procedure call")
- ELSE out.WriteSString("illegal execution (ad = "); WriteHex(Kernel.val); out.WriteChar(")")
- END
- ELSIF Kernel.err = 257 THEN out.WriteSString("out of memory")
- ELSIF Kernel.err = 10001H THEN out.WriteSString("bus error")
- ELSIF Kernel.err = 10002H THEN out.WriteSString("address error")
- ELSIF Kernel.err = 10007H THEN out.WriteSString("fpu error")
- ELSIF Kernel.err < 0 THEN
- out.WriteSString("Exception "); out.WriteIntForm(-Kernel.err, TextMappers.hexadecimal, 3, "0", TextMappers.showBase)
- ELSE
- out.WriteSString("TRAP "); out.WriteInt(Kernel.err);
- IF Kernel.err = 126 THEN out.WriteSString(" (not yet implemented)")
- ELSIF Kernel.err = 125 THEN out.WriteSString(" (call of obsolete procedure)")
- ELSIF Kernel.err >= 100 THEN out.WriteSString(" (invariant violated)")
- ELSIF Kernel.err >= 60 THEN out.WriteSString(" (postcondition violated)")
- ELSIF Kernel.err >= 20 THEN out.WriteSString(" (precondition violated)")
- END
- END;
- GetTrapMsg(msg);
- IF msg # "" THEN out.WriteLn; out.WriteString(msg) END;
- out.WriteLn; out.rider.SetAttr(a0);
- out.WriteLn; ShowStack;
- NEW(action); action.text := out.rider.Base();
- Services.DoLater(action, Services.now);
- out.ConnectTo(NIL)
- END Trap;
- BEGIN
- Kernel.InstallTrapViewer(Trap);
- empty := "";
- path[0].x := refViewSize DIV 2; path[0].y := 0;
- path[1].x := refViewSize; path[1].y := refViewSize DIV 2;
- path[2].x := refViewSize DIV 2; path[2].y := refViewSize;
- path[3].x := 0; path[3].y := refViewSize DIV 2;
- END StdDebug.
|