From: Stefan Behnel Date: Thu, 27 Nov 2008 09:11:34 +0000 (+0100) Subject: fix ref-counting bug in buffer assignments X-Git-Tag: 0.11-beta~205 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=72d55eda9dcafcfae407bb5e014f15625aabc460;p=cython.git fix ref-counting bug in buffer assignments --- 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: