summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorda-woods <dw-git@d-woods.co.uk>2020-04-15 19:15:30 +0100
committerGitHub <noreply@github.com>2020-04-15 20:15:30 +0200
commitc1f3fd2831083b675acd6b0ee73dddcec5671d31 (patch)
tree12e67c285f14d7c83096981bc8d0e59900a50036
parent34cde7c658208c3782155a7b291918d982b85c77 (diff)
downloadcython-c1f3fd2831083b675acd6b0ee73dddcec5671d31.tar.gz
Release temps used for buffer indexing after use (GH-3517)
Closes https://github.com/cython/cython/issues/3430
-rw-r--r--Cython/Compiler/ExprNodes.py13
1 files changed, 10 insertions, 3 deletions
diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py
index 96ae0a8f0..187187af5 100644
--- a/Cython/Compiler/ExprNodes.py
+++ b/Cython/Compiler/ExprNodes.py
@@ -4331,7 +4331,7 @@ class BufferIndexNode(_IndexingBaseNode):
else:
negative_indices = Buffer.buffer_defaults['negative_indices']
- return buffer_entry, Buffer.put_buffer_lookup_code(
+ buffer_lookup_result = Buffer.put_buffer_lookup_code(
entry=buffer_entry,
index_signeds=[ivar.type.signed for ivar in self.indices],
index_cnames=index_temps,
@@ -4340,6 +4340,9 @@ class BufferIndexNode(_IndexingBaseNode):
negative_indices=negative_indices,
in_nogil_context=self.in_nogil_context)
+ # must return index_temps since that cannot be released until buffer_lookup_result has been used
+ return buffer_entry, buffer_lookup_result, index_temps
+
def generate_assignment_code(self, rhs, code, overloaded_assignment=False):
self.generate_subexpr_evaluation_code(code)
self.generate_buffer_setitem_code(rhs, code)
@@ -4370,7 +4373,7 @@ class BufferIndexNode(_IndexingBaseNode):
return
# Used from generate_assignment_code and InPlaceAssignmentNode
- buffer_entry, ptrexpr = self.buffer_lookup_code(code)
+ buffer_entry, ptrexpr, buffer_temps = self.buffer_lookup_code(code)
if self.buffer_type.dtype.is_pyobject:
# Must manage refcounts. Decref what is already there
@@ -4388,6 +4391,8 @@ class BufferIndexNode(_IndexingBaseNode):
else:
# Simple case
code.putln("*%s %s= %s;" % (ptrexpr, op, rhs.result()))
+ for temp in buffer_temps:
+ code.funcstate.release_temp(temp)
def generate_result_code(self, code):
if is_pythran_expr(self.base.type):
@@ -4399,13 +4404,15 @@ class BufferIndexNode(_IndexingBaseNode):
self.base.pythran_result(),
pythran_indexing_code(self.indices)))
return
- buffer_entry, self.buffer_ptr_code = self.buffer_lookup_code(code)
+ buffer_entry, self.buffer_ptr_code, buffer_temps = self.buffer_lookup_code(code)
if self.type.is_pyobject:
# is_temp is True, so must pull out value and incref it.
# NOTE: object temporary results for nodes are declared
# as PyObject *, so we need a cast
code.putln("%s = (PyObject *) *%s;" % (self.result(), self.buffer_ptr_code))
code.putln("__Pyx_INCREF((PyObject*)%s);" % self.result())
+ for temp in buffer_temps:
+ code.funcstate.release_temp(temp)
class MemoryViewIndexNode(BufferIndexNode):