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