diff -r 618cca51a27e Lib/test/test_getargs2.py --- a/Lib/test/test_getargs2.py Wed Dec 11 21:07:54 2013 +0200 +++ b/Lib/test/test_getargs2.py Wed Dec 11 21:28:59 2013 +0200 @@ -73,11 +73,12 @@ # b returns 'unsigned char', and does range checking (0 ... UCHAR_MAX) self.assertRaises(TypeError, getargs_b, 3.14) self.assertEqual(99, getargs_b(Int())) - self.assertEqual(0, getargs_b(IntSubclass())) + self.assertEqual(99, getargs_b(IntSubclass())) self.assertRaises(TypeError, getargs_b, BadInt()) with self.assertWarns(DeprecationWarning): self.assertEqual(1, getargs_b(BadInt2())) - self.assertEqual(0, getargs_b(BadInt3())) + with self.assertWarns(DeprecationWarning): + self.assertEqual(1, getargs_b(BadInt3())) self.assertRaises(OverflowError, getargs_b, -1) self.assertEqual(0, getargs_b(0)) @@ -92,11 +93,12 @@ # B returns 'unsigned char', no range checking self.assertRaises(TypeError, getargs_B, 3.14) self.assertEqual(99, getargs_B(Int())) - self.assertEqual(0, getargs_B(IntSubclass())) + self.assertEqual(99, getargs_B(IntSubclass())) self.assertRaises(TypeError, getargs_B, BadInt()) with self.assertWarns(DeprecationWarning): self.assertEqual(1, getargs_B(BadInt2())) - self.assertEqual(0, getargs_B(BadInt3())) + with self.assertWarns(DeprecationWarning): + self.assertEqual(1, getargs_B(BadInt3())) self.assertEqual(UCHAR_MAX, getargs_B(-1)) self.assertEqual(0, getargs_B(0)) @@ -111,11 +113,12 @@ # H returns 'unsigned short', no range checking self.assertRaises(TypeError, getargs_H, 3.14) self.assertEqual(99, getargs_H(Int())) - self.assertEqual(0, getargs_H(IntSubclass())) + self.assertEqual(99, getargs_H(IntSubclass())) self.assertRaises(TypeError, getargs_H, BadInt()) with self.assertWarns(DeprecationWarning): self.assertEqual(1, getargs_H(BadInt2())) - self.assertEqual(0, getargs_H(BadInt3())) + with self.assertWarns(DeprecationWarning): + self.assertEqual(1, getargs_H(BadInt3())) self.assertEqual(USHRT_MAX, getargs_H(-1)) self.assertEqual(0, getargs_H(0)) @@ -131,11 +134,12 @@ # I returns 'unsigned int', no range checking self.assertRaises(TypeError, getargs_I, 3.14) self.assertEqual(99, getargs_I(Int())) - self.assertEqual(0, getargs_I(IntSubclass())) + self.assertEqual(99, getargs_I(IntSubclass())) self.assertRaises(TypeError, getargs_I, BadInt()) with self.assertWarns(DeprecationWarning): self.assertEqual(1, getargs_I(BadInt2())) - self.assertEqual(0, getargs_I(BadInt3())) + with self.assertWarns(DeprecationWarning): + self.assertEqual(1, getargs_I(BadInt3())) self.assertEqual(UINT_MAX, getargs_I(-1)) self.assertEqual(0, getargs_I(0)) @@ -152,10 +156,11 @@ # it does not accept float, or instances with __int__ self.assertRaises(TypeError, getargs_k, 3.14) self.assertRaises(TypeError, getargs_k, Int()) - self.assertEqual(0, getargs_k(IntSubclass())) + self.assertEqual(99, getargs_k(IntSubclass())) self.assertRaises(TypeError, getargs_k, BadInt()) self.assertRaises(TypeError, getargs_k, BadInt2()) - self.assertEqual(0, getargs_k(BadInt3())) + with self.assertWarns(DeprecationWarning): + self.assertEqual(1, getargs_k(BadInt3())) self.assertEqual(ULONG_MAX, getargs_k(-1)) self.assertEqual(0, getargs_k(0)) @@ -172,11 +177,12 @@ # h returns 'short', and does range checking (SHRT_MIN ... SHRT_MAX) self.assertRaises(TypeError, getargs_h, 3.14) self.assertEqual(99, getargs_h(Int())) - self.assertEqual(0, getargs_h(IntSubclass())) + self.assertEqual(99, getargs_h(IntSubclass())) self.assertRaises(TypeError, getargs_h, BadInt()) with self.assertWarns(DeprecationWarning): self.assertEqual(1, getargs_h(BadInt2())) - self.assertEqual(0, getargs_h(BadInt3())) + with self.assertWarns(DeprecationWarning): + self.assertEqual(1, getargs_h(BadInt3())) self.assertRaises(OverflowError, getargs_h, SHRT_MIN-1) self.assertEqual(SHRT_MIN, getargs_h(SHRT_MIN)) @@ -191,11 +197,12 @@ # i returns 'int', and does range checking (INT_MIN ... INT_MAX) self.assertRaises(TypeError, getargs_i, 3.14) self.assertEqual(99, getargs_i(Int())) - self.assertEqual(0, getargs_i(IntSubclass())) + self.assertEqual(99, getargs_i(IntSubclass())) self.assertRaises(TypeError, getargs_i, BadInt()) with self.assertWarns(DeprecationWarning): self.assertEqual(1, getargs_i(BadInt2())) - self.assertEqual(0, getargs_i(BadInt3())) + with self.assertWarns(DeprecationWarning): + self.assertEqual(1, getargs_i(BadInt3())) self.assertRaises(OverflowError, getargs_i, INT_MIN-1) self.assertEqual(INT_MIN, getargs_i(INT_MIN)) @@ -210,11 +217,12 @@ # l returns 'long', and does range checking (LONG_MIN ... LONG_MAX) self.assertRaises(TypeError, getargs_l, 3.14) self.assertEqual(99, getargs_l(Int())) - self.assertEqual(0, getargs_l(IntSubclass())) + self.assertEqual(99, getargs_l(IntSubclass())) self.assertRaises(TypeError, getargs_l, BadInt()) with self.assertWarns(DeprecationWarning): self.assertEqual(1, getargs_l(BadInt2())) - self.assertEqual(0, getargs_l(BadInt3())) + with self.assertWarns(DeprecationWarning): + self.assertEqual(1, getargs_l(BadInt3())) self.assertRaises(OverflowError, getargs_l, LONG_MIN-1) self.assertEqual(LONG_MIN, getargs_l(LONG_MIN)) @@ -252,11 +260,12 @@ self.assertRaises(TypeError, getargs_L, 3.14) self.assertRaises(TypeError, getargs_L, "Hello") self.assertEqual(99, getargs_L(Int())) - self.assertEqual(0, getargs_L(IntSubclass())) + self.assertEqual(99, getargs_L(IntSubclass())) self.assertRaises(TypeError, getargs_L, BadInt()) with self.assertWarns(DeprecationWarning): self.assertEqual(1, getargs_L(BadInt2())) - self.assertEqual(0, getargs_L(BadInt3())) + with self.assertWarns(DeprecationWarning): + self.assertEqual(1, getargs_L(BadInt3())) self.assertRaises(OverflowError, getargs_L, LLONG_MIN-1) self.assertEqual(LLONG_MIN, getargs_L(LLONG_MIN)) @@ -271,10 +280,11 @@ # K return 'unsigned long long', no range checking self.assertRaises(TypeError, getargs_K, 3.14) self.assertRaises(TypeError, getargs_K, Int()) - self.assertEqual(0, getargs_K(IntSubclass())) + self.assertEqual(99, getargs_K(IntSubclass())) self.assertRaises(TypeError, getargs_K, BadInt()) self.assertRaises(TypeError, getargs_K, BadInt2()) - self.assertEqual(0, getargs_K(BadInt3())) + with self.assertWarns(DeprecationWarning): + self.assertEqual(1, getargs_K(BadInt3())) self.assertEqual(ULLONG_MAX, getargs_K(ULLONG_MAX)) self.assertEqual(0, getargs_K(0)) diff -r 618cca51a27e Lib/test/test_index.py --- a/Lib/test/test_index.py Wed Dec 11 21:07:54 2013 +0200 +++ b/Lib/test/test_index.py Wed Dec 11 21:28:59 2013 +0200 @@ -66,10 +66,10 @@ direct_index = my_int.__index__() operator_index = operator.index(my_int) self.assertEqual(direct_index, 8) - self.assertEqual(operator_index, 7) + self.assertEqual(operator_index, 8) # Both results should be of exact type int. self.assertIs(type(direct_index), int) - #self.assertIs(type(operator_index), int) + self.assertIs(type(operator_index), int) def test_index_returns_int_subclass(self): class BadInt: @@ -78,7 +78,7 @@ class BadInt2(int): def __index__(self): - return True + return self bad_int = BadInt() with self.assertWarns(DeprecationWarning): @@ -86,7 +86,8 @@ self.assertEqual(n, 1) bad_int = BadInt2() - n = operator.index(bad_int) + with self.assertWarns(DeprecationWarning): + n = operator.index(bad_int) self.assertEqual(n, 0) diff -r 618cca51a27e Lib/test/test_int.py --- a/Lib/test/test_int.py Wed Dec 11 21:07:54 2013 +0200 +++ b/Lib/test/test_int.py Wed Dec 11 21:28:59 2013 +0200 @@ -375,6 +375,7 @@ good_int = TruncReturnsIntSubclass() n = int(good_int) + self.assertIs(type(n), int) self.assertEqual(n, 1) def test_error_message(self): diff -r 618cca51a27e Objects/abstract.c --- a/Objects/abstract.c Wed Dec 11 21:07:54 2013 +0200 +++ b/Objects/abstract.c Wed Dec 11 21:28:59 2013 +0200 @@ -1142,7 +1142,7 @@ PyObject *result = NULL; if (item == NULL) return null_error(); - if (PyLong_Check(item)) { + if (PyLong_CheckExact(item)) { Py_INCREF(item); return item; } @@ -1245,8 +1245,8 @@ PyObject *truncated = PyEval_CallObject(trunc_func, NULL); PyObject *int_instance; Py_DECREF(trunc_func); - if (truncated == NULL || PyLong_Check(truncated)) - return truncated; + if (truncated == NULL) + return NULL; /* __trunc__ is specified to return an Integral type, but int() needs to return a int. */ m = truncated->ob_type->tp_as_number; diff -r 618cca51a27e Objects/longobject.c --- a/Objects/longobject.c Wed Dec 11 21:07:54 2013 +0200 +++ b/Objects/longobject.c Wed Dec 11 21:28:59 2013 +0200 @@ -116,6 +116,12 @@ return v; } +#define _PyLong_IsCompatible(obj) \ + (PyLong_CheckExact((obj)) || \ + (PyLong_Check((obj)) && \ + (obj)->ob_type->tp_as_number->nb_int == \ + PyLong_Type.tp_as_number->nb_int)) + /* _PyLong_FromNbInt: Convert the given object to a PyLongObject using the nb_int slot, if available. Raise TypeError if either the nb_int slot is not available or the result of the call to nb_int @@ -397,7 +403,7 @@ return -1; } - if (PyLong_Check(vv)) { + if (_PyLong_IsCompatible(vv)) { v = (PyLongObject *)vv; } else { @@ -677,7 +683,7 @@ return (unsigned long)-1; } - if (PyLong_Check(op)) { + if (_PyLong_IsCompatible(op)) { return _PyLong_AsUnsignedLongMask(op); } @@ -1204,7 +1210,7 @@ return -1; } - if (PyLong_Check(vv)) { + if (_PyLong_IsCompatible(vv)) { v = (PyLongObject *)vv; } else { @@ -1320,7 +1326,7 @@ return (unsigned long)-1; } - if (PyLong_Check(op)) { + if (_PyLong_IsCompatible(op)) { return _PyLong_AsUnsignedLongLongMask(op); } @@ -1361,7 +1367,7 @@ return -1; } - if (PyLong_Check(vv)) { + if (_PyLong_IsCompatible(vv)) { v = (PyLongObject *)vv; } else {