Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f354575

Browse files
committed
Generate FOR_ITER-based loops instead of old FOR_LOOP-based loops
1 parent 318e167 commit f354575

2 files changed

Lines changed: 18 additions & 10 deletions

File tree

Lib/compiler/pycodegen.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -355,11 +355,11 @@ def visitFor(self, node):
355355
self.set_lineno(node)
356356
self.emit('SETUP_LOOP', after)
357357
self.visit(node.list)
358-
self.visit(ast.Const(0))
358+
self.emit('GET_ITER')
359+
359360
self.nextBlock(start)
360361
self.set_lineno(node, force=1)
361-
self.emit('FOR_LOOP', anchor)
362-
self.nextBlock()
362+
self.emit('FOR_ITER', anchor)
363363
self.visit(node.assign)
364364
self.visit(node.body)
365365
self.emit('JUMP_ABSOLUTE', start)
@@ -567,7 +567,8 @@ def visitTryExcept(self, node):
567567
self.nextBlock(next)
568568
else:
569569
self.nextBlock()
570-
self.emit('POP_TOP')
570+
if expr: # XXX
571+
self.emit('POP_TOP')
571572
self.emit('END_FINALLY')
572573
if node.else_:
573574
self.nextBlock(lElse)
@@ -1001,7 +1002,10 @@ def _nameOp(self, prefix, name):
10011002
else:
10021003
self.emit(prefix + '_FAST', name)
10031004
elif scope == SC_GLOBAL:
1004-
self.emit(prefix + '_GLOBAL', name)
1005+
if not self.optimized:
1006+
self.emit(prefix + '_NAME', name)
1007+
else:
1008+
self.emit(prefix + '_GLOBAL', name)
10051009
elif scope == SC_FREE or scope == SC_CELL:
10061010
self.emit(prefix + '_DEREF', name)
10071011
else:

Tools/compiler/compiler/pycodegen.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -355,11 +355,11 @@ def visitFor(self, node):
355355
self.set_lineno(node)
356356
self.emit('SETUP_LOOP', after)
357357
self.visit(node.list)
358-
self.visit(ast.Const(0))
358+
self.emit('GET_ITER')
359+
359360
self.nextBlock(start)
360361
self.set_lineno(node, force=1)
361-
self.emit('FOR_LOOP', anchor)
362-
self.nextBlock()
362+
self.emit('FOR_ITER', anchor)
363363
self.visit(node.assign)
364364
self.visit(node.body)
365365
self.emit('JUMP_ABSOLUTE', start)
@@ -567,7 +567,8 @@ def visitTryExcept(self, node):
567567
self.nextBlock(next)
568568
else:
569569
self.nextBlock()
570-
self.emit('POP_TOP')
570+
if expr: # XXX
571+
self.emit('POP_TOP')
571572
self.emit('END_FINALLY')
572573
if node.else_:
573574
self.nextBlock(lElse)
@@ -1001,7 +1002,10 @@ def _nameOp(self, prefix, name):
10011002
else:
10021003
self.emit(prefix + '_FAST', name)
10031004
elif scope == SC_GLOBAL:
1004-
self.emit(prefix + '_GLOBAL', name)
1005+
if not self.optimized:
1006+
self.emit(prefix + '_NAME', name)
1007+
else:
1008+
self.emit(prefix + '_GLOBAL', name)
10051009
elif scope == SC_FREE or scope == SC_CELL:
10061010
self.emit(prefix + '_DEREF', name)
10071011
else:

0 commit comments

Comments
 (0)