library/compiler/py38/peephole.py (49 lines of code) (raw):
# Portions copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
# pyre-unsafe
from __future__ import annotations
from ..peephole import Optimizer, ophandler_registry, UNARY_OPS, BINARY_OPS
TYPE_CHECKING = False
if TYPE_CHECKING:
from typing import Optional
class Optimizer38(Optimizer):
OP_HANDLERS, ophandler = ophandler_registry(Optimizer.OP_HANDLERS)
del OP_HANDLERS["FOR_ITER"]
# pyre-ignore[56]: decorator factory type is unknown
@ophandler(*UNARY_OPS)
def op_unary_constants(
self, instr_index: int, opcode: int, op_start: int, nextop: int, nexti: int
) -> Optional[int]:
return
# pyre-ignore[56]: decorator factory type is unknown
@ophandler(*BINARY_OPS)
def op_binary_constants(
self, instr_index: int, opcode: int, op_start: int, nextop: int, nexti: int
) -> Optional[int]:
return
# pyre-ignore[56]: decorator factory type is unknown
@ophandler("RETURN_VALUE")
def opt_return_value(
self, instr_index: int, opcode: int, op_start: int, nextop: int, nexti: int
) -> Optional[int]:
block_end = instr_index + 1
block_id = self.blocks[instr_index]
while (
# checks that we are still in the same basic block
block_end < len(self.codestr) // self.CODEUNIT_SIZE
and self.blocks[block_end] == block_id
and self.codestr[block_end * self.CODEUNIT_SIZE] != self.opcode.END_FINALLY
):
if (
self.codestr[block_end * self.CODEUNIT_SIZE]
== self.opcode.SETUP_FINALLY
):
while (
block_end > instr_index + 1
and self.codestr[(block_end - 1) * self.CODEUNIT_SIZE]
== self.EXTENDED_ARG
):
block_end -= 1
break
block_end += 1
if block_end > instr_index + 1:
self.fill_nops(instr_index + 1, block_end)
op_fold_jumps_to_uncond_jumps = ophandler(
"POP_JUMP_IF_FALSE",
"POP_JUMP_IF_TRUE",
"JUMP_FORWARD",
"JUMP_ABSOLUTE",
)(Optimizer.op_fold_jumps_to_uncond_jumps)