Debug.txt 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. MODULE StdDebug;
  2. (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Std/Mod/Debug.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT SYSTEM,
  5. Kernel, Strings, Fonts, Services, Ports, Views, Properties, Dialog, Containers, StdFolds,
  6. TextModels, TextMappers, TextViews, TextRulers;
  7. CONST
  8. refViewSize = 9 * Ports.point;
  9. heap = 1; source = 2; module = 3; modules = 4; (* RefView types *)
  10. TYPE
  11. Name = Kernel.Name;
  12. ArrayPtr = POINTER TO RECORD
  13. last, t, first: INTEGER; (* gc header *)
  14. len: ARRAY 16 OF INTEGER (* dynamic array length table *)
  15. END;
  16. RefView = POINTER TO RefViewDesc;
  17. RefViewDesc = RECORD
  18. type: SHORTINT;
  19. command: SHORTINT;
  20. back: RefView;
  21. adr: INTEGER;
  22. desc: Kernel.Type;
  23. ptr: ArrayPtr;
  24. name: Name
  25. END;
  26. Action = POINTER TO RECORD (Services.Action)
  27. text: TextModels.Model
  28. END;
  29. Cluster = POINTER TO RECORD [untagged] (* must correspond to Kernel.Cluster *)
  30. size: INTEGER;
  31. next: Cluster
  32. END;
  33. VAR
  34. out: TextMappers.Formatter;
  35. path: ARRAY 4 OF Ports.Point;
  36. empty: Name;
  37. PROCEDURE NewRuler (): TextRulers.Ruler;
  38. CONST mm = Ports.mm;
  39. VAR r: TextRulers.Ruler;
  40. BEGIN
  41. r := TextRulers.dir.New(NIL);
  42. TextRulers.SetRight(r, 140 * mm);
  43. TextRulers.AddTab(r, 4 * mm); TextRulers.AddTab(r, 34 * mm); TextRulers.AddTab(r, 80 * mm);
  44. RETURN r
  45. END NewRuler;
  46. PROCEDURE OpenViewer (t: TextModels.Model; title: Views.Title; ruler:TextRulers.Ruler);
  47. VAR v: TextViews.View; c: Containers.Controller;
  48. BEGIN
  49. Dialog.MapString(title, title);
  50. v := TextViews.dir.New(t);
  51. v.SetDefaults(ruler, TextViews.dir.defAttr);
  52. c := v.ThisController();
  53. IF c # NIL THEN
  54. c.SetOpts(c.opts - {Containers.noFocus, Containers.noSelection} + {Containers.noCaret})
  55. END;
  56. Views.OpenAux(v, title)
  57. END OpenViewer;
  58. PROCEDURE OpenFold (hidden: ARRAY OF CHAR);
  59. VAR fold: StdFolds.Fold; t: TextModels.Model; w: TextMappers.Formatter;
  60. BEGIN
  61. Dialog.MapString(hidden, hidden);
  62. t := TextModels.dir.New();
  63. w.ConnectTo(t); w.WriteString(hidden);
  64. fold := StdFolds.dir.New(StdFolds.expanded, "", t);
  65. out.WriteView(fold)
  66. END OpenFold;
  67. PROCEDURE CloseFold (collaps: BOOLEAN);
  68. VAR fold: StdFolds.Fold; m: TextModels.Model;
  69. BEGIN
  70. fold := StdFolds.dir.New(StdFolds.expanded, "", NIL);
  71. out.WriteView(fold);
  72. IF collaps THEN fold.Flip(); m := out.rider.Base(); out.SetPos(m.Length()) END
  73. END CloseFold;
  74. PROCEDURE WriteHex (n: INTEGER);
  75. BEGIN
  76. out.WriteIntForm(n, TextMappers.hexadecimal, 9, "0", TextMappers.showBase)
  77. END WriteHex;
  78. PROCEDURE WriteString (adr, len, base: INTEGER; zterm, unicode: BOOLEAN);
  79. CONST beg = 0; char = 1; code = 2;
  80. VAR ch: CHAR; sc: SHORTCHAR; val, mode: INTEGER; str: ARRAY 16 OF CHAR;
  81. BEGIN
  82. mode := beg;
  83. IF base = 2 THEN SYSTEM.GET(adr, ch); val := ORD(ch) ELSE SYSTEM.GET(adr, sc); val := ORD(sc) END;
  84. IF zterm & (val = 0) THEN out.WriteSString('""')
  85. ELSE
  86. REPEAT
  87. IF (val >= ORD(" ")) & (val < 7FH) OR (val > 0A0H) & (val < 100H) OR unicode & (val >= 100H) THEN
  88. IF mode # char THEN
  89. IF mode = code THEN out.WriteSString(", ") END;
  90. out.WriteChar(22X); mode := char
  91. END;
  92. out.WriteChar(CHR(val))
  93. ELSE
  94. IF mode = char THEN out.WriteChar(22X) END;
  95. IF mode # beg THEN out.WriteSString(", ") END;
  96. mode := code; Strings.IntToStringForm(val, Strings.hexadecimal, 1, "0", FALSE, str);
  97. IF str[0] > "9" THEN out.WriteChar("0") END;
  98. out.WriteString(str); out.WriteChar("X")
  99. END;
  100. INC(adr, base); DEC(len);
  101. IF base = 2 THEN SYSTEM.GET(adr, ch); val := ORD(ch) ELSE SYSTEM.GET(adr, sc); val := ORD(sc) END
  102. UNTIL (len = 0) OR zterm & (val = 0)
  103. END;
  104. IF mode = char THEN out.WriteChar(22X) END
  105. END WriteString;
  106. PROCEDURE OutString (s: ARRAY OF CHAR);
  107. VAR str: Dialog.String;
  108. BEGIN
  109. Dialog.MapString(s, str);
  110. out.WriteString(str)
  111. END OutString;
  112. (* ------------------- variable display ------------------- *)
  113. PROCEDURE FormOf (t: Kernel.Type): SHORTCHAR;
  114. BEGIN
  115. IF SYSTEM.VAL(INTEGER, t) DIV 256 = 0 THEN
  116. RETURN SHORT(CHR(SYSTEM.VAL(INTEGER, t)))
  117. ELSE
  118. RETURN SHORT(CHR(16 + t.id MOD 4))
  119. END
  120. END FormOf;
  121. PROCEDURE LenOf (t: Kernel.Type; ptr: ArrayPtr): INTEGER;
  122. BEGIN
  123. IF t.size # 0 THEN RETURN t.size
  124. ELSIF ptr # NIL THEN RETURN ptr.len[t.id DIV 16 MOD 16 - 1]
  125. ELSE RETURN 0
  126. END
  127. END LenOf;
  128. PROCEDURE SizeOf (t: Kernel.Type; ptr: ArrayPtr): INTEGER;
  129. BEGIN
  130. CASE FormOf(t) OF
  131. | 0BX: RETURN 0
  132. | 1X, 2X, 4X: RETURN 1
  133. | 3X, 5X: RETURN 2
  134. | 8X, 0AX: RETURN 8
  135. | 11X: RETURN t.size
  136. | 12X: RETURN LenOf(t, ptr) * SizeOf(t.base[0], ptr)
  137. ELSE RETURN 4
  138. END
  139. END SizeOf;
  140. PROCEDURE WriteName (t: Kernel.Type; ptr: ArrayPtr);
  141. VAR name: Kernel.Name; f: SHORTCHAR;
  142. BEGIN
  143. f := FormOf(t);
  144. CASE f OF
  145. | 0X: OutString("#Dev:Unknown")
  146. | 1X: out.WriteSString("BOOLEAN")
  147. | 2X: out.WriteSString("SHORTCHAR")
  148. | 3X: out.WriteSString("CHAR")
  149. | 4X: out.WriteSString("BYTE")
  150. | 5X: out.WriteSString("SHORTINT")
  151. | 6X: out.WriteSString("INTEGER")
  152. | 7X: out.WriteSString("SHORTREAL")
  153. | 8X: out.WriteSString("REAL")
  154. | 9X: out.WriteSString("SET")
  155. | 0AX: out.WriteSString("LONGINT")
  156. | 0BX: out.WriteSString("ANYREC")
  157. | 0CX: out.WriteSString("ANYPTR")
  158. | 0DX: out.WriteSString("POINTER")
  159. | 0EX: out.WriteSString("PROCEDURE")
  160. | 0FX: out.WriteSString("STRING")
  161. | 10X..13X:
  162. Kernel.GetTypeName(t, name);
  163. IF name = "!" THEN
  164. IF f = 11X THEN out.WriteSString("RECORD")
  165. ELSIF f = 12X THEN out.WriteSString("ARRAY")
  166. ELSE OutString("#Dev:Unknown")
  167. END
  168. ELSIF (t.id DIV 256 # 0) & (t.mod.refcnt >= 0) THEN
  169. out.WriteSString(t.mod.name); out.WriteChar("."); out.WriteSString(name)
  170. ELSIF f = 11X THEN
  171. out.WriteSString(t.mod.name); out.WriteSString(".RECORD")
  172. ELSIF f = 12X THEN
  173. out.WriteSString("ARRAY "); out.WriteInt(LenOf(t, ptr)); t := t.base[0];
  174. WHILE (FormOf(t) = 12X) & ((t.id DIV 256 = 0) OR (t.mod.refcnt < 0)) DO
  175. out.WriteSString(", "); out.WriteInt(LenOf(t, ptr)); t := t.base[0]
  176. END;
  177. out.WriteSString(" OF "); WriteName(t, ptr)
  178. ELSIF f = 13X THEN
  179. out.WriteSString("POINTER")
  180. ELSE
  181. out.WriteSString("PROCEDURE")
  182. END
  183. | 20X: out.WriteSString("COM.IUnknown")
  184. | 21X: out.WriteSString("COM.GUID")
  185. | 22X: out.WriteSString("COM.RESULT")
  186. ELSE OutString("#Dev:UnknownFormat"); out.WriteInt(ORD(f))
  187. END
  188. END WriteName;
  189. PROCEDURE WriteGuid (a: INTEGER);
  190. PROCEDURE Hex (a: INTEGER);
  191. VAR x: SHORTCHAR;
  192. BEGIN
  193. SYSTEM.GET(a, x);
  194. out.WriteIntForm(ORD(x), TextMappers.hexadecimal, 2, "0", FALSE)
  195. END Hex;
  196. BEGIN
  197. out.WriteChar("{");
  198. Hex(a + 3); Hex(a + 2); Hex(a + 1); Hex(a);
  199. out.WriteChar("-");
  200. Hex(a + 5); Hex(a + 4);
  201. out.WriteChar("-");
  202. Hex(a + 7); Hex(a + 6);
  203. out.WriteChar("-");
  204. Hex(a + 8);
  205. Hex(a + 9);
  206. out.WriteChar("-");
  207. Hex(a + 10);
  208. Hex(a + 11);
  209. Hex(a + 12);
  210. Hex(a + 13);
  211. Hex(a + 14);
  212. Hex(a + 15);
  213. out.WriteChar("}")
  214. END WriteGuid;
  215. PROCEDURE^ ShowVar (ad, ind: INTEGER; f, c: SHORTCHAR; desc: Kernel.Type; ptr: ArrayPtr;
  216. back: RefView; VAR name, sel: Name);
  217. PROCEDURE ShowRecord (a, ind: INTEGER; desc: Kernel.Type; back: RefView; VAR sel: Name);
  218. VAR dir: Kernel.Directory; obj: Kernel.Object; name: Kernel.Name; i, j, n: INTEGER; base: Kernel.Type;
  219. BEGIN
  220. WriteName(desc, NIL); out.WriteTab;
  221. IF desc.mod.refcnt >= 0 THEN
  222. OpenFold("#Dev:Fields");
  223. n := desc.id DIV 16 MOD 16; j := 0;
  224. WHILE j <= n DO
  225. base := desc.base[j];
  226. IF base # NIL THEN
  227. dir := base.fields; i := 0;
  228. WHILE i < dir.num DO
  229. obj := SYSTEM.VAL(Kernel.Object, SYSTEM.ADR(dir.obj[i]));
  230. Kernel.GetObjName(base.mod, obj, name);
  231. ShowVar(a + obj.offs, ind, FormOf(obj.struct), 1X, obj.struct, NIL, back, name, sel);
  232. INC(i)
  233. END
  234. END;
  235. INC(j)
  236. END;
  237. out.WriteSString(" "); CloseFold((ind > 1) OR (sel # ""))
  238. ELSE
  239. OutString("#Dev:Unloaded")
  240. END
  241. END ShowRecord;
  242. PROCEDURE ShowArray (a, ind: INTEGER; desc: Kernel.Type; ptr: ArrayPtr; back: RefView; VAR sel: Name);
  243. VAR f: SHORTCHAR; i, n, m, size, len: INTEGER; name: Kernel.Name; eltyp, t: Kernel.Type;
  244. vi: SHORTINT; vs: BYTE; str: Dialog.String; high: BOOLEAN;
  245. BEGIN
  246. WriteName(desc, ptr); out.WriteTab;
  247. len := LenOf(desc, ptr); eltyp := desc.base[0]; f := FormOf(eltyp); size := SizeOf(eltyp, ptr);
  248. IF (f = 2X) OR (f = 3X) THEN (* string *)
  249. n := 0; m := len; high := FALSE;
  250. IF f = 2X THEN
  251. REPEAT SYSTEM.GET(a + n, vs); INC(n) UNTIL (n = 32) OR (n = len) OR (vs = 0);
  252. REPEAT DEC(m); SYSTEM.GET(a + m, vs) UNTIL (m = 0) OR (vs # 0)
  253. ELSE
  254. REPEAT
  255. SYSTEM.GET(a + n * 2, vi); INC(n);
  256. IF vi DIV 256 # 0 THEN high := TRUE END
  257. UNTIL (n = len) OR (vi = 0);
  258. n := MIN(n, 32);
  259. REPEAT DEC(m); SYSTEM.GET(a + m * 2, vi) UNTIL (m = 0) OR (vi # 0)
  260. END;
  261. WriteString(a, n, size, TRUE, TRUE);
  262. INC(m, 2);
  263. IF m > len THEN m := len END;
  264. IF high OR (m > n) THEN
  265. out.WriteSString(" "); OpenFold("...");
  266. out.WriteLn;
  267. IF high & (n = 32) THEN
  268. WriteString(a, m, size, TRUE, TRUE);
  269. out.WriteLn; out.WriteLn
  270. END;
  271. WriteString(a, m, size, FALSE, FALSE);
  272. IF m < len THEN out.WriteSString(", ..., 0X") END;
  273. out.WriteSString(" "); CloseFold(TRUE)
  274. END
  275. ELSE
  276. t := eltyp;
  277. WHILE FormOf(t) = 12X DO t := t.base[0] END;
  278. IF FormOf(t) # 0X THEN
  279. OpenFold("#Dev:Elements");
  280. i := 0;
  281. WHILE i < len DO
  282. Strings.IntToString(i, str);
  283. name := "[" + SHORT(str$) + "]";
  284. ShowVar(a, ind, f, 1X, eltyp, ptr, back, name, sel);
  285. INC(i); INC(a, size)
  286. END;
  287. out.WriteSString(" "); CloseFold(TRUE)
  288. END
  289. END
  290. END ShowArray;
  291. PROCEDURE ShowProcVar (a: INTEGER);
  292. VAR vli, n, ref: INTEGER; m: Kernel.Module; name: Kernel.Name;
  293. BEGIN
  294. SYSTEM.GET(a, vli);
  295. Kernel.SearchProcVar(vli, m, vli);
  296. IF m = NIL THEN
  297. IF vli = 0 THEN out.WriteSString("NIL")
  298. ELSE WriteHex(vli)
  299. END
  300. ELSE
  301. IF m.refcnt >= 0 THEN
  302. out.WriteSString(m.name); ref := m.refs;
  303. REPEAT Kernel.GetRefProc(ref, n, name) UNTIL (n = 0) OR (vli < n);
  304. IF vli < n THEN out.WriteChar("."); out.WriteSString(name) END
  305. ELSE
  306. OutString("#Dev:ProcInUnloadedMod");
  307. out.WriteSString(m.name); out.WriteSString(" !!!")
  308. END
  309. END
  310. END ShowProcVar;
  311. PROCEDURE ShowPointer (a: INTEGER; f: SHORTCHAR; desc: Kernel.Type; back: RefView; VAR sel: Name);
  312. VAR adr, x: INTEGER; ptr: ArrayPtr; c: Cluster; btyp: Kernel.Type;
  313. BEGIN
  314. SYSTEM.GET(a, adr);
  315. IF f = 13X THEN btyp := desc.base[0] ELSE btyp := NIL END;
  316. IF adr = 0 THEN out.WriteSString("NIL")
  317. ELSIF f = 20X THEN
  318. out.WriteChar("["); WriteHex(adr); out.WriteChar("]");
  319. out.WriteChar(" "); c := SYSTEM.VAL(Cluster, Kernel.Root());
  320. WHILE (c # NIL) & ((adr < SYSTEM.VAL(INTEGER, c)) OR (adr >= SYSTEM.VAL(INTEGER, c) + c.size)) DO c := c.next END;
  321. IF c # NIL THEN
  322. ptr := SYSTEM.VAL(ArrayPtr, adr)
  323. END
  324. ELSE
  325. IF (f = 13X) OR (f = 0CX) THEN x := adr - 4 ELSE x := adr END;
  326. IF ((adr < -4) OR (adr >= 65536)) & Kernel.IsReadable(x, adr + 16) THEN
  327. out.WriteChar("["); WriteHex(adr); out.WriteChar("]");
  328. IF (f = 13X) OR (f = 0CX) THEN
  329. out.WriteChar(" "); c := SYSTEM.VAL(Cluster, Kernel.Root());
  330. WHILE (c # NIL) & ((adr < SYSTEM.VAL(INTEGER, c)) OR (adr >= SYSTEM.VAL(INTEGER, c) + c.size)) DO
  331. c := c.next
  332. END;
  333. IF c # NIL THEN
  334. ptr := SYSTEM.VAL(ArrayPtr, adr);
  335. IF (f = 13X) & (FormOf(btyp) = 12X) THEN (* array *)
  336. adr := SYSTEM.ADR(ptr.len[btyp.id DIV 16 MOD 16])
  337. END
  338. ELSE OutString("#Dev:IllegalPointer")
  339. END
  340. END
  341. ELSE OutString("#Dev:IllegalAddress"); WriteHex(adr)
  342. END
  343. END
  344. END ShowPointer;
  345. PROCEDURE ShowSelector (ref: RefView);
  346. VAR b: RefView; n: SHORTINT; a, a0: TextModels.Attributes;
  347. BEGIN
  348. b := ref.back; n := 1;
  349. IF b # NIL THEN
  350. WHILE (b.name = ref.name) & (b.back # NIL) DO INC(n); b := b.back END;
  351. ShowSelector(b);
  352. IF n > 1 THEN out.WriteChar("(") END;
  353. out.WriteChar(".")
  354. END;
  355. out.WriteSString(ref.name);
  356. IF ref.type = heap THEN out.WriteChar("^") END;
  357. IF n > 1 THEN
  358. out.WriteChar(")");
  359. a0 := out.rider.attr; a := TextModels.NewOffset(a0, 2 * Ports.point);
  360. out.rider.SetAttr(a);
  361. out.WriteInt(n); out.rider.SetAttr(a0)
  362. END
  363. END ShowSelector;
  364. PROCEDURE ShowVar (ad, ind: INTEGER; f, c: SHORTCHAR; desc: Kernel.Type; ptr: ArrayPtr; back: RefView;
  365. VAR name, sel: Name);
  366. VAR i, j, vli, a: INTEGER; tsel: Name; a0: TextModels.Attributes;
  367. vc: SHORTCHAR; vsi: BYTE; vi: SHORTINT; vr: SHORTREAL; vlr: REAL; vs: SET;
  368. BEGIN
  369. out.WriteLn; out.WriteTab; i := 0;
  370. WHILE i < ind DO out.WriteSString(" "); INC(i) END;
  371. a := ad; i := 0; j := 0;
  372. IF sel # "" THEN
  373. WHILE sel[i] # 0X DO tsel[i] := sel[i]; INC(i) END;
  374. IF (tsel[i-1] # ":") & (name[0] # "[") THEN tsel[i] := "."; INC(i) END
  375. END;
  376. WHILE name[j] # 0X DO tsel[i] := name[j]; INC(i); INC(j) END;
  377. tsel[i] := 0X;
  378. a0 := out.rider.attr;
  379. IF c = 3X THEN (* varpar *)
  380. SYSTEM.GET(ad, a);
  381. out.rider.SetAttr(TextModels.NewStyle(a0, {Fonts.italic}))
  382. END;
  383. IF name[0] # "[" THEN out.WriteChar(".") END;
  384. out.WriteSString(name);
  385. out.rider.SetAttr(a0); out.WriteTab;
  386. IF (c = 3X) & (a >= 0) & (a < 65536) THEN
  387. out.WriteTab; out.WriteSString("NIL VARPAR")
  388. ELSIF f = 11X THEN
  389. Kernel.GetTypeName(desc, name);
  390. IF (c = 3X) & (name[0] # "!") THEN SYSTEM.GET(ad + 4, desc) END; (* dynamic type *)
  391. ShowRecord(a, ind + 1, desc, back, tsel)
  392. ELSIF (c = 3X) & (f = 0BX) THEN (* VAR anyrecord *)
  393. SYSTEM.GET(ad + 4, desc);
  394. ShowRecord(a, ind + 1, desc, back, tsel)
  395. ELSIF f = 12X THEN
  396. IF (desc.size = 0) & (ptr = NIL) THEN SYSTEM.GET(ad, a) END; (* dyn array val par *)
  397. IF ptr = NIL THEN ptr := SYSTEM.VAL(ArrayPtr, ad - 8) END;
  398. ShowArray(a, ind + 1, desc, ptr, back, tsel)
  399. ELSE
  400. IF desc = NIL THEN desc := SYSTEM.VAL(Kernel.Type, ORD(f)) END;
  401. WriteName(desc, NIL); out.WriteTab;
  402. CASE f OF
  403. | 0X: (* SYSTEM.GET(a, vli); WriteHex(vli) *)
  404. | 1X: SYSTEM.GET(a, vc);
  405. IF vc = 0X THEN out.WriteSString("FALSE")
  406. ELSIF vc = 1X THEN out.WriteSString("TRUE")
  407. ELSE OutString("#Dev:Undefined"); out.WriteInt(ORD(vc))
  408. END
  409. | 2X: WriteString(a, 1, 1, FALSE, FALSE)
  410. | 3X: WriteString(a, 1, 2, FALSE, TRUE);
  411. SYSTEM.GET(a, vi);
  412. IF vi DIV 256 # 0 THEN out.WriteString(" "); WriteString(a, 1, 2, FALSE, FALSE) END
  413. | 4X: SYSTEM.GET(a, vsi); out.WriteInt(vsi)
  414. | 5X: SYSTEM.GET(a, vi); out.WriteInt(vi)
  415. | 6X: SYSTEM.GET(a, vli); out.WriteInt(vli)
  416. | 7X: SYSTEM.GET(a, vr); out.WriteReal(vr)
  417. | 8X: SYSTEM.GET(a, vlr); out.WriteReal(vlr)
  418. | 9X: SYSTEM.GET(a, vs); out.WriteSet(vs)
  419. | 0AX: SYSTEM.GET(a, vli); SYSTEM.GET(a + 4, i);
  420. IF (vli >= 0) & (i = 0) OR (vli < 0) & (i = -1) THEN out.WriteInt(vli)
  421. ELSE out.WriteIntForm(i, TextMappers.hexadecimal, 8, "0", TextMappers.hideBase); WriteHex(vli)
  422. END
  423. | 0CX, 0DX, 13X, 20X: ShowPointer(a, f, desc, back, tsel)
  424. | 0EX, 10X: ShowProcVar(a)
  425. | 0FX: WriteString(a, 256, 1, TRUE, FALSE)
  426. | 21X: WriteGuid(a)
  427. | 22X: SYSTEM.GET(a, vli); WriteHex(vli)
  428. ELSE
  429. END
  430. END
  431. END ShowVar;
  432. PROCEDURE ShowStack;
  433. VAR ref, end, i, j, x, a, b, c: INTEGER; m, f: SHORTCHAR; mod: Kernel.Module; name, sel: Kernel.Name;
  434. d: Kernel.Type;
  435. BEGIN
  436. a := Kernel.pc; b := Kernel.fp; c := 100;
  437. REPEAT
  438. mod := Kernel.modList;
  439. WHILE (mod # NIL) & ((a < mod.code) OR (a >= mod.code + mod.csize)) DO mod := mod.next END;
  440. IF mod # NIL THEN
  441. DEC(a, mod.code);
  442. IF mod.refcnt >= 0 THEN
  443. out.WriteChar(" "); out.WriteSString(mod.name); ref := mod.refs;
  444. REPEAT Kernel.GetRefProc(ref, end, name) UNTIL (end = 0) OR (a < end);
  445. IF a < end THEN
  446. out.WriteChar("."); out.WriteSString(name);
  447. sel := mod.name$; i := 0;
  448. WHILE sel[i] # 0X DO INC(i) END;
  449. sel[i] := "."; INC(i); j := 0;
  450. WHILE name[j] # 0X DO sel[i] := name[j]; INC(i); INC(j) END;
  451. sel[i] := ":"; sel[i+1] := 0X;
  452. out.WriteSString(" ["); WriteHex(a);
  453. out.WriteSString("] ");
  454. i := Kernel.SourcePos(mod, 0);
  455. IF name # "$$" THEN
  456. Kernel.GetRefVar(ref, m, f, d, x, name);
  457. WHILE m # 0X DO
  458. IF name[0] # "@" THEN ShowVar(b + x, 0, f, m, d, NIL, NIL, name, sel) END;
  459. Kernel.GetRefVar(ref, m, f, d, x, name)
  460. END
  461. END;
  462. out.WriteLn
  463. ELSE out.WriteSString(".???"); out.WriteLn
  464. END
  465. ELSE
  466. out.WriteChar("("); out.WriteSString(mod.name);
  467. out.WriteSString(") (pc="); WriteHex(a);
  468. out.WriteSString(", fp="); WriteHex(b); out.WriteChar(")");
  469. out.WriteLn
  470. END
  471. ELSE
  472. out.WriteSString("<system> (pc="); WriteHex(a);
  473. out.WriteSString(", fp="); WriteHex(b); out.WriteChar(")");
  474. out.WriteLn
  475. END;
  476. IF (b >= Kernel.fp) & (b < Kernel.stack) THEN
  477. SYSTEM.GET(b+4, a); (* stacked pc *)
  478. SYSTEM.GET(b, b); (* dynamic link *)
  479. DEC(a); DEC(c)
  480. ELSE c := 0
  481. END
  482. UNTIL c = 0
  483. END ShowStack;
  484. PROCEDURE (a: Action) Do; (* delayed trap window open *)
  485. BEGIN
  486. Kernel.SetTrapGuard(TRUE);
  487. OpenViewer(a.text, "#Dev:Trap", NewRuler());
  488. Kernel.SetTrapGuard(FALSE);
  489. END Do;
  490. PROCEDURE GetTrapMsg(OUT msg: ARRAY OF CHAR);
  491. VAR ref, end, a: INTEGER; mod: Kernel.Module; name: Kernel.Name; head, tail, errstr: ARRAY 32 OF CHAR;
  492. key: ARRAY 128 OF CHAR;
  493. BEGIN
  494. a := Kernel.pc; mod := Kernel.modList;
  495. WHILE (mod # NIL) & ((a < mod.code) OR (a >= mod.code + mod.csize)) DO mod := mod.next END;
  496. IF mod # NIL THEN
  497. DEC(a, mod.code); ref := mod.refs;
  498. REPEAT Kernel.GetRefProc(ref, end, name) UNTIL (end = 0) OR (a < end);
  499. IF a < end THEN
  500. Kernel.SplitName (mod.name$, head, tail);
  501. IF head = "" THEN head := "System" END;
  502. Strings.IntToString(Kernel.err, errstr);
  503. key := tail + "." + name + "." + errstr;
  504. Dialog.MapString("#" + head + ":" + key, msg);
  505. (* IF key # msg THEN out.WriteString(" " + msg) END; *)
  506. IF key = msg THEN msg := "" END;
  507. END
  508. END
  509. END GetTrapMsg;
  510. PROCEDURE Trap;
  511. VAR a0: TextModels.Attributes; action: Action; msg: ARRAY 512 OF CHAR;
  512. BEGIN
  513. out.ConnectTo(TextModels.dir.New());
  514. a0 := out.rider.attr;
  515. out.rider.SetAttr(TextModels.NewWeight(a0, Fonts.bold));
  516. IF Kernel.err = 129 THEN out.WriteSString("invalid WITH")
  517. ELSIF Kernel.err = 130 THEN out.WriteSString("invalid CASE")
  518. ELSIF Kernel.err = 131 THEN out.WriteSString("function without RETURN")
  519. ELSIF Kernel.err = 132 THEN out.WriteSString("type guard")
  520. ELSIF Kernel.err = 133 THEN out.WriteSString("implied type guard")
  521. ELSIF Kernel.err = 134 THEN out.WriteSString("value out of range")
  522. ELSIF Kernel.err = 135 THEN out.WriteSString("index out of range")
  523. ELSIF Kernel.err = 136 THEN out.WriteSString("string too long")
  524. ELSIF Kernel.err = 137 THEN out.WriteSString("stack overflow")
  525. ELSIF Kernel.err = 138 THEN out.WriteSString("integer overflow")
  526. ELSIF Kernel.err = 139 THEN out.WriteSString("division by zero")
  527. ELSIF Kernel.err = 140 THEN out.WriteSString("infinite real result")
  528. ELSIF Kernel.err = 141 THEN out.WriteSString("real underflow")
  529. ELSIF Kernel.err = 142 THEN out.WriteSString("real overflow")
  530. ELSIF Kernel.err = 143 THEN out.WriteSString("undefined real result")
  531. ELSIF Kernel.err = 144 THEN out.WriteSString("not a number")
  532. ELSIF Kernel.err = 200 THEN out.WriteSString("keyboard interrupt")
  533. ELSIF Kernel.err = 201 THEN
  534. out.WriteSString("NIL dereference")
  535. ELSIF Kernel.err = 202 THEN
  536. out.WriteSString("illegal instruction: ");
  537. out.WriteIntForm(Kernel.val, TextMappers.hexadecimal, 5, "0", TextMappers.showBase)
  538. ELSIF Kernel.err = 203 THEN
  539. IF (Kernel.val >= -4) & (Kernel.val < 65536) THEN out.WriteSString("NIL dereference (read)")
  540. ELSE out.WriteSString("illegal memory read (ad = "); WriteHex(Kernel.val); out.WriteChar(")")
  541. END
  542. ELSIF Kernel.err = 204 THEN
  543. IF (Kernel.val >= -4) & (Kernel.val < 65536) THEN out.WriteSString("NIL dereference (write)")
  544. ELSE out.WriteSString("illegal memory write (ad = "); WriteHex(Kernel.val); out.WriteChar(")")
  545. END
  546. ELSIF Kernel.err = 205 THEN
  547. IF (Kernel.val >= -4) & (Kernel.val < 65536) THEN out.WriteSString("NIL procedure call")
  548. ELSE out.WriteSString("illegal execution (ad = "); WriteHex(Kernel.val); out.WriteChar(")")
  549. END
  550. ELSIF Kernel.err = 257 THEN out.WriteSString("out of memory")
  551. ELSIF Kernel.err = 10001H THEN out.WriteSString("bus error")
  552. ELSIF Kernel.err = 10002H THEN out.WriteSString("address error")
  553. ELSIF Kernel.err = 10007H THEN out.WriteSString("fpu error")
  554. ELSIF Kernel.err < 0 THEN
  555. out.WriteSString("Exception "); out.WriteIntForm(-Kernel.err, TextMappers.hexadecimal, 3, "0", TextMappers.showBase)
  556. ELSE
  557. out.WriteSString("TRAP "); out.WriteInt(Kernel.err);
  558. IF Kernel.err = 126 THEN out.WriteSString(" (not yet implemented)")
  559. ELSIF Kernel.err = 125 THEN out.WriteSString(" (call of obsolete procedure)")
  560. ELSIF Kernel.err >= 100 THEN out.WriteSString(" (invariant violated)")
  561. ELSIF Kernel.err >= 60 THEN out.WriteSString(" (postcondition violated)")
  562. ELSIF Kernel.err >= 20 THEN out.WriteSString(" (precondition violated)")
  563. END
  564. END;
  565. GetTrapMsg(msg);
  566. IF msg # "" THEN out.WriteLn; out.WriteString(msg) END;
  567. out.WriteLn; out.rider.SetAttr(a0);
  568. out.WriteLn; ShowStack;
  569. NEW(action); action.text := out.rider.Base();
  570. Services.DoLater(action, Services.now);
  571. out.ConnectTo(NIL)
  572. END Trap;
  573. BEGIN
  574. Kernel.InstallTrapViewer(Trap);
  575. empty := "";
  576. path[0].x := refViewSize DIV 2; path[0].y := 0;
  577. path[1].x := refViewSize; path[1].y := refViewSize DIV 2;
  578. path[2].x := refViewSize DIV 2; path[2].y := refViewSize;
  579. path[3].x := 0; path[3].y := refViewSize DIV 2;
  580. END StdDebug.