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

Skip to content

Commit bb0bae6

Browse files
committed
Pop loop off the loop stack before handling the loop's else clause.
Otherwise, continue/break will attempt to affect the wrong loop. A few more fiddles to get the SET_LINENOs consistent across compilers.
1 parent 13d7094 commit bb0bae6

2 files changed

Lines changed: 8 additions & 8 deletions

File tree

Lib/compiler/pycodegen.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ def visitWhile(self, node):
326326
self.nextBlock(loop)
327327
self.loops.push(loop)
328328

329-
self.set_lineno(node)
329+
self.set_lineno(node, force=1)
330330
self.visit(node.test)
331331
self.emit('JUMP_IF_FALSE', else_ or after)
332332

@@ -338,9 +338,9 @@ def visitWhile(self, node):
338338
self.startBlock(else_) # or just the POPs if not else clause
339339
self.emit('POP_TOP')
340340
self.emit('POP_BLOCK')
341+
self.loops.pop()
341342
if node.else_:
342343
self.visit(node.else_)
343-
self.loops.pop()
344344
self.nextBlock(after)
345345

346346
def visitFor(self, node):
@@ -354,17 +354,17 @@ def visitFor(self, node):
354354
self.visit(node.list)
355355
self.visit(ast.Const(0))
356356
self.nextBlock(start)
357-
self.set_lineno(node)
357+
self.set_lineno(node, force=1)
358358
self.emit('FOR_LOOP', anchor)
359359
self.nextBlock()
360360
self.visit(node.assign)
361361
self.visit(node.body)
362362
self.emit('JUMP_ABSOLUTE', start)
363363
self.startBlock(anchor)
364364
self.emit('POP_BLOCK')
365+
self.loops.pop()
365366
if node.else_:
366367
self.visit(node.else_)
367-
self.loops.pop()
368368
self.nextBlock(after)
369369

370370
def visitBreak(self, node):

Tools/compiler/compiler/pycodegen.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ def visitWhile(self, node):
326326
self.nextBlock(loop)
327327
self.loops.push(loop)
328328

329-
self.set_lineno(node)
329+
self.set_lineno(node, force=1)
330330
self.visit(node.test)
331331
self.emit('JUMP_IF_FALSE', else_ or after)
332332

@@ -338,9 +338,9 @@ def visitWhile(self, node):
338338
self.startBlock(else_) # or just the POPs if not else clause
339339
self.emit('POP_TOP')
340340
self.emit('POP_BLOCK')
341+
self.loops.pop()
341342
if node.else_:
342343
self.visit(node.else_)
343-
self.loops.pop()
344344
self.nextBlock(after)
345345

346346
def visitFor(self, node):
@@ -354,17 +354,17 @@ def visitFor(self, node):
354354
self.visit(node.list)
355355
self.visit(ast.Const(0))
356356
self.nextBlock(start)
357-
self.set_lineno(node)
357+
self.set_lineno(node, force=1)
358358
self.emit('FOR_LOOP', anchor)
359359
self.nextBlock()
360360
self.visit(node.assign)
361361
self.visit(node.body)
362362
self.emit('JUMP_ABSOLUTE', start)
363363
self.startBlock(anchor)
364364
self.emit('POP_BLOCK')
365+
self.loops.pop()
365366
if node.else_:
366367
self.visit(node.else_)
367-
self.loops.pop()
368368
self.nextBlock(after)
369369

370370
def visitBreak(self, node):

0 commit comments

Comments
 (0)