mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	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.
This commit is contained in:
		
							parent
							
								
									13d70944cb
								
							
						
					
					
						commit
						bb0bae6da2
					
				
					 2 changed files with 8 additions and 8 deletions
				
			
		|  | @ -326,7 +326,7 @@ def visitWhile(self, node): | ||||||
|         self.nextBlock(loop) |         self.nextBlock(loop) | ||||||
|         self.loops.push(loop) |         self.loops.push(loop) | ||||||
| 
 | 
 | ||||||
|         self.set_lineno(node) |         self.set_lineno(node, force=1) | ||||||
|         self.visit(node.test) |         self.visit(node.test) | ||||||
|         self.emit('JUMP_IF_FALSE', else_ or after) |         self.emit('JUMP_IF_FALSE', else_ or after) | ||||||
| 
 | 
 | ||||||
|  | @ -338,9 +338,9 @@ def visitWhile(self, node): | ||||||
|         self.startBlock(else_) # or just the POPs if not else clause |         self.startBlock(else_) # or just the POPs if not else clause | ||||||
|         self.emit('POP_TOP') |         self.emit('POP_TOP') | ||||||
|         self.emit('POP_BLOCK') |         self.emit('POP_BLOCK') | ||||||
|  |         self.loops.pop() | ||||||
|         if node.else_: |         if node.else_: | ||||||
|             self.visit(node.else_) |             self.visit(node.else_) | ||||||
|         self.loops.pop() |  | ||||||
|         self.nextBlock(after) |         self.nextBlock(after) | ||||||
| 
 | 
 | ||||||
|     def visitFor(self, node): |     def visitFor(self, node): | ||||||
|  | @ -354,7 +354,7 @@ def visitFor(self, node): | ||||||
|         self.visit(node.list) |         self.visit(node.list) | ||||||
|         self.visit(ast.Const(0)) |         self.visit(ast.Const(0)) | ||||||
|         self.nextBlock(start) |         self.nextBlock(start) | ||||||
|         self.set_lineno(node) |         self.set_lineno(node, force=1) | ||||||
|         self.emit('FOR_LOOP', anchor) |         self.emit('FOR_LOOP', anchor) | ||||||
|         self.nextBlock() |         self.nextBlock() | ||||||
|         self.visit(node.assign) |         self.visit(node.assign) | ||||||
|  | @ -362,9 +362,9 @@ def visitFor(self, node): | ||||||
|         self.emit('JUMP_ABSOLUTE', start) |         self.emit('JUMP_ABSOLUTE', start) | ||||||
|         self.startBlock(anchor) |         self.startBlock(anchor) | ||||||
|         self.emit('POP_BLOCK') |         self.emit('POP_BLOCK') | ||||||
|  |         self.loops.pop() | ||||||
|         if node.else_: |         if node.else_: | ||||||
|             self.visit(node.else_) |             self.visit(node.else_) | ||||||
|         self.loops.pop() |  | ||||||
|         self.nextBlock(after) |         self.nextBlock(after) | ||||||
| 
 | 
 | ||||||
|     def visitBreak(self, node): |     def visitBreak(self, node): | ||||||
|  |  | ||||||
|  | @ -326,7 +326,7 @@ def visitWhile(self, node): | ||||||
|         self.nextBlock(loop) |         self.nextBlock(loop) | ||||||
|         self.loops.push(loop) |         self.loops.push(loop) | ||||||
| 
 | 
 | ||||||
|         self.set_lineno(node) |         self.set_lineno(node, force=1) | ||||||
|         self.visit(node.test) |         self.visit(node.test) | ||||||
|         self.emit('JUMP_IF_FALSE', else_ or after) |         self.emit('JUMP_IF_FALSE', else_ or after) | ||||||
| 
 | 
 | ||||||
|  | @ -338,9 +338,9 @@ def visitWhile(self, node): | ||||||
|         self.startBlock(else_) # or just the POPs if not else clause |         self.startBlock(else_) # or just the POPs if not else clause | ||||||
|         self.emit('POP_TOP') |         self.emit('POP_TOP') | ||||||
|         self.emit('POP_BLOCK') |         self.emit('POP_BLOCK') | ||||||
|  |         self.loops.pop() | ||||||
|         if node.else_: |         if node.else_: | ||||||
|             self.visit(node.else_) |             self.visit(node.else_) | ||||||
|         self.loops.pop() |  | ||||||
|         self.nextBlock(after) |         self.nextBlock(after) | ||||||
| 
 | 
 | ||||||
|     def visitFor(self, node): |     def visitFor(self, node): | ||||||
|  | @ -354,7 +354,7 @@ def visitFor(self, node): | ||||||
|         self.visit(node.list) |         self.visit(node.list) | ||||||
|         self.visit(ast.Const(0)) |         self.visit(ast.Const(0)) | ||||||
|         self.nextBlock(start) |         self.nextBlock(start) | ||||||
|         self.set_lineno(node) |         self.set_lineno(node, force=1) | ||||||
|         self.emit('FOR_LOOP', anchor) |         self.emit('FOR_LOOP', anchor) | ||||||
|         self.nextBlock() |         self.nextBlock() | ||||||
|         self.visit(node.assign) |         self.visit(node.assign) | ||||||
|  | @ -362,9 +362,9 @@ def visitFor(self, node): | ||||||
|         self.emit('JUMP_ABSOLUTE', start) |         self.emit('JUMP_ABSOLUTE', start) | ||||||
|         self.startBlock(anchor) |         self.startBlock(anchor) | ||||||
|         self.emit('POP_BLOCK') |         self.emit('POP_BLOCK') | ||||||
|  |         self.loops.pop() | ||||||
|         if node.else_: |         if node.else_: | ||||||
|             self.visit(node.else_) |             self.visit(node.else_) | ||||||
|         self.loops.pop() |  | ||||||
|         self.nextBlock(after) |         self.nextBlock(after) | ||||||
| 
 | 
 | ||||||
|     def visitBreak(self, node): |     def visitBreak(self, node): | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Jeremy Hylton
						Jeremy Hylton