bpo-37269: Correctly optimise conditionals with constant booleans (GH-14071)

Fix a regression introduced by af8646c805 that was causing code of the form:

if True and False:
   do_something()

to be optimized incorrectly, eliminating the block.
This commit is contained in:
Pablo Galindo 2019-06-14 06:54:53 +01:00 committed by GitHub
parent d0eeb936d8
commit 05f8318655
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 0 deletions

View File

@ -414,6 +414,13 @@ class TestTranforms(BytecodeTestCase):
pass
self.assertEqual(count_instr_recursively(forloop, 'BUILD_LIST'), 0)
def test_condition_with_binop_with_bools(self):
def f():
if True or False:
return 1
return 0
self.assertEqual(f(), 1)
class TestBuglets(unittest.TestCase):

View File

@ -0,0 +1,2 @@
Fix a bug in the peephole optimizer that was not treating correctly constant
conditions with binary operators. Patch by Pablo Galindo.

View File

@ -315,6 +315,11 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,
fill_nops(codestr, op_start, nexti + 1);
cumlc = 0;
} else if (is_true == 0) {
if (i > 1 &&
(_Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_TRUE ||
_Py_OPCODE(codestr[i - 1]) == POP_JUMP_IF_FALSE)) {
break;
}
h = get_arg(codestr, nexti) / sizeof(_Py_CODEUNIT);
tgt = find_op(codestr, codelen, h);
fill_nops(codestr, op_start, tgt);