summaryrefslogtreecommitdiffstats
path: root/Python/peephole.c
diff options
context:
space:
mode:
authorPablo Galindo <Pablogsal@gmail.com>2019-05-17 10:37:08 (GMT)
committerGitHub <noreply@github.com>2019-05-17 10:37:08 (GMT)
commitaf8646c8054d0f4180a2013383039b6a472f9698 (patch)
treeceafae5989deb1ab62b8237593bd8752ab600e39 /Python/peephole.c
parenta8b46944d72bba6dc76260ed61da5c78d3f9d9c0 (diff)
downloadcpython-af8646c8054d0f4180a2013383039b6a472f9698.zip
cpython-af8646c8054d0f4180a2013383039b6a472f9698.tar.gz
cpython-af8646c8054d0f4180a2013383039b6a472f9698.tar.bz2
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/peephole.c')
-rw-r--r--Python/peephole.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/Python/peephole.c b/Python/peephole.c
index cc244aa..1ce3535 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.