10428d44dSStephen Tozer# DExTer : Debugging Experience Tester 20428d44dSStephen Tozer# ~~~~~~ ~ ~~ ~ ~~ 30428d44dSStephen Tozer# 40428d44dSStephen Tozer# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 50428d44dSStephen Tozer# See https://llvm.org/LICENSE.txt for license information. 60428d44dSStephen Tozer# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70428d44dSStephen Tozer"""Commmand sets the path for all following commands to 'declared_file'. 80428d44dSStephen Tozer""" 90428d44dSStephen Tozer 100428d44dSStephen Tozerimport os 11b03451bbSStephen Tozerfrom pathlib import PurePath 120428d44dSStephen Tozer 130428d44dSStephen Tozerfrom dex.command.CommandBase import CommandBase, StepExpectInfo 140428d44dSStephen Tozer 15*f98ee40fSTobias Hieta 160428d44dSStephen Tozerclass DexDeclareAddress(CommandBase): 170428d44dSStephen Tozer def __init__(self, addr_name, expression, **kwargs): 180428d44dSStephen Tozer if not isinstance(addr_name, str): 19*f98ee40fSTobias Hieta raise TypeError("invalid argument type") 200428d44dSStephen Tozer 210428d44dSStephen Tozer self.addr_name = addr_name 220428d44dSStephen Tozer self.expression = expression 23*f98ee40fSTobias Hieta self.on_line = kwargs.pop("on_line") 24*f98ee40fSTobias Hieta self.hit_count = kwargs.pop("hit_count", 0) 250428d44dSStephen Tozer 260428d44dSStephen Tozer self.address_resolutions = None 270428d44dSStephen Tozer 280428d44dSStephen Tozer super(DexDeclareAddress, self).__init__() 290428d44dSStephen Tozer 300428d44dSStephen Tozer @staticmethod 310428d44dSStephen Tozer def get_name(): 320428d44dSStephen Tozer return __class__.__name__ 330428d44dSStephen Tozer 340428d44dSStephen Tozer def get_watches(self): 35*f98ee40fSTobias Hieta return [ 36*f98ee40fSTobias Hieta StepExpectInfo( 37*f98ee40fSTobias Hieta self.expression, self.path, 0, range(self.on_line, self.on_line + 1) 38*f98ee40fSTobias Hieta ) 39*f98ee40fSTobias Hieta ] 400428d44dSStephen Tozer 410428d44dSStephen Tozer def get_address_name(self): 420428d44dSStephen Tozer return self.addr_name 430428d44dSStephen Tozer 440428d44dSStephen Tozer def eval(self, step_collection): 450428d44dSStephen Tozer self.address_resolutions[self.get_address_name()] = None 460428d44dSStephen Tozer for step in step_collection.steps: 470428d44dSStephen Tozer loc = step.current_location 480428d44dSStephen Tozer 49*f98ee40fSTobias Hieta if ( 50*f98ee40fSTobias Hieta loc.path 51*f98ee40fSTobias Hieta and self.path 52*f98ee40fSTobias Hieta and PurePath(loc.path) == PurePath(self.path) 53*f98ee40fSTobias Hieta and loc.lineno == self.on_line 54*f98ee40fSTobias Hieta ): 550428d44dSStephen Tozer if self.hit_count > 0: 560428d44dSStephen Tozer self.hit_count -= 1 570428d44dSStephen Tozer continue 580428d44dSStephen Tozer try: 590428d44dSStephen Tozer watch = step.program_state.frames[0].watches[self.expression] 600428d44dSStephen Tozer except KeyError: 612a156f60SStephen Tozer continue 622a156f60SStephen Tozer try: 630428d44dSStephen Tozer hex_val = int(watch.value, 16) 642a156f60SStephen Tozer except ValueError: 652a156f60SStephen Tozer hex_val = None 660428d44dSStephen Tozer self.address_resolutions[self.get_address_name()] = hex_val 670428d44dSStephen Tozer break 68