Lisandro Dalcin wrote:

> Ah! now I see.. so you are removing the Py_BLOCK_THREADS from finally
> block and moving it up to the try block.  Looks good...

OK.


I checked other except clauses and propose a solution to fix them.

1/ void foo() nogil except +MemoryError

Generated:
      try {foo();} catch(...) { try { throw; } catch(const std::exception& exn) 
{ PyErr_SetString(__pyx_builtin_MemoryError, exn.what()); } catch(...) { 
PyErr_SetNone(__pyx_builtin_MemoryError); }; {__pyx_filename = __pyx_f[0]; 
__pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L6;}}

Proposed fix:
      try {foo();} catch(...) { Py_BLOCK_THREADS try { throw; } catch(const 
std::exception& exn) { PyErr_SetString(__pyx_builtin_MemoryError, exn.what()); 
} catch(...) { PyErr_SetNone(__pyx_builtin_MemoryError); }; {__pyx_filename = 
__pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L6;}}


2/ void foo() nogil except *

Generated:
      foo(); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; 
__pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L6;}

Proposed fix (need to restore the context before checking and save again in 
case there is no error):
      foo(); Py_BLOCK_THREADS if (unlikely(PyErr_Occurred())) {__pyx_filename = 
__pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L6;} 
Py_UNBLOCK_THREADS


3/ int foo() nogil except -1

Generated:
      __pyx_t_1 = foo(); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = 
__pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L6;}

Proposed fix:
      __pyx_t_1 = foo(); if (unlikely(__pyx_t_1 == -1)) { Py_BLOCK_THREADS 
__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto 
__pyx_L6;}


4/ int foo() nogil except? -1

Generated:
      __pyx_t_1 = foo(); if (unlikely(__pyx_t_1 == -1 && PyErr_Occurred())) 
{__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto 
__pyx_L6;}

Proposed fix:
      __pyx_t_1 = foo(); if (unlikely(__pyx_t_1 == -1)) { Py_BLOCK_THREADS if 
(unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; 
__pyx_clineno = __LINE__; goto __pyx_L6;} Py_UNBLOCK_THREADS }


Cheers,
Stephane
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to