[3.7] bpo-37269: Correctly optimise conditionals with constant booleans (GH-14071) (GH-14073)

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..
(cherry picked from commit 05f8318655)

Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
This commit is contained in:
Pablo Galindo 2019-06-14 07:18:51 +01:00 committed by GitHub
parent 6a433f5ae6
commit 5292179afc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 0 deletions

View File

@ -311,6 +311,13 @@ class TestTranforms(BytecodeTestCase):
self.assertFalse(instr.opname.startswith('BINARY_'))
self.assertFalse(instr.opname.startswith('BUILD_'))
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

@ -313,6 +313,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);