Commit cb2c4269 authored by Stefan Behnel's avatar Stefan Behnel

code cleanup

parent 9ad6182c
...@@ -242,8 +242,10 @@ class PostParse(CythonTransform): ...@@ -242,8 +242,10 @@ class PostParse(CythonTransform):
self.context.nonfatal_error(e) self.context.nonfatal_error(e)
return None return None
# support for parallel assignments (a,b = b,a) by splitting them # Split parallel assignments (a,b = b,a) into separate partial
# into separate assignments that are executed rhs-first # assignments that are executed rhs-first using temps. This
# optimisation is best applied before type analysis so that known
# types on rhs and lhs can be matched directly.
def visit_SingleAssignmentNode(self, node): def visit_SingleAssignmentNode(self, node):
self.visitchildren(node) self.visitchildren(node)
...@@ -295,7 +297,7 @@ def flatten_parallel_assignments(input, output): ...@@ -295,7 +297,7 @@ def flatten_parallel_assignments(input, output):
complete_assignments = [] complete_assignments = []
rhs_size = len(rhs.args) rhs_size = len(rhs.args)
lhs_targets = [ [] for _ in range(rhs_size) ] lhs_targets = [ [] for _ in xrange(rhs_size) ]
starred_assignments = [] starred_assignments = []
for lhs in input[:-1]: for lhs in input[:-1]:
if not lhs.is_sequence_constructor: if not lhs.is_sequence_constructor:
...@@ -305,32 +307,26 @@ def flatten_parallel_assignments(input, output): ...@@ -305,32 +307,26 @@ def flatten_parallel_assignments(input, output):
continue continue
lhs_size = len(lhs.args) lhs_size = len(lhs.args)
starred_targets = sum([1 for expr in lhs.args if expr.is_starred]) starred_targets = sum([1 for expr in lhs.args if expr.is_starred])
if starred_targets: if starred_targets > 1:
if starred_targets > 1: error(lhs.pos, "more than 1 starred expression in assignment")
error(lhs.pos, "more than 1 starred expression in assignment") output.append([lhs,rhs])
output.append([lhs,rhs]) continue
continue elif lhs_size - starred_targets > rhs_size:
elif lhs_size - starred_targets > rhs_size: error(lhs.pos, "need more than %d value%s to unpack"
error(lhs.pos, "need more than %d value%s to unpack" % (rhs_size, (rhs_size != 1) and 's' or ''))
% (rhs_size, (rhs_size != 1) and 's' or '')) output.append([lhs,rhs])
output.append([lhs,rhs]) continue
continue elif starred_targets == 1:
map_starred_assignment(lhs_targets, starred_assignments, map_starred_assignment(lhs_targets, starred_assignments,
lhs.args, rhs.args) lhs.args, rhs.args)
elif lhs_size < rhs_size:
error(lhs.pos, "too many values to unpack (expected %d, got %d)"
% (lhs_size, rhs_size))
output.append([lhs,rhs])
continue
else: else:
if lhs_size > rhs_size: for targets, expr in zip(lhs_targets, lhs.args):
error(lhs.pos, "need more than %d value%s to unpack" targets.append(expr)
% (rhs_size, (rhs_size != 1) and 's' or ''))
output.append([lhs,rhs])
continue
elif lhs_size < rhs_size:
error(lhs.pos, "too many values to unpack (expected %d, got %d)"
% (lhs_size, rhs_size))
output.append([lhs,rhs])
continue
else:
for targets, expr in zip(lhs_targets, lhs.args):
targets.append(expr)
if complete_assignments: if complete_assignments:
complete_assignments.append(rhs) complete_assignments.append(rhs)
......
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