diff --git a/src/pairs/mapping/funcs.py b/src/pairs/mapping/funcs.py index 6258aa10ce8b969354ebce7b83eb8133962b87a7..16abbab7d5d9181184914440c91bd1e86e3932a6 100644 --- a/src/pairs/mapping/funcs.py +++ b/src/pairs/mapping/funcs.py @@ -91,7 +91,6 @@ class BuildParticleIR(ast.NodeVisitor): self.ctx_symbols.update(symbols) def visit_Assign(self, node): - #print(ast.dump(node)) assert len(node.targets) == 1, "Only one target is allowed on assignments!" lhs = self.visit(node.targets[0]) rhs = self.visit(node.value) @@ -104,15 +103,16 @@ class BuildParticleIR(ast.NodeVisitor): def visit_AugAssign(self, node): lhs = self.visit(node.target) + # We need a copy of the target object so it is properly visited during + # compiler analyses and transformations + lhs_copy = self.visit(node.target) rhs = self.visit(node.value) op_class = OperatorClass.from_type_list([lhs.type(), rhs.type()]) - bin_op = op_class(self.sim, lhs, rhs, BuildParticleIR.get_binary_op(node.op)) + bin_op = op_class(self.sim, lhs_copy, rhs, BuildParticleIR.get_binary_op(node.op)) - if isinstance(lhs, UndefinedSymbol): - self.add_symbols({lhs.symbol_id: bin_op}) - rhs.set_label(lhs.symbol_id) - else: - Assign(self.sim, lhs, bin_op) + assert not isinstance(lhs, UndefinedSymbol), \ + f"Invalid AugAssign: symbol {lhs} not defined yet!" + Assign(self.sim, lhs, bin_op) def visit_BinOp(self, node): #print(ast.dump(node))