mirror of
https://github.com/python/cpython.git
synced 2026-04-22 03:41:08 +00:00
bpo-1875: Raise SyntaxError in invalid blocks that will be optimised away (GH-13332)
Move the check for dead conditionals (if 0) to the peephole optimizer
and make sure that the code block is still compiled to report any
existing syntax errors within.
(cherry picked from commit af8646c805)
Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
This commit is contained in:
parent
94704048e2
commit
85ed1712e4
4 changed files with 33 additions and 9 deletions
|
|
@ -2301,13 +2301,12 @@ compiler_if(struct compiler *c, stmt_ty s)
|
|||
return 0;
|
||||
|
||||
constant = expr_constant(s->v.If.test);
|
||||
/* constant = 0: "if 0"
|
||||
/* constant = 0: "if 0" Leave the optimizations to
|
||||
* the pephole optimizer to check for syntax errors
|
||||
* in the block.
|
||||
* constant = 1: "if 1", "if 2", ...
|
||||
* constant = -1: rest */
|
||||
if (constant == 0) {
|
||||
if (s->v.If.orelse)
|
||||
VISIT_SEQ(c, stmt, s->v.If.orelse);
|
||||
} else if (constant == 1) {
|
||||
if (constant == 1) {
|
||||
VISIT_SEQ(c, stmt, s->v.If.body);
|
||||
} else {
|
||||
if (asdl_seq_LEN(s->v.If.orelse)) {
|
||||
|
|
|
|||
|
|
@ -304,11 +304,19 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
|
|||
case LOAD_CONST:
|
||||
cumlc = lastlc + 1;
|
||||
if (nextop != POP_JUMP_IF_FALSE ||
|
||||
!ISBASICBLOCK(blocks, op_start, i + 1) ||
|
||||
!PyObject_IsTrue(PyList_GET_ITEM(consts, get_arg(codestr, i))))
|
||||
!ISBASICBLOCK(blocks, op_start, i + 1)) {
|
||||
break;
|
||||
fill_nops(codestr, op_start, nexti + 1);
|
||||
cumlc = 0;
|
||||
}
|
||||
PyObject* cnt = PyList_GET_ITEM(consts, get_arg(codestr, i));
|
||||
int is_true = PyObject_IsTrue(cnt);
|
||||
if (is_true == 1) {
|
||||
fill_nops(codestr, op_start, nexti + 1);
|
||||
cumlc = 0;
|
||||
} else if (is_true == 0) {
|
||||
h = get_arg(codestr, nexti) / sizeof(_Py_CODEUNIT);
|
||||
tgt = find_op(codestr, codelen, h);
|
||||
fill_nops(codestr, op_start, tgt);
|
||||
}
|
||||
break;
|
||||
|
||||
/* Try to fold tuples of constants.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue