1.1 --- a/common.py Sat Mar 11 22:27:45 2017 +0100
1.2 +++ b/common.py Sat Mar 11 23:50:14 2017 +0100
1.3 @@ -129,7 +129,6 @@
1.4
1.5 self.astnode = None
1.6 self.encoding = None
1.7 - self.iterators = {}
1.8 self.temp = {}
1.9 self.lambdas = {}
1.10
1.11 @@ -230,19 +229,6 @@
1.12 def next_literal(self):
1.13 self.literals[self.get_namespace_path()] += 1
1.14
1.15 - # Temporary iterator naming.
1.16 -
1.17 - def get_iterator_path(self):
1.18 - return self.in_function and self.get_namespace_path() or self.name
1.19 -
1.20 - def get_iterator_name(self):
1.21 - path = self.get_iterator_path()
1.22 - init_item(self.iterators, path, lambda: 0)
1.23 - return "$i%d" % self.iterators[path]
1.24 -
1.25 - def next_iterator(self):
1.26 - self.iterators[self.get_iterator_path()] += 1
1.27 -
1.28 # Temporary variable naming.
1.29
1.30 def get_temporary_name(self):
1.31 @@ -565,17 +551,32 @@
1.32 the iterator, producing a replacement node for the original.
1.33 """
1.34
1.35 + t0 = self.get_temporary_name()
1.36 + self.next_temporary()
1.37 + t1 = self.get_temporary_name()
1.38 + self.next_temporary()
1.39 + i0 = self.get_temporary_name()
1.40 + self.next_temporary()
1.41 +
1.42 node = compiler.ast.Stmt([
1.43
1.44 - # <next> = {n.list}.__iter__().next
1.45 + # <t0> = {n.list}
1.46 + # <t1> = <t0>.__iter__()
1.47 + # <i0> = <t1>.next
1.48
1.49 compiler.ast.Assign(
1.50 - [compiler.ast.AssName(self.get_iterator_name(), "OP_ASSIGN")],
1.51 - compiler.ast.Getattr(
1.52 - compiler.ast.CallFunc(
1.53 - compiler.ast.Getattr(n.list, "__iter__"),
1.54 - []
1.55 - ), "next")),
1.56 + [compiler.ast.AssName(t0, "OP_ASSIGN")],
1.57 + n.list),
1.58 +
1.59 + compiler.ast.Assign(
1.60 + [compiler.ast.AssName(t1, "OP_ASSIGN")],
1.61 + compiler.ast.CallFunc(
1.62 + compiler.ast.Getattr(compiler.ast.Name(t0), "__iter__"),
1.63 + [])),
1.64 +
1.65 + compiler.ast.Assign(
1.66 + [compiler.ast.AssName(i0, "OP_ASSIGN")],
1.67 + compiler.ast.Getattr(compiler.ast.Name(t1), "next")),
1.68
1.69 # try:
1.70 # while True:
1.71 @@ -591,7 +592,7 @@
1.72 compiler.ast.Assign(
1.73 [n.assign],
1.74 compiler.ast.CallFunc(
1.75 - compiler.ast.Name(self.get_iterator_name()),
1.76 + compiler.ast.Name(i0),
1.77 []
1.78 )),
1.79 n.body]),
1.80 @@ -600,7 +601,6 @@
1.81 None)
1.82 ])
1.83
1.84 - self.next_iterator()
1.85 self.process_structure_node(node)
1.86
1.87 def process_literal_sequence_node(self, n, name, ref, cls):