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: