mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	bpo-43933: Force RETURN_VALUE bytecodes to have line numbers (GH-26054)
This commit is contained in:
		
							parent
							
								
									6574334a68
								
							
						
					
					
						commit
						cb6f3d7163
					
				
					 4 changed files with 2995 additions and 2944 deletions
				
			
		|  | @ -7276,6 +7276,34 @@ insert_generator_prefix(struct compiler *c, basicblock *entryblock) { | |||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| /* Make sure that all returns have a line number, even if early passes
 | ||||
|  * have failed to propagate a correct line number. | ||||
|  * The resulting line number may not be correct according to PEP 626, | ||||
|  * but should be "good enough", and no worse than in older versions. */ | ||||
| static void | ||||
| guarantee_lineno_for_exits(struct assembler *a, int firstlineno) { | ||||
|     int lineno = firstlineno; | ||||
|     assert(lineno > 0); | ||||
|     for (basicblock *b = a->a_entry; b != NULL; b = b->b_next) { | ||||
|         if (b->b_iused == 0) { | ||||
|             continue; | ||||
|         } | ||||
|         struct instr *last = &b->b_instr[b->b_iused-1]; | ||||
|         if (last->i_lineno < 0) { | ||||
|             if (last->i_opcode == RETURN_VALUE) | ||||
|             { | ||||
|                 for (int i = 0; i < b->b_iused; i++) { | ||||
|                     assert(b->b_instr[i].i_lineno < 0); | ||||
|                     b->b_instr[i].i_lineno = lineno; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         else { | ||||
|             lineno = last->i_lineno; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static PyCodeObject * | ||||
| assemble(struct compiler *c, int addNone) | ||||
| { | ||||
|  | @ -7338,6 +7366,7 @@ assemble(struct compiler *c, int addNone) | |||
|     if (optimize_cfg(c, &a, consts)) { | ||||
|         goto error; | ||||
|     } | ||||
|     guarantee_lineno_for_exits(&a, c->u->u_firstlineno); | ||||
| 
 | ||||
|     int maxdepth = stackdepth(c); | ||||
|     if (maxdepth < 0) { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mark Shannon
						Mark Shannon