mirror of https://github.com/m-labs/artiq.git
transforms.ARTIQIRGenerator: IndexError loc should point to "[".
This commit is contained in:
parent
96c770190c
commit
acd8d6355f
|
@ -466,12 +466,16 @@ class ARTIQIRGenerator(algorithm.Visitor):
|
||||||
def visit_Continue(self, node):
|
def visit_Continue(self, node):
|
||||||
self.append(ir.Branch(self.continue_target))
|
self.append(ir.Branch(self.continue_target))
|
||||||
|
|
||||||
def raise_exn(self, exn):
|
def raise_exn(self, exn, loc=None):
|
||||||
if exn is not None:
|
if exn is not None:
|
||||||
loc_file = ir.Constant(self.current_loc.source_buffer.name, builtins.TStr())
|
if loc is None:
|
||||||
loc_line = ir.Constant(self.current_loc.line(), builtins.TInt(types.TValue(32)))
|
loc = self.current_loc
|
||||||
loc_column = ir.Constant(self.current_loc.column(), builtins.TInt(types.TValue(32)))
|
|
||||||
|
loc_file = ir.Constant(loc.source_buffer.name, builtins.TStr())
|
||||||
|
loc_line = ir.Constant(loc.line(), builtins.TInt(types.TValue(32)))
|
||||||
|
loc_column = ir.Constant(loc.column(), builtins.TInt(types.TValue(32)))
|
||||||
loc_function = ir.Constant(".".join(self.name), builtins.TStr())
|
loc_function = ir.Constant(".".join(self.name), builtins.TStr())
|
||||||
|
|
||||||
self.append(ir.SetAttr(exn, "__file__", loc_file))
|
self.append(ir.SetAttr(exn, "__file__", loc_file))
|
||||||
self.append(ir.SetAttr(exn, "__line__", loc_line))
|
self.append(ir.SetAttr(exn, "__line__", loc_line))
|
||||||
self.append(ir.SetAttr(exn, "__col__", loc_column))
|
self.append(ir.SetAttr(exn, "__col__", loc_column))
|
||||||
|
@ -686,7 +690,7 @@ class ARTIQIRGenerator(algorithm.Visitor):
|
||||||
else:
|
else:
|
||||||
self.append(ir.SetAttr(obj, node.attr, self.current_assign))
|
self.append(ir.SetAttr(obj, node.attr, self.current_assign))
|
||||||
|
|
||||||
def _map_index(self, length, index, one_past_the_end=False):
|
def _map_index(self, length, index, one_past_the_end=False, loc=None):
|
||||||
lt_0 = self.append(ir.Compare(ast.Lt(loc=None),
|
lt_0 = self.append(ir.Compare(ast.Lt(loc=None),
|
||||||
index, ir.Constant(0, index.type)))
|
index, ir.Constant(0, index.type)))
|
||||||
from_end = self.append(ir.Arith(ast.Add(loc=None), length, index))
|
from_end = self.append(ir.Arith(ast.Add(loc=None), length, index))
|
||||||
|
@ -703,7 +707,7 @@ class ARTIQIRGenerator(algorithm.Visitor):
|
||||||
exn = self.alloc_exn(builtins.TIndexError(),
|
exn = self.alloc_exn(builtins.TIndexError(),
|
||||||
ir.Constant("index {0} out of bounds 0:{1}", builtins.TStr()),
|
ir.Constant("index {0} out of bounds 0:{1}", builtins.TStr()),
|
||||||
index, length)
|
index, length)
|
||||||
self.raise_exn(exn)
|
self.raise_exn(exn, loc=loc)
|
||||||
|
|
||||||
self.current_block = in_bounds_block = self.add_block()
|
self.current_block = in_bounds_block = self.add_block()
|
||||||
head.append(ir.BranchIf(in_bounds, in_bounds_block, out_of_bounds_block))
|
head.append(ir.BranchIf(in_bounds, in_bounds_block, out_of_bounds_block))
|
||||||
|
@ -754,7 +758,8 @@ class ARTIQIRGenerator(algorithm.Visitor):
|
||||||
if isinstance(node.slice, ast.Index):
|
if isinstance(node.slice, ast.Index):
|
||||||
index = self.visit(node.slice.value)
|
index = self.visit(node.slice.value)
|
||||||
length = self.iterable_len(value, index.type)
|
length = self.iterable_len(value, index.type)
|
||||||
mapped_index = self._map_index(length, index)
|
mapped_index = self._map_index(length, index,
|
||||||
|
loc=node.begin_loc)
|
||||||
if self.current_assign is None:
|
if self.current_assign is None:
|
||||||
result = self.iterable_get(value, mapped_index)
|
result = self.iterable_get(value, mapped_index)
|
||||||
result.set_name("{}.at.{}".format(value.name, _readable_name(index)))
|
result.set_name("{}.at.{}".format(value.name, _readable_name(index)))
|
||||||
|
@ -769,13 +774,15 @@ class ARTIQIRGenerator(algorithm.Visitor):
|
||||||
start_index = self.visit(node.slice.lower)
|
start_index = self.visit(node.slice.lower)
|
||||||
else:
|
else:
|
||||||
start_index = ir.Constant(0, node.slice.type)
|
start_index = ir.Constant(0, node.slice.type)
|
||||||
mapped_start_index = self._map_index(length, start_index)
|
mapped_start_index = self._map_index(length, start_index,
|
||||||
|
loc=node.begin_loc)
|
||||||
|
|
||||||
if node.slice.upper is not None:
|
if node.slice.upper is not None:
|
||||||
stop_index = self.visit(node.slice.upper)
|
stop_index = self.visit(node.slice.upper)
|
||||||
else:
|
else:
|
||||||
stop_index = length
|
stop_index = length
|
||||||
mapped_stop_index = self._map_index(length, stop_index, one_past_the_end=True)
|
mapped_stop_index = self._map_index(length, stop_index, one_past_the_end=True,
|
||||||
|
loc=node.begin_loc)
|
||||||
|
|
||||||
if node.slice.step is not None:
|
if node.slice.step is not None:
|
||||||
step = self.visit(node.slice.step)
|
step = self.visit(node.slice.step)
|
||||||
|
|
Loading…
Reference in New Issue