cython-devel
changeset 2564:3aa603282788
fix bug 409: use cascaded assignments also for the complete rhs when optimising parallel assignments
| author | Stefan Behnel <scoder@users.berlios.de> |
|---|---|
| date | Fri Oct 23 10:10:14 2009 +0200 (2 years ago) |
| parents | e3c343d38eb8 |
| children | 511aa0bc18eb |
| files | Cython/Compiler/Parsing.py tests/bugs.txt tests/run/extended_unpacking_T409.pyx |
line diff
1.1 --- a/Cython/Compiler/Parsing.py Thu Oct 22 23:21:40 2009 -0700
1.2 +++ b/Cython/Compiler/Parsing.py Fri Oct 23 10:10:14 2009 +0200
1.3 @@ -928,6 +928,8 @@
1.4 output.append(input)
1.5 return
1.6
1.7 + complete_assignments = [rhs]
1.8 +
1.9 rhs_size = len(rhs.args)
1.10 lhs_targets = [ [] for _ in range(rhs_size) ]
1.11 starred_assignments = []
1.12 @@ -935,7 +937,7 @@
1.13 if not lhs.is_sequence_constructor:
1.14 if lhs.is_starred:
1.15 error(lhs.pos, "starred assignment target must be in a list or tuple")
1.16 - output.append([lhs,rhs])
1.17 + complete_assignments.append(lhs)
1.18 continue
1.19 lhs_size = len(lhs.args)
1.20 starred_targets = sum([1 for expr in lhs.args if expr.is_starred])
1.21 @@ -966,6 +968,9 @@
1.22 for targets, expr in zip(lhs_targets, lhs.args):
1.23 targets.append(expr)
1.24
1.25 + if len(complete_assignments) > 1:
1.26 + output.append(complete_assignments[::-1])
1.27 +
1.28 # recursively flatten partial assignments
1.29 for cascade, rhs in zip(lhs_targets, rhs.args):
1.30 if cascade:
2.1 --- a/tests/bugs.txt Thu Oct 22 23:21:40 2009 -0700
2.2 +++ b/tests/bugs.txt Fri Oct 23 10:10:14 2009 +0200
2.3 @@ -7,4 +7,3 @@
2.4 unsignedbehaviour_T184
2.5 bad_c_struct_T252
2.6 missing_baseclass_in_predecl_T262
2.7 -extended_unpacking_T409
3.1 --- a/tests/run/extended_unpacking_T409.pyx Thu Oct 22 23:21:40 2009 -0700
3.2 +++ b/tests/run/extended_unpacking_T409.pyx Fri Oct 23 10:10:14 2009 +0200
3.3 @@ -1,14 +1,24 @@
3.4 -__doc__ = """
3.5 - >>> simple()
3.6 - (1, 2, [1, 2], [1, 2])
3.7 - >>> extended()
3.8 - (1, (), 2, [1, 2], [1, 2])
3.9 -"""
3.10
3.11 def simple():
3.12 + """
3.13 + >>> simple()
3.14 + ([1, 2], [1, 2])
3.15 + """
3.16 + d = e = [1,2]
3.17 + return d, e
3.18 +
3.19 +def simple_parallel():
3.20 + """
3.21 + >>> simple_parallel()
3.22 + (1, 2, [1, 2], [1, 2])
3.23 + """
3.24 a, c = d = e = [1,2]
3.25 return a, c, d, e
3.26
3.27 def extended():
3.28 + """
3.29 + >>> extended()
3.30 + (1, [], 2, [1, 2], [1, 2])
3.31 + """
3.32 a, *b, c = d = e = [1,2]
3.33 return a, b, c, d, e
