@@ -187,7 +187,8 @@ cfg_builder_new_block(cfg_builder *g)
187187}
188188
189189static int
190- basicblock_addop (basicblock * b , int opcode , int oparg , location loc )
190+ basicblock_addop (basicblock * b , int opcode , int oparg , location loc ,
191+ basicblock * except )
191192{
192193 assert (IS_WITHIN_OPCODE_RANGE (opcode ));
193194 assert (!IS_ASSEMBLER_OPCODE (opcode ));
@@ -202,23 +203,24 @@ basicblock_addop(basicblock *b, int opcode, int oparg, location loc)
202203 i -> i_opcode = opcode ;
203204 i -> i_oparg = oparg ;
204205 i -> i_loc = loc ;
206+ i -> i_except = except ;
205207 // memory is already zero initialized
206208 assert (i -> i_target == NULL );
207- assert (i -> i_except == NULL );
208209
209210 return SUCCESS ;
210211}
211212
212213static int
213- basicblock_add_jump (basicblock * b , int opcode , basicblock * target , location loc )
214+ basicblock_add_jump (basicblock * b , int opcode , basicblock * target , location loc ,
215+ basicblock * except )
214216{
215217 cfg_instr * last = basicblock_last_instr (b );
216218 if (last && is_jump (last )) {
217219 return ERROR ;
218220 }
219221
220222 RETURN_IF_ERROR (
221- basicblock_addop (b , opcode , target -> b_label .id , loc ));
223+ basicblock_addop (b , opcode , target -> b_label .id , loc , except ));
222224 last = basicblock_last_instr (b );
223225 assert (last && last -> i_opcode == opcode );
224226 last -> i_target = target ;
492494_PyCfgBuilder_Addop (cfg_builder * g , int opcode , int oparg , location loc )
493495{
494496 RETURN_IF_ERROR (cfg_builder_maybe_start_new_block (g ));
495- return basicblock_addop (g -> g_curblock , opcode , oparg , loc );
497+ return basicblock_addop (g -> g_curblock , opcode , oparg , loc , NULL );
496498}
497499
498500
@@ -553,7 +555,7 @@ normalize_jumps_in_block(cfg_builder *g, basicblock *b) {
553555 bool is_forward = last -> i_target -> b_visited == 0 ;
554556 if (is_forward ) {
555557 RETURN_IF_ERROR (
556- basicblock_addop (b , NOT_TAKEN , 0 , last -> i_loc ));
558+ basicblock_addop (b , NOT_TAKEN , 0 , last -> i_loc , last -> i_except ));
557559 return SUCCESS ;
558560 }
559561
@@ -582,9 +584,11 @@ normalize_jumps_in_block(cfg_builder *g, basicblock *b) {
582584 return ERROR ;
583585 }
584586 RETURN_IF_ERROR (
585- basicblock_addop (backwards_jump , NOT_TAKEN , 0 , last -> i_loc ));
587+ basicblock_addop (backwards_jump , NOT_TAKEN , 0 , last -> i_loc ,
588+ last -> i_except ));
586589 RETURN_IF_ERROR (
587- basicblock_add_jump (backwards_jump , JUMP , target , last -> i_loc ));
590+ basicblock_add_jump (backwards_jump , JUMP , target , last -> i_loc ,
591+ last -> i_except ));
588592 backwards_jump -> b_startdepth = target -> b_startdepth ;
589593 last -> i_opcode = reversed_opcode ;
590594 last -> i_target = b -> b_next ;
@@ -1292,7 +1296,8 @@ jump_thread(basicblock *bb, cfg_instr *inst, cfg_instr *target, int opcode)
12921296
12931297 RETURN_IF_ERROR (
12941298 basicblock_add_jump (
1295- bb , opcode , target -> i_target , target -> i_loc ));
1299+ bb , opcode , target -> i_target , target -> i_loc ,
1300+ target -> i_except ));
12961301
12971302 return true;
12981303 }
@@ -3541,7 +3546,7 @@ push_cold_blocks_to_end(cfg_builder *g) {
35413546 b -> b_next -> b_label .id = next_lbl ++ ;
35423547 }
35433548 basicblock_addop (explicit_jump , JUMP_NO_INTERRUPT , b -> b_next -> b_label .id ,
3544- NO_LOCATION );
3549+ NO_LOCATION , NULL );
35453550 explicit_jump -> b_cold = 1 ;
35463551 explicit_jump -> b_next = b -> b_next ;
35473552 explicit_jump -> b_predecessors = 1 ;
0 commit comments