Otherwise, continue/break will attempt to affect the wrong loop.
A few more fiddles to get the SET_LINENOs consistent across compilers.
self.nextBlock(loop)
self.loops.push(loop)
- self.set_lineno(node)
+ self.set_lineno(node, force=1)
self.visit(node.test)
self.emit('JUMP_IF_FALSE', else_ or after)
self.startBlock(else_) # or just the POPs if not else clause
self.emit('POP_TOP')
self.emit('POP_BLOCK')
+ self.loops.pop()
if node.else_:
self.visit(node.else_)
- self.loops.pop()
self.nextBlock(after)
def visitFor(self, node):
self.visit(node.list)
self.visit(ast.Const(0))
self.nextBlock(start)
- self.set_lineno(node)
+ self.set_lineno(node, force=1)
self.emit('FOR_LOOP', anchor)
self.nextBlock()
self.visit(node.assign)
self.emit('JUMP_ABSOLUTE', start)
self.startBlock(anchor)
self.emit('POP_BLOCK')
+ self.loops.pop()
if node.else_:
self.visit(node.else_)
- self.loops.pop()
self.nextBlock(after)
def visitBreak(self, node):
self.nextBlock(loop)
self.loops.push(loop)
- self.set_lineno(node)
+ self.set_lineno(node, force=1)
self.visit(node.test)
self.emit('JUMP_IF_FALSE', else_ or after)
self.startBlock(else_) # or just the POPs if not else clause
self.emit('POP_TOP')
self.emit('POP_BLOCK')
+ self.loops.pop()
if node.else_:
self.visit(node.else_)
- self.loops.pop()
self.nextBlock(after)
def visitFor(self, node):
self.visit(node.list)
self.visit(ast.Const(0))
self.nextBlock(start)
- self.set_lineno(node)
+ self.set_lineno(node, force=1)
self.emit('FOR_LOOP', anchor)
self.nextBlock()
self.visit(node.assign)
self.emit('JUMP_ABSOLUTE', start)
self.startBlock(anchor)
self.emit('POP_BLOCK')
+ self.loops.pop()
if node.else_:
self.visit(node.else_)
- self.loops.pop()
self.nextBlock(after)
def visitBreak(self, node):