]> granicus.if.org Git - python/commitdiff
Generate FOR_ITER-based loops instead of old FOR_LOOP-based loops
authorJeremy Hylton <jeremy@alum.mit.edu>
Tue, 28 Aug 2001 16:35:18 +0000 (16:35 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Tue, 28 Aug 2001 16:35:18 +0000 (16:35 +0000)
Lib/compiler/pycodegen.py
Tools/compiler/compiler/pycodegen.py

index ced0f07d425c16caede10f764e9ce17f3fdf8e46..37dbcfdfe59635b5b14e2636ef04b8542335e054 100644 (file)
@@ -355,11 +355,11 @@ class CodeGenerator:
         self.set_lineno(node)
         self.emit('SETUP_LOOP', after)
         self.visit(node.list)
-        self.visit(ast.Const(0))
+        self.emit('GET_ITER')
+
         self.nextBlock(start)
         self.set_lineno(node, force=1)
-        self.emit('FOR_LOOP', anchor)
-        self.nextBlock()
+        self.emit('FOR_ITER', anchor)
         self.visit(node.assign)
         self.visit(node.body)
         self.emit('JUMP_ABSOLUTE', start)
@@ -567,7 +567,8 @@ class CodeGenerator:
                 self.nextBlock(next)
             else:
                 self.nextBlock()
-            self.emit('POP_TOP')
+            if expr: # XXX
+                self.emit('POP_TOP')
         self.emit('END_FINALLY')
         if node.else_:
             self.nextBlock(lElse)
@@ -1001,7 +1002,10 @@ class NestedScopeCodeGenerator(CodeGenerator):
             else:
                 self.emit(prefix + '_FAST', name)
         elif scope == SC_GLOBAL:
-            self.emit(prefix + '_GLOBAL', name)
+            if not self.optimized:
+                self.emit(prefix + '_NAME', name)
+            else:
+                self.emit(prefix + '_GLOBAL', name)
         elif scope == SC_FREE or scope == SC_CELL:
             self.emit(prefix + '_DEREF', name)
         else:
index ced0f07d425c16caede10f764e9ce17f3fdf8e46..37dbcfdfe59635b5b14e2636ef04b8542335e054 100644 (file)
@@ -355,11 +355,11 @@ class CodeGenerator:
         self.set_lineno(node)
         self.emit('SETUP_LOOP', after)
         self.visit(node.list)
-        self.visit(ast.Const(0))
+        self.emit('GET_ITER')
+
         self.nextBlock(start)
         self.set_lineno(node, force=1)
-        self.emit('FOR_LOOP', anchor)
-        self.nextBlock()
+        self.emit('FOR_ITER', anchor)
         self.visit(node.assign)
         self.visit(node.body)
         self.emit('JUMP_ABSOLUTE', start)
@@ -567,7 +567,8 @@ class CodeGenerator:
                 self.nextBlock(next)
             else:
                 self.nextBlock()
-            self.emit('POP_TOP')
+            if expr: # XXX
+                self.emit('POP_TOP')
         self.emit('END_FINALLY')
         if node.else_:
             self.nextBlock(lElse)
@@ -1001,7 +1002,10 @@ class NestedScopeCodeGenerator(CodeGenerator):
             else:
                 self.emit(prefix + '_FAST', name)
         elif scope == SC_GLOBAL:
-            self.emit(prefix + '_GLOBAL', name)
+            if not self.optimized:
+                self.emit(prefix + '_NAME', name)
+            else:
+                self.emit(prefix + '_GLOBAL', name)
         elif scope == SC_FREE or scope == SC_CELL:
             self.emit(prefix + '_DEREF', name)
         else: