Commit 150c4283 authored by Stefan Behnel's avatar Stefan Behnel

Repair indexing syntax in generated Pythran code: must use "(...)" for...

Repair indexing syntax in generated Pythran code: must use "(...)" for multiple indices, but "[...]" for a single index.
Also refactor indexing code to avoid duplication.
Closes #1946.
parent 41b4a28d
...@@ -4193,7 +4193,7 @@ class BufferIndexNode(_IndexingBaseNode): ...@@ -4193,7 +4193,7 @@ class BufferIndexNode(_IndexingBaseNode):
# case. # case.
code.putln("__Pyx_call_destructor(%s);" % obj) code.putln("__Pyx_call_destructor(%s);" % obj)
code.putln("new (&%s) decltype(%s){%s};" % (obj, obj, self.base.pythran_result())) code.putln("new (&%s) decltype(%s){%s};" % (obj, obj, self.base.pythran_result()))
code.putln("%s(%s) %s= %s;" % ( code.putln("%s%s %s= %s;" % (
obj, obj,
pythran_indexing_code(self.indices), pythran_indexing_code(self.indices),
op, op,
...@@ -4224,7 +4224,7 @@ class BufferIndexNode(_IndexingBaseNode): ...@@ -4224,7 +4224,7 @@ class BufferIndexNode(_IndexingBaseNode):
if is_pythran_expr(self.base.type): if is_pythran_expr(self.base.type):
res = self.result() res = self.result()
code.putln("__Pyx_call_destructor(%s);" % res) code.putln("__Pyx_call_destructor(%s);" % res)
code.putln("new (&%s) decltype(%s){%s[%s]};" % ( code.putln("new (&%s) decltype(%s){%s%s};" % (
res, res,
res, res,
self.base.pythran_result(), self.base.pythran_result(),
......
...@@ -58,8 +58,13 @@ def pythran_unaryop_type(op, type_): ...@@ -58,8 +58,13 @@ def pythran_unaryop_type(op, type_):
op, pythran_type(type_)) op, pythran_type(type_))
def pythran_indexing_type(type_, indices): @cython.ccall
def index_code(idx): def _index_access(index_code, indices):
indexing = ",".join([index_code(idx) for idx in indices])
return ('[%s]' if len(indices) == 1 else '(%s)') % indexing
def _index_type_code(idx):
if idx.is_slice: if idx.is_slice:
if idx.step.is_none: if idx.step.is_none:
func = "contiguous_slice" func = "contiguous_slice"
...@@ -75,12 +80,8 @@ def pythran_indexing_type(type_, indices): ...@@ -75,12 +80,8 @@ def pythran_indexing_type(type_, indices):
return "std::declval<%s>()" % idx.type.pythran_type return "std::declval<%s>()" % idx.type.pythran_type
raise ValueError("unsupported indexing type %s!" % idx.type) raise ValueError("unsupported indexing type %s!" % idx.type)
indexing = ",".join(index_code(idx) for idx in indices)
return type_remove_ref("decltype(std::declval<%s>()[%s])" % (pythran_type(type_), indexing))
def pythran_indexing_code(indices): def _index_code(idx):
def index_code(idx):
if idx.is_slice: if idx.is_slice:
values = idx.start, idx.stop, idx.step values = idx.start, idx.stop, idx.step
if idx.step.is_none: if idx.step.is_none:
...@@ -96,7 +97,16 @@ def pythran_indexing_code(indices): ...@@ -96,7 +97,16 @@ def pythran_indexing_code(indices):
return idx.pythran_result() return idx.pythran_result()
raise ValueError("unsupported indexing type %s" % idx.type) raise ValueError("unsupported indexing type %s" % idx.type)
return ",".join(index_code(idx) for idx in indices)
def pythran_indexing_type(type_, indices):
return type_remove_ref("decltype(std::declval<%s>()%s)" % (
pythran_type(type_),
_index_access(_index_type_code, indices),
))
def pythran_indexing_code(indices):
return _index_access(_index_code, indices)
def pythran_func_type(func, args): def pythran_func_type(func, args):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment