[3.7] bpo-37269: Correctly optimise conditionals with constant booleans (GH-14071) (GH-14073)
Fix a regression introduced byaf8646c805
that was causing code of the form: if True and False: do_something() to be optimized incorrectly, eliminating the block.. (cherry picked from commit05f8318655
) Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
This commit is contained in:
parent
6a433f5ae6
commit
5292179afc
|
@ -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):
|
||||
|
||||
|
|
|
@ -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.
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue