only recursively expand in the format spec (closes #17644)

This commit is contained in:
Benjamin Peterson 2013-05-17 17:34:30 -05:00
parent 36f74aa7f7
commit d2b58a9880
3 changed files with 13 additions and 2 deletions

View File

@ -934,6 +934,8 @@ class UnicodeTest(string_tests.CommonTest,
self.assertEqual("{0:.0s}".format("ABC\u0410\u0411\u0412"), self.assertEqual("{0:.0s}".format("ABC\u0410\u0411\u0412"),
'') '')
self.assertEqual("{[{}]}".format({"{}": 5}), "5")
def test_format_map(self): def test_format_map(self):
self.assertEqual(''.format_map({}), '') self.assertEqual(''.format_map({}), '')
self.assertEqual('a'.format_map({}), 'a') self.assertEqual('a'.format_map({}), 'a')

View File

@ -12,6 +12,9 @@ What's New in Python 3.3.3 release candidate 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #17644: Fix a crash in str.format when curly braces are used in square
brackets.
- Issue #17983: Raise a SyntaxError for a ``global __class__`` statement in a - Issue #17983: Raise a SyntaxError for a ``global __class__`` statement in a
class body. class body.

View File

@ -638,7 +638,7 @@ MarkupIterator_next(MarkupIterator *self, SubString *literal,
SubString *format_spec, Py_UCS4 *conversion, SubString *format_spec, Py_UCS4 *conversion,
int *format_spec_needs_expanding) int *format_spec_needs_expanding)
{ {
int at_end; int at_end, hit_format_spec;
Py_UCS4 c = 0; Py_UCS4 c = 0;
Py_ssize_t start; Py_ssize_t start;
int count; int count;
@ -723,12 +723,18 @@ MarkupIterator_next(MarkupIterator *self, SubString *literal,
/* we know we can't have a zero length string, so don't worry /* we know we can't have a zero length string, so don't worry
about that case */ about that case */
hit_format_spec = 0;
while (self->str.start < self->str.end) { while (self->str.start < self->str.end) {
switch (c = PyUnicode_READ_CHAR(self->str.str, self->str.start++)) { switch (c = PyUnicode_READ_CHAR(self->str.str, self->str.start++)) {
case ':':
hit_format_spec = 1;
count = 1;
break;
case '{': case '{':
/* the format spec needs to be recursively expanded. /* the format spec needs to be recursively expanded.
this is an optimization, and not strictly needed */ this is an optimization, and not strictly needed */
*format_spec_needs_expanding = 1; if (hit_format_spec)
*format_spec_needs_expanding = 1;
count++; count++;
break; break;
case '}': case '}':