Skip to content

Commit fe9bf9a

Browse files
committed
fixed a bunch of issues with error messages
1 parent adb76fd commit fe9bf9a

5 files changed

Lines changed: 53 additions & 9 deletions

File tree

pixie/vm/compiler.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,10 @@ def __init__(self, name, argc, parent_ctx):
7878
self._max_sp = 0
7979
self.can_tail_call = False
8080
self.closed_overs = []
81-
self.name = name
81+
if parent_ctx:
82+
self.name = parent_ctx.name + u"_" + name
83+
else:
84+
self.name = name
8285
self.recur_points = []
8386
self.debug_points = {}
8487

pixie/vm/libs/pxic/reader.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ def read_raw_integer(rdr):
5555
return r_uint(ord(rdr.read()[0]) | (ord(rdr.read()[0]) << 8) | (ord(rdr.read()[0]) << 16) | (ord(rdr.read()[0]) << 24))
5656

5757
def read_raw_string(rdr):
58-
return rdr.read_cached_string()
58+
s = rdr.read_cached_string()
59+
return s
5960

6061
def read_code(rdr):
6162
sz = read_raw_integer(rdr)
@@ -129,7 +130,6 @@ def read_interpreter_code_info(rdr):
129130
line_number = read_raw_integer(rdr)
130131
column_number = read_raw_integer(rdr)
131132
file = read_raw_string(rdr)
132-
133133
return InterpreterCodeInfo(line, intmask(line_number), intmask(column_number), file)
134134

135135
def read_obj(rdr):
@@ -151,6 +151,7 @@ def read_obj(rdr):
151151
return symbol(read_raw_string(rdr))
152152
elif tag == LINE_PROMISE:
153153
lp = LinePromise()
154+
lp._chrs = None
154155
lp._str = read_raw_string(rdr)
155156
return lp
156157
elif tag == MAP:

pixie/vm/libs/pxic/writer.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,6 @@ def write_namespace(o, wtr):
231231

232232
def write_interpreter_code_info(obj, wtr):
233233
line, line_number, column_number, file = obj.interpreter_code_info_state()
234-
235234
write_tag(CODE_INFO, wtr)
236235

237236
write_object(line, wtr)

pixie/vm/object.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,3 +255,24 @@ def trace_map(self):
255255
tm = {keyword(u"type") : keyword(u"pixie")}
256256
tm[keyword(u"name")] = String(self._name)
257257
return tm
258+
259+
class ExtraCodeInfo(ErrorInfo):
260+
def __init__(self, str):
261+
self._str = str
262+
263+
def __repr__(self):
264+
return self._str
265+
266+
def trace_map(self):
267+
import pixie.vm.rt as rt
268+
from pixie.vm.keyword import keyword
269+
270+
tm = {keyword(u"type"): keyword(u"extra"),
271+
keyword(u"data"): rt.wrap(self._str)}
272+
return tm
273+
274+
275+
def add_info(ex, data):
276+
assert isinstance(ex, WrappedException)
277+
ex._ex._trace.append(ExtraCodeInfo(data))
278+
return ex

pixie/vm/stdlib.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22
from pixie.vm.object import Type, _type_registry, WrappedException, RuntimeException, affirm, InterpreterCodeInfo, istypeinstance, \
3-
runtime_error
3+
runtime_error, add_info
44
from pixie.vm.code import BaseCode, PolymorphicFn, wrap_fn, as_var, defprotocol, extend, Protocol, Var, \
55
list_copy, returns, intern_var
66
import pixie.vm.code as code
@@ -506,12 +506,32 @@ def load_reader(rdr):
506506
form = reader.read(rdr, False)
507507
if form is reader.eof:
508508
return nil
509-
compiled = compiler.compile(form)
510509

511-
if pxic_writer is not None:
512-
pxic_writer.write_object(compiled)
510+
try:
511+
compiled = compiler.compile(form)
512+
513+
except WrappedException as ex:
514+
meta = rt.meta(form)
515+
if meta is not nil:
516+
ci = rt.interpreter_code_info(meta)
517+
add_info(ex, ci.__repr__())
518+
add_info(ex, u"Compiling: " + rt.name(rt.str(form)))
519+
raise ex
520+
521+
try:
522+
if pxic_writer is not None:
523+
pxic_writer.write_object(compiled)
524+
525+
compiled.invoke([])
526+
527+
except WrappedException as ex:
528+
meta = rt.meta(form)
529+
if meta is not nil:
530+
ci = rt.interpreter_code_info(meta)
531+
add_info(ex, ci.__repr__())
532+
add_info(ex, u"Running: " + rt.name(rt.str(form)))
533+
raise ex
513534

514-
compiled.invoke([])
515535

516536
if not we_are_translated():
517537
print "done"

0 commit comments

Comments
 (0)