Issue #3236: Return small longs from PyLong_FromString.
diff --git a/Lib/test/test_int.py b/Lib/test/test_int.py
index 3462540..dd40ef6 100644
--- a/Lib/test/test_int.py
+++ b/Lib/test/test_int.py
@@ -95,6 +95,9 @@
self.assertRaises(ValueError, int, "0b", 2)
self.assertRaises(ValueError, int, "0b", 0)
+ # Bug #3236: Return small longs from PyLong_FromString
+ self.assert_(int("10") is 10)
+ self.assert_(int("-1") is -1)
# SF bug 1334662: int(string, base) wrong answers
# Various representations of 2**32 evaluated to 0
diff --git a/Misc/NEWS b/Misc/NEWS
index 0ba9a9c..b3d4f30 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@
Core and Builtins
-----------------
+- Issue #3236: Return small longs from PyLong_FromString.
+
Library
-------
diff --git a/Objects/longobject.c b/Objects/longobject.c
index d1c27e6..2c684cb 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -1981,6 +1981,14 @@
goto onError;
if (pend)
*pend = str;
+ long_normalize(z);
+ if (ABS(Py_SIZE(z)) <= 1) {
+ long res = MEDIUM_VALUE(z);
+ if (-NSMALLPOSINTS <= res && res <= NSMALLPOSINTS) {
+ Py_DECREF(z);
+ return PyLong_FromLong(res);
+ }
+ }
return (PyObject *) z;
onError: