[Python-checkins] r75737 - in python/branches/py3k: Lib/test/test_complex.py Misc/NEWS Objects/complexobject.c

mark.dickinson python-checkins at python.org
Mon Oct 26 22:51:18 CET 2009


Author: mark.dickinson
Date: Mon Oct 26 22:51:18 2009
New Revision: 75737

Log:
Remove length limitation on string arguments to complex()

Modified:
   python/branches/py3k/Lib/test/test_complex.py
   python/branches/py3k/Misc/NEWS
   python/branches/py3k/Objects/complexobject.c

Modified: python/branches/py3k/Lib/test/test_complex.py
==============================================================================
--- python/branches/py3k/Lib/test/test_complex.py	(original)
+++ python/branches/py3k/Lib/test/test_complex.py	Mon Oct 26 22:51:18 2009
@@ -284,7 +284,6 @@
         self.assertRaises(ValueError, complex, "1+2j)")
         self.assertRaises(ValueError, complex, "1+(2j)")
         self.assertRaises(ValueError, complex, "(1+2j)123")
-        self.assertRaises(ValueError, complex, "1"*500)
         self.assertRaises(ValueError, complex, "x")
         self.assertRaises(ValueError, complex, "1j+2")
         self.assertRaises(ValueError, complex, "1e1ej")
@@ -295,6 +294,9 @@
         self.assertRaises(ValueError, complex, "1.11.1j")
         self.assertRaises(ValueError, complex, "1e1.1j")
 
+        # check that complex accepts long unicode strings
+        self.assertEqual(type(complex("1"*500)), complex)
+
         class EvilExc(Exception):
             pass
 

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Mon Oct 26 22:51:18 2009
@@ -12,6 +12,8 @@
 Core and Builtins
 -----------------
 
+- Remove length limitation when constructing a complex number from a string.
+
 - Issue #1087418: Boost performance of bitwise operations for longs.
 
 - Support for AtheOS has been completely removed from the code base. It was

Modified: python/branches/py3k/Objects/complexobject.c
==============================================================================
--- python/branches/py3k/Objects/complexobject.c	(original)
+++ python/branches/py3k/Objects/complexobject.c	Mon Oct 26 22:51:18 2009
@@ -740,20 +740,20 @@
 	char *end;
 	double x=0.0, y=0.0, z;
 	int got_bracket=0;
-	char s_buffer[256];
+	char *s_buffer = NULL;
 	Py_ssize_t len;
 
 	if (PyUnicode_Check(v)) {
-		if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
-			PyErr_SetString(PyExc_ValueError,
-				 "complex() literal too large to convert");
-			return NULL;
-		}
+		s_buffer = (char *)PyMem_MALLOC(PyUnicode_GET_SIZE(v) + 1);
+		if (s_buffer == NULL)
+			return PyErr_NoMemory();
 		if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
 					    PyUnicode_GET_SIZE(v),
 					    s_buffer,
-					    NULL))
+					    NULL)) {
+			PyMem_FREE(s_buffer);
 			return NULL;
+		}
 		s = s_buffer;
 		len = strlen(s);
 	}
@@ -870,9 +870,13 @@
 	if (s-start != len)
 		goto parse_error;
 
+	if (s_buffer)
+		PyMem_FREE(s_buffer);
 	return complex_subtype_from_doubles(type, x, y);
 
   parse_error:
+	if (s_buffer)
+		PyMem_FREE(s_buffer);
 	PyErr_SetString(PyExc_ValueError,
 			"complex() arg is a malformed string");
 	return NULL;


More information about the Python-checkins mailing list