# Note: This might be cleaned up by having IndexNode
# parsed in a saner way and only construct the tuple if
# needed.
+
+ # Note that this function must leave IndexNode in a cloneable state.
+ # For buffers, self.index is packed out on the initial analysis, and
+ # when cloning self.indices is copied.
self.is_buffer_access = False
self.base.analyse_types(env)
skip_child_analysis = False
buffer_access = False
if self.base.type.is_buffer:
- assert isinstance(self.base, NameNode)
- if isinstance(self.index, TupleNode):
- indices = self.index.args
+ assert hasattr(self.base, "entry") # Must be a NameNode-like node
+ if self.indices:
+ indices = self.indices
else:
- indices = [self.index]
+ # On cloning, indices is cloned. Otherwise, unpack index into indices
+ assert not isinstance(self.index, CloneNode)
+ if isinstance(self.index, TupleNode):
+ indices = self.index.args
+ else:
+ indices = [self.index]
if len(indices) == self.base.type.ndim:
buffer_access = True
skip_child_analysis = True
def generate_subexpr_evaluation_code(self, code):
self.base.generate_evaluation_code(code)
- if self.index is not None:
+ if not self.indices:
self.index.generate_evaluation_code(code)
else:
for i in self.indices:
def generate_subexpr_disposal_code(self, code):
self.base.generate_disposal_code(code)
- if self.index is not None:
+ if not self.indices:
self.index.generate_disposal_code(code)
else:
for i in self.indices:
self.dup = self.lhs
self.dup.analyse_types(env)
if isinstance(self.lhs, ExprNodes.NameNode):
- target_lhs = ExprNodes.NameNode(self.dup.pos, name = self.dup.name, is_temp = self.dup.is_temp, entry = self.dup.entry)
+ target_lhs = ExprNodes.NameNode(self.dup.pos,
+ name = self.dup.name,
+ is_temp = self.dup.is_temp,
+ entry = self.dup.entry)
elif isinstance(self.lhs, ExprNodes.AttributeNode):
- target_lhs = ExprNodes.AttributeNode(self.dup.pos, obj = ExprNodes.CloneNode(self.lhs.obj), attribute = self.dup.attribute, is_temp = self.dup.is_temp)
+ target_lhs = ExprNodes.AttributeNode(self.dup.pos,
+ obj = ExprNodes.CloneNode(self.lhs.obj),
+ attribute = self.dup.attribute,
+ is_temp = self.dup.is_temp)
elif isinstance(self.lhs, ExprNodes.IndexNode):
- target_lhs = ExprNodes.IndexNode(self.dup.pos, base = ExprNodes.CloneNode(self.dup.base), index = ExprNodes.CloneNode(self.lhs.index), is_temp = self.dup.is_temp)
+ if self.lhs.index:
+ index = ExprNodes.CloneNode(self.lhs.index)
+ else:
+ index = None
+ if self.lhs.indices:
+ indices = [ExprNodes.CloneNode(x) for x in self.lhs.indices]
+ else:
+ indices = []
+ target_lhs = ExprNodes.IndexNode(self.dup.pos,
+ base = ExprNodes.CloneNode(self.dup.base),
+ index = index,
+ indices = indices,
+ is_temp = self.dup.is_temp)
self.lhs = target_lhs
return self.dup