mirror of https://github.com/python/cpython
bpo-27145: small_ints[x] could be returned in long_add and long_sub (GH-15716)
This commit is contained in:
parent
386d00cc34
commit
036fe85bd3
|
@ -956,6 +956,14 @@ class LongTest(unittest.TestCase):
|
||||||
self.assertEqual(huge >> (sys.maxsize + 1), (1 << 499) + 5)
|
self.assertEqual(huge >> (sys.maxsize + 1), (1 << 499) + 5)
|
||||||
self.assertEqual(huge >> (sys.maxsize + 1000), 0)
|
self.assertEqual(huge >> (sys.maxsize + 1000), 0)
|
||||||
|
|
||||||
|
@support.cpython_only
|
||||||
|
def test_small_ints_in_huge_calculation(self):
|
||||||
|
a = 2 ** 100
|
||||||
|
b = -a + 1
|
||||||
|
c = a + 1
|
||||||
|
self.assertIs(a + b, 1)
|
||||||
|
self.assertIs(c - a, 1)
|
||||||
|
|
||||||
def test_small_ints(self):
|
def test_small_ints(self):
|
||||||
for i in range(-5, 257):
|
for i in range(-5, 257):
|
||||||
self.assertIs(i, i + 0)
|
self.assertIs(i, i + 0)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
int + int and int - int operators can now return small integer singletons. Patch by hongweipeng.
|
|
@ -3206,7 +3206,7 @@ x_sub(PyLongObject *a, PyLongObject *b)
|
||||||
if (sign < 0) {
|
if (sign < 0) {
|
||||||
Py_SIZE(z) = -Py_SIZE(z);
|
Py_SIZE(z) = -Py_SIZE(z);
|
||||||
}
|
}
|
||||||
return long_normalize(z);
|
return maybe_small_long(long_normalize(z));
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
@ -3254,13 +3254,15 @@ long_sub(PyLongObject *a, PyLongObject *b)
|
||||||
return PyLong_FromLong(MEDIUM_VALUE(a) - MEDIUM_VALUE(b));
|
return PyLong_FromLong(MEDIUM_VALUE(a) - MEDIUM_VALUE(b));
|
||||||
}
|
}
|
||||||
if (Py_SIZE(a) < 0) {
|
if (Py_SIZE(a) < 0) {
|
||||||
if (Py_SIZE(b) < 0)
|
if (Py_SIZE(b) < 0) {
|
||||||
z = x_sub(a, b);
|
z = x_sub(b, a);
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
z = x_add(a, b);
|
z = x_add(a, b);
|
||||||
if (z != NULL) {
|
if (z != NULL) {
|
||||||
assert(Py_SIZE(z) == 0 || Py_REFCNT(z) == 1);
|
assert(Py_SIZE(z) == 0 || Py_REFCNT(z) == 1);
|
||||||
Py_SIZE(z) = -(Py_SIZE(z));
|
Py_SIZE(z) = -(Py_SIZE(z));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
Loading…
Reference in New Issue