Amaury Forgeot d'Arc, 18.02.2012 15:41: > 2012/2/18 Stefan Behnel >> 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. > > I think I understand now, thanks for your example. > Things are a bit simpler in PyPy because these exceptions are > stored in the frame that is currently handling it. At least better than > CPython > which stores it in one place, and has to somehow save the state of the > previous frames. > Did you consider adding such a function to CPython? > "PyErr_SetCurrentFrameExceptionInfo"? > > For the record, pypy could implement it as: > space.getexecutioncontext().gettopframe_nohidden().last_exception = > operationerr > i.e. the thing returned by sys.exc_info().
I've dropped a patch for CPython in the corresponding tracker ticket: http://bugs.python.org/issue14098 The (trivial) implementation of the two functions is at the end of this file: http://bugs.python.org/file24613/exc_info_capi.patch Could you add them to PyPy? Thanks! Stefan _______________________________________________ pypy-dev mailing list pypy-dev@python.org http://mail.python.org/mailman/listinfo/pypy-dev