From d76e711eabd7b1d0ff96b4df2d8e7ba86be40abe Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sun, 13 Dec 2009 16:41:44 +0000 Subject: Merged revisions 76794 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r76794 | benjamin.peterson | 2009-12-13 10:36:53 -0600 (Sun, 13 Dec 2009) | 2 lines fix the ignoring of __cmp__ method on metaclasses #7491 ........ --- Lib/test/test_descr.py | 9 +++++++++ Misc/NEWS | 2 ++ Objects/typeobject.c | 6 +++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index cef7d47..e9a5057 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1198,6 +1198,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): diff --git a/Misc/NEWS b/Misc/NEWS index 80a82bf..d9cb038 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,8 @@ What's New in Python 2.6.5 Core and Builtins ----------------- +- Issue #7491: Metaclass's __cmp__ method was ignored. + - Add Py3k warnings for parameter names in parenthesis. - Issue #7362: Give a proper error message for def f((x)=3): pass. diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 7e48172..a537b2b 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -645,7 +645,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; } -- cgit v0.12