[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
This commit is contained in:
Stephen Tozer 2022-06-06 11:20:05 +01:00
parent e4ba24c17d
commit b03451bb9a
3 changed files with 8 additions and 7 deletions

View File

@ -8,6 +8,7 @@
"""
import os
from pathlib import PurePath
from dex.command.CommandBase import CommandBase, StepExpectInfo
@ -37,13 +38,12 @@ class DexDeclareAddress(CommandBase):
return self.addr_name
def eval(self, step_collection):
assert os.path.exists(self.path)
self.address_resolutions[self.get_address_name()] = None
for step in step_collection.steps:
loc = step.current_location
if (loc.path and os.path.exists(loc.path) and
os.path.samefile(loc.path, self.path) and
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

View File

@ -14,6 +14,7 @@ import difflib
import os
import math
from collections import namedtuple
from pathlib import PurePath
from dex.command.CommandBase import CommandBase, StepExpectInfo
from dex.command.StepValueInfo import StepValueInfo
@ -208,12 +209,11 @@ class DexExpectWatchBase(CommandBase):
return differences
def eval(self, step_collection):
assert os.path.exists(self.path)
for step in step_collection.steps:
loc = step.current_location
if (loc.path and os.path.exists(loc.path) and
os.path.samefile(loc.path, self.path) and
if (loc.path and self.path and
PurePath(loc.path) == PurePath(self.path) and
loc.lineno in self.line_range):
try:
watch = step.program_state.frames[0].watches[self.expression]

View File

@ -11,6 +11,7 @@ fixed point in execution.
import os
from collections import OrderedDict
from pathlib import PurePath
from typing import List
class SourceLocation:
@ -31,7 +32,7 @@ class SourceLocation:
if not other or not isinstance(other, SourceLocation):
return False
if self.path and (self.path != other.path):
if self.path and (other.path is None or (PurePath(self.path) != PurePath(other.path))):
return False
if self.lineno and (self.lineno != other.lineno):