summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Smith <eric@trueblade.com>2008-01-27 21:07:59 (GMT)
committerEric Smith <eric@trueblade.com>2008-01-27 21:07:59 (GMT)
commit7b69c6c3afba79518865313e1b41845a6b534fb6 (patch)
tree1a2f2f8e142378ff212cc4f57083e8a983cbe297
parent412dc9c88f040abf4b23017c5e5e4d8b880d247d (diff)
downloadcpython-7b69c6c3afba79518865313e1b41845a6b534fb6.zip
cpython-7b69c6c3afba79518865313e1b41845a6b534fb6.tar.gz
cpython-7b69c6c3afba79518865313e1b41845a6b534fb6.tar.bz2
Restrict format presentation types to those specified in the 'Standard Format Specifiers' section of PEP 3101.
-rw-r--r--Lib/test/test_float.py15
-rw-r--r--Lib/test/test_long.py17
-rw-r--r--Objects/stringlib/formatter.h77
3 files changed, 23 insertions, 86 deletions
diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py
index 0de65cb..b9ad8c5 100644
--- a/Lib/test/test_float.py
+++ b/Lib/test/test_float.py
@@ -133,13 +133,10 @@ class FormatTestCase(unittest.TestCase):
self.assertEqual(format(0.01, ''), '0.01')
self.assertEqual(format(0.01, 'g'), '0.01')
- self.assertEqual(format(0, 'f'), '0.000000')
self.assertEqual(format(1.0, 'f'), '1.000000')
- self.assertEqual(format(1, 'f'), '1.000000')
self.assertEqual(format(-1.0, 'f'), '-1.000000')
- self.assertEqual(format(-1, 'f'), '-1.000000')
self.assertEqual(format( 1.0, ' f'), ' 1.000000')
self.assertEqual(format(-1.0, ' f'), '-1.000000')
@@ -152,6 +149,18 @@ class FormatTestCase(unittest.TestCase):
# conversion to string should fail
self.assertRaises(ValueError, format, 3.0, "s")
+ # other format specifiers shouldn't work on floats,
+ # in particular int specifiers
+ for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
+ [chr(x) for x in range(ord('A'), ord('Z')+1)]):
+ if not format_spec in 'eEfFgGn%':
+ self.assertRaises(ValueError, format, 0.0, format_spec)
+ self.assertRaises(ValueError, format, 1.0, format_spec)
+ self.assertRaises(ValueError, format, -1.0, format_spec)
+ self.assertRaises(ValueError, format, 1e100, format_spec)
+ self.assertRaises(ValueError, format, -1e100, format_spec)
+ self.assertRaises(ValueError, format, 1e-100, format_spec)
+ self.assertRaises(ValueError, format, -1e-100, format_spec)
class ReprTestCase(unittest.TestCase):
def test_repr(self):
diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py
index 18bb7a4..2c9e2d0 100644
--- a/Lib/test/test_long.py
+++ b/Lib/test/test_long.py
@@ -526,16 +526,21 @@ class LongTest(unittest.TestCase):
self.assertEqual(format(1234, "+b"), "+10011010010")
self.assertEqual(format(-1234, "+b"), "-10011010010")
- # conversion to float
- self.assertEqual(format(0, 'f'), '0.000000')
-
# make sure these are errors
self.assertRaises(ValueError, format, 3, "1.3") # precision disallowed
self.assertRaises(ValueError, format, 3, "+c") # sign not allowed
# with 'c'
- self.assertRaises(ValueError, format, 3, "R") # bogus format type
- # conversion to string should fail
- self.assertRaises(ValueError, format, 3, "s")
+ # other format specifiers shouldn't work on ints,
+ # in particular float and string specifiers
+ for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
+ [chr(x) for x in range(ord('A'), ord('Z')+1)]):
+ if not format_spec in 'bcdoxX':
+ self.assertRaises(ValueError, format, 0, format_spec)
+ self.assertRaises(ValueError, format, 1, format_spec)
+ self.assertRaises(ValueError, format, -1, format_spec)
+ self.assertRaises(ValueError, format, 2**100, format_spec)
+ self.assertRaises(ValueError, format, -(2**100), format_spec)
+
def test_nan_inf(self):
self.assertRaises(OverflowError, int, float('inf'))
diff --git a/Objects/stringlib/formatter.h b/Objects/stringlib/formatter.h
index b4f6e3c..49b3566 100644
--- a/Objects/stringlib/formatter.h
+++ b/Objects/stringlib/formatter.h
@@ -788,37 +788,6 @@ FORMAT_STRING(PyObject* value, PyObject* args)
/* no type conversion needed, already a string. do the formatting */
result = format_string_internal(value, &format);
break;
-#if 0
- case 'b':
- case 'c':
- case 'd':
- case 'o':
- case 'x':
- case 'X':
- /* convert to integer */
- /* XXX: make a stringlib function to do this when backporting,
- since FromUnicode differs from FromString */
- tmp = PyLong_FromUnicode(STRINGLIB_STR(value), STRINGLIB_LEN(value), 0);
- if (tmp == NULL)
- goto done;
- result = format_long_internal(tmp, &format);
- break;
-
- case 'e':
- case 'E':
- case 'f':
- case 'F':
- case 'g':
- case 'G':
- case 'n':
- case '%':
- /* convert to float */
- tmp = PyFloat_FromString(value);
- if (tmp == NULL)
- goto done;
- result = format_float_internal(tmp, &format);
- break;
-#endif
default:
/* unknown */
PyErr_Format(PyExc_ValueError, "Unknown conversion type %c",
@@ -855,15 +824,6 @@ FORMAT_LONG(PyObject* value, PyObject* args)
/* type conversion? */
switch (format.type) {
-#if 0
- case 's':
- /* convert to string/unicode */
- tmp = STRINGLIB_TOSTR(value);
- if (tmp == NULL)
- goto done;
- result = format_string_internal(tmp, &format);
- break;
-#endif
case 'b':
case 'c':
case 'd':
@@ -874,21 +834,6 @@ FORMAT_LONG(PyObject* value, PyObject* args)
result = format_long_internal(value, &format);
break;
- case 'e':
- case 'E':
- case 'f':
- case 'F':
- case 'g':
- case 'G':
- case 'n':
- case '%':
- /* convert to float */
- tmp = PyNumber_Float(value);
- if (tmp == NULL)
- goto done;
- result = format_float_internal(value, &format);
- break;
-
default:
/* unknown */
PyErr_Format(PyExc_ValueError, "Unknown conversion type %c",
@@ -925,28 +870,6 @@ FORMAT_FLOAT(PyObject *value, PyObject *args)
/* type conversion? */
switch (format.type) {
-#if 0
- case 's':
- /* convert to string/unicode */
- tmp = STRINGLIB_TOSTR(value);
- if (tmp == NULL)
- goto done;
- result = format_string_internal(tmp, &format);
- break;
-#endif
- case 'b':
- case 'c':
- case 'd':
- case 'o':
- case 'x':
- case 'X':
- /* convert to integer */
- tmp = PyNumber_Long(value);
- if (tmp == NULL)
- goto done;
- result = format_long_internal(tmp, &format);
- break;
-
case 'e':
case 'E':
case 'f':