diff options
author | Pablo Galindo <Pablogsal@gmail.com> | 2019-07-15 09:15:01 (GMT) |
---|---|---|
committer | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2019-07-15 09:15:01 (GMT) |
commit | 18c5f9d44dde37c0fae5585a604c6027825252d2 (patch) | |
tree | 5646a1af289769cc336aa9b4c8441dca80f43ff1 /Lib/test/test_compile.py | |
parent | cd6e83b4810549c308ab2d7315dbab526e35ccf6 (diff) | |
download | cpython-18c5f9d44dde37c0fae5585a604c6027825252d2.zip cpython-18c5f9d44dde37c0fae5585a604c6027825252d2.tar.gz cpython-18c5f9d44dde37c0fae5585a604c6027825252d2.tar.bz2 |
bpo-37500: Make sure dead code does not generate bytecode but also detect syntax errors (GH-14612)
https://bugs.python.org/issue37500
Add a new field to the compiler structure that allows to be configured
so no bytecode is emitted. In this way is possible to detect errors by
walking the nodes while preserving optimizations.
https://bugs.python.org/issue37500
Diffstat (limited to 'Lib/test/test_compile.py')
-rw-r--r-- | Lib/test/test_compile.py | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 56f73f6..9d77f7a 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -697,6 +697,40 @@ if 1: # complex statements. compile("if a: b\n" * 200000, "<dummy>", "exec") + # Multiple users rely on the fact that CPython does not generate + # bytecode for dead code blocks. See bpo-37500 for more context. + @support.cpython_only + def test_dead_blocks_do_not_generate_bytecode(self): + def unused_block_if(): + if 0: + return 42 + + def unused_block_while(): + while 0: + return 42 + + def unused_block_if_else(): + if 1: + return None + else: + return 42 + + def unused_block_while_else(): + while 1: + return None + else: + return 42 + + funcs = [unused_block_if, unused_block_while, + unused_block_if_else, unused_block_while_else] + + for func in funcs: + opcodes = list(dis.get_instructions(func)) + self.assertEqual(2, len(opcodes)) + self.assertEqual('LOAD_CONST', opcodes[0].opname) + self.assertEqual(None, opcodes[0].argval) + self.assertEqual('RETURN_VALUE', opcodes[1].opname) + class TestExpressionStackSize(unittest.TestCase): # These tests check that the computed stack size for a code object |