| 38 | | class ObjectCatalog |
| 39 | | |
| 40 | | test |
| 41 | | cat = ObjectCatalog() |
| 42 | | assert cat.maxSerialNum == 0 |
| 43 | | |
| 44 | | a = Object() |
| 45 | | cat.record(a) |
| 46 | | assert cat.maxSerialNum == 1000 |
| 47 | | assert cat.contains(a) |
| 48 | | assert cat.serialNumFor(a) == 1000 |
| 49 | | assert cat.objectFor(1000) is a |
| 50 | | |
| 51 | | b = Object() |
| 52 | | cat.record(b) |
| 53 | | assert cat.maxSerialNum == 1001 |
| 54 | | assert cat.serialNumFor(a) == 1000 |
| 55 | | assert cat.serialNumFor(b) == 1001 |
| 56 | | assert cat.objectFor(1000) is a |
| 57 | | assert cat.objectFor(1001) is b |
| 58 | | |
| 59 | | var _objectToSerialNum = Dictionary<of Object, int>() |
| 60 | | var _serialNumToObject = Dictionary<of int, Object>() |
| 61 | | var _minSerialNum = 0 |
| 62 | | var _maxSerialNum = 0 |
| 63 | | |
| 64 | | def init |
| 65 | | pass |
| 66 | | |
| 67 | | get minSerialNum from var |
| 68 | | |
| 69 | | get maxSerialNum from var |
| 70 | | |
| 71 | | def contains(obj as Object) as bool |
| 72 | | return _objectToSerialNum.containsKey(obj) |
| 73 | | |
| 74 | | def contains(serialNum as int) as bool |
| 75 | | return _serialNumToObject.containsKey(serialNum) |
| 76 | | |
| 77 | | def record(obj as Object) |
| 78 | | ensure .contains(obj) |
| 79 | | if not _objectToSerialNum.containsKey(obj) |
| 80 | | _maxSerialNum = _objectToSerialNum.count + 1000 |
| 81 | | _objectToSerialNum.add(obj, _maxSerialNum) |
| 82 | | _serialNumToObject.add(_maxSerialNum, obj) |
| 83 | | if _minSerialNum == 0 |
| 84 | | _minSerialNum = _maxSerialNum |
| 85 | | |
| 86 | | def serialNumFor(obj as Object) as int |
| 87 | | require |
| 88 | | .contains(obj) |
| 89 | | ensure |
| 90 | | result >= 1000 |
| 91 | | .contains(result) |
| 92 | | body |
| 93 | | return _objectToSerialNum[obj] |
| 94 | | |
| 95 | | def objectFor(serialNum as int) as Object |
| 96 | | require |
| 97 | | .contains(serialNum) |
| 98 | | ensure |
| 99 | | .contains(result) |
| 100 | | body |
| 101 | | return _serialNumToObject[serialNum] |
| 102 | | |
| 114 | | |
| 115 | | class ExceptionReportWriter |
| 116 | | is abstract |
| 117 | | |
| 118 | | def writeReport(tw as TextWriter, exc as Exception?) |
| 119 | | .writeReport(tw, exc, CobraImp.detailedStackTrace) |
| 120 | | |
| 121 | | def writeReport(tw as TextWriter, exc as Exception?, frames as Stack<of CobraFrame>) is abstract |
| 122 | | |
| 123 | | |
| 124 | | class TextExceptionReportWriter |
| 125 | | inherits ExceptionReportWriter |
| 126 | | |
| 127 | | def writeReport(tw as TextWriter, exc as Exception?, frames as Stack<of CobraFrame>) is override |
| 128 | | # dump the most recent stack frames last since the text will output top-down and scroll in the shell |
| 129 | | tw.writeLine('Stack trace:') |
| 130 | | if not frames.count |
| 131 | | tw.writeLine('No stack frames.') |
| 132 | | else |
| 133 | | i = 0 |
| 134 | | for frame in frames |
| 135 | | frame.dumpText(tw, i) |
| 136 | | i += 1 |