GP-5266: Only track on user click or address change.

This commit is contained in:
Dan 2025-01-15 13:56:40 -05:00 committed by Ryan Kurtz
parent 2a628178b3
commit 5d71f073f4
10 changed files with 135 additions and 32 deletions

View file

@ -470,4 +470,25 @@ public class Sequence implements Comparable<Sequence> {
}
return result;
}
public boolean differsOnlyByPatch(Sequence that) {
int size = this.steps.size();
if (size == that.steps.size()) {
if (size == 0) {
return true;
}
if (!this.steps.subList(0, size - 1).equals(that.steps.subList(0, size - 1))) {
return false;
}
Step thisLast = this.steps.getLast();
Step thatLast = that.steps.getLast();
return thisLast.equals(thatLast) ||
thisLast instanceof PatchStep && thatLast instanceof PatchStep;
}
if (size == that.steps.size() - 1) {
Step thatLast = that.steps.getLast();
return thatLast instanceof PatchStep;
}
return false;
}
}

View file

@ -673,4 +673,20 @@ public class TraceSchedule implements Comparable<TraceSchedule> {
public TraceSchedule assumeRecorded() {
return new TraceSchedule(snap, steps, pSteps, Source.RECORD);
}
public boolean differsOnlyByPatch(TraceSchedule that) {
if (this.snap != that.snap) {
return false;
}
if (this.pSteps.isNop() != that.pSteps.isNop()) {
return false;
}
if (this.pSteps.isNop()) {
return this.steps.differsOnlyByPatch(that.steps);
}
if (!this.steps.equals(that.steps)) {
return false;
}
return this.pSteps.differsOnlyByPatch(that.pSteps);
}
}

View file

@ -470,4 +470,37 @@ public class TraceScheduleTest extends AbstractGhidraHeadlessIntegrationTest {
"t0-{r0=0x200000001};t0-{r1l=0x3}", time.toString());
}
}
@Test
public void testDiffersOnlyByPatch() throws Exception {
assertTrue(TraceSchedule.parse("1").differsOnlyByPatch(TraceSchedule.parse("1")));
assertTrue(TraceSchedule.parse("1:1").differsOnlyByPatch(TraceSchedule.parse("1:1")));
assertTrue(TraceSchedule.parse("1:1.1").differsOnlyByPatch(TraceSchedule.parse("1:1.1")));
assertTrue(TraceSchedule.parse("1:1;{r0=1}")
.differsOnlyByPatch(TraceSchedule.parse("1:1;{r0=1}")));
assertTrue(TraceSchedule.parse("1:1.1;{r0=1}")
.differsOnlyByPatch(TraceSchedule.parse("1:1.1;{r0=1}")));
assertFalse(TraceSchedule.parse("1").differsOnlyByPatch(TraceSchedule.parse("1:1")));
assertFalse(TraceSchedule.parse("1:1").differsOnlyByPatch(TraceSchedule.parse("1")));
assertFalse(TraceSchedule.parse("1:1").differsOnlyByPatch(TraceSchedule.parse("1:2")));
assertFalse(TraceSchedule.parse("1:2").differsOnlyByPatch(TraceSchedule.parse("1:1")));
assertFalse(TraceSchedule.parse("1:1").differsOnlyByPatch(TraceSchedule.parse("1:1.1")));
assertFalse(TraceSchedule.parse("1:1.1").differsOnlyByPatch(TraceSchedule.parse("1:1")));
assertTrue(TraceSchedule.parse("1").differsOnlyByPatch(TraceSchedule.parse("1:{r0=1}")));
assertFalse(TraceSchedule.parse("1:{r0=1}").differsOnlyByPatch(TraceSchedule.parse("1")));
assertTrue(
TraceSchedule.parse("1:1").differsOnlyByPatch(TraceSchedule.parse("1:1;{r0=1}")));
assertFalse(
TraceSchedule.parse("1:1;{r0=1}").differsOnlyByPatch(TraceSchedule.parse("1:1")));
assertTrue(
TraceSchedule.parse("1:1.1").differsOnlyByPatch(TraceSchedule.parse("1:1.1;{r0=1}")));
assertFalse(
TraceSchedule.parse("1:1.1;{r0=1}").differsOnlyByPatch(TraceSchedule.parse("1:1.1")));
}
}