From e51ea0797a2dcb61e034933618e4606b02ef7118 Mon Sep 17 00:00:00 2001 From: Dag Sverre Seljebotn Date: Tue, 29 Jul 2008 00:33:55 +0200 Subject: [PATCH] Buffers: Fixed problem with preserving exception through release phase --- Cython/Compiler/Buffer.py | 17 +++++++++++++++-- tests/run/bufaccess.pyx | 7 ++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Cython/Compiler/Buffer.py b/Cython/Compiler/Buffer.py index cd15b312..62cbf9ac 100755 --- a/Cython/Compiler/Buffer.py +++ b/Cython/Compiler/Buffer.py @@ -141,9 +141,22 @@ def put_acquire_arg_buffer(entry, code, pos): # need to do care about the buffer then. put_unpack_buffer_aux_into_scope(buffer_aux, code) +#def put_release_buffer_normal(entry, code): +# code.putln("if (%s != Py_None) PyObject_ReleaseBuffer(%s, &%s);" % ( +# entry.cname, +# entry.cname, +# entry.buffer_aux.buffer_info_var.cname)) + def put_release_buffer(entry, code): - code.putln("if (%s != Py_None) PyObject_ReleaseBuffer(%s, &%s);" % ( - entry.cname, entry.cname, entry.buffer_aux.buffer_info_var.cname)) + code.putln(dedent("""\ + if (%s != Py_None) { + PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + PyErr_Fetch(&__pyx_type, &__pyx_value, &__pyx_tb); + PyObject_ReleaseBuffer(%s, &%s); + PyErr_Restore(__pyx_type, __pyx_value, __pyx_tb); + }""" % (entry.cname, + entry.cname, + entry.buffer_aux.buffer_info_var.cname))) def put_assign_to_buffer(lhs_cname, rhs_cname, retcode_cname, buffer_aux, buffer_type, is_initialized, pos, code): diff --git a/tests/run/bufaccess.pyx b/tests/run/bufaccess.pyx index a6aa128a..a82271e6 100755 --- a/tests/run/bufaccess.pyx +++ b/tests/run/bufaccess.pyx @@ -46,8 +46,7 @@ def acquire_release(o1, o2): buf = o1 buf = o2 -#TODO! -#@testcase +@testcase def acquire_raise(o): """ Apparently, doctest won't handle mixed exceptions and print @@ -61,11 +60,9 @@ def acquire_raise(o): >>> A.printlog() acquired A released A - """ cdef object[int] buf buf = o - o.printlog() raise Exception("on purpose") @testcase @@ -614,7 +611,7 @@ cdef class MockBuffer: def __releasebuffer__(MockBuffer self, Py_buffer* buffer): msg = "released %s" % self.label - print msg + print msg self.log += msg + "\n" def printlog(self): -- 2.26.2