def test_iter_invalid_types(self): # Labels are not allowed in basic blocks block = BasicBlock() block.append(Label()) with self.assertRaises(ValueError): list(block) with self.assertRaises(ValueError): block.legalize(1) # Only one jump allowed and only at the end block = BasicBlock() block2 = BasicBlock() block.extend([Instr("JUMP_ABSOLUTE", block2), Instr("NOP")]) with self.assertRaises(ValueError): list(block) with self.assertRaises(ValueError): block.legalize(1) # jump target must be a BasicBlock block = BasicBlock() label = Label() block.extend([Instr("JUMP_ABSOLUTE", label)]) with self.assertRaises(ValueError): list(block) with self.assertRaises(ValueError): block.legalize(1)
def _create_consecutive_blocks(bytecode_cfg: ControlFlowGraph, first: BasicBlock, amount: int) -> Tuple[BasicBlock, ...]: """Split the given basic block into more blocks. The blocks are consecutive in the list of basic blocks. Args: bytecode_cfg: The control-flow graph first: The first basic block amount: The amount of consecutive blocks that should be created. Returns: A tuple of consecutive basic blocks """ assert amount > 0, "Amount of created basic blocks must be positive." current: BasicBlock = first nodes: List[BasicBlock] = [] # Can be any instruction, as it is discarded anyway. dummy_instruction = Instr("POP_TOP") for _ in range(amount): # Insert dummy instruction, which we can use to split off another block current.insert(0, dummy_instruction) current = bytecode_cfg.split_block(current, 1) nodes.append(current) # Move instructions back to first block. first.clear() first.extend(current) # Clear instructions in all created blocks. for node in nodes: node.clear() return tuple(nodes)
def test_iter_invalid_types(self): # Labels are not allowed in basic blocks block = BasicBlock() block.append(Label()) with self.assertRaises(ValueError): list(block) # Only one jump allowed and only at the end block = BasicBlock() block2 = BasicBlock() block.extend([Instr('JUMP_ABSOLUTE', block2), Instr('NOP')]) with self.assertRaises(ValueError): list(block) # jump target must be a BasicBlock block = BasicBlock() label = Label() block.extend([Instr('JUMP_ABSOLUTE', label)]) with self.assertRaises(ValueError): list(block)