Make int("...") return a long if an int would overflow.

Also remove the 512 character limitation for int(u"...") and long(u"...").

This closes SF bug #629989.
diff --git a/Lib/test/test_b1.py b/Lib/test/test_b1.py
index 65285ee..9e6c8d5 100644
--- a/Lib/test/test_b1.py
+++ b/Lib/test/test_b1.py
@@ -435,10 +435,8 @@
     raise TestFailed, "int(%s)" % `s`
 try:
     int(s[1:])
-except ValueError:
-    pass
-else:
-    raise TestFailed, "int(%s)" % `s[1:]` + " should raise ValueError"
+except:
+    raise TestFailed, "int(%s)" % `s[1:]` + " should return long"
 try:
     int(1e100)
 except OverflowError:
@@ -468,9 +466,12 @@
 except ValueError: pass
 else: raise TestFailed("int('53', 40) didn't raise ValueError")
 
-try: int('1' * 512)
-except ValueError: pass
-else: raise TestFailed("int('1' * 512) didn't raise ValueError")
+try: int('1' * 600)
+except: raise TestFailed("int('1' * 600) didn't return long")
+
+if have_unicode:
+	try: int(unichr(0x661) * 600)
+	except: raise TestFailed("int('\\u0661' * 600) didn't return long")
 
 try: int(1, 12)
 except TypeError: pass
diff --git a/Objects/intobject.c b/Objects/intobject.c
index 7404e98..e339085 100644
--- a/Objects/intobject.c
+++ b/Objects/intobject.c
@@ -208,10 +208,9 @@
 		return NULL;
 	}
 	else if (errno != 0) {
-		PyOS_snprintf(buffer, sizeof(buffer),
-			      "int() literal too large: %.200s", s);
-		PyErr_SetString(PyExc_ValueError, buffer);
-		return NULL;
+		if (err_ovf("string/unicode conversion"))
+			return NULL;
+		return PyLong_FromString(s, pend, base);
 	}
 	if (pend)
 		*pend = end;
@@ -222,16 +221,19 @@
 PyObject *
 PyInt_FromUnicode(Py_UNICODE *s, int length, int base)
 {
-	char buffer[256];
+	PyObject *result;
+	char *buffer = PyMem_MALLOC(length+1);
 
-	if (length >= sizeof(buffer)) {
-		PyErr_SetString(PyExc_ValueError,
-				"int() literal too large to convert");
+	if (buffer == NULL)
+		return NULL;
+
+	if (PyUnicode_EncodeDecimal(s, length, buffer, NULL)) {
+		PyMem_FREE(buffer);
 		return NULL;
 	}
-	if (PyUnicode_EncodeDecimal(s, length, buffer, NULL))
-		return NULL;
-	return PyInt_FromString(buffer, NULL, base);
+	result = PyInt_FromString(buffer, NULL, base);
+	PyMem_FREE(buffer);
+	return result;
 }
 #endif
 
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 35d1211..7374fce 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -1123,17 +1123,19 @@
 PyObject *
 PyLong_FromUnicode(Py_UNICODE *u, int length, int base)
 {
-	char buffer[256];
+	PyObject *result;
+	char *buffer = PyMem_MALLOC(length+1);
 
-	if (length >= sizeof(buffer)) {
-		PyErr_SetString(PyExc_ValueError,
-				"long() literal too large to convert");
+	if (buffer == NULL)
+		return NULL;
+
+	if (PyUnicode_EncodeDecimal(u, length, buffer, NULL)) {
+		PyMem_FREE(buffer);
 		return NULL;
 	}
-	if (PyUnicode_EncodeDecimal(u, length, buffer, NULL))
-		return NULL;
-
-	return PyLong_FromString(buffer, NULL, base);
+	result = PyLong_FromString(buffer, NULL, base);
+	PyMem_FREE(buffer);
+	return result;
 }
 #endif