[Python-Dev] Strange bug only happens with Python 2.2

Guido van Rossum guido@python.org
Fri, 27 Sep 2002 20:11:54 -0400

> Ok, I've now further narrowed down this isinstance issue:
> python22-maint                                   ==> bug does not appear
> python22-maint with abstract.c from Python 2.2.1 ==> bug appears
> So for what it's worth (i. e. not much), I'd say please /do/ include the
> abstract.c changes into the upcoming Python 2.2.2 :-)

I'm sure it's this change, which was backported to the 2.2 maintenance
branch (and hence will be in 2.2.2).  It fixes several several
occurrences where an error is not cleared.

revision 2.101
date: 2002/04/23 22:45:44;  author: bwarsaw;  state: Exp;  lines: +46 -9
abstract_get_bases(): Clarify exactly what the return values and
states can be for this function, and ensure that only AttributeErrors
are masked.  Any other exception raised via the equivalent of
getattr(cls, '__bases__') should be propagated up.

abstract_issubclass(): If abstract_get_bases() returns NULL, we must
call PyErr_Occurred() to see if an exception is being propagated, and
return -1 or 0 as appropriate.  This is the specific fix for a problem
whereby if getattr(derived, '__bases__') raised an exception, an
"undetected error" would occur (under a debug build).  This nasty
situation was uncovered when writing a security proxy extension type
for the Zope3 project, where the security proxy raised a Forbidden
exception on getattr of __bases__.

PyObject_IsInstance(), PyObject_IsSubclass(): After both calls to
abstract_get_bases(), where we're setting the TypeError if the return
value is NULL, we must first check to see if an exception occurred,
and /not/ mask an existing exception.

Neil Schemenauer should double check that these changes don't break
his ExtensionClass examples (there aren't any test cases for those
examples and abstract_get_bases() was added by him in response to
problems with ExtensionClass).  Neil, please add test cases if

I belive this is a bug fix candidate for Python 2.2.2.

--Guido van Rossum (home page: http://www.python.org/~guido/)