@@ -1110,6 +1110,8 @@ stack_effect(int opcode, int oparg, int jump)
11101110
11111111 case POP_JUMP_IF_FALSE :
11121112 case POP_JUMP_IF_TRUE :
1113+ case POP_JUMP_IF_NONE :
1114+ case POP_JUMP_IF_NOT_NONE :
11131115 return -1 ;
11141116
11151117 case LOAD_GLOBAL :
@@ -8519,6 +8521,21 @@ optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts)
85198521 bb -> b_instr [i + 1 ].i_opcode = NOP ;
85208522 }
85218523 break ;
8524+ case IS_OP :
8525+ cnt = get_const_value (inst -> i_opcode , oparg , consts );
8526+ if (cnt == NULL ) {
8527+ goto error ;
8528+ }
8529+ int jump_op = i + 2 < bb -> b_iused ? bb -> b_instr [i + 2 ].i_opcode : 0 ;
8530+ if (Py_IsNone (cnt ) && (jump_op == POP_JUMP_IF_FALSE || jump_op == POP_JUMP_IF_TRUE )) {
8531+ unsigned char nextarg = bb -> b_instr [i + 1 ].i_oparg ;
8532+ inst -> i_opcode = NOP ;
8533+ bb -> b_instr [i + 1 ].i_opcode = NOP ;
8534+ bb -> b_instr [i + 2 ].i_opcode = nextarg ^ (jump_op == POP_JUMP_IF_FALSE ) ?
8535+ POP_JUMP_IF_NOT_NONE : POP_JUMP_IF_NONE ;
8536+ }
8537+ Py_DECREF (cnt );
8538+ break ;
85228539 }
85238540 break ;
85248541 }
@@ -8611,6 +8628,14 @@ optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts)
86118628 break ;
86128629 }
86138630 break ;
8631+ case POP_JUMP_IF_NOT_NONE :
8632+ case POP_JUMP_IF_NONE :
8633+ switch (target -> i_opcode ) {
8634+ case JUMP_ABSOLUTE :
8635+ case JUMP_FORWARD :
8636+ i -= jump_thread (inst , target , inst -> i_opcode );
8637+ }
8638+ break ;
86148639 case POP_JUMP_IF_FALSE :
86158640 switch (target -> i_opcode ) {
86168641 case JUMP_ABSOLUTE :
@@ -8766,6 +8791,8 @@ normalize_basic_block(basicblock *bb) {
87668791 case JUMP_FORWARD :
87678792 bb -> b_nofallthrough = 1 ;
87688793 /* fall through */
8794+ case POP_JUMP_IF_NOT_NONE :
8795+ case POP_JUMP_IF_NONE :
87698796 case POP_JUMP_IF_FALSE :
87708797 case POP_JUMP_IF_TRUE :
87718798 case JUMP_IF_FALSE_OR_POP :
0 commit comments