diff options
author | da-woods <dw-git@d-woods.co.uk> | 2020-04-15 19:15:30 +0100 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2020-04-15 20:16:54 +0200 |
commit | d6d8b3456253fe1a3d08a628058b51db3eb955a5 (patch) | |
tree | 507c523fd5bed6428cffb997d809afea6eaa6263 | |
parent | b3c2e0d6791378a7361a1cc731ff93728b6a3d16 (diff) | |
download | cython-d6d8b3456253fe1a3d08a628058b51db3eb955a5.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.py | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 80dec9abf..81fde57ef 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -4294,7 +4294,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, @@ -4303,6 +4303,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) @@ -4333,7 +4336,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 @@ -4351,6 +4354,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): @@ -4362,13 +4367,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): |