Index: Lib/test/py3k_warnings_test.py =================================================================== --- Lib/test/py3k_warnings_test.py (revision 0) +++ Lib/test/py3k_warnings_test.py (revision 0) @@ -0,0 +1,50 @@ +import unittest +from test.test_support import catch_warning, TestSkipped +import warnings + +class TestPy3KWarnings(unittest.TestCase): + + def test_type_inequality_comparisons(self): + expected = 'type inequality comparisons not supported in 3.x.' + with catch_warning() as w: + self.assertWarning(int < str, w, expected) + self.assertWarning(type < object, w, expected) + + def test_object_inequality_comparisons(self): + expected = 'comparing unequal types not supported in 3.x.' + with catch_warning() as w: + self.assertWarning(str < [], w, expected) + self.assertWarning(object() < (1, 2), w, expected) + + def test_dict_inequality_comparisons(self): + expected = 'dict inequality comparisons not supported in 3.x.' + with catch_warning() as w: + self.assertWarning({} < {2:3}, w, expected) + self.assertWarning({} <= {}, w, expected) + self.assertWarning({} > {2:3}, w, expected) + self.assertWarning({2:3} >= {}, w, expected) + + def test_cell_inequality_comparisons(self): + expected = 'cell comparisons not supported in 3.x.' + def f(x): + def g(): + return x + return g + cell0, = f(0).func_closure + cell1, = f(1).func_closure + with catch_warning() as w: + self.assertWarning(cell0 == cell1, w, expected) + self.assertWarning(cell0 < cell1, w, expected) + + def assertWarning(self, _, warning, expected_message): + self.assertEqual(str(warning.message), expected_message) + + +if __name__ == '__main__': + # TODO: expose whether or not -3 was passed in to Python code somehow + with catch_warning() as w: + callable(int) + if w.message is None: + raise TestSkipped('py3k_warnings_test must be run with the -3 flag') + + unittest.main() \ No newline at end of file Property changes on: Lib\test\py3k_warnings_test.py ___________________________________________________________________ Name: svn:keywords + Id Name: svn:eol-style + native Index: Lib/test/test_types.py =================================================================== --- Lib/test/test_types.py (revision 61453) +++ Lib/test/test_types.py (working copy) @@ -44,6 +44,34 @@ if None is None: pass else: self.fail('identity test failed') + # check that types can be compared + self.assertTrue(str < int or str > int) + self.assertTrue(int <= str or int >= str) + self.assertTrue(cmp(int, str) != 0) + self.assertTrue(int is int) + self.assertTrue(str == str) + self.assertTrue(int != str) + + # check cell comparison + def f(x): + if x: + y = 1 + def g(): + return x + def h(): + return y + return g, h + g, h = f(0) + g_cell, = g.func_closure + h_cell, = h.func_closure + self.assertTrue(h_cell < g_cell) + self.assertTrue(g_cell >= h_cell) + self.assertEqual(cmp(g_cell, h_cell), 1) + self.assertTrue(g_cell is g_cell) + self.assertTrue(g_cell == g_cell) + self.assertTrue(h_cell == h_cell) + self.assertTrue(g_cell != h_cell) + def test_float_constructor(self): self.assertRaises(ValueError, float, '') self.assertRaises(ValueError, float, '5\0') Index: Objects/cellobject.c =================================================================== --- Objects/cellobject.c (revision 61485) +++ Objects/cellobject.c (working copy) @@ -54,6 +54,12 @@ static int cell_compare(PyCellObject *a, PyCellObject *b) { + /* Py3K warning for comparisons */ + if (Py_Py3kWarningFlag && PyErr_Warn(PyExc_DeprecationWarning, + "cell comparisons not supported in 3.x.") < 0) { + return NULL; + } + if (a->ob_ref == NULL) { if (b->ob_ref == NULL) return 0; Index: Objects/dictobject.c =================================================================== --- Objects/dictobject.c (revision 61485) +++ Objects/dictobject.c (working copy) @@ -1776,8 +1776,14 @@ return NULL; res = (cmp == (op == Py_EQ)) ? Py_True : Py_False; } - else + else { + /* Py3K warning if comparison isn't == or != */ + if (Py_Py3kWarningFlag && PyErr_Warn(PyExc_DeprecationWarning, + "dict inequality comparisons not supported in 3.x.") < 0) { + return NULL; + } res = Py_NotImplemented; + } Py_INCREF(res); return res; } Index: Objects/object.c =================================================================== --- Objects/object.c (revision 61485) +++ Objects/object.c (working copy) @@ -863,8 +863,18 @@ int c; c = try_3way_compare(v, w); - if (c >= 2) + if (c >= 2) { + + /* Py3K warning if types are not equal and comparison isn't == or != */ + if (Py_Py3kWarningFlag && + v->ob_type != w->ob_type && op != Py_EQ && op != Py_NE && + PyErr_Warn(PyExc_DeprecationWarning, + "comparing unequal types not supported in 3.x.") < 0) { + return NULL; + } + c = default_3way_compare(v, w); + } if (c <= -2) return NULL; return convert_3way_to_object(op, c); Index: Objects/typeobject.c =================================================================== --- Objects/typeobject.c (revision 61485) +++ Objects/typeobject.c (working copy) @@ -593,6 +593,48 @@ return (vv < ww) ? -1 : (vv > ww) ? 1 : 0; } +static PyObject* +type_richcompare(PyObject *v, PyObject *w, int op) +{ + PyObject *result; + Py_uintptr_t vv, ww; + int c; + + /* Make sure both arguments are types. */ + if (!PyType_Check(v) || !PyType_Check(w)) { + result = Py_NotImplemented; + goto out; + } + + /* Py3K warning if comparison isn't == or != */ + if (Py_Py3kWarningFlag && op != Py_EQ && op != Py_NE && + PyErr_Warn(PyExc_DeprecationWarning, + "type inequality comparisons not supported in 3.x.") < 0) { + return NULL; + } + + /* Compare addresses */ + vv = (Py_uintptr_t)v; + ww = (Py_uintptr_t)w; + switch (op) { + case Py_LT: c = vv < ww; break; + case Py_LE: c = vv <= ww; break; + case Py_EQ: c = vv == ww; break; + case Py_NE: c = vv != ww; break; + case Py_GT: c = vv > ww; break; + case Py_GE: c = vv >= ww; break; + default: + result = Py_NotImplemented; + goto out; + } + result = c ? Py_True : Py_False; + + /* incref and return */ + out: + Py_INCREF(result); + return result; +} + static PyObject * type_repr(PyTypeObject *type) { @@ -2666,7 +2708,7 @@ type_doc, /* tp_doc */ (traverseproc)type_traverse, /* tp_traverse */ (inquiry)type_clear, /* tp_clear */ - 0, /* tp_richcompare */ + type_richcompare, /* tp_richcompare */ offsetof(PyTypeObject, tp_weaklist), /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */