From 73a1dfe3674429f923e98b84ef01df1614baad2f Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Tue, 11 Sep 2001 21:44:14 +0000 Subject: [PATCH] More bug 460020. When I is a subclass of int, disable the +I(whatever), I(0) << whatever, I(0) >> whatever, I(whatever) << 0 and I(whatever) >> 0 optimizations. --- Lib/test/test_descr.py | 5 +++++ Objects/intobject.c | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 5c4db30335..e89f6425b9 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1366,6 +1366,11 @@ def inherits(): a = hexint(12345) verify(int(a) == 12345) verify(int(a).__class__ is int) + verify((+a).__class__ is int) + verify((a >> 0).__class__ is int) + verify((a << 0).__class__ is int) + verify((hexint(0) << 12).__class__ is int) + verify((hexint(0) >> 12).__class__ is int) class octlong(long): __slots__ = [] diff --git a/Objects/intobject.c b/Objects/intobject.c index 261edb8443..c93b3840ab 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -681,8 +681,12 @@ int_neg(PyIntObject *v) static PyObject * int_pos(PyIntObject *v) { - Py_INCREF(v); - return (PyObject *)v; + if (PyInt_CheckExact(v)) { + Py_INCREF(v); + return (PyObject *)v; + } + else + return PyInt_FromLong(v->ob_ival); } static PyObject * @@ -716,10 +720,8 @@ int_lshift(PyIntObject *v, PyIntObject *w) PyErr_SetString(PyExc_ValueError, "negative shift count"); return NULL; } - if (a == 0 || b == 0) { - Py_INCREF(v); - return (PyObject *) v; - } + if (a == 0 || b == 0) + return int_pos(v); if (b >= LONG_BIT) { return PyInt_FromLong(0L); } @@ -737,10 +739,8 @@ int_rshift(PyIntObject *v, PyIntObject *w) PyErr_SetString(PyExc_ValueError, "negative shift count"); return NULL; } - if (a == 0 || b == 0) { - Py_INCREF(v); - return (PyObject *) v; - } + if (a == 0 || b == 0) + return int_pos(v); if (b >= LONG_BIT) { if (a < 0) a = -1; -- 2.40.0