From: Dag Sverre Seljebotn Date: Mon, 28 Jul 2008 22:33:55 +0000 (+0200) Subject: Buffers: Fixed problem with preserving exception through release phase X-Git-Tag: 0.9.8.1~49^2~59 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=e51ea0797a2dcb61e034933618e4606b02ef7118;p=cython.git Buffers: Fixed problem with preserving exception through release phase --- 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):