mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-42810: Mark jumps at end of if and try statements as artificial. (GH-24091)
* Mark jumps at end of if and try statements as artificial. * Update importlib * Add comment explaining the purpose of ADDOP_JUMP_NOLINE.
This commit is contained in:
parent
de833b6013
commit
127dde5916
5 changed files with 2250 additions and 2191 deletions
|
@ -207,6 +207,7 @@ static int compiler_next_instr(basicblock *);
|
|||
static int compiler_addop(struct compiler *, int);
|
||||
static int compiler_addop_i(struct compiler *, int, Py_ssize_t);
|
||||
static int compiler_addop_j(struct compiler *, int, basicblock *);
|
||||
static int compiler_addop_j_noline(struct compiler *, int, basicblock *);
|
||||
static int compiler_error(struct compiler *, const char *);
|
||||
static int compiler_warn(struct compiler *, const char *, ...);
|
||||
static int compiler_nameop(struct compiler *, identifier, expr_context_ty);
|
||||
|
@ -1425,6 +1426,12 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b)
|
|||
return add_jump_to_block(c->u->u_curblock, opcode, c->u->u_lineno, b);
|
||||
}
|
||||
|
||||
static int
|
||||
compiler_addop_j_noline(struct compiler *c, int opcode, basicblock *b)
|
||||
{
|
||||
return add_jump_to_block(c->u->u_curblock, opcode, -1, b);
|
||||
}
|
||||
|
||||
/* NEXT_BLOCK() creates an implicit jump from the current block
|
||||
to the new block.
|
||||
|
||||
|
@ -1495,6 +1502,14 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b)
|
|||
return 0; \
|
||||
}
|
||||
|
||||
/* Add a jump with no line number.
|
||||
* Used for artificial jumps that have no corresponding
|
||||
* token in the source code. */
|
||||
#define ADDOP_JUMP_NOLINE(C, OP, O) { \
|
||||
if (!compiler_addop_j_noline((C), (OP), (O))) \
|
||||
return 0; \
|
||||
}
|
||||
|
||||
#define ADDOP_COMPARE(C, CMP) { \
|
||||
if (!compiler_addcompare((C), (cmpop_ty)(CMP))) \
|
||||
return 0; \
|
||||
|
@ -2527,7 +2542,7 @@ compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond)
|
|||
return 0;
|
||||
if (!compiler_jump_if(c, e->v.IfExp.body, next, cond))
|
||||
return 0;
|
||||
ADDOP_JUMP(c, JUMP_FORWARD, end);
|
||||
ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, end);
|
||||
compiler_use_next_block(c, next2);
|
||||
if (!compiler_jump_if(c, e->v.IfExp.orelse, next, cond))
|
||||
return 0;
|
||||
|
@ -2560,11 +2575,11 @@ compiler_jump_if(struct compiler *c, expr_ty e, basicblock *next, int cond)
|
|||
basicblock *end = compiler_new_block(c);
|
||||
if (end == NULL)
|
||||
return 0;
|
||||
ADDOP_JUMP(c, JUMP_FORWARD, end);
|
||||
ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, end);
|
||||
compiler_use_next_block(c, cleanup);
|
||||
ADDOP(c, POP_TOP);
|
||||
if (!cond) {
|
||||
ADDOP_JUMP(c, JUMP_FORWARD, next);
|
||||
ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, next);
|
||||
}
|
||||
compiler_use_next_block(c, end);
|
||||
return 1;
|
||||
|
@ -2599,7 +2614,7 @@ compiler_ifexp(struct compiler *c, expr_ty e)
|
|||
if (!compiler_jump_if(c, e->v.IfExp.test, next, 0))
|
||||
return 0;
|
||||
VISIT(c, expr, e->v.IfExp.body);
|
||||
ADDOP_JUMP(c, JUMP_FORWARD, end);
|
||||
ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, end);
|
||||
compiler_use_next_block(c, next);
|
||||
VISIT(c, expr, e->v.IfExp.orelse);
|
||||
compiler_use_next_block(c, end);
|
||||
|
@ -2686,7 +2701,7 @@ compiler_if(struct compiler *c, stmt_ty s)
|
|||
}
|
||||
VISIT_SEQ(c, stmt, s->v.If.body);
|
||||
if (asdl_seq_LEN(s->v.If.orelse)) {
|
||||
ADDOP_JUMP(c, JUMP_FORWARD, end);
|
||||
ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, end);
|
||||
compiler_use_next_block(c, next);
|
||||
VISIT_SEQ(c, stmt, s->v.If.orelse);
|
||||
}
|
||||
|
@ -2945,7 +2960,7 @@ compiler_try_finally(struct compiler *c, stmt_ty s)
|
|||
ADDOP(c, POP_BLOCK);
|
||||
compiler_pop_fblock(c, FINALLY_TRY, body);
|
||||
VISIT_SEQ(c, stmt, s->v.Try.finalbody);
|
||||
ADDOP_JUMP(c, JUMP_FORWARD, exit);
|
||||
ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, exit);
|
||||
/* `finally` block */
|
||||
compiler_use_next_block(c, end);
|
||||
if (!compiler_push_fblock(c, FINALLY_END, end, NULL, NULL))
|
||||
|
@ -3094,6 +3109,8 @@ compiler_try_except(struct compiler *c, stmt_ty s)
|
|||
return 0;
|
||||
VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
|
||||
compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body);
|
||||
/* name = None; del name; # Mark as artificial */
|
||||
c->u->u_lineno = -1;
|
||||
ADDOP(c, POP_EXCEPT);
|
||||
ADDOP_JUMP(c, JUMP_FORWARD, end);
|
||||
}
|
||||
|
@ -3907,7 +3924,7 @@ compiler_compare(struct compiler *c, expr_ty e)
|
|||
basicblock *end = compiler_new_block(c);
|
||||
if (end == NULL)
|
||||
return 0;
|
||||
ADDOP_JUMP(c, JUMP_FORWARD, end);
|
||||
ADDOP_JUMP_NOLINE(c, JUMP_FORWARD, end);
|
||||
compiler_use_next_block(c, cleanup);
|
||||
ADDOP(c, ROT_TWO);
|
||||
ADDOP(c, POP_TOP);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue