diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 367e492fecc04049a5afcea2e435bc34b36da6c2..47339f0bb2cabc00580787da9ef5325254e60277 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -2096,11 +2096,8 @@ class NameNode(AtomicExprNode): code.put_giveref(rhs.py_result()) if not self.type.is_memoryviewslice: if not assigned: - if overloaded_assignment: - code.putln('%s = %s;' % (self.result(), rhs.result())) - else: - code.putln('%s = %s;' % ( - self.result(), rhs.result_as(self.ctype()))) + result = rhs.result() if overloaded_assignment else rhs.result_as(self.ctype()) + code.putln('%s = %s;' % (self.result(), result)) if debug_disposal_code: print("NameNode.generate_assignment_code:") print("...generating post-assignment code for %s" % rhs) diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 2e4d93efe54f27f2b6ada5a10ba96a4ad2bf62b3..11fd2ec35a1fc5f1981b07d1d3f9d021580c189e 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -901,7 +901,7 @@ class CArgDeclNode(Node): if self.default: self.default.annotate(code) - def generate_assignment_code(self, code, target=None): + def generate_assignment_code(self, code, target=None, overloaded_assignment=False): default = self.default if default is None or default.is_literal: return @@ -909,7 +909,7 @@ class CArgDeclNode(Node): target = self.calculate_default_value_code(code) default.generate_evaluation_code(code) default.make_owned_reference(code) - result = default.result_as(self.type) + result = default.result() if overloaded_assignment else default.result_as(self.type) code.putln("%s = %s;" % (target, result)) if self.type.is_pyobject: code.put_giveref(default.result()) @@ -5071,7 +5071,7 @@ class SingleAssignmentNode(AssignmentNode): def generate_rhs_evaluation_code(self, code): self.rhs.generate_evaluation_code(code) - def generate_assignment_code(self, code): + def generate_assignment_code(self, code, overloaded_assignment=False): self.lhs.generate_assignment_code( self.rhs, code, overloaded_assignment=self.is_overloaded_assignment) @@ -5158,7 +5158,7 @@ class CascadedAssignmentNode(AssignmentNode): def generate_rhs_evaluation_code(self, code): self.rhs.generate_evaluation_code(code) - def generate_assignment_code(self, code): + def generate_assignment_code(self, code, overloaded_assignment=False): # prepare all coercions for rhs in self.coerced_values: rhs.generate_evaluation_code(code) diff --git a/Cython/Compiler/UtilNodes.py b/Cython/Compiler/UtilNodes.py index bfcb34ee327333dea55e25961e4554a7d086f19e..e788f3b7a55757689790f13df02d09a6d76a6c5e 100644 --- a/Cython/Compiler/UtilNodes.py +++ b/Cython/Compiler/UtilNodes.py @@ -53,12 +53,15 @@ class TempRefNode(AtomicExprNode): def generate_result_code(self, code): pass - def generate_assignment_code(self, rhs, code): + def generate_assignment_code(self, rhs, code, overloaded_assignment=False): if self.type.is_pyobject: rhs.make_owned_reference(code) # TODO: analyse control flow to see if this is necessary code.put_xdecref(self.result(), self.ctype()) - code.putln('%s = %s;' % (self.result(), rhs.result_as(self.ctype()))) + code.putln('%s = %s;' % ( + self.result(), + rhs.result() if overloaded_assignment else rhs.result_as(self.ctype()), + )) rhs.generate_post_assignment_code(code) rhs.free_temps(code) @@ -66,7 +69,7 @@ class CleanupTempRefNode(TempRefNode): # THIS IS DEPRECATED, USE LetRefNode instead # handle TempHandle - def generate_assignment_code(self, rhs, code): + def generate_assignment_code(self, rhs, code, overloaded_assignment=False): pass def generate_execution_code(self, code): @@ -200,12 +203,15 @@ class ResultRefNode(AtomicExprNode): def generate_disposal_code(self, code): pass - def generate_assignment_code(self, rhs, code): + def generate_assignment_code(self, rhs, code, overloaded_assignment=False): if self.type.is_pyobject: rhs.make_owned_reference(code) if not self.lhs_of_first_assignment: code.put_decref(self.result(), self.ctype()) - code.putln('%s = %s;' % (self.result(), rhs.result_as(self.ctype()))) + code.putln('%s = %s;' % ( + self.result(), + rhs.result() if overloaded_assignment else rhs.result_as(self.ctype()), + )) rhs.generate_post_assignment_code(code) rhs.free_temps(code)