11364750dSJames Henderson# DExTer : Debugging Experience Tester 21364750dSJames Henderson# ~~~~~~ ~ ~~ ~ ~~ 31364750dSJames Henderson# 41364750dSJames Henderson# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 51364750dSJames Henderson# See https://llvm.org/LICENSE.txt for license information. 61364750dSJames Henderson# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 71364750dSJames Henderson 81364750dSJames Henderson 91364750dSJames Hendersonfrom dex.command.CommandBase import CommandBase 101364750dSJames Hendersonfrom dex.dextIR import ValueIR 111364750dSJames Henderson 121364750dSJames Henderson 131364750dSJames Hendersonclass DexUnreachable(CommandBase): 141364750dSJames Henderson """Expect the source line this is found on will never be stepped on to. 151364750dSJames Henderson 161364750dSJames Henderson DexUnreachable() 171364750dSJames Henderson 181364750dSJames Henderson See Commands.md for more info. 191364750dSJames Henderson """ 201364750dSJames Henderson 210f92c113SJeremy Morse def __init__(self, *args, **kwargs): 220f92c113SJeremy Morse if len(args) != 0: 230f92c113SJeremy Morse raise TypeError("DexUnreachable takes no positional arguments") 24*f98ee40fSTobias Hieta if "on_line" in kwargs: 25*f98ee40fSTobias Hieta on_line = kwargs.pop("on_line") 260f92c113SJeremy Morse self._from_line = on_line 270f92c113SJeremy Morse self._to_line = on_line 28*f98ee40fSTobias Hieta elif "from_line" in kwargs and "to_line" in kwargs: 29*f98ee40fSTobias Hieta self._from_line = kwargs.pop("from_line") 30*f98ee40fSTobias Hieta self._to_line = kwargs.pop("to_line") 31*f98ee40fSTobias Hieta elif "from_line" in kwargs or "to_line" in kwargs: 320f92c113SJeremy Morse raise TypeError("Must provide both from_line and to_line to DexUnreachable") 330f92c113SJeremy Morse 340f92c113SJeremy Morse if len(kwargs) > 0: 350f92c113SJeremy Morse raise TypeError("Unexpected kwargs {}".format(kwargs.keys())) 361364750dSJames Henderson super(DexUnreachable, self).__init__() 371364750dSJames Henderson pass 381364750dSJames Henderson 391364750dSJames Henderson @staticmethod 401364750dSJames Henderson def get_name(): 411364750dSJames Henderson return __class__.__name__ 421364750dSJames Henderson 431364750dSJames Henderson def eval(self, step_info): 441364750dSJames Henderson # If we're ever called, at all, then we're evaluating a line that has 451364750dSJames Henderson # been marked as unreachable. Which means a failure. 46*f98ee40fSTobias Hieta vir = ValueIR( 47*f98ee40fSTobias Hieta expression="Unreachable", 48*f98ee40fSTobias Hieta value="True", 49*f98ee40fSTobias Hieta type_name=None, 501364750dSJames Henderson error_string=None, 511364750dSJames Henderson could_evaluate=True, 521364750dSJames Henderson is_optimized_away=True, 53*f98ee40fSTobias Hieta is_irretrievable=False, 54*f98ee40fSTobias Hieta ) 55*f98ee40fSTobias Hieta return {"DexUnreachable": vir} 56