Stephen Tozer b03451bb9a [Dexter] Use PurePath to compare paths in Dexter commands
Prior to this patch, when comparing the paths of source files in Dexter
commands, we would use os.samefile. This function performs actual file
operations and requires the files to exist on the current system; this
is suitable when running the test for the first time, but renders the
DextIR output files non-portable, and unusable if the source files no
longer exist in their original location.

Differential Revision: https://reviews.llvm.org/D127099
2022-06-08 16:28:27 +01:00

61 lines
2.0 KiB
Python

# DExTer : Debugging Experience Tester
# ~~~~~~ ~ ~~ ~ ~~
#
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
"""Commmand sets the path for all following commands to 'declared_file'.
"""
import os
from pathlib import PurePath
from dex.command.CommandBase import CommandBase, StepExpectInfo
class DexDeclareAddress(CommandBase):
def __init__(self, addr_name, expression, **kwargs):
if not isinstance(addr_name, str):
raise TypeError('invalid argument type')
self.addr_name = addr_name
self.expression = expression
self.on_line = kwargs.pop('on_line')
self.hit_count = kwargs.pop('hit_count', 0)
self.address_resolutions = None
super(DexDeclareAddress, self).__init__()
@staticmethod
def get_name():
return __class__.__name__
def get_watches(self):
return [StepExpectInfo(self.expression, self.path, 0, range(self.on_line, self.on_line + 1))]
def get_address_name(self):
return self.addr_name
def eval(self, step_collection):
self.address_resolutions[self.get_address_name()] = None
for step in step_collection.steps:
loc = step.current_location
if (loc.path and self.path and
PurePath(loc.path) == PurePath(self.path) and
loc.lineno == self.on_line):
if self.hit_count > 0:
self.hit_count -= 1
continue
try:
watch = step.program_state.frames[0].watches[self.expression]
except KeyError:
continue
try:
hex_val = int(watch.value, 16)
except ValueError:
hex_val = None
self.address_resolutions[self.get_address_name()] = hex_val
break