mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	[3.13] gh-123048: Fix missing source location in pattern matching code (GH-123167) (#123169)
gh-123048: Fix missing source location in pattern matching code (GH-123167)
(cherry picked from commit bffed80230)
Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
			
			
This commit is contained in:
		
							parent
							
								
									595fb38e91
								
							
						
					
					
						commit
						159db050f4
					
				
					 3 changed files with 22 additions and 1 deletions
				
			
		|  | @ -1,6 +1,7 @@ | |||
| import array | ||||
| import collections | ||||
| import dataclasses | ||||
| import dis | ||||
| import enum | ||||
| import inspect | ||||
| import sys | ||||
|  | @ -3377,6 +3378,24 @@ class Keys: | |||
|         self.assertIs(y, None) | ||||
|         self.assertIs(z, None) | ||||
| 
 | ||||
| class TestSourceLocations(unittest.TestCase): | ||||
|     def test_jump_threading(self): | ||||
|         # See gh-123048 | ||||
|         def f(): | ||||
|             x = 0 | ||||
|             v = 1 | ||||
|             match v: | ||||
|                 case 1: | ||||
|                     if x < 0: | ||||
|                         x = 1 | ||||
|                 case 2: | ||||
|                     if x < 0: | ||||
|                         x = 1 | ||||
|             x += 1 | ||||
| 
 | ||||
|         for inst in dis.get_instructions(f): | ||||
|             if inst.opcode in dis.hasjump: | ||||
|                 self.assertIsNotNone(inst.positions.lineno, "jump without location") | ||||
| 
 | ||||
| class TestTracing(unittest.TestCase): | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,2 @@ | |||
| Fix a bug where pattern matching code could emit a :opcode:`JUMP_FORWARD` | ||||
| with no source location. | ||||
|  | @ -7478,7 +7478,7 @@ compiler_match_inner(struct compiler *c, stmt_ty s, pattern_context *pc) | |||
|             ADDOP(c, LOC(m->pattern), POP_TOP); | ||||
|         } | ||||
|         VISIT_SEQ(c, stmt, m->body); | ||||
|         ADDOP_JUMP(c, NO_LOCATION, JUMP_NO_INTERRUPT, end); | ||||
|         ADDOP_JUMP(c, NO_LOCATION, JUMP, end); | ||||
|         // If the pattern fails to match, we want the line number of the
 | ||||
|         // cleanup to be associated with the failed pattern, not the last line
 | ||||
|         // of the body
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Miss Islington (bot)
						Miss Islington (bot)