summaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
authorPablo Galindo <Pablogsal@gmail.com>2019-05-17 11:37:08 +0100
committerGitHub <noreply@github.com>2019-05-17 11:37:08 +0100
commitaf8646c8054d0f4180a2013383039b6a472f9698 (patch)
treeceafae5989deb1ab62b8237593bd8752ab600e39 /Python
parenta8b46944d72bba6dc76260ed61da5c78d3f9d9c0 (diff)
downloadcpython-git-af8646c8054d0f4180a2013383039b6a472f9698.tar.gz
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.
Diffstat (limited to 'Python')
-rw-r--r--Python/compile.c9
-rw-r--r--Python/peephole.c16
2 files changed, 16 insertions, 9 deletions
diff --git a/Python/compile.c b/Python/compile.c
index 91ce04b02e..2a086a509f 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -2546,13 +2546,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)) {
diff --git a/Python/peephole.c b/Python/peephole.c
index cc244aa433..1ce3535626 100644
--- a/Python/peephole.c
+++ b/Python/peephole.c
@@ -302,11 +302,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.