Skip to content

Commit acf066c

Browse files
committed
reorder code in with/async-with exception exit path to reduce the size of the exception table
1 parent 68f6a5d commit acf066c

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

Lib/test/test_dis.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -1471,16 +1471,16 @@ def _prepare_test_cases():
14711471
Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=302, starts_line=None, is_jump_target=False, positions=None),
14721472
Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=304, starts_line=25, is_jump_target=False, positions=None),
14731473
Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=306, starts_line=None, is_jump_target=False, positions=None),
1474-
Instruction(opname='POP_JUMP_FORWARD_IF_TRUE', opcode=115, arg=4, argval=318, argrepr='to 318', offset=308, starts_line=None, is_jump_target=False, positions=None),
1474+
Instruction(opname='POP_JUMP_FORWARD_IF_TRUE', opcode=115, arg=1, argval=312, argrepr='to 312', offset=308, starts_line=None, is_jump_target=False, positions=None),
14751475
Instruction(opname='RERAISE', opcode=119, arg=2, argval=2, argrepr='', offset=310, starts_line=None, is_jump_target=False, positions=None),
1476-
Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=312, starts_line=None, is_jump_target=False, positions=None),
1476+
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=312, starts_line=None, is_jump_target=True, positions=None),
14771477
Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=314, starts_line=None, is_jump_target=False, positions=None),
1478-
Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=316, starts_line=None, is_jump_target=False, positions=None),
1479-
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=318, starts_line=None, is_jump_target=True, positions=None),
1480-
Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=320, starts_line=None, is_jump_target=False, positions=None),
1481-
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=322, starts_line=None, is_jump_target=False, positions=None),
1482-
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=324, starts_line=None, is_jump_target=False, positions=None),
1483-
Instruction(opname='JUMP_BACKWARD', opcode=140, arg=27, argval=274, argrepr='to 274', offset=326, starts_line=None, is_jump_target=False, positions=None),
1478+
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=316, starts_line=None, is_jump_target=False, positions=None),
1479+
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=318, starts_line=None, is_jump_target=False, positions=None),
1480+
Instruction(opname='JUMP_BACKWARD', opcode=140, arg=24, argval=274, argrepr='to 274', offset=320, starts_line=None, is_jump_target=False, positions=None),
1481+
Instruction(opname='COPY', opcode=120, arg=3, argval=3, argrepr='', offset=322, starts_line=None, is_jump_target=False, positions=None),
1482+
Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=324, starts_line=None, is_jump_target=False, positions=None),
1483+
Instruction(opname='RERAISE', opcode=119, arg=1, argval=1, argrepr='', offset=326, starts_line=None, is_jump_target=False, positions=None),
14841484
Instruction(opname='PUSH_EXC_INFO', opcode=35, arg=None, argval=None, argrepr='', offset=328, starts_line=None, is_jump_target=False, positions=None),
14851485
Instruction(opname='LOAD_GLOBAL', opcode=116, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=330, starts_line=22, is_jump_target=False, positions=None),
14861486
Instruction(opname='CHECK_EXC_MATCH', opcode=36, arg=None, argval=None, argrepr='', offset=342, starts_line=None, is_jump_target=False, positions=None),

Python/compile.c

+13-7
Original file line numberDiff line numberDiff line change
@@ -5551,20 +5551,26 @@ compiler_visit_keyword(struct compiler *c, keyword_ty k)
55515551
static int
55525552
compiler_with_except_finish(struct compiler *c, basicblock * cleanup) {
55535553
UNSET_LOC(c);
5554-
basicblock *exit;
5555-
exit = compiler_new_block(c);
5556-
if (exit == NULL)
5554+
basicblock *suppress = compiler_new_block(c);
5555+
if (suppress == NULL) {
55575556
return 0;
5558-
ADDOP_JUMP(c, POP_JUMP_IF_TRUE, exit);
5557+
}
5558+
ADDOP_JUMP(c, POP_JUMP_IF_TRUE, suppress);
55595559
ADDOP_I(c, RERAISE, 2);
5560-
compiler_use_next_block(c, cleanup);
5561-
POP_EXCEPT_AND_RERAISE(c);
5562-
compiler_use_next_block(c, exit);
5560+
compiler_use_next_block(c, suppress);
55635561
ADDOP(c, POP_TOP); /* exc_value */
55645562
ADDOP(c, POP_BLOCK);
55655563
ADDOP(c, POP_EXCEPT);
55665564
ADDOP(c, POP_TOP);
55675565
ADDOP(c, POP_TOP);
5566+
basicblock *exit = compiler_new_block(c);
5567+
if (exit == NULL) {
5568+
return 0;
5569+
}
5570+
ADDOP_JUMP(c, JUMP, exit);
5571+
compiler_use_next_block(c, cleanup);
5572+
POP_EXCEPT_AND_RERAISE(c);
5573+
compiler_use_next_block(c, exit);
55685574
return 1;
55695575
}
55705576

0 commit comments

Comments
 (0)