From 72d55eda9dcafcfae407bb5e014f15625aabc460 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Thu, 27 Nov 2008 10:11:34 +0100 Subject: [PATCH] fix ref-counting bug in buffer assignments --- Cython/Compiler/ExprNodes.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 78fd7779..b6cba5f9 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -1224,17 +1224,24 @@ class NameNode(AtomicExprNode): rhs.generate_post_assignment_code(code) def generate_acquire_buffer(self, rhs, code): - rhstmp = code.funcstate.allocate_temp(self.entry.type) buffer_aux = self.entry.buffer_aux bufstruct = buffer_aux.buffer_info_var.cname - code.putln('%s = %s;' % (rhstmp, rhs.result_as(self.ctype()))) + + value_is_temp = rhs.is_temp + if value_is_temp: + rhstmp = rhs.result_as(self.ctype()) + else: + rhstmp = code.funcstate.allocate_temp(self.entry.type) + code.putln('%s = %s;' % (rhstmp, rhs.result_as(self.ctype()))) + code.put_incref(rhstmp, self.entry.type) import Buffer Buffer.put_assign_to_buffer(self.result(), rhstmp, buffer_aux, self.entry.type, is_initialized=not self.lhs_of_first_assignment, pos=self.pos, code=code) - code.putln("%s = 0;" % rhstmp) - code.funcstate.release_temp(rhstmp) + if not value_is_temp: + code.put_decref_clear(rhstmp, self.entry.type) + code.funcstate.release_temp(rhstmp) def generate_deletion_code(self, code): if self.entry is None: -- 2.26.2