Buffers: Fixed problem with preserving exception through release phase
authorDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Mon, 28 Jul 2008 22:33:55 +0000 (00:33 +0200)
committerDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Mon, 28 Jul 2008 22:33:55 +0000 (00:33 +0200)
Cython/Compiler/Buffer.py
tests/run/bufaccess.pyx

index cd15b3128b3df1d32881361366ffc23421e615f1..62cbf9ac7ba5118087ef54e163490dbeb45eed1f 100755 (executable)
@@ -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):
index a6aa128a1646fbe0c125e3819cae53c07a159866..a82271e69b1d7fb33af874d5c1b1d3a9322eef46 100755 (executable)
@@ -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):