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

Reply via email to