mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
Merged revisions 74464 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r74464 | benjamin.peterson | 2009-08-15 17:59:21 -0500 (Sat, 15 Aug 2009) | 4 lines better col_offsets for "for" statements with tuple unpacking #6704 Patch from Frank Wierzbicki. ........
This commit is contained in:
parent
8719ad5dde
commit
2e4b0e1d8b
3 changed files with 18 additions and 11 deletions
|
@ -60,6 +60,10 @@ exec_tests = [
|
||||||
"break",
|
"break",
|
||||||
# Continue
|
# Continue
|
||||||
"continue",
|
"continue",
|
||||||
|
# for statements with naked tuples (see http://bugs.python.org/issue6704)
|
||||||
|
"for a,b in c: pass",
|
||||||
|
"[(a,b) for a,b in c]",
|
||||||
|
"((a,b) for a,b in c)",
|
||||||
]
|
]
|
||||||
|
|
||||||
# These are compiled through "single"
|
# These are compiled through "single"
|
||||||
|
@ -321,6 +325,9 @@ exec_results = [
|
||||||
('Module', [('Pass', (1, 0))]),
|
('Module', [('Pass', (1, 0))]),
|
||||||
('Module', [('Break', (1, 0))]),
|
('Module', [('Break', (1, 0))]),
|
||||||
('Module', [('Continue', (1, 0))]),
|
('Module', [('Continue', (1, 0))]),
|
||||||
|
('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 4), 'a', ('Store',)), ('Name', (1, 6), 'b', ('Store',))], ('Store',)), ('Name', (1, 11), 'c', ('Load',)), [('Pass', (1, 14))], [])]),
|
||||||
|
('Module', [('Expr', (1, 0), ('ListComp', (1, 1), ('Tuple', (1, 2), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [])]))]),
|
||||||
|
('Module', [('Expr', (1, 0), ('GeneratorExp', (1, 1), ('Tuple', (1, 2), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [])]))]),
|
||||||
]
|
]
|
||||||
single_results = [
|
single_results = [
|
||||||
('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Num', (1, 0), 1), ('Add',), ('Num', (1, 2), 2)))]),
|
('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Num', (1, 0), 1), ('Add',), ('Num', (1, 2), 2)))]),
|
||||||
|
|
|
@ -805,6 +805,7 @@ Collin Winter
|
||||||
Dik Winter
|
Dik Winter
|
||||||
Blake Winton
|
Blake Winton
|
||||||
Jean-Claude Wippler
|
Jean-Claude Wippler
|
||||||
|
Frank Wierzbicki
|
||||||
Lars Wirzenius
|
Lars Wirzenius
|
||||||
Chris Withers
|
Chris Withers
|
||||||
Stefan Witzel
|
Stefan Witzel
|
||||||
|
|
21
Python/ast.c
21
Python/ast.c
|
@ -1192,7 +1192,7 @@ ast_for_comprehension(struct compiling *c, const node *n)
|
||||||
for (i = 0; i < n_fors; i++) {
|
for (i = 0; i < n_fors; i++) {
|
||||||
comprehension_ty comp;
|
comprehension_ty comp;
|
||||||
asdl_seq *t;
|
asdl_seq *t;
|
||||||
expr_ty expression;
|
expr_ty expression, first;
|
||||||
node *for_ch;
|
node *for_ch;
|
||||||
|
|
||||||
REQ(n, comp_for);
|
REQ(n, comp_for);
|
||||||
|
@ -1207,14 +1207,13 @@ ast_for_comprehension(struct compiling *c, const node *n)
|
||||||
|
|
||||||
/* Check the # of children rather than the length of t, since
|
/* Check the # of children rather than the length of t, since
|
||||||
(x for x, in ...) has 1 element in t, but still requires a Tuple. */
|
(x for x, in ...) has 1 element in t, but still requires a Tuple. */
|
||||||
|
first = (expr_ty)asdl_seq_GET(t, 0);
|
||||||
if (NCH(for_ch) == 1)
|
if (NCH(for_ch) == 1)
|
||||||
comp = comprehension((expr_ty)asdl_seq_GET(t, 0), expression,
|
comp = comprehension(first, expression, NULL, c->c_arena);
|
||||||
NULL, c->c_arena);
|
|
||||||
else
|
else
|
||||||
comp = comprehension(Tuple(t, Store, LINENO(n), n->n_col_offset,
|
comp = comprehension(Tuple(t, Store, first->lineno, first->col_offset,
|
||||||
c->c_arena),
|
c->c_arena),
|
||||||
expression, NULL, c->c_arena);
|
expression, NULL, c->c_arena);
|
||||||
|
|
||||||
if (!comp)
|
if (!comp)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -1294,7 +1293,6 @@ ast_for_dictcomp(struct compiling *c, const node *n)
|
||||||
key = ast_for_expr(c, CHILD(n, 0));
|
key = ast_for_expr(c, CHILD(n, 0));
|
||||||
if (!key)
|
if (!key)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
value = ast_for_expr(c, CHILD(n, 2));
|
value = ast_for_expr(c, CHILD(n, 2));
|
||||||
if (!value)
|
if (!value)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -2802,7 +2800,7 @@ ast_for_for_stmt(struct compiling *c, const node *n)
|
||||||
{
|
{
|
||||||
asdl_seq *_target, *seq = NULL, *suite_seq;
|
asdl_seq *_target, *seq = NULL, *suite_seq;
|
||||||
expr_ty expression;
|
expr_ty expression;
|
||||||
expr_ty target;
|
expr_ty target, first;
|
||||||
const node *node_target;
|
const node *node_target;
|
||||||
/* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
|
/* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
|
||||||
REQ(n, for_stmt);
|
REQ(n, for_stmt);
|
||||||
|
@ -2819,10 +2817,11 @@ ast_for_for_stmt(struct compiling *c, const node *n)
|
||||||
return NULL;
|
return NULL;
|
||||||
/* Check the # of children rather than the length of _target, since
|
/* Check the # of children rather than the length of _target, since
|
||||||
for x, in ... has 1 element in _target, but still requires a Tuple. */
|
for x, in ... has 1 element in _target, but still requires a Tuple. */
|
||||||
|
first = (expr_ty)asdl_seq_GET(_target, 0);
|
||||||
if (NCH(node_target) == 1)
|
if (NCH(node_target) == 1)
|
||||||
target = (expr_ty)asdl_seq_GET(_target, 0);
|
target = first;
|
||||||
else
|
else
|
||||||
target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
|
target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
|
||||||
|
|
||||||
expression = ast_for_testlist(c, CHILD(n, 3));
|
expression = ast_for_testlist(c, CHILD(n, 3));
|
||||||
if (!expression)
|
if (!expression)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue