zopefoundation / persistent

automatic persistence for Python objects
https://pypi.org/project/persistent/
Other
46 stars 28 forks source link

Avoid raising a SystemError when clearing slots if setstate() failed. #62

Closed jamadden closed 7 years ago

jamadden commented 7 years ago

PR #52 introduced a code path to ghostify that calls PyErr_Clear() with the intent to avoid propagating AttributeErrors for slots.

However, if there is an error (like a POSKeyError) raised by jar.setstate(), then unghostify will call ghostify with an error pending. If the object had slots that weren't set and the AttributeError was cleared, so was the pending error from setstate. So when ghostify returned NULL that got propagated up to the interpreter which finds no exception and so raises SystemError: error return without exception set.

This commit makes unghostify save and restore the exception state around the call to PyErr_Clear so the real exception is raised, rather than the baffling and unhelpful SystemError.

jamadden commented 7 years ago

@tseaver Could we get a merge and release please?

tseaver commented 7 years ago

https://pypi.python.org/pypi/persistent/4.2.4

jamadden commented 7 years ago

Thank you!