Amaury Forgeot d'Arc, 18.02.2012 14:52:
> 2012/2/18 Stefan Behnel
>
>> The exception handling code that you deleted in __Pyx_GetException(), that
>> which accesses exc_type and friends, is actually needed for correct
>> semantics of Cython code and Python code. Basically, it implements the part
>> of the except clause that moves the hot exception into sys.exc_info().
>>
>> This equally applies to __Pyx_ExceptionSave() and __Pyx_ExceptionReset(),
>> which form something like an exception backup frame around code sections
>> that may raise exceptions themselves but must otherwise not touch the
>> current exception. Specifically, as part of the finally clause.
>>
>> In order to fix this, is there a way to store away and restore the current
>> sys.exc_info() in PyPy?
>>
>
> I certainly was a bit fast to remove code there, and these
> exc_value and curexc_value have always been a delicate
> part of the CPython interpreter.
>
> One thing I don't understand for example, is why Cython needs to deal with
> sys.exc_info, when no other extension uses it for exception management.
Here's an example.
Python code:
def print_excinfo():
print(sys.exc_info())
Cython code:
from stuff import print_excinfo
try:
raise TypeError
except TypeError:
print_excinfo()
With the code removed, Cython will not store the TypeError in
sys.exc_info(), so the Python code cannot see it. This may seem like an
unimportant use case (who uses sys.exc_info() anyway, right?), but this
becomes very visible when the code that uses sys.exc_info() is not user
code but CPython itself, e.g. when raising another exception or when
inspecting frames. Things grow really bad here, especially in Python 3.
> The only way to know for sure is to have unit tests with different use
> cases.
Cython has loads of those in its test suite, as you can imagine. These
things are so tricky to get right that it's futile to even try without
growing a substantial test base of weird corner cases.
Stefan
_______________________________________________
pypy-dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-dev