Commit 8dfb62c9 authored by Mark Dickinson's avatar Mark Dickinson

Remove length limitation on string arguments to complex()

parent ff6a681d
...@@ -284,7 +284,6 @@ class ComplexTest(unittest.TestCase): ...@@ -284,7 +284,6 @@ class ComplexTest(unittest.TestCase):
self.assertRaises(ValueError, complex, "1+2j)") self.assertRaises(ValueError, complex, "1+2j)")
self.assertRaises(ValueError, complex, "1+(2j)") self.assertRaises(ValueError, complex, "1+(2j)")
self.assertRaises(ValueError, complex, "(1+2j)123") self.assertRaises(ValueError, complex, "(1+2j)123")
self.assertRaises(ValueError, complex, "1"*500)
self.assertRaises(ValueError, complex, "x") self.assertRaises(ValueError, complex, "x")
self.assertRaises(ValueError, complex, "1j+2") self.assertRaises(ValueError, complex, "1j+2")
self.assertRaises(ValueError, complex, "1e1ej") self.assertRaises(ValueError, complex, "1e1ej")
...@@ -295,6 +294,9 @@ class ComplexTest(unittest.TestCase): ...@@ -295,6 +294,9 @@ class ComplexTest(unittest.TestCase):
self.assertRaises(ValueError, complex, "1.11.1j") self.assertRaises(ValueError, complex, "1.11.1j")
self.assertRaises(ValueError, complex, "1e1.1j") self.assertRaises(ValueError, complex, "1e1.1j")
# check that complex accepts long unicode strings
self.assertEqual(type(complex("1"*500)), complex)
class EvilExc(Exception): class EvilExc(Exception):
pass pass
......
...@@ -12,6 +12,8 @@ What's New in Python 3.2 Alpha 1? ...@@ -12,6 +12,8 @@ What's New in Python 3.2 Alpha 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Remove length limitation when constructing a complex number from a string.
- Issue #1087418: Boost performance of bitwise operations for longs. - Issue #1087418: Boost performance of bitwise operations for longs.
- Support for AtheOS has been completely removed from the code base. It was - Support for AtheOS has been completely removed from the code base. It was
......
...@@ -740,20 +740,20 @@ complex_subtype_from_string(PyTypeObject *type, PyObject *v) ...@@ -740,20 +740,20 @@ complex_subtype_from_string(PyTypeObject *type, PyObject *v)
char *end; char *end;
double x=0.0, y=0.0, z; double x=0.0, y=0.0, z;
int got_bracket=0; int got_bracket=0;
char s_buffer[256]; char *s_buffer = NULL;
Py_ssize_t len; Py_ssize_t len;
if (PyUnicode_Check(v)) { if (PyUnicode_Check(v)) {
if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) { s_buffer = (char *)PyMem_MALLOC(PyUnicode_GET_SIZE(v) + 1);
PyErr_SetString(PyExc_ValueError, if (s_buffer == NULL)
"complex() literal too large to convert"); return PyErr_NoMemory();
return NULL;
}
if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v), if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
PyUnicode_GET_SIZE(v), PyUnicode_GET_SIZE(v),
s_buffer, s_buffer,
NULL)) NULL)) {
PyMem_FREE(s_buffer);
return NULL; return NULL;
}
s = s_buffer; s = s_buffer;
len = strlen(s); len = strlen(s);
} }
...@@ -870,9 +870,13 @@ complex_subtype_from_string(PyTypeObject *type, PyObject *v) ...@@ -870,9 +870,13 @@ complex_subtype_from_string(PyTypeObject *type, PyObject *v)
if (s-start != len) if (s-start != len)
goto parse_error; goto parse_error;
if (s_buffer)
PyMem_FREE(s_buffer);
return complex_subtype_from_doubles(type, x, y); return complex_subtype_from_doubles(type, x, y);
parse_error: parse_error:
if (s_buffer)
PyMem_FREE(s_buffer);
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
"complex() arg is a malformed string"); "complex() arg is a malformed string");
return NULL; return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment