Commit b8417dd9 authored by Benjamin Peterson's avatar Benjamin Peterson

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.
........
parent 338dbacb
...@@ -60,6 +60,10 @@ exec_tests = [ ...@@ -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 = [ ...@@ -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 ...@@ -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
......
...@@ -1192,7 +1192,7 @@ ast_for_comprehension(struct compiling *c, const node *n) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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)
......
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