diff options
author | Benjamin Peterson <benjamin@python.org> | 2009-12-13 16:36:53 +0000 |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2009-12-13 16:36:53 +0000 |
commit | 4895af4ef1c91679e642c0fc81f584aecc26a7ea (patch) | |
tree | e854f0d7770beff477fd7ee94540b2e15524bddd | |
parent | 2a08b42e9523b9642c72c15dffc41e8e442b4e72 (diff) | |
download | cpython-git-4895af4ef1c91679e642c0fc81f584aecc26a7ea.tar.gz |
fix the ignoring of __cmp__ method on metaclasses #7491
-rw-r--r-- | Lib/test/test_descr.py | 9 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Objects/typeobject.c | 6 |
3 files changed, 16 insertions, 1 deletions
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 0b21f57ce8..87d30eb9fa 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1222,6 +1222,15 @@ order (MRO) for bases """ # This used to crash self.assertRaises(TypeError, MyABC.a.__set__, u, 3) + def test_metaclass_cmp(self): + # See bug 7491. + class M(type): + def __cmp__(self, other): + return -1 + class X(object): + __metaclass__ = M + self.assertTrue(X < M) + def test_dynamics(self): # Testing class attribute propagation... class D(object): @@ -12,6 +12,8 @@ What's New in Python 2.7 alpha 2? Core and Builtins ----------------- +- Issue #7491: Metaclass's __cmp__ method was ignored. + - Issue #7466: segmentation fault when the garbage collector is called in the middle of populating a tuple. Patch by Florent Xicluna. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 8c49096216..8ef23d52e1 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -628,7 +628,11 @@ type_richcompare(PyObject *v, PyObject *w, int op) int c; /* Make sure both arguments are types. */ - if (!PyType_Check(v) || !PyType_Check(w)) { + if (!PyType_Check(v) || !PyType_Check(w) || + /* If there is a __cmp__ method defined, let it be called instead + of our dumb function designed merely to warn. See bug + #7491. */ + Py_TYPE(v)->tp_compare || Py_TYPE(w)->tp_compare) { result = Py_NotImplemented; goto out; } |