Skip to content

Commit 0b1f7e1

Browse files
committed
Merge pull request #192 from gigasquid/exception_printing_querying
Exception printing and querying
2 parents 5766c61 + 65f70db commit 0b1f7e1

File tree

5 files changed

+83
-4
lines changed

5 files changed

+83
-4
lines changed

pixie/stdlib.pxi

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2104,7 +2104,6 @@ Expands to calls to `extend-type`."
21042104
([sb] (str sb))
21052105
([sb item] (conj! sb item)))
21062106

2107-
21082107
(defmacro using [bindings & body]
21092108
(let [pairs (partition 2 bindings)
21102109
names (map first pairs)]
@@ -2114,3 +2113,16 @@ Expands to calls to `extend-type`."
21142113
`(-dispose! ~nm))
21152114
names)
21162115
result#)))
2116+
(defn pst
2117+
{:doc "Prints the trace of a Runtime Exception if given, or the last Runtime Exception in *e"
2118+
:signatures [[] [e]]
2119+
:added "0.1"}
2120+
([] (pst *e))
2121+
([e] (when e (print (str e)))))
2122+
2123+
(defn trace
2124+
{:doc "Returns a seq of the trace of a Runtime Exception or the last Runtime Exception in *e"
2125+
:signatures [[] [e]]
2126+
:added "0.1"}
2127+
([] (trace *e))
2128+
([e] (seq e)))

pixie/vm/object.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ def __repr__(self):
122122

123123
s.extend([u"RuntimeException: " + rt.name(rt.str(self._data)) + u"\n"])
124124

125-
126125
return u"".join(s)
127126

128127
class WrappedException(Exception):
@@ -176,13 +175,34 @@ def __repr__(self):
176175
def interpreter_code_info_state(self):
177176
return self._line, self._line_number, self._column_number, self._file
178177

178+
def trace_map(self):
179+
from pixie.vm.string import String
180+
from pixie.vm.numbers import Integer
181+
from pixie.vm.keyword import keyword
182+
183+
tm = {keyword(u"type") : keyword(u"interpreter")}
184+
tm[keyword(u"line")] = String(self._line.__repr__())
185+
tm[keyword(u"line-number")] = Integer(self._line_number)
186+
tm[keyword(u"column-number")] = Integer(self._column_number)
187+
tm[keyword(u"file")] = String(self._file)
188+
return tm
189+
179190
class NativeCodeInfo(ErrorInfo):
180191
def __init__(self, name):
181192
self._name = name
182193

183194
def __repr__(self):
184195
return u"in internal function " + self._name + u"\n"
185196

197+
def trace_map(self):
198+
from pixie.vm.string import String
199+
from pixie.vm.numbers import Integer
200+
from pixie.vm.keyword import keyword
201+
202+
tm = {keyword(u"type") : keyword(u"native")}
203+
tm[keyword(u"name")] = String(self._name)
204+
return tm
205+
186206
class PolymorphicCodeInfo(ErrorInfo):
187207
def __init__(self, name, tp):
188208
self._name = name
@@ -193,11 +213,30 @@ def __repr__(self):
193213
assert isinstance(tp, Type)
194214
return u"in polymorphic function " + self._name + u" dispatching on " + tp._name + u"\n"
195215

216+
def trace_map(self):
217+
from pixie.vm.string import String
218+
from pixie.vm.numbers import Integer
219+
from pixie.vm.keyword import keyword
196220

221+
tp = self._tp
222+
assert isinstance(tp, Type)
223+
tm = {keyword(u"type") : keyword(u"polymorphic")}
224+
tm[keyword(u"name")] = String(self._name)
225+
tm[keyword(u"tp")] = String(tp._name)
226+
return tm
197227

198228
class PixieCodeInfo(ErrorInfo):
199229
def __init__(self, name):
200230
self._name = name
201231

202232
def __repr__(self):
203233
return u"in pixie function " + self._name + u"\n"
234+
235+
def trace_map(self):
236+
from pixie.vm.string import String
237+
from pixie.vm.numbers import Integer
238+
from pixie.vm.keyword import keyword
239+
240+
tm = {keyword(u"type") : keyword(u"pixie")}
241+
tm[keyword(u"name")] = String(self._name)
242+
return tm

pixie/vm/rt.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ def reinit():
143143
# stacklet.with_stacklets(run_load_stdlib)
144144

145145
init_fns = [u"reduce", u"get", u"reset!", u"assoc", u"key", u"val", u"keys", u"vals", u"vec", u"load-file", u"compile-file",
146-
u"load-ns"]
146+
u"load-ns", u"hashmap"]
147147
for x in init_fns:
148148
globals()[py_str(code.munge(x))] = unwrap(code.intern_var(u"pixie.stdlib", x))
149149

pixie/vm/stdlib.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -774,8 +774,28 @@ def _str(self):
774774
assert isinstance(self, RuntimeException)
775775
return rt.wrap(self.__repr__())
776776

777+
@extend(_seq, RuntimeException)
778+
def _seq(self):
779+
import pixie.vm.persistent_vector as vector
780+
import pixie.vm.persistent_hash_map as hmap
781+
from pixie.vm.keyword import keyword
782+
assert isinstance(self, RuntimeException)
783+
trace = vector.EMPTY
784+
trace_element = rt.hashmap(keyword(u"type"), keyword(u"runtime"))
785+
trace_element = rt.assoc(trace_element, keyword(u"data"), rt.wrap(self._data))
786+
trace = rt.conj(trace, trace_element)
787+
for x in self._trace:
788+
tmap = x.trace_map()
789+
trace_element = hmap.EMPTY
790+
for key in tmap:
791+
val = tmap[key]
792+
trace_element = rt.assoc(trace_element, key, val)
793+
794+
trace = rt.conj(trace, trace_element)
795+
796+
return rt._seq(trace)
797+
777798
@as_var("ex-msg")
778799
def ex_msg(e):
779800
assert isinstance(e, RuntimeException)
780801
return e._data
781-

tests/pixie/tests/test-stdlib.pxi

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,3 +377,11 @@
377377
(t/assert= (transduce (drop-while even?) conj [2 4 6 7 8]) [7 8])
378378
(t/assert= (transduce (drop-while even?) conj [0 2] [1 4 6]) [0 2 1 4 6])
379379
(t/assert= (transduce (drop-while even?) conj [0 2] [2 4 6 7 8]) [0 2 7 8]))
380+
381+
382+
(t/deftest test-trace
383+
(try
384+
(/ 0 0)
385+
(catch e
386+
(t/assert= (first (trace e)) {:type :runtime :data "Divide by zero"})
387+
(t/assert= (second (trace e)) {:type :native :name "_div"} ))))

0 commit comments

Comments
 (0)