bug: mro, subclassing and equality
Hello, I found a bug in Python 2.2.1, that I think is related to method resolution order and type initialization. I'm pretty new to Python, so bear with me while I try to explain. The following code: class Nanite(type): key = "blargchoo" def __eq__(self, other): return self.key == other.key def crashbang(): """KILL!""" c1 = type("molly", (Nanite,), {}) p1 = type('parent1', (), {}) p2 = type('parent2', (), {}) c1('child', (p1, p2), {}) causes the interpreter to seg fault. GDB tells me that it's crashing in typeobject.c, at line 1217. I made the following change, based on a bit of copy-coding, without actually tracing the full execution path, and it seemed to fix the problem, but hopefully someone here knows enough that they can tell whether I just made the symptom go away or this actually fixes the problem: *************** *** 1213,1224 **** /* Look in tp_dict of types in MRO */ mro = type->tp_mro; ! if (mro == NULL) { ! n = 0; ! } else { ! assert(PyTuple_Check(mro)); ! n = PyTuple_GET_SIZE(mro); ! } for (i = 0; i < n; i++) { base = PyTuple_GET_ITEM(mro, i); if (PyClass_Check(base)) --- 1213,1220 ---- /* Look in tp_dict of types in MRO */ mro = type->tp_mro; ! assert(PyTuple_Check(mro)); ! n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { base = PyTuple_GET_ITEM(mro, i); if (PyClass_Check(base)) Thanks, Josh Hoyt <josh@janrain.com> Software Engineer JanRain, Inc.
I found a bug in Python 2.2.1, that I think is related to method resolution order and type initialization. I'm pretty new to Python, so bear with me while I try to explain.
This has already been fixed in CVS, both for Python 2.2.2 and for Python 2.3. See python.org/sf/551412. --Guido van Rossum (home page: http://www.python.org/~guido/)
participants (2)
-
Guido van Rossum -
Josh Hoyt