@@ -188,7 +188,8 @@ cfg_builder_new_block(cfg_builder *g)
188188}
189189
190190static int
191- basicblock_addop (basicblock * b , int opcode , int oparg , location loc )
191+ basicblock_addop (basicblock * b , int opcode , int oparg , location loc ,
192+ basicblock * except )
192193{
193194 assert (IS_WITHIN_OPCODE_RANGE (opcode ));
194195 assert (!IS_ASSEMBLER_OPCODE (opcode ));
@@ -203,23 +204,24 @@ basicblock_addop(basicblock *b, int opcode, int oparg, location loc)
203204 i -> i_opcode = opcode ;
204205 i -> i_oparg = oparg ;
205206 i -> i_loc = loc ;
207+ i -> i_except = except ;
206208 // memory is already zero initialized
207209 assert (i -> i_target == NULL );
208- assert (i -> i_except == NULL );
209210
210211 return SUCCESS ;
211212}
212213
213214static int
214- basicblock_add_jump (basicblock * b , int opcode , basicblock * target , location loc )
215+ basicblock_add_jump (basicblock * b , int opcode , basicblock * target , location loc ,
216+ basicblock * except )
215217{
216218 cfg_instr * last = basicblock_last_instr (b );
217219 if (last && is_jump (last )) {
218220 return ERROR ;
219221 }
220222
221223 RETURN_IF_ERROR (
222- basicblock_addop (b , opcode , target -> b_label .id , loc ));
224+ basicblock_addop (b , opcode , target -> b_label .id , loc , except ));
223225 last = basicblock_last_instr (b );
224226 assert (last && last -> i_opcode == opcode );
225227 last -> i_target = target ;
493495_PyCfgBuilder_Addop (cfg_builder * g , int opcode , int oparg , location loc )
494496{
495497 RETURN_IF_ERROR (cfg_builder_maybe_start_new_block (g ));
496- return basicblock_addop (g -> g_curblock , opcode , oparg , loc );
498+ return basicblock_addop (g -> g_curblock , opcode , oparg , loc , NULL );
497499}
498500
499501
@@ -554,7 +556,7 @@ normalize_jumps_in_block(cfg_builder *g, basicblock *b) {
554556 bool is_forward = last -> i_target -> b_visited == 0 ;
555557 if (is_forward ) {
556558 RETURN_IF_ERROR (
557- basicblock_addop (b , NOT_TAKEN , 0 , last -> i_loc ));
559+ basicblock_addop (b , NOT_TAKEN , 0 , last -> i_loc , last -> i_except ));
558560 return SUCCESS ;
559561 }
560562
@@ -583,9 +585,11 @@ normalize_jumps_in_block(cfg_builder *g, basicblock *b) {
583585 return ERROR ;
584586 }
585587 RETURN_IF_ERROR (
586- basicblock_addop (backwards_jump , NOT_TAKEN , 0 , last -> i_loc ));
588+ basicblock_addop (backwards_jump , NOT_TAKEN , 0 , last -> i_loc ,
589+ last -> i_except ));
587590 RETURN_IF_ERROR (
588- basicblock_add_jump (backwards_jump , JUMP , target , last -> i_loc ));
591+ basicblock_add_jump (backwards_jump , JUMP , target , last -> i_loc ,
592+ last -> i_except ));
589593 backwards_jump -> b_startdepth = target -> b_startdepth ;
590594 last -> i_opcode = reversed_opcode ;
591595 last -> i_target = b -> b_next ;
@@ -1293,7 +1297,8 @@ jump_thread(basicblock *bb, cfg_instr *inst, cfg_instr *target, int opcode)
12931297
12941298 RETURN_IF_ERROR (
12951299 basicblock_add_jump (
1296- bb , opcode , target -> i_target , target -> i_loc ));
1300+ bb , opcode , target -> i_target , target -> i_loc ,
1301+ target -> i_except ));
12971302
12981303 return true;
12991304 }
@@ -3547,7 +3552,7 @@ push_cold_blocks_to_end(cfg_builder *g) {
35473552 b -> b_next -> b_label .id = next_lbl ++ ;
35483553 }
35493554 basicblock_addop (explicit_jump , JUMP_NO_INTERRUPT , b -> b_next -> b_label .id ,
3550- NO_LOCATION );
3555+ NO_LOCATION , NULL );
35513556 explicit_jump -> b_cold = 1 ;
35523557 explicit_jump -> b_next = b -> b_next ;
35533558 explicit_jump -> b_predecessors = 1 ;
0 commit comments