Fix error propagation from memoryview-returning functions
authorMatěj Laitl <matej@laitl.cz>
Thu, 24 Jan 2013 10:59:23 +0000 (11:59 +0100)
committerMatěj Laitl <matej@laitl.cz>
Thu, 24 Jan 2013 10:59:23 +0000 (11:59 +0100)
commitfb8eba690d08515a5637ee5dc986e673465d95ca
treeee78b9dbc650d6f10e7966de0a34c961f045b592
parent360e93c3480046ca6e38b453072c9b9f176b7569
Fix error propagation from memoryview-returning functions

A code like
|cdef double[:] foo():
|    raise AttributeError('dummy')

generated C code like this:
|  __pyx_L1_error:;
|  (...)
|  __pyx_r.memview = NULL;
|  __Pyx_AddTraceback("view_return_errors.foo", __pyx_clineno, __pyx_lineno, __pyx_filename);
|  __pyx_L0:;
|  if (unlikely(!__pyx_r.memview)) {
|    PyErr_SetString(PyExc_TypeError,"Memoryview return value is not initialized");
|  }
|  __Pyx_RefNannyFinishContext();
|  return __pyx_r;
|}

Which is incorrect in error case, because we set __pyx_r.memview to NULL and
then we test it, so that the PyErr_SetString() is always called in the error
case, which swallows previously-set error. (it also swallowed the traceback,
which I don't understand)

A fix is to jump to return_from_error_cleanup label in case return type is
memoryview, as it is currently done for the case when buffers are present.

A testcase that fauils w/out this fix applied is included, too.

v2: fix test under Python 3 by not using StandardError

--HG--
extra : transplant_source : G%B5%99Og%D1%81%25k%8F%1F%7B%02V%3E%B9%A4y%FF%EA
Cython/Compiler/Nodes.py
tests/memoryview/view_return_errors.pyx [new file with mode: 0644]