Commit e51ea079 authored by Dag Sverre Seljebotn's avatar Dag Sverre Seljebotn

Buffers: Fixed problem with preserving exception through release phase

parent 00209341
...@@ -141,9 +141,22 @@ def put_acquire_arg_buffer(entry, code, pos): ...@@ -141,9 +141,22 @@ def put_acquire_arg_buffer(entry, code, pos):
# need to do care about the buffer then. # need to do care about the buffer then.
put_unpack_buffer_aux_into_scope(buffer_aux, code) 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): def put_release_buffer(entry, code):
code.putln("if (%s != Py_None) PyObject_ReleaseBuffer(%s, &%s);" % ( code.putln(dedent("""\
entry.cname, entry.cname, entry.buffer_aux.buffer_info_var.cname)) 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, def put_assign_to_buffer(lhs_cname, rhs_cname, retcode_cname, buffer_aux, buffer_type,
is_initialized, pos, code): is_initialized, pos, code):
......
...@@ -46,8 +46,7 @@ def acquire_release(o1, o2): ...@@ -46,8 +46,7 @@ def acquire_release(o1, o2):
buf = o1 buf = o1
buf = o2 buf = o2
#TODO! @testcase
#@testcase
def acquire_raise(o): def acquire_raise(o):
""" """
Apparently, doctest won't handle mixed exceptions and print Apparently, doctest won't handle mixed exceptions and print
...@@ -61,11 +60,9 @@ def acquire_raise(o): ...@@ -61,11 +60,9 @@ def acquire_raise(o):
>>> A.printlog() >>> A.printlog()
acquired A acquired A
released A released A
""" """
cdef object[int] buf cdef object[int] buf
buf = o buf = o
o.printlog()
raise Exception("on purpose") raise Exception("on purpose")
@testcase @testcase
...@@ -614,7 +611,7 @@ cdef class MockBuffer: ...@@ -614,7 +611,7 @@ cdef class MockBuffer:
def __releasebuffer__(MockBuffer self, Py_buffer* buffer): def __releasebuffer__(MockBuffer self, Py_buffer* buffer):
msg = "released %s" % self.label msg = "released %s" % self.label
print msg print msg
self.log += msg + "\n" self.log += msg + "\n"
def printlog(self): def printlog(self):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment