From 14f8dfc5a83df6f884e64eea89aa68a6b97e9e64 Mon Sep 17 00:00:00 2001 From: Rafael Ravedutti <rafael.r.ravedutti@fau.de> Date: Mon, 3 Feb 2025 18:38:43 +0100 Subject: [PATCH] Fix issue with AugAssign Signed-off-by: Rafael Ravedutti <rafael.r.ravedutti@fau.de> --- src/pairs/mapping/funcs.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/pairs/mapping/funcs.py b/src/pairs/mapping/funcs.py index 6258aa1..16abbab 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)) -- GitLab