mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-05-23 02:10:47 +08:00
GP-2076 domain object event refactor
This commit is contained in:
+21
-28
@@ -43,7 +43,7 @@ import ghidra.debug.api.breakpoint.LogicalBreakpointsChangeListener;
|
||||
import ghidra.debug.api.control.ControlMode;
|
||||
import ghidra.debug.api.target.Target;
|
||||
import ghidra.debug.api.tracemgr.DebuggerCoordinates;
|
||||
import ghidra.framework.model.DomainObject;
|
||||
import ghidra.framework.model.DomainObjectEvent;
|
||||
import ghidra.framework.plugintool.*;
|
||||
import ghidra.framework.plugintool.annotation.AutoServiceConsumed;
|
||||
import ghidra.pcode.exec.SleighUtils;
|
||||
@@ -300,8 +300,7 @@ public class DebuggerBreakpointsProvider extends ComponentProviderAdapter
|
||||
|
||||
@Override
|
||||
public boolean isEnabledForContext(ActionContext context) {
|
||||
return contextHasMatchingBreakpoints(context,
|
||||
row -> row.getState() != State.ENABLED,
|
||||
return contextHasMatchingBreakpoints(context, row -> row.getState() != State.ENABLED,
|
||||
row -> row.getState() != State.ENABLED);
|
||||
}
|
||||
|
||||
@@ -380,8 +379,7 @@ public class DebuggerBreakpointsProvider extends ComponentProviderAdapter
|
||||
|
||||
@Override
|
||||
public boolean isEnabledForContext(ActionContext context) {
|
||||
return contextHasMatchingBreakpoints(context,
|
||||
row -> row.getState() != State.DISABLED,
|
||||
return contextHasMatchingBreakpoints(context, row -> row.getState() != State.DISABLED,
|
||||
row -> row.getState() != State.DISABLED);
|
||||
}
|
||||
|
||||
@@ -546,8 +544,7 @@ public class DebuggerBreakpointsProvider extends ComponentProviderAdapter
|
||||
|
||||
static ActionBuilder builder(Plugin owner) {
|
||||
String ownerName = owner.getName();
|
||||
return new ActionBuilder(NAME, ownerName)
|
||||
.description(DESCRIPTION)
|
||||
return new ActionBuilder(NAME, ownerName).description(DESCRIPTION)
|
||||
.popupMenuPath(NAME)
|
||||
.popupMenuGroup(GROUP)
|
||||
.helpLocation(new HelpLocation(ownerName, HELP_ANCHOR));
|
||||
@@ -562,8 +559,7 @@ public class DebuggerBreakpointsProvider extends ComponentProviderAdapter
|
||||
|
||||
static ActionBuilder builder(Plugin owner) {
|
||||
String ownerName = owner.getName();
|
||||
return new ActionBuilder(NAME, ownerName)
|
||||
.description(DESCRIPTION)
|
||||
return new ActionBuilder(NAME, ownerName).description(DESCRIPTION)
|
||||
.popupMenuPath(NAME)
|
||||
.popupMenuGroup(GROUP)
|
||||
.helpLocation(new HelpLocation(ownerName, HELP_ANCHOR));
|
||||
@@ -605,7 +601,7 @@ public class DebuggerBreakpointsProvider extends ComponentProviderAdapter
|
||||
|
||||
public ForBreakpointLocationsTraceListener(Trace trace) {
|
||||
this.trace = trace;
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, e -> objectRestored());
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, e -> objectRestored());
|
||||
listenFor(TraceBreakpointChangeType.ADDED, this::locationAdded);
|
||||
listenFor(TraceBreakpointChangeType.CHANGED, this::locationChanged);
|
||||
listenFor(TraceBreakpointChangeType.LIFESPAN_CHANGED, this::locationLifespanChanged);
|
||||
@@ -865,9 +861,8 @@ public class DebuggerBreakpointsProvider extends ComponentProviderAdapter
|
||||
}
|
||||
|
||||
private void loadBreakpointLocations(Trace trace) {
|
||||
ControlMode mode = controlService == null
|
||||
? ControlMode.DEFAULT
|
||||
: controlService.getCurrentMode(trace);
|
||||
ControlMode mode =
|
||||
controlService == null ? ControlMode.DEFAULT : controlService.getCurrentMode(trace);
|
||||
DebuggerCoordinates currentFor = traceManager.getCurrentFor(trace);
|
||||
Target target = currentFor.getTarget();
|
||||
if (!mode.useEmulatedBreakpoints() && target == null) {
|
||||
@@ -876,8 +871,8 @@ public class DebuggerBreakpointsProvider extends ComponentProviderAdapter
|
||||
Lifespan span = Lifespan.at(currentFor.getSnap());
|
||||
Collection<TraceBreakpoint> visible = new ArrayList<>();
|
||||
for (AddressRange range : trace.getBaseAddressFactory().getAddressSet()) {
|
||||
Collection<? extends TraceBreakpoint> breaks = trace.getBreakpointManager()
|
||||
.getBreakpointsIntersecting(span, range);
|
||||
Collection<? extends TraceBreakpoint> breaks =
|
||||
trace.getBreakpointManager().getBreakpointsIntersecting(span, range);
|
||||
if (mode.useEmulatedBreakpoints()) {
|
||||
visible.addAll(breaks);
|
||||
}
|
||||
@@ -1039,21 +1034,19 @@ public class DebuggerBreakpointsProvider extends ComponentProviderAdapter
|
||||
});
|
||||
|
||||
TableColumnModel bptColModel = breakpointTable.getColumnModel();
|
||||
TableColumn bptEnCol =
|
||||
bptColModel.getColumn(LogicalBreakpointTableColumns.STATE.ordinal());
|
||||
TableColumn bptEnCol = bptColModel.getColumn(LogicalBreakpointTableColumns.STATE.ordinal());
|
||||
bptEnCol.setCellRenderer(new DebuggerBreakpointStateTableCellRenderer());
|
||||
bptEnCol.setCellEditor(
|
||||
new DebuggerBreakpointStateTableCellEditor<>(breakpointFilterPanel) {
|
||||
@Override
|
||||
protected State getToggledState(LogicalBreakpointRow row, State current) {
|
||||
boolean mapped = row.isMapped();
|
||||
if (!mapped) {
|
||||
tool.setStatusInfo(
|
||||
"Breakpoint has no locations. Only toggling its bookmark.", true);
|
||||
}
|
||||
return current.getToggled(mapped);
|
||||
bptEnCol.setCellEditor(new DebuggerBreakpointStateTableCellEditor<>(breakpointFilterPanel) {
|
||||
@Override
|
||||
protected State getToggledState(LogicalBreakpointRow row, State current) {
|
||||
boolean mapped = row.isMapped();
|
||||
if (!mapped) {
|
||||
tool.setStatusInfo("Breakpoint has no locations. Only toggling its bookmark.",
|
||||
true);
|
||||
}
|
||||
});
|
||||
return current.getToggled(mapped);
|
||||
}
|
||||
});
|
||||
bptEnCol.setMaxWidth(24);
|
||||
bptEnCol.setMinWidth(24);
|
||||
TableColumn bptNameCol =
|
||||
|
||||
+4
-5
@@ -34,7 +34,7 @@ import ghidra.app.plugin.core.debug.gui.DebuggerResources;
|
||||
import ghidra.app.plugin.core.debug.utils.DebouncedRowWrappedEnumeratedColumnTableModel;
|
||||
import ghidra.app.services.DebuggerListingService;
|
||||
import ghidra.debug.api.tracemgr.DebuggerCoordinates;
|
||||
import ghidra.framework.model.DomainObject;
|
||||
import ghidra.framework.model.DomainObjectEvent;
|
||||
import ghidra.framework.plugintool.AutoService;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.framework.plugintool.annotation.AutoServiceConsumed;
|
||||
@@ -107,9 +107,8 @@ public class DebuggerLegacyRegionsPanel extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
protected static class RegionTableModel
|
||||
extends DebouncedRowWrappedEnumeratedColumnTableModel< //
|
||||
RegionTableColumns, ObjectKey, RegionRow, TraceMemoryRegion> {
|
||||
protected static class RegionTableModel extends DebouncedRowWrappedEnumeratedColumnTableModel< //
|
||||
RegionTableColumns, ObjectKey, RegionRow, TraceMemoryRegion> {
|
||||
|
||||
public RegionTableModel(PluginTool tool) {
|
||||
super(tool, "Regions", RegionTableColumns.class, TraceMemoryRegion::getObjectKey,
|
||||
@@ -142,7 +141,7 @@ public class DebuggerLegacyRegionsPanel extends JPanel {
|
||||
|
||||
private class RegionsListener extends TraceDomainObjectListener {
|
||||
public RegionsListener() {
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, e -> objectRestored());
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, e -> objectRestored());
|
||||
|
||||
listenFor(TraceMemoryRegionChangeType.ADDED, this::regionAdded);
|
||||
listenFor(TraceMemoryRegionChangeType.CHANGED, this::regionChanged);
|
||||
|
||||
+2
-1
@@ -22,6 +22,7 @@ import java.util.stream.Stream;
|
||||
|
||||
import docking.widgets.table.RangeCursorTableHeaderRenderer.SeekListener;
|
||||
import docking.widgets.table.threaded.ThreadedTableModel;
|
||||
import ghidra.framework.model.DomainObjectEvent;
|
||||
import ghidra.framework.model.DomainObjectChangeRecord;
|
||||
import ghidra.framework.plugintool.Plugin;
|
||||
import ghidra.trace.model.*;
|
||||
@@ -38,7 +39,7 @@ public abstract class AbstractQueryTableModel<T> extends ThreadedTableModel<T, T
|
||||
|
||||
protected class ListenerForChanges extends TraceDomainObjectListener {
|
||||
public ListenerForChanges() {
|
||||
listenForUntyped(Trace.DO_OBJECT_RESTORED, this::objectRestored);
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, this::objectRestored);
|
||||
listenFor(TraceObjectChangeType.VALUE_CREATED, this::valueCreated);
|
||||
listenFor(TraceObjectChangeType.VALUE_DELETED, this::valueDeleted);
|
||||
listenFor(TraceObjectChangeType.VALUE_LIFESPAN_CHANGED, this::valueLifespanChanged);
|
||||
|
||||
+1
-1
@@ -39,7 +39,7 @@ public class ObjectTreeModel implements DisplaysModified {
|
||||
class ListenerForChanges extends TraceDomainObjectListener
|
||||
implements DomainObjectClosedListener {
|
||||
public ListenerForChanges() {
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, this::domainObjectRestored);
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, this::domainObjectRestored);
|
||||
listenFor(TraceObjectChangeType.CREATED, this::objectCreated);
|
||||
listenFor(TraceObjectChangeType.VALUE_CREATED, this::valueCreated);
|
||||
listenFor(TraceObjectChangeType.VALUE_DELETED, this::valueDeleted);
|
||||
|
||||
+4
-5
@@ -32,7 +32,7 @@ import docking.widgets.table.DefaultEnumeratedColumnTableModel.EnumeratedTableCo
|
||||
import ghidra.app.plugin.core.debug.gui.DebuggerResources;
|
||||
import ghidra.app.plugin.core.debug.utils.DebouncedRowWrappedEnumeratedColumnTableModel;
|
||||
import ghidra.debug.api.tracemgr.DebuggerCoordinates;
|
||||
import ghidra.framework.model.DomainObject;
|
||||
import ghidra.framework.model.DomainObjectEvent;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.program.model.address.*;
|
||||
import ghidra.trace.model.*;
|
||||
@@ -141,9 +141,8 @@ public class DebuggerLegacyModulesPanel extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
protected static class ModuleTableModel
|
||||
extends DebouncedRowWrappedEnumeratedColumnTableModel< //
|
||||
ModuleTableColumns, ObjectKey, ModuleRow, TraceModule> {
|
||||
protected static class ModuleTableModel extends DebouncedRowWrappedEnumeratedColumnTableModel< //
|
||||
ModuleTableColumns, ObjectKey, ModuleRow, TraceModule> {
|
||||
|
||||
public ModuleTableModel(PluginTool tool, DebuggerModulesProvider provider) {
|
||||
super(tool, "Modules", ModuleTableColumns.class, TraceModule::getObjectKey,
|
||||
@@ -158,7 +157,7 @@ public class DebuggerLegacyModulesPanel extends JPanel {
|
||||
|
||||
private class ModulesListener extends TraceDomainObjectListener {
|
||||
public ModulesListener() {
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, e -> objectRestored());
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, e -> objectRestored());
|
||||
|
||||
listenFor(TraceModuleChangeType.ADDED, this::moduleAdded);
|
||||
listenFor(TraceModuleChangeType.CHANGED, this::moduleChanged);
|
||||
|
||||
+4
-5
@@ -33,7 +33,7 @@ import docking.widgets.table.TableFilter;
|
||||
import ghidra.app.plugin.core.debug.gui.DebuggerResources;
|
||||
import ghidra.app.plugin.core.debug.utils.DebouncedRowWrappedEnumeratedColumnTableModel;
|
||||
import ghidra.debug.api.tracemgr.DebuggerCoordinates;
|
||||
import ghidra.framework.model.DomainObject;
|
||||
import ghidra.framework.model.DomainObjectEvent;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.program.model.address.*;
|
||||
import ghidra.trace.model.Trace;
|
||||
@@ -124,9 +124,8 @@ public class DebuggerLegacySectionsPanel extends JPanel {
|
||||
}
|
||||
}
|
||||
|
||||
protected static class SectionTableModel
|
||||
extends DebouncedRowWrappedEnumeratedColumnTableModel< //
|
||||
SectionTableColumns, ObjectKey, SectionRow, TraceSection> {
|
||||
protected static class SectionTableModel extends DebouncedRowWrappedEnumeratedColumnTableModel< //
|
||||
SectionTableColumns, ObjectKey, SectionRow, TraceSection> {
|
||||
|
||||
public SectionTableModel(PluginTool tool) {
|
||||
super(tool, "Sections", SectionTableColumns.class, TraceSection::getObjectKey,
|
||||
@@ -141,7 +140,7 @@ public class DebuggerLegacySectionsPanel extends JPanel {
|
||||
|
||||
private class SectionsListener extends TraceDomainObjectListener {
|
||||
public SectionsListener() {
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, e -> objectRestored());
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, e -> objectRestored());
|
||||
|
||||
/**
|
||||
* NOTE: No need for Module.ADDED here. A TraceModule is created empty, so when each
|
||||
|
||||
+4
-5
@@ -40,7 +40,7 @@ import ghidra.app.plugin.core.debug.gui.DebuggerResources;
|
||||
import ghidra.app.plugin.core.debug.gui.DebuggerResources.*;
|
||||
import ghidra.app.plugin.core.debug.utils.DebouncedRowWrappedEnumeratedColumnTableModel;
|
||||
import ghidra.app.services.*;
|
||||
import ghidra.framework.model.DomainObject;
|
||||
import ghidra.framework.model.DomainObjectEvent;
|
||||
import ghidra.framework.plugintool.*;
|
||||
import ghidra.framework.plugintool.annotation.AutoServiceConsumed;
|
||||
import ghidra.program.model.address.*;
|
||||
@@ -94,9 +94,8 @@ public class DebuggerStaticMappingProvider extends ComponentProviderAdapter
|
||||
}
|
||||
}
|
||||
|
||||
protected static class MappingTableModel
|
||||
extends DebouncedRowWrappedEnumeratedColumnTableModel< //
|
||||
StaticMappingTableColumns, ObjectKey, StaticMappingRow, TraceStaticMapping> {
|
||||
protected static class MappingTableModel extends DebouncedRowWrappedEnumeratedColumnTableModel< //
|
||||
StaticMappingTableColumns, ObjectKey, StaticMappingRow, TraceStaticMapping> {
|
||||
|
||||
public MappingTableModel(PluginTool tool) {
|
||||
super(tool, "Mappings", StaticMappingTableColumns.class,
|
||||
@@ -107,7 +106,7 @@ public class DebuggerStaticMappingProvider extends ComponentProviderAdapter
|
||||
|
||||
protected class ListenerForStaticMappingDisplay extends TraceDomainObjectListener {
|
||||
public ListenerForStaticMappingDisplay() {
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, e -> objectRestored());
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, e -> objectRestored());
|
||||
listenFor(TraceStaticMappingChangeType.ADDED, this::staticMappingAdded);
|
||||
listenFor(TraceStaticMappingChangeType.DELETED, this::staticMappingDeleted);
|
||||
}
|
||||
|
||||
+14
-24
@@ -52,7 +52,7 @@ import ghidra.dbg.error.DebuggerModelAccessException;
|
||||
import ghidra.debug.api.target.Target;
|
||||
import ghidra.debug.api.tracemgr.DebuggerCoordinates;
|
||||
import ghidra.docking.settings.*;
|
||||
import ghidra.framework.model.DomainObject;
|
||||
import ghidra.framework.model.DomainObjectEvent;
|
||||
import ghidra.framework.model.DomainObjectChangeRecord;
|
||||
import ghidra.framework.options.AutoOptions;
|
||||
import ghidra.framework.options.SaveState;
|
||||
@@ -104,8 +104,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter
|
||||
|
||||
static ActionBuilder builder(Plugin owner) {
|
||||
String ownerName = owner.getName();
|
||||
return new ActionBuilder(NAME, ownerName)
|
||||
.description(DESCRIPTION);
|
||||
return new ActionBuilder(NAME, ownerName).description(DESCRIPTION);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,8 +115,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter
|
||||
|
||||
static ActionBuilder builder(Plugin owner) {
|
||||
String ownerName = owner.getName();
|
||||
return new ActionBuilder(NAME, ownerName)
|
||||
.description(DESCRIPTION)
|
||||
return new ActionBuilder(NAME, ownerName).description(DESCRIPTION)
|
||||
.popupMenuPath(NAME)
|
||||
.helpLocation(new HelpLocation(ownerName, HELP_ANCHOR));
|
||||
}
|
||||
@@ -152,9 +150,8 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter
|
||||
RegisterRow::isValueEditable, SortDirection.ASCENDING) {
|
||||
private static final RegisterValueCellRenderer RENDERER =
|
||||
new RegisterValueCellRenderer();
|
||||
private static final SettingsDefinition[] DEFS = new SettingsDefinition[] {
|
||||
FormatSettingsDefinition.DEF_HEX,
|
||||
};
|
||||
private static final SettingsDefinition[] DEFS =
|
||||
new SettingsDefinition[] { FormatSettingsDefinition.DEF_HEX, };
|
||||
|
||||
@Override
|
||||
public GColumnRenderer<BigInteger> getRenderer() {
|
||||
@@ -186,9 +183,8 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
<T> RegisterTableColumns(String header, int width, Class<T> cls,
|
||||
Function<RegisterRow, T> getter,
|
||||
BiConsumer<RegisterRow, T> setter, Predicate<RegisterRow> editable,
|
||||
SortDirection direction) {
|
||||
Function<RegisterRow, T> getter, BiConsumer<RegisterRow, T> setter,
|
||||
Predicate<RegisterRow> editable, SortDirection direction) {
|
||||
this.header = header;
|
||||
this.width = width;
|
||||
this.cls = cls;
|
||||
@@ -277,7 +273,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter
|
||||
|
||||
class TraceChangeListener extends TraceDomainObjectListener {
|
||||
public TraceChangeListener() {
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, e -> objectRestored(e));
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, e -> objectRestored(e));
|
||||
listenFor(TraceMemoryBytesChangeType.CHANGED, this::registerValueChanged);
|
||||
listenFor(TraceMemoryStateChangeType.CHANGED, this::registerStateChanged);
|
||||
listenFor(TraceCodeChangeType.ADDED, this::registerTypeAdded);
|
||||
@@ -899,8 +895,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter
|
||||
getRegisterMemorySpace(register.getAddressSpace(), true).getCodeSpace(true);
|
||||
long snap = current.getViewSnap();
|
||||
TracePlatform platform = current.getPlatform();
|
||||
code.definedUnits()
|
||||
.clear(platform, Lifespan.at(snap), register, TaskMonitor.DUMMY);
|
||||
code.definedUnits().clear(platform, Lifespan.at(snap), register, TaskMonitor.DUMMY);
|
||||
if (dataType != null) {
|
||||
code.definedData().create(platform, Lifespan.nowOn(snap), register, dataType);
|
||||
}
|
||||
@@ -936,8 +931,8 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter
|
||||
return;
|
||||
}
|
||||
try {
|
||||
RegisterValue rv = TraceRegisterUtils.encodeValueRepresentationHackPointer(
|
||||
register, data, representation);
|
||||
RegisterValue rv = TraceRegisterUtils.encodeValueRepresentationHackPointer(register,
|
||||
data, representation);
|
||||
writeRegisterValue(rv);
|
||||
}
|
||||
catch (DataTypeEncodeException e) {
|
||||
@@ -1109,9 +1104,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter
|
||||
protected static TraceMemorySpace getRegisterMemorySpace(DebuggerCoordinates coords,
|
||||
AddressSpace space, boolean createIfAbsent) {
|
||||
if (!space.isRegisterSpace()) {
|
||||
return coords.getTrace()
|
||||
.getMemoryManager()
|
||||
.getMemorySpace(space, createIfAbsent);
|
||||
return coords.getTrace().getMemoryManager().getMemorySpace(space, createIfAbsent);
|
||||
}
|
||||
TraceThread thread = coords.getThread();
|
||||
if (thread == null) {
|
||||
@@ -1122,17 +1115,14 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter
|
||||
.getMemoryRegisterSpace(thread, coords.getFrame(), createIfAbsent);
|
||||
}
|
||||
|
||||
protected TraceMemorySpace getRegisterMemorySpace(AddressSpace space,
|
||||
boolean createIfAbsent) {
|
||||
protected TraceMemorySpace getRegisterMemorySpace(AddressSpace space, boolean createIfAbsent) {
|
||||
return getRegisterMemorySpace(current, space, createIfAbsent);
|
||||
}
|
||||
|
||||
protected static TraceCodeSpace getRegisterCodeSpace(DebuggerCoordinates coords,
|
||||
AddressSpace space, boolean createIfAbsent) {
|
||||
if (!space.isRegisterSpace()) {
|
||||
return coords.getTrace()
|
||||
.getCodeManager()
|
||||
.getCodeSpace(space, createIfAbsent);
|
||||
return coords.getTrace().getCodeManager().getCodeSpace(space, createIfAbsent);
|
||||
}
|
||||
TraceThread thread = coords.getThread();
|
||||
if (thread == null) {
|
||||
|
||||
+3
-4
@@ -33,7 +33,7 @@ import ghidra.app.plugin.core.debug.gui.DebuggerSnapActionContext;
|
||||
import ghidra.app.services.DebuggerTraceManagerService;
|
||||
import ghidra.debug.api.tracemgr.DebuggerCoordinates;
|
||||
import ghidra.docking.settings.Settings;
|
||||
import ghidra.framework.model.DomainObject;
|
||||
import ghidra.framework.model.DomainObjectEvent;
|
||||
import ghidra.framework.model.DomainObjectChangeRecord;
|
||||
import ghidra.framework.plugintool.AutoService;
|
||||
import ghidra.framework.plugintool.annotation.AutoServiceConsumed;
|
||||
@@ -120,14 +120,13 @@ public class DebuggerLegacyThreadsPanel extends JPanel {
|
||||
|
||||
public ThreadTableModel(DebuggerThreadsProvider provider) {
|
||||
super(provider.getTool(), "Threads", ThreadTableColumns.class,
|
||||
TraceThread::getObjectKey, t -> new ThreadRow(provider, t),
|
||||
ThreadRow::getThread);
|
||||
TraceThread::getObjectKey, t -> new ThreadRow(provider, t), ThreadRow::getThread);
|
||||
}
|
||||
}
|
||||
|
||||
private class ForThreadsListener extends TraceDomainObjectListener {
|
||||
public ForThreadsListener() {
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, this::objectRestored);
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, this::objectRestored);
|
||||
|
||||
listenFor(TraceThreadChangeType.ADDED, this::threadAdded);
|
||||
listenFor(TraceThreadChangeType.CHANGED, this::threadChanged);
|
||||
|
||||
+5
-5
@@ -33,7 +33,7 @@ import ghidra.app.plugin.core.debug.gui.DebuggerResources.ToToggleSelectionListe
|
||||
import ghidra.app.services.*;
|
||||
import ghidra.app.services.DebuggerTraceManagerService.BooleanChangeAdapter;
|
||||
import ghidra.debug.api.tracemgr.DebuggerCoordinates;
|
||||
import ghidra.framework.model.DomainObject;
|
||||
import ghidra.framework.model.DomainObjectEvent;
|
||||
import ghidra.framework.model.DomainObjectChangeRecord;
|
||||
import ghidra.framework.plugintool.AutoService;
|
||||
import ghidra.framework.plugintool.ComponentProviderAdapter;
|
||||
@@ -65,7 +65,7 @@ public class DebuggerThreadsProvider extends ComponentProviderAdapter {
|
||||
private Trace currentTrace;
|
||||
|
||||
public ForSnapsListener() {
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, this::objectRestored);
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, this::objectRestored);
|
||||
|
||||
listenFor(TraceSnapshotChangeType.ADDED, this::snapAdded);
|
||||
listenFor(TraceSnapshotChangeType.DELETED, this::snapDeleted);
|
||||
@@ -210,7 +210,7 @@ public class DebuggerThreadsProvider extends ComponentProviderAdapter {
|
||||
void threadsPanelContextChanged() {
|
||||
myActionContext = panel.getActionContext();
|
||||
}
|
||||
|
||||
|
||||
void legacyThreadsPanelContextChanged() {
|
||||
myActionContext = legacyPanel.getActionContext();
|
||||
}
|
||||
@@ -247,8 +247,8 @@ public class DebuggerThreadsProvider extends ComponentProviderAdapter {
|
||||
.enabledWhen(c -> traceManager != null)
|
||||
.onAction(c -> toggleSyncFocus(actionSyncTarget.isSelected()))
|
||||
.buildAndInstallLocal(this);
|
||||
traceManager.addSynchronizeActiveChangeListener(toToggleSelectionListener =
|
||||
new ToToggleSelectionListener(actionSyncTarget));
|
||||
traceManager.addSynchronizeActiveChangeListener(
|
||||
toToggleSelectionListener = new ToToggleSelectionListener(actionSyncTarget));
|
||||
}
|
||||
|
||||
private void changedSynchronizeTarget(boolean value) {
|
||||
|
||||
+5
-5
@@ -28,7 +28,7 @@ import javax.swing.table.*;
|
||||
import docking.widgets.table.*;
|
||||
import docking.widgets.table.DefaultEnumeratedColumnTableModel.EnumeratedTableColumn;
|
||||
import ghidra.docking.settings.Settings;
|
||||
import ghidra.framework.model.DomainObject;
|
||||
import ghidra.framework.model.DomainObjectEvent;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.trace.model.Trace;
|
||||
import ghidra.trace.model.Trace.TraceSnapshotChangeType;
|
||||
@@ -94,7 +94,7 @@ public class DebuggerSnapshotTablePanel extends JPanel {
|
||||
|
||||
private class SnapshotListener extends TraceDomainObjectListener {
|
||||
public SnapshotListener() {
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, e -> objectRestored());
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, e -> objectRestored());
|
||||
|
||||
listenFor(TraceSnapshotChangeType.ADDED, this::snapAdded);
|
||||
listenFor(TraceSnapshotChangeType.CHANGED, this::snapChanged);
|
||||
@@ -234,9 +234,9 @@ public class DebuggerSnapshotTablePanel extends JPanel {
|
||||
return;
|
||||
}
|
||||
TraceTimeManager manager = currentTrace.getTimeManager();
|
||||
Collection<? extends TraceSnapshot> snapshots = hideScratch
|
||||
? manager.getSnapshots(0, true, Long.MAX_VALUE, true)
|
||||
: manager.getAllSnapshots();
|
||||
Collection<? extends TraceSnapshot> snapshots =
|
||||
hideScratch ? manager.getSnapshots(0, true, Long.MAX_VALUE, true)
|
||||
: manager.getAllSnapshots();
|
||||
snapshotTableModel
|
||||
.addAll(snapshots.stream().map(s -> new SnapshotRow(currentTrace, s)).toList());
|
||||
}
|
||||
|
||||
+8
-11
@@ -56,7 +56,7 @@ import ghidra.base.widgets.table.DataTypeTableCellEditor;
|
||||
import ghidra.debug.api.tracemgr.DebuggerCoordinates;
|
||||
import ghidra.debug.api.watch.WatchRow;
|
||||
import ghidra.docking.settings.*;
|
||||
import ghidra.framework.model.DomainObject;
|
||||
import ghidra.framework.model.DomainObjectEvent;
|
||||
import ghidra.framework.model.DomainObjectChangeRecord;
|
||||
import ghidra.framework.options.SaveState;
|
||||
import ghidra.framework.plugintool.*;
|
||||
@@ -109,8 +109,7 @@ public class DebuggerWatchesProvider extends ComponentProviderAdapter
|
||||
|
||||
static ActionBuilder builder(Plugin owner) {
|
||||
String ownerName = owner.getName();
|
||||
return new ActionBuilder(NAME, ownerName)
|
||||
.description(DESCRIPTION)
|
||||
return new ActionBuilder(NAME, ownerName).description(DESCRIPTION)
|
||||
.popupMenuPath(NAME)
|
||||
.helpLocation(new HelpLocation(ownerName, HELP_ANCHOR));
|
||||
}
|
||||
@@ -247,7 +246,7 @@ public class DebuggerWatchesProvider extends ComponentProviderAdapter
|
||||
|
||||
class ForDepsListener extends TraceDomainObjectListener {
|
||||
public ForDepsListener() {
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, this::objectRestored);
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, this::objectRestored);
|
||||
listenFor(TraceMemoryBytesChangeType.CHANGED, this::bytesChanged);
|
||||
listenFor(TraceMemoryStateChangeType.CHANGED, this::stateChanged);
|
||||
}
|
||||
@@ -459,8 +458,8 @@ public class DebuggerWatchesProvider extends ComponentProviderAdapter
|
||||
int modelCol = watchTable.convertColumnIndexToModel(watchTable.getSelectedColumn());
|
||||
Throwable error = row.getError(); // I don't care the selected column for errors
|
||||
if (error != null) {
|
||||
Msg.showError(this, getComponent(), "Evaluation error",
|
||||
"Could not evaluate watch", error);
|
||||
Msg.showError(this, getComponent(), "Evaluation error", "Could not evaluate watch",
|
||||
error);
|
||||
}
|
||||
else if (modelCol == WatchTableColumns.ADDRESS.ordinal()) {
|
||||
Address address = row.getAddress();
|
||||
@@ -509,9 +508,8 @@ public class DebuggerWatchesProvider extends ComponentProviderAdapter
|
||||
selHasMemoryReads(ctx))
|
||||
.onAction(this::activatedSelectReads)
|
||||
.buildAndInstallLocal(this);
|
||||
actionAdd = AddAction.builder(plugin)
|
||||
.onAction(this::activatedAdd)
|
||||
.buildAndInstallLocal(this);
|
||||
actionAdd =
|
||||
AddAction.builder(plugin).onAction(this::activatedAdd).buildAndInstallLocal(this);
|
||||
actionRemove = RemoveAction.builder(plugin)
|
||||
.withContext(DebuggerWatchActionContext.class)
|
||||
.enabledWhen(ctx -> !ctx.getWatchRows().isEmpty())
|
||||
@@ -609,8 +607,7 @@ public class DebuggerWatchesProvider extends ComponentProviderAdapter
|
||||
return;
|
||||
}
|
||||
}
|
||||
try (Transaction tx =
|
||||
current.getTrace().openTransaction("Apply Watch Data Type")) {
|
||||
try (Transaction tx = current.getTrace().openTransaction("Apply Watch Data Type")) {
|
||||
try {
|
||||
listing.clearCodeUnits(row.getAddress(), row.getRange().getMaxAddress(), false);
|
||||
Data data = listing.createData(address, dataType, size);
|
||||
|
||||
+43
-71
@@ -58,26 +58,17 @@ import ghidra.util.Msg;
|
||||
import ghidra.util.datastruct.ListenerSet;
|
||||
|
||||
@PluginInfo(
|
||||
shortDescription = "Debugger logical breakpoints service plugin",
|
||||
description = "Aggregates breakpoints from open programs and live traces",
|
||||
category = PluginCategoryNames.DEBUGGER,
|
||||
packageName = DebuggerPluginPackage.NAME,
|
||||
status = PluginStatus.RELEASED,
|
||||
eventsConsumed = {
|
||||
ProgramOpenedPluginEvent.class,
|
||||
ProgramClosedPluginEvent.class,
|
||||
TraceOpenedPluginEvent.class,
|
||||
TraceActivatedPluginEvent.class,
|
||||
TraceInactiveCoordinatesPluginEvent.class,
|
||||
TraceClosedPluginEvent.class,
|
||||
},
|
||||
servicesRequired = {
|
||||
DebuggerTraceManagerService.class,
|
||||
DebuggerStaticMappingService.class,
|
||||
},
|
||||
servicesProvided = {
|
||||
DebuggerLogicalBreakpointService.class,
|
||||
})
|
||||
shortDescription = "Debugger logical breakpoints service plugin",
|
||||
description = "Aggregates breakpoints from open programs and live traces",
|
||||
category = PluginCategoryNames.DEBUGGER,
|
||||
packageName = DebuggerPluginPackage.NAME,
|
||||
status = PluginStatus.RELEASED,
|
||||
eventsConsumed = { ProgramOpenedPluginEvent.class, ProgramClosedPluginEvent.class,
|
||||
TraceOpenedPluginEvent.class, TraceActivatedPluginEvent.class,
|
||||
TraceInactiveCoordinatesPluginEvent.class, TraceClosedPluginEvent.class, },
|
||||
servicesRequired = { DebuggerTraceManagerService.class,
|
||||
DebuggerStaticMappingService.class, },
|
||||
servicesProvided = { DebuggerLogicalBreakpointService.class, })
|
||||
public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
implements DebuggerLogicalBreakpointService {
|
||||
|
||||
@@ -206,7 +197,7 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
// (Same in break provider for locations)
|
||||
this.info = info;
|
||||
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, e -> objectRestored());
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, e -> objectRestored());
|
||||
listenFor(TraceBreakpointChangeType.ADDED, this::breakpointAdded);
|
||||
listenFor(TraceBreakpointChangeType.CHANGED, this::breakpointChanged);
|
||||
listenFor(TraceBreakpointChangeType.LIFESPAN_CHANGED, this::breakpointLifespanChanged);
|
||||
@@ -254,13 +245,12 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
}
|
||||
catch (NoSuchElementException e) {
|
||||
// TODO: This catch clause should not be necessary.
|
||||
Msg.error(this,
|
||||
"!!!! Object-based breakpoint emitted event without a spec: " + tb);
|
||||
Msg.error(this, "!!!! Object-based breakpoint emitted event without a spec: " + tb);
|
||||
}
|
||||
}
|
||||
|
||||
private void breakpointLifespanChanged(TraceAddressSpace spaceIsNull,
|
||||
TraceBreakpoint tb, Lifespan oldSpan, Lifespan newSpan) {
|
||||
private void breakpointLifespanChanged(TraceAddressSpace spaceIsNull, TraceBreakpoint tb,
|
||||
Lifespan oldSpan, Lifespan newSpan) {
|
||||
// NOTE: User/script probably modified historical breakpoint
|
||||
boolean isInOld = oldSpan.contains(info.snap);
|
||||
boolean isInNew = newSpan.contains(info.snap);
|
||||
@@ -294,12 +284,12 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
public ProgramBreakpointsListener(InfoPerProgram info) {
|
||||
this.info = info;
|
||||
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, e -> objectRestored());
|
||||
listenForUntyped(ChangeManager.DOCR_BOOKMARK_ADDED,
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, e -> objectRestored());
|
||||
listenForUntyped(ProgramEvent.BOOKMARK_ADDED,
|
||||
onBreakpoint(this::breakpointBookmarkAdded));
|
||||
listenForUntyped(ChangeManager.DOCR_BOOKMARK_CHANGED,
|
||||
listenForUntyped(ProgramEvent.BOOKMARK_CHANGED,
|
||||
onBreakpoint(this::breakpointBookmarkChanged));
|
||||
listenForUntyped(ChangeManager.DOCR_BOOKMARK_REMOVED,
|
||||
listenForUntyped(ProgramEvent.BOOKMARK_REMOVED,
|
||||
onBreakpoint(this::breakpointBookmarkDeleted));
|
||||
}
|
||||
|
||||
@@ -504,9 +494,8 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
protected void forgetAllBreakpoints(RemoveCollector r) {
|
||||
Collection<TraceBreakpoint> toForget = new ArrayList<>();
|
||||
for (AddressRange range : trace.getBaseAddressFactory().getAddressSet()) {
|
||||
toForget.addAll(trace
|
||||
.getBreakpointManager()
|
||||
.getBreakpointsIntersecting(Lifespan.ALL, range));
|
||||
toForget.addAll(
|
||||
trace.getBreakpointManager().getBreakpointsIntersecting(Lifespan.ALL, range));
|
||||
}
|
||||
for (TraceBreakpoint tb : toForget) {
|
||||
forgetTraceBreakpoint(r, tb);
|
||||
@@ -520,8 +509,7 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
* has changed or become invalid, or because it has no live breakpoint in target mode.
|
||||
*/
|
||||
ControlMode mode = getMode(trace);
|
||||
for (Set<LogicalBreakpointInternal> set : List
|
||||
.copyOf(breakpointsByAddress.values())) {
|
||||
for (Set<LogicalBreakpointInternal> set : List.copyOf(breakpointsByAddress.values())) {
|
||||
for (LogicalBreakpointInternal lb : Set.copyOf(set)) {
|
||||
for (TraceBreakpoint tb : Set.copyOf(lb.getTraceBreakpoints(trace))) {
|
||||
if (!mode.useEmulatedBreakpoints() &&
|
||||
@@ -576,8 +564,7 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
}
|
||||
|
||||
protected ProgramLocation computeStaticLocation(TraceBreakpoint tb) {
|
||||
if (traceManager == null ||
|
||||
!traceManager.getOpenTraces().contains(tb.getTrace())) {
|
||||
if (traceManager == null || !traceManager.getOpenTraces().contains(tb.getTrace())) {
|
||||
/**
|
||||
* Mapping service will throw an exception otherwise. NB: When trace is opened,
|
||||
* mapping service will fire events causing this service to coalesce affected
|
||||
@@ -593,9 +580,8 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
new DefaultTraceLocation(trace, null, Lifespan.at(snap), minAddress));
|
||||
}
|
||||
|
||||
protected void trackTraceBreakpoint(AddCollector a, TraceBreakpoint tb,
|
||||
ControlMode mode, boolean forceUpdate)
|
||||
throws TrackedTooSoonException {
|
||||
protected void trackTraceBreakpoint(AddCollector a, TraceBreakpoint tb, ControlMode mode,
|
||||
boolean forceUpdate) throws TrackedTooSoonException {
|
||||
if (!mode.useEmulatedBreakpoints() &&
|
||||
(target == null || !target.isBreakpointValid(tb))) {
|
||||
return;
|
||||
@@ -681,9 +667,8 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
}
|
||||
}
|
||||
|
||||
LogicalBreakpointInternal lb =
|
||||
createLogicalBreakpoint(address, ProgramBreakpoint.lengthFromBookmark(pb),
|
||||
ProgramBreakpoint.kindsFromBookmark(pb));
|
||||
LogicalBreakpointInternal lb = createLogicalBreakpoint(address,
|
||||
ProgramBreakpoint.lengthFromBookmark(pb), ProgramBreakpoint.kindsFromBookmark(pb));
|
||||
set.add(lb);
|
||||
a.added(lb);
|
||||
return lb;
|
||||
@@ -747,8 +732,7 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
* NOTE: A change in the program (other than bookmark address), should not affect the
|
||||
* mapped trace addresses. That would require a change in the trace.
|
||||
*/
|
||||
for (Set<LogicalBreakpointInternal> set : List
|
||||
.copyOf(breakpointsByAddress.values())) {
|
||||
for (Set<LogicalBreakpointInternal> set : List.copyOf(breakpointsByAddress.values())) {
|
||||
for (LogicalBreakpointInternal lb : Set.copyOf(set)) {
|
||||
Bookmark pb = lb.getProgramBookmark();
|
||||
if (pb == null) {
|
||||
@@ -768,10 +752,10 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
|
||||
protected void trackAllProgramBreakpoints(AddCollector a) {
|
||||
BookmarkManager bookmarks = program.getBookmarkManager();
|
||||
trackProgramBreakpoints(a, IteratorUtils.asIterable(bookmarks
|
||||
.getBookmarksIterator(LogicalBreakpoint.ENABLED_BOOKMARK_TYPE)));
|
||||
trackProgramBreakpoints(a, IteratorUtils.asIterable(bookmarks
|
||||
.getBookmarksIterator(LogicalBreakpoint.DISABLED_BOOKMARK_TYPE)));
|
||||
trackProgramBreakpoints(a, IteratorUtils.asIterable(
|
||||
bookmarks.getBookmarksIterator(LogicalBreakpoint.ENABLED_BOOKMARK_TYPE)));
|
||||
trackProgramBreakpoints(a, IteratorUtils.asIterable(
|
||||
bookmarks.getBookmarksIterator(LogicalBreakpoint.DISABLED_BOOKMARK_TYPE)));
|
||||
}
|
||||
|
||||
protected void trackProgramBreakpoints(AddCollector a, Iterable<Bookmark> bptMarks) {
|
||||
@@ -798,8 +782,7 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
|
||||
private boolean isConsistentAfterRemoval(Bookmark pb, LogicalBreakpointInternal lb,
|
||||
boolean forChange) {
|
||||
Set<LogicalBreakpointInternal> present =
|
||||
breakpointsByAddress.get(pb.getAddress());
|
||||
Set<LogicalBreakpointInternal> present = breakpointsByAddress.get(pb.getAddress());
|
||||
boolean shouldBeAbsent = lb.isEmpty() && !forChange;
|
||||
boolean isAbsent = present == null || !present.contains(lb);
|
||||
return shouldBeAbsent == isAbsent;
|
||||
@@ -859,15 +842,13 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
for (Trace t : affectedTraces) {
|
||||
InfoPerTrace info = traceInfos.get(t);
|
||||
if (info != null) {
|
||||
info.forgetMismappedBreakpoints(c.r, additionalTraces,
|
||||
additionalPrograms);
|
||||
info.forgetMismappedBreakpoints(c.r, additionalTraces, additionalPrograms);
|
||||
}
|
||||
}
|
||||
for (Program p : affectedPrograms) {
|
||||
InfoPerProgram info = programInfos.get(p);
|
||||
if (info != null) {
|
||||
info.forgetMismappedBreakpoints(c.r, additionalTraces,
|
||||
additionalPrograms);
|
||||
info.forgetMismappedBreakpoints(c.r, additionalTraces, additionalPrograms);
|
||||
}
|
||||
}
|
||||
for (Trace t : additionalTraces) {
|
||||
@@ -1131,8 +1112,7 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
|
||||
@Override
|
||||
public Set<LogicalBreakpoint> getBreakpointsAt(ProgramLocation loc) {
|
||||
return DebuggerLogicalBreakpointService.programOrTrace(loc,
|
||||
this::getBreakpointsAt,
|
||||
return DebuggerLogicalBreakpointService.programOrTrace(loc, this::getBreakpointsAt,
|
||||
this::getBreakpointsAt);
|
||||
}
|
||||
|
||||
@@ -1263,9 +1243,7 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
}
|
||||
|
||||
private ControlMode getMode(Trace trace) {
|
||||
return controlService == null
|
||||
? ControlMode.DEFAULT
|
||||
: controlService.getCurrentMode(trace);
|
||||
return controlService == null ? ControlMode.DEFAULT : controlService.getCurrentMode(trace);
|
||||
}
|
||||
|
||||
interface TargetBreakpointConsumer {
|
||||
@@ -1315,26 +1293,20 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> enableLocs(Collection<TraceBreakpoint> col) {
|
||||
return actOnLocs(col,
|
||||
BreakpointActionSet::planEnableTarget,
|
||||
BreakpointActionSet::planEnableEmu,
|
||||
LogicalBreakpoint::enableForProgram);
|
||||
return actOnLocs(col, BreakpointActionSet::planEnableTarget,
|
||||
BreakpointActionSet::planEnableEmu, LogicalBreakpoint::enableForProgram);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> disableLocs(Collection<TraceBreakpoint> col) {
|
||||
return actOnLocs(col,
|
||||
BreakpointActionSet::planDisableTarget,
|
||||
BreakpointActionSet::planDisableEmu,
|
||||
LogicalBreakpoint::disableForProgram);
|
||||
return actOnLocs(col, BreakpointActionSet::planDisableTarget,
|
||||
BreakpointActionSet::planDisableEmu, LogicalBreakpoint::disableForProgram);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> deleteLocs(Collection<TraceBreakpoint> col) {
|
||||
return actOnLocs(col,
|
||||
BreakpointActionSet::planDeleteTarget,
|
||||
BreakpointActionSet::planDeleteEmu,
|
||||
lb -> {
|
||||
return actOnLocs(col, BreakpointActionSet::planDeleteTarget,
|
||||
BreakpointActionSet::planDeleteEmu, lb -> {
|
||||
// Never delete bookmark when user requests deleting locations
|
||||
});
|
||||
}
|
||||
|
||||
+21
-30
@@ -61,24 +61,15 @@ import ghidra.util.exception.CancelledException;
|
||||
import ghidra.util.task.TaskMonitor;
|
||||
|
||||
@PluginInfo(
|
||||
shortDescription = "Debugger static mapping manager",
|
||||
description = "Track and manage static mappings (program-trace relocations)",
|
||||
category = PluginCategoryNames.DEBUGGER,
|
||||
packageName = DebuggerPluginPackage.NAME,
|
||||
status = PluginStatus.RELEASED,
|
||||
eventsConsumed = {
|
||||
ProgramOpenedPluginEvent.class,
|
||||
ProgramClosedPluginEvent.class,
|
||||
TraceOpenedPluginEvent.class,
|
||||
TraceClosedPluginEvent.class,
|
||||
},
|
||||
servicesRequired = {
|
||||
ProgramManager.class,
|
||||
DebuggerTraceManagerService.class,
|
||||
},
|
||||
servicesProvided = {
|
||||
DebuggerStaticMappingService.class,
|
||||
})
|
||||
shortDescription = "Debugger static mapping manager",
|
||||
description = "Track and manage static mappings (program-trace relocations)",
|
||||
category = PluginCategoryNames.DEBUGGER,
|
||||
packageName = DebuggerPluginPackage.NAME,
|
||||
status = PluginStatus.RELEASED,
|
||||
eventsConsumed = { ProgramOpenedPluginEvent.class, ProgramClosedPluginEvent.class,
|
||||
TraceOpenedPluginEvent.class, TraceClosedPluginEvent.class, },
|
||||
servicesRequired = { ProgramManager.class, DebuggerTraceManagerService.class, },
|
||||
servicesProvided = { DebuggerStaticMappingService.class, })
|
||||
public class DebuggerStaticMappingServicePlugin extends Plugin
|
||||
implements DebuggerStaticMappingService, DomainFolderChangeAdapter {
|
||||
|
||||
@@ -230,7 +221,7 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
|
||||
public InfoPerTrace(Trace trace) {
|
||||
this.trace = trace;
|
||||
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, e -> objectRestored());
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, e -> objectRestored());
|
||||
listenFor(TraceStaticMappingChangeType.ADDED, this::staticMappingAdded);
|
||||
listenFor(TraceStaticMappingChangeType.DELETED, this::staticMappingDeleted);
|
||||
|
||||
@@ -420,7 +411,7 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
|
||||
|
||||
@Override
|
||||
public void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
if (ev.containsEvent(DomainObject.DO_DOMAIN_FILE_CHANGED)) {
|
||||
if (ev.contains(DomainObjectEvent.FILE_CHANGED)) {
|
||||
// TODO: This seems like overkill
|
||||
programClosed(program);
|
||||
programOpened(program);
|
||||
@@ -461,8 +452,8 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
|
||||
|
||||
public Set<TraceLocation> getOpenMappedTraceLocations(Address address) {
|
||||
Set<TraceLocation> result = new HashSet<>();
|
||||
for (Entry<MappingEntry, Address> inPreceding : inbound.headMapByValue(address,
|
||||
true).entrySet()) {
|
||||
for (Entry<MappingEntry, Address> inPreceding : inbound.headMapByValue(address, true)
|
||||
.entrySet()) {
|
||||
Address start = inPreceding.getValue();
|
||||
if (start == null) {
|
||||
continue;
|
||||
@@ -478,8 +469,8 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
|
||||
|
||||
public TraceLocation getOpenMappedTraceLocation(Trace trace, Address address, long snap) {
|
||||
// TODO: Map by trace?
|
||||
for (Entry<MappingEntry, Address> inPreceding : inbound.headMapByValue(address,
|
||||
true).entrySet()) {
|
||||
for (Entry<MappingEntry, Address> inPreceding : inbound.headMapByValue(address, true)
|
||||
.entrySet()) {
|
||||
Address start = inPreceding.getValue();
|
||||
if (start == null) {
|
||||
continue;
|
||||
@@ -501,8 +492,9 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
|
||||
|
||||
protected void collectOpenMappedViews(AddressRange rng,
|
||||
Map<TraceSpan, Collection<MappedAddressRange>> result) {
|
||||
for (Entry<MappingEntry, Address> inPreceeding : inbound.headMapByValue(
|
||||
rng.getMaxAddress(), true).entrySet()) {
|
||||
for (Entry<MappingEntry, Address> inPreceeding : inbound
|
||||
.headMapByValue(rng.getMaxAddress(), true)
|
||||
.entrySet()) {
|
||||
Address start = inPreceeding.getValue();
|
||||
if (start == null) {
|
||||
continue;
|
||||
@@ -658,8 +650,8 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
|
||||
return;
|
||||
}
|
||||
// NB. The URL may have changed, so can't use that as key
|
||||
for (Iterator<InfoPerProgram> it =
|
||||
trackedProgramInfo.values().iterator(); it.hasNext();) {
|
||||
for (Iterator<InfoPerProgram> it = trackedProgramInfo.values().iterator(); it
|
||||
.hasNext();) {
|
||||
InfoPerProgram info = it.next();
|
||||
if (info.program == program) {
|
||||
it.remove();
|
||||
@@ -797,8 +789,7 @@ public class DebuggerStaticMappingServicePlugin extends Plugin
|
||||
}
|
||||
}
|
||||
for (Map.Entry<Program, List<ModuleMapEntry>> ent : entriesByProgram.entrySet()) {
|
||||
try (Transaction tx =
|
||||
ent.getKey().openTransaction("Memorize module mapping")) {
|
||||
try (Transaction tx = ent.getKey().openTransaction("Memorize module mapping")) {
|
||||
for (ModuleMapEntry entry : ent.getValue()) {
|
||||
ProgramModuleIndexer.addModulePaths(entry.getToProgram(),
|
||||
List.of(entry.getModule().getName()));
|
||||
|
||||
+3
-3
@@ -104,13 +104,13 @@ public class ProgramModuleIndexer implements DomainFolderChangeAdapter {
|
||||
if (disposed) {
|
||||
return;
|
||||
}
|
||||
if (ev.containsEvent(DomainObject.DO_OBJECT_RESTORED)) {
|
||||
if (ev.contains(DomainObjectEvent.RESTORED)) {
|
||||
refreshIndex(program.getDomainFile(), program);
|
||||
return;
|
||||
}
|
||||
if (ev.containsEvent(DomainObject.DO_PROPERTY_CHANGED)) {
|
||||
if (ev.contains(DomainObjectEvent.PROPERTY_CHANGED)) {
|
||||
for (DomainObjectChangeRecord rec : ev) {
|
||||
if (rec.getEventType() == DomainObject.DO_PROPERTY_CHANGED) {
|
||||
if (rec.getEventType() == DomainObjectEvent.PROPERTY_CHANGED) {
|
||||
// OldValue is actually the property name :/
|
||||
// See DomainObjectAdapter#propertyChanged
|
||||
String propertyName = (String) rec.getOldValue();
|
||||
|
||||
+1
-1
@@ -124,7 +124,7 @@ public class DomainObjectEventQueues {
|
||||
this.eventsEnabled = eventsEnabled;
|
||||
if (eventsEnabled) {
|
||||
DomainObjectChangeRecord restored =
|
||||
new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED);
|
||||
new DomainObjectChangeRecord(DomainObjectEvent.RESTORED);
|
||||
eventQueue.fireEvent(restored);
|
||||
for (PrivateQueue privateQueue : privateEventQueues.values()) {
|
||||
privateQueue.fireEvent(restored);
|
||||
|
||||
+8
-6
@@ -54,9 +54,9 @@ public class DBTraceObjectBreakpointSpec
|
||||
this.object = object;
|
||||
TargetObjectSchema schema = object.getTargetSchema();
|
||||
synchronized (KEYS_BY_SCHEMA) {
|
||||
keys = KEYS_BY_SCHEMA.computeIfAbsent(schema, s -> Set.of(
|
||||
schema.checkAliasedAttribute(TargetBreakpointSpec.KINDS_ATTRIBUTE_NAME),
|
||||
schema.checkAliasedAttribute(TargetTogglable.ENABLED_ATTRIBUTE_NAME)));
|
||||
keys = KEYS_BY_SCHEMA.computeIfAbsent(schema,
|
||||
s -> Set.of(schema.checkAliasedAttribute(TargetBreakpointSpec.KINDS_ATTRIBUTE_NAME),
|
||||
schema.checkAliasedAttribute(TargetTogglable.ENABLED_ATTRIBUTE_NAME)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -234,14 +234,16 @@ public class DBTraceObjectBreakpointSpec
|
||||
@Override
|
||||
public Collection<? extends TraceObjectBreakpointLocation> getLocations() {
|
||||
try (LockHold hold = object.getTrace().lockRead()) {
|
||||
return object.querySuccessorsInterface(getLifespan(),
|
||||
TraceObjectBreakpointLocation.class, true).collect(Collectors.toSet());
|
||||
return object
|
||||
.querySuccessorsInterface(getLifespan(), TraceObjectBreakpointLocation.class,
|
||||
true)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TraceChangeRecord<?, ?> translateEvent(TraceChangeRecord<?, ?> rec) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.VALUE_CREATED.getType()) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.VALUE_CREATED.getEventType()) {
|
||||
TraceChangeRecord<TraceObjectValue, Void> cast =
|
||||
TraceObjectChangeType.VALUE_CREATED.cast(rec);
|
||||
TraceObjectValue affected = cast.getAffectedObject();
|
||||
|
||||
+86
-95
@@ -43,8 +43,7 @@ import ghidra.program.model.reloc.RelocationTable;
|
||||
import ghidra.program.model.symbol.*;
|
||||
import ghidra.program.model.util.AddressSetPropertyMap;
|
||||
import ghidra.program.model.util.PropertyMapManager;
|
||||
import ghidra.program.util.ChangeManager;
|
||||
import ghidra.program.util.ProgramChangeRecord;
|
||||
import ghidra.program.util.*;
|
||||
import ghidra.trace.database.*;
|
||||
import ghidra.trace.database.listing.DBTraceCodeSpace;
|
||||
import ghidra.trace.database.listing.DBTraceDefinedUnitsView;
|
||||
@@ -86,12 +85,12 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
protected class EventTranslator extends TypedEventDispatcher
|
||||
implements DBTraceDirectChangeListener {
|
||||
public EventTranslator() {
|
||||
listenForUntyped(DomainObject.DO_OBJECT_SAVED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObject.DO_DOMAIN_FILE_CHANGED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RENAMED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObject.DO_OBJECT_RESTORED, this::objectRestored);
|
||||
listenForUntyped(DomainObject.DO_OBJECT_CLOSED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObject.DO_OBJECT_ERROR, this::eventPassthrough);
|
||||
listenForUntyped(DomainObjectEvent.SAVED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObjectEvent.FILE_CHANGED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObjectEvent.RENAMED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObjectEvent.RESTORED, this::objectRestored);
|
||||
listenForUntyped(DomainObjectEvent.CLOSED, this::eventPassthrough);
|
||||
listenForUntyped(DomainObjectEvent.ERROR, this::eventPassthrough);
|
||||
|
||||
listenFor(TraceBookmarkChangeType.TYPE_ADDED, this::bookmarkTypeAdded);
|
||||
listenFor(TraceBookmarkChangeType.ADDED, this::bookmarkAdded);
|
||||
@@ -175,8 +174,8 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
}
|
||||
|
||||
private void bookmarkTypeAdded(TraceBookmarkType type) {
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_BOOKMARK_TYPE_ADDED, null,
|
||||
null, type, null, null));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.BOOKMARK_TYPE_ADDED, null, null,
|
||||
type, null, null));
|
||||
}
|
||||
|
||||
private void bookmarkAdded(TraceAddressSpace space, TraceBookmark bm) {
|
||||
@@ -188,8 +187,8 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
}
|
||||
|
||||
protected void fireBookmarkAdded(DomainObjectEventQueues queues, TraceBookmark bm) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_BOOKMARK_ADDED,
|
||||
bm.getAddress(), bm.getAddress(), bm, null, null));
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.BOOKMARK_ADDED, bm.getAddress(),
|
||||
bm.getAddress(), bm, null, null));
|
||||
}
|
||||
|
||||
private void bookmarkChanged(TraceAddressSpace space, TraceBookmark bm) {
|
||||
@@ -201,8 +200,8 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
}
|
||||
|
||||
protected void fireBookmarkChanged(DomainObjectEventQueues queues, TraceBookmark bm) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_BOOKMARK_CHANGED,
|
||||
bm.getAddress(), bm.getAddress(), bm, null, null));
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.BOOKMARK_CHANGED, bm.getAddress(),
|
||||
bm.getAddress(), bm, null, null));
|
||||
}
|
||||
|
||||
private void bookmarkLifespanChanged(TraceAddressSpace space, TraceBookmark bm,
|
||||
@@ -230,30 +229,30 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
}
|
||||
|
||||
protected void fireBookmarkRemoved(DomainObjectEventQueues queues, TraceBookmark bm) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_BOOKMARK_REMOVED,
|
||||
bm.getAddress(), bm.getAddress(), bm, null, null));
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.BOOKMARK_REMOVED, bm.getAddress(),
|
||||
bm.getAddress(), bm, null, null));
|
||||
}
|
||||
|
||||
private void categoryAdded(long id, Category oldIsNull, Category added) {
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_CATEGORY_ADDED, null, null,
|
||||
null, oldIsNull, added));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_CATEGORY_ADDED, null,
|
||||
null, null, oldIsNull, added));
|
||||
}
|
||||
|
||||
private void categoryMoved(long id, CategoryPath oldPath, CategoryPath newPath) {
|
||||
Category category = getDataTypeManager().getCategory(id);
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_CATEGORY_MOVED, null, null,
|
||||
null, oldPath, category));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_CATEGORY_MOVED, null,
|
||||
null, null, oldPath, category));
|
||||
}
|
||||
|
||||
private void categoryRenamed(long id, String oldName, String newName) {
|
||||
Category category = getDataTypeManager().getCategory(id);
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_CATEGORY_RENAMED, null,
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_CATEGORY_RENAMED, null,
|
||||
null, null, oldName, category));
|
||||
}
|
||||
|
||||
private void categoryDeleted(long id, CategoryPath deleted, CategoryPath newIsNull) {
|
||||
Category parent = getDataTypeManager().getCategory(deleted.getParent());
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_CATEGORY_REMOVED, null,
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_CATEGORY_REMOVED, null,
|
||||
null, null, parent, deleted.getName()));
|
||||
}
|
||||
|
||||
@@ -271,7 +270,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
|
||||
protected void fireCodeAdded(DomainObjectEventQueues queues, Address min, Address max) {
|
||||
queues.fireEvent(
|
||||
new ProgramChangeRecord(ChangeManager.DOCR_CODE_ADDED, min, max, null, null, null));
|
||||
new ProgramChangeRecord(ProgramEvent.CODE_ADDED, min, max, null, null, null));
|
||||
}
|
||||
|
||||
private void codeLifespanChanged(TraceAddressSpace space, TraceCodeUnit unit,
|
||||
@@ -302,8 +301,8 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
|
||||
protected void fireCodeRemoved(DomainObjectEventQueues queues, Address min, Address max,
|
||||
TraceCodeUnit removed) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_CODE_REMOVED, min, max,
|
||||
null, removed, null));
|
||||
queues.fireEvent(
|
||||
new ProgramChangeRecord(ProgramEvent.CODE_REMOVED, min, max, null, removed, null));
|
||||
}
|
||||
|
||||
private void codeFragmentChanged(TraceAddressSpace space, TraceAddressSnapRange range,
|
||||
@@ -312,7 +311,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_CODE_MOVED, null, null,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.FRAGMENT_CHANGED, null, null,
|
||||
null, range.getX1(), range.getX2()));
|
||||
}
|
||||
|
||||
@@ -323,8 +322,8 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_REPLACED,
|
||||
range.getX1(), range.getX2(), null, null, null));
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_REPLACED, range.getX1(),
|
||||
range.getX2(), null, null, null));
|
||||
}
|
||||
|
||||
private void codeDataTypeSettingsChanged(TraceAddressSpace space,
|
||||
@@ -334,49 +333,44 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
return;
|
||||
}
|
||||
// Yes, x1 twice
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_SETTING_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_SETTING_CHANGED,
|
||||
range.getX1(), range.getX1(), null, null, null));
|
||||
}
|
||||
|
||||
private void commentChanged(int docrType, TraceAddressSpace space,
|
||||
private void commentChanged(int commentType, TraceAddressSpace space,
|
||||
TraceAddressSnapRange range, String oldValue, String newValue) {
|
||||
DomainObjectEventQueues queues = isVisible(space, range);
|
||||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(docrType, range.getX1(), range.getX2(), null,
|
||||
oldValue, newValue));
|
||||
queues.fireEvent(
|
||||
new CommentChangeRecord(commentType, range.getX1(), oldValue, newValue));
|
||||
}
|
||||
|
||||
private void commentEolChanged(TraceAddressSpace space, TraceAddressSnapRange range,
|
||||
String oldValue, String newValue) {
|
||||
commentChanged(ChangeManager.DOCR_EOL_COMMENT_CHANGED, space, range, oldValue,
|
||||
newValue);
|
||||
commentChanged(CodeUnit.EOL_COMMENT, space, range, oldValue, newValue);
|
||||
}
|
||||
|
||||
private void commentPlateChanged(TraceAddressSpace space, TraceAddressSnapRange range,
|
||||
String oldValue, String newValue) {
|
||||
commentChanged(ChangeManager.DOCR_PLATE_COMMENT_CHANGED, space, range, oldValue,
|
||||
newValue);
|
||||
commentChanged(CodeUnit.PLATE_COMMENT, space, range, oldValue, newValue);
|
||||
}
|
||||
|
||||
private void commentPostChanged(TraceAddressSpace space, TraceAddressSnapRange range,
|
||||
String oldValue, String newValue) {
|
||||
commentChanged(ChangeManager.DOCR_POST_COMMENT_CHANGED, space, range, oldValue,
|
||||
newValue);
|
||||
commentChanged(CodeUnit.POST_COMMENT, space, range, oldValue, newValue);
|
||||
}
|
||||
|
||||
private void commentPreChanged(TraceAddressSpace space, TraceAddressSnapRange range,
|
||||
String oldValue, String newValue) {
|
||||
commentChanged(ChangeManager.DOCR_PRE_COMMENT_CHANGED, space, range, oldValue,
|
||||
newValue);
|
||||
commentChanged(CodeUnit.PRE_COMMENT, space, range, oldValue, newValue);
|
||||
}
|
||||
|
||||
private void commentRepeatableChanged(TraceAddressSpace space, TraceAddressSnapRange range,
|
||||
String oldValue, String newValue) {
|
||||
// TODO: The "repeatable" semantics are not implemented, yet.
|
||||
commentChanged(ChangeManager.DOCR_REPEATABLE_COMMENT_CHANGED, space, range, oldValue,
|
||||
newValue);
|
||||
commentChanged(CodeUnit.REPEATABLE_COMMENT, space, range, oldValue, newValue);
|
||||
}
|
||||
|
||||
private void compositeDataAdded(TraceAddressSpace space, TraceAddressSnapRange range,
|
||||
@@ -385,7 +379,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_COMPOSITE_ADDED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.COMPOSITE_ADDED,
|
||||
added.getMinAddress(), added.getMaxAddress(), null, null, added));
|
||||
}
|
||||
|
||||
@@ -398,11 +392,11 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
boolean inOld = isCodeVisible(data, oldSpan);
|
||||
boolean inNew = isCodeVisible(data, newSpan);
|
||||
if (inOld && !inNew) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_COMPOSITE_REMOVED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.COMPOSITE_REMOVED,
|
||||
data.getMinAddress(), data.getMaxAddress(), null, data, null));
|
||||
}
|
||||
if (!inOld && inNew) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_COMPOSITE_ADDED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.COMPOSITE_ADDED,
|
||||
data.getMinAddress(), data.getMaxAddress(), null, null, data));
|
||||
}
|
||||
}
|
||||
@@ -414,42 +408,42 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
return;
|
||||
}
|
||||
// TODO: ProgramDB doesn't send this.... Should I?
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_COMPOSITE_REMOVED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.COMPOSITE_REMOVED,
|
||||
removed.getMinAddress(), removed.getMaxAddress(), null, removed, null));
|
||||
}
|
||||
|
||||
private void dataTypeAdded(long id, DataType oldIsNull, DataType added) {
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_ADDED, null,
|
||||
null, null, oldIsNull, added));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_ADDED, null, null,
|
||||
null, oldIsNull, added));
|
||||
}
|
||||
|
||||
private void dataTypeChanged(long id, DataType oldIsNull, DataType changed) {
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_CHANGED, null,
|
||||
null, null, oldIsNull, changed));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_CHANGED, null, null,
|
||||
null, oldIsNull, changed));
|
||||
}
|
||||
|
||||
private void dataTypeReplaced(long id, DataTypePath oldPath, DataTypePath newPath) {
|
||||
DataType newType = getDataTypeManager().getDataType(id);
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_REPLACED, null,
|
||||
null, null, newPath, newType));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_REPLACED, null, null,
|
||||
null, newPath, newType));
|
||||
}
|
||||
|
||||
private void dataTypeMoved(long id, DataTypePath oldPath, DataTypePath newPath) {
|
||||
Category oldCategory = getDataTypeManager().getCategory(oldPath.getCategoryPath());
|
||||
DataType dataType = getDataTypeManager().getDataType(id);
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_MOVED, null,
|
||||
null, null, oldCategory, dataType));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_MOVED, null, null,
|
||||
null, oldCategory, dataType));
|
||||
}
|
||||
|
||||
private void dataTypeRenamed(long id, String oldName, String newName) {
|
||||
DataType dataType = getDataTypeManager().getDataType(id);
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_RENAMED, null,
|
||||
null, null, oldName, dataType));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_RENAMED, null, null,
|
||||
null, oldName, dataType));
|
||||
}
|
||||
|
||||
private void dataTypeDeleted(long id, DataTypePath oldPath, DataTypePath newIsNull) {
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_REMOVED, null,
|
||||
null, null, oldPath, newIsNull));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.DATA_TYPE_REMOVED, null, null,
|
||||
null, oldPath, newIsNull));
|
||||
}
|
||||
|
||||
private void instructionFlowOverrideChanged(TraceAddressSpace space,
|
||||
@@ -458,7 +452,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_FLOWOVERRIDE_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.FLOW_OVERRIDE_CHANGED,
|
||||
instruction.getMinAddress(), instruction.getMinAddress(), null, null, null));
|
||||
}
|
||||
|
||||
@@ -468,7 +462,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_FALLTHROUGH_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.FALLTHROUGH_CHANGED,
|
||||
instruction.getMinAddress(), instruction.getMinAddress(), null, null, null));
|
||||
}
|
||||
|
||||
@@ -478,7 +472,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_LENGTH_OVERRIDE_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.LENGTH_OVERRIDE_CHANGED,
|
||||
instruction.getMinAddress(), instruction.getMinAddress(), null, null, null));
|
||||
}
|
||||
|
||||
@@ -493,7 +487,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
|
||||
protected void fireMemoryBytesChanged(DomainObjectEventQueues queues,
|
||||
TraceAddressSnapRange range) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_MEMORY_BYTES_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.MEMORY_BYTES_CHANGED,
|
||||
range.getX1(), range.getX2(), null, null, null));
|
||||
}
|
||||
|
||||
@@ -502,21 +496,21 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
return;
|
||||
}
|
||||
// NOTE: Register view regions are fixed
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_MEMORY_BLOCK_ADDED,
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ProgramEvent.MEMORY_BLOCK_ADDED,
|
||||
region.getMinAddress(), region.getMaxAddress(), null, null, null));
|
||||
// NOTE: MemoryMapDB does this, too. Otherwise, CodeBrowserPlugin does not hear.
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED));
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObjectEvent.RESTORED));
|
||||
}
|
||||
|
||||
private void memoryRegionChanged(TraceAddressSpace space, TraceMemoryRegion region) {
|
||||
if (!isRegionVisible(region)) {
|
||||
return;
|
||||
}
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_MEMORY_BLOCK_CHANGED,
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ProgramEvent.MEMORY_BLOCK_CHANGED,
|
||||
region.getMinAddress(), region.getMaxAddress(), null, null, null));
|
||||
// TODO: Perhaps a bit heavy-handed here. MemoryMapDB does not do this, too.
|
||||
// TODO: Probably want a separate RANGE_CHANGED or MOVED event
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED));
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObjectEvent.RESTORED));
|
||||
}
|
||||
|
||||
private void memoryRegionLifespanChanged(TraceAddressSpace space, TraceMemoryRegion region,
|
||||
@@ -524,19 +518,16 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
boolean inOld = isRegionVisible(region, oldSpan);
|
||||
boolean inNew = isRegionVisible(region, newSpan);
|
||||
if (inOld && !inNew) {
|
||||
eventQueues
|
||||
.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_MEMORY_BLOCK_REMOVED,
|
||||
region.getMinAddress(), region.getMaxAddress(), null, null, null));
|
||||
// NOTE: MemoryMapDB does this, too. Otherwise, CodeBrowserPlugin does not hear.
|
||||
eventQueues
|
||||
.fireEvent(new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED));
|
||||
}
|
||||
if (!inOld && inNew) {
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_MEMORY_BLOCK_ADDED,
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ProgramEvent.MEMORY_BLOCK_REMOVED,
|
||||
region.getMinAddress(), region.getMaxAddress(), null, null, null));
|
||||
// NOTE: MemoryMapDB does this, too. Otherwise, CodeBrowserPlugin does not hear.
|
||||
eventQueues
|
||||
.fireEvent(new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED));
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObjectEvent.RESTORED));
|
||||
}
|
||||
if (!inOld && inNew) {
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ProgramEvent.MEMORY_BLOCK_ADDED,
|
||||
region.getMinAddress(), region.getMaxAddress(), null, null, null));
|
||||
// NOTE: MemoryMapDB does this, too. Otherwise, CodeBrowserPlugin does not hear.
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObjectEvent.RESTORED));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -547,20 +538,20 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
if (!isRegionVisible(region)) {
|
||||
return;
|
||||
}
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_MEMORY_BLOCK_REMOVED,
|
||||
eventQueues.fireEvent(new ProgramChangeRecord(ProgramEvent.MEMORY_BLOCK_REMOVED,
|
||||
region.getMinAddress(), region.getMaxAddress(), null, null, null));
|
||||
// NOTE: MemoryMapDB does this, too. Otherwise, CodeBrowserPlugin does not hear.
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED));
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObjectEvent.RESTORED));
|
||||
}
|
||||
|
||||
private void sourceArchiveAdded(UniversalID id) {
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_SOURCE_ARCHIVE_ADDED, null,
|
||||
null, id, null, null));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.SOURCE_ARCHIVE_ADDED, null, null,
|
||||
id, null, null));
|
||||
}
|
||||
|
||||
private void sourceArchiveChanged(UniversalID id) {
|
||||
fireEventAllViews(new ProgramChangeRecord(ChangeManager.DOCR_SOURCE_ARCHIVE_CHANGED,
|
||||
null, null, id, null, null));
|
||||
fireEventAllViews(new ProgramChangeRecord(ProgramEvent.SOURCE_ARCHIVE_CHANGED, null,
|
||||
null, id, null, null));
|
||||
}
|
||||
|
||||
private void symbolAdded(TraceAddressSpace space, TraceSymbol symbol) {
|
||||
@@ -572,8 +563,8 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
}
|
||||
|
||||
public void fireSymbolAdded(DomainObjectEventQueues queues, TraceSymbol symbol) {
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_ADDED,
|
||||
symbol.getAddress(), symbol.getAddress(), null, null, symbol));
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_ADDED, symbol.getAddress(),
|
||||
symbol.getAddress(), null, null, symbol));
|
||||
}
|
||||
|
||||
private void symbolSourceChanged(TraceAddressSpace space, TraceSymbol symbol) {
|
||||
@@ -581,7 +572,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_SOURCE_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_SOURCE_CHANGED,
|
||||
symbol.getAddress(), symbol.getAddress(), symbol, null, null));
|
||||
}
|
||||
|
||||
@@ -597,7 +588,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
oldPrimary = null;
|
||||
}
|
||||
assert oldQueues == newQueues || oldQueues == null;
|
||||
newQueues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_SET_AS_PRIMARY,
|
||||
newQueues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_PRIMARY_STATE_CHANGED,
|
||||
symbol.getAddress(), symbol.getAddress(), null, oldPrimary, newPrimary));
|
||||
}
|
||||
|
||||
@@ -607,7 +598,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_RENAMED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_RENAMED,
|
||||
symbol.getAddress(), symbol.getAddress(), symbol, oldName, newName));
|
||||
}
|
||||
|
||||
@@ -617,7 +608,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_SCOPE_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_SCOPE_CHANGED,
|
||||
symbol.getAddress(), symbol.getAddress(), symbol, oldParent, newParent));
|
||||
}
|
||||
|
||||
@@ -628,7 +619,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
return;
|
||||
}
|
||||
// Strange. This is fired as if by the reference rather than the symbol
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_ASSOCIATION_ADDED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_ASSOCIATION_ADDED,
|
||||
newRef.getFromAddress(), newRef.getFromAddress(), newRef, null, symbol));
|
||||
}
|
||||
|
||||
@@ -639,7 +630,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
return;
|
||||
}
|
||||
// Ditto as ADDED
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_ASSOCIATION_REMOVED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_ASSOCIATION_REMOVED,
|
||||
oldRef.getFromAddress(), oldRef.getFromAddress(), oldRef, symbol, null));
|
||||
}
|
||||
|
||||
@@ -649,7 +640,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_ADDRESS_CHANGED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ProgramEvent.SYMBOL_ADDRESS_CHANGED,
|
||||
oldAddress, oldAddress, symbol, oldAddress, newAddress));
|
||||
}
|
||||
|
||||
@@ -679,7 +670,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
|
||||
protected void fireSymbolRemoved(DomainObjectEventQueues queues, TraceSymbol symbol) {
|
||||
queues.fireEvent(
|
||||
new ProgramChangeRecord(ChangeManager.DOCR_SYMBOL_REMOVED, symbol.getAddress(),
|
||||
new ProgramChangeRecord(ProgramEvent.SYMBOL_REMOVED, symbol.getAddress(),
|
||||
symbol.getAddress(), symbol, symbol.getName(), symbol.getID()));
|
||||
}
|
||||
}
|
||||
@@ -780,7 +771,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
}
|
||||
|
||||
protected void viewportChanged() {
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED));
|
||||
eventQueues.fireEvent(new DomainObjectChangeRecord(DomainObjectEvent.RESTORED));
|
||||
}
|
||||
|
||||
protected void fireEventAllViews(DomainObjectChangeRecord ev) {
|
||||
@@ -795,7 +786,7 @@ public class DBTraceProgramView implements TraceProgramView {
|
||||
* Fires object-restored event on this view and all associated register views.
|
||||
*/
|
||||
protected void fireObjectRestored() {
|
||||
fireEventAllViews(new DomainObjectChangeRecord(DomainObject.DO_OBJECT_RESTORED));
|
||||
fireEventAllViews(new DomainObjectChangeRecord(DomainObjectEvent.RESTORED));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+12
-12
@@ -17,9 +17,10 @@ package ghidra.trace.database.stack;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.target.TargetStackFrame;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
import ghidra.framework.model.EventType;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.listing.CodeUnit;
|
||||
import ghidra.trace.database.target.DBTraceObject;
|
||||
@@ -52,8 +53,8 @@ public class DBTraceObjectStackFrame implements TraceObjectStackFrame, DBTraceOb
|
||||
|
||||
TargetObjectSchema schema = object.getTargetSchema();
|
||||
synchronized (KEYS_BY_SCHEMA) {
|
||||
keys = KEYS_BY_SCHEMA.computeIfAbsent(schema, s -> Set.of(
|
||||
schema.checkAliasedAttribute(TargetStackFrame.PC_ATTRIBUTE_NAME)));
|
||||
keys = KEYS_BY_SCHEMA.computeIfAbsent(schema,
|
||||
s -> Set.of(schema.checkAliasedAttribute(TargetStackFrame.PC_ATTRIBUTE_NAME)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,8 +89,8 @@ public class DBTraceObjectStackFrame implements TraceObjectStackFrame, DBTraceOb
|
||||
|
||||
@Override
|
||||
public Address getProgramCounter(long snap) {
|
||||
return TraceObjectInterfaceUtils.getValue(object, snap,
|
||||
TargetStackFrame.PC_ATTRIBUTE_NAME, Address.class, null);
|
||||
return TraceObjectInterfaceUtils.getValue(object, snap, TargetStackFrame.PC_ATTRIBUTE_NAME,
|
||||
Address.class, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -128,8 +129,7 @@ public class DBTraceObjectStackFrame implements TraceObjectStackFrame, DBTraceOb
|
||||
public void setComment(long snap, String comment) {
|
||||
/* See rant in getComment */
|
||||
try (LockHold hold = object.getTrace().lockWrite()) {
|
||||
TraceObjectValue pcAttr =
|
||||
object.getValue(snap, TargetStackFrame.PC_ATTRIBUTE_NAME);
|
||||
TraceObjectValue pcAttr = object.getValue(snap, TargetStackFrame.PC_ATTRIBUTE_NAME);
|
||||
object.getTrace()
|
||||
.getCommentAdapter()
|
||||
.setComment(pcAttr.getLifespan(), (Address) pcAttr.getValue(),
|
||||
@@ -166,7 +166,7 @@ public class DBTraceObjectStackFrame implements TraceObjectStackFrame, DBTraceOb
|
||||
}
|
||||
|
||||
protected long snapFor(TraceChangeRecord<?, ?> rec) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.VALUE_CREATED.getType()) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.VALUE_CREATED.getEventType()) {
|
||||
return TraceObjectChangeType.VALUE_CREATED.cast(rec).getAffectedObject().getMinSnap();
|
||||
}
|
||||
return computeMinSnap();
|
||||
@@ -179,18 +179,18 @@ public class DBTraceObjectStackFrame implements TraceObjectStackFrame, DBTraceOb
|
||||
|
||||
@Override
|
||||
public TraceChangeRecord<?, ?> translateEvent(TraceChangeRecord<?, ?> rec) {
|
||||
int type = rec.getEventType();
|
||||
if (type == TraceObjectChangeType.LIFE_CHANGED.getType()) {
|
||||
EventType type = rec.getEventType();
|
||||
if (type == TraceObjectChangeType.LIFE_CHANGED.getEventType()) {
|
||||
LifeSet newLife = object.getLife();
|
||||
if (!newLife.isEmpty()) {
|
||||
life = newLife;
|
||||
}
|
||||
return createChangeRecord();
|
||||
}
|
||||
else if (type == TraceObjectChangeType.VALUE_CREATED.getType() && changeApplies(rec)) {
|
||||
else if (type == TraceObjectChangeType.VALUE_CREATED.getEventType() && changeApplies(rec)) {
|
||||
return createChangeRecord();
|
||||
}
|
||||
else if (type == TraceObjectChangeType.DELETED.getType()) {
|
||||
else if (type == TraceObjectChangeType.DELETED.getEventType()) {
|
||||
if (life.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
+3
-3
@@ -115,7 +115,7 @@ public interface DBTraceObjectInterface extends TraceObjectInterface, TraceUniqu
|
||||
}
|
||||
|
||||
public TraceChangeRecord<?, ?> translate(TraceChangeRecord<?, ?> rec) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.LIFE_CHANGED.getType()) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.LIFE_CHANGED.getEventType()) {
|
||||
if (object.isDeleted()) {
|
||||
return null;
|
||||
}
|
||||
@@ -137,7 +137,7 @@ public interface DBTraceObjectInterface extends TraceObjectInterface, TraceUniqu
|
||||
throw new AssertionError("Life changed from empty to empty?");
|
||||
}
|
||||
}
|
||||
if (rec.getEventType() == TraceObjectChangeType.VALUE_CREATED.getType()) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.VALUE_CREATED.getEventType()) {
|
||||
if (object.isDeleted()) {
|
||||
return null;
|
||||
}
|
||||
@@ -160,7 +160,7 @@ public interface DBTraceObjectInterface extends TraceObjectInterface, TraceUniqu
|
||||
cast.getNewValue());
|
||||
return new TraceChangeRecord<>(type, getSpace(life), iface, null, null);
|
||||
}
|
||||
if (rec.getEventType() == TraceObjectChangeType.DELETED.getType()) {
|
||||
if (rec.getEventType() == TraceObjectChangeType.DELETED.getEventType()) {
|
||||
return translateDeleted(life);
|
||||
}
|
||||
return null;
|
||||
|
||||
@@ -74,8 +74,7 @@ public interface Trace extends DataTypeManagerDomainObject {
|
||||
return trace != null && trace.getObjectManager().getRootSchema() == null;
|
||||
}
|
||||
|
||||
public static final class TraceObjectChangeType<T, U>
|
||||
extends DefaultTraceChangeType<T, U> {
|
||||
public static final class TraceObjectChangeType<T, U> extends DefaultTraceChangeType<T, U> {
|
||||
/**
|
||||
* An object was created, but not yet inserted.
|
||||
*
|
||||
|
||||
+2
-2
@@ -22,9 +22,9 @@ public class TraceDomainObjectListener extends TypedEventDispatcher
|
||||
|
||||
@Override
|
||||
public void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
if (restoredHandler != null && ev.containsEvent(DomainObject.DO_OBJECT_RESTORED)) {
|
||||
if (restoredHandler != null && ev.contains(DomainObjectEvent.RESTORED)) {
|
||||
for (DomainObjectChangeRecord rec : ev) {
|
||||
if (rec.getEventType() == DomainObject.DO_OBJECT_RESTORED) {
|
||||
if (rec.getEventType() == DomainObjectEvent.RESTORED) {
|
||||
restoredHandler.accept(rec);
|
||||
return;
|
||||
}
|
||||
|
||||
+5
-6
@@ -19,8 +19,7 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import ghidra.framework.model.DomainObject;
|
||||
import ghidra.framework.model.DomainObjectChangeRecord;
|
||||
import ghidra.framework.model.*;
|
||||
import ghidra.trace.util.*;
|
||||
|
||||
public class TypedEventDispatcher {
|
||||
@@ -103,7 +102,7 @@ public class TypedEventDispatcher {
|
||||
}
|
||||
|
||||
private Map<TraceChangeType<?, ?>, EventRecordHandler<?, ?>> typedMap = new HashMap<>();
|
||||
private Map<Integer, Consumer<DomainObjectChangeRecord>> untypedMap = new HashMap<>();
|
||||
private Map<EventType, Consumer<DomainObjectChangeRecord>> untypedMap = new HashMap<>();
|
||||
protected Consumer<DomainObjectChangeRecord> restoredHandler = null;
|
||||
|
||||
protected <T, U> void listenFor(TraceChangeType<T, U> type, EventRecordHandler<T, U> handler) {
|
||||
@@ -156,8 +155,8 @@ public class TypedEventDispatcher {
|
||||
typedMap.put(type, handler);
|
||||
}
|
||||
|
||||
protected void listenForUntyped(int type, Consumer<DomainObjectChangeRecord> handler) {
|
||||
if (type == DomainObject.DO_OBJECT_RESTORED) {
|
||||
protected void listenForUntyped(EventType type, Consumer<DomainObjectChangeRecord> handler) {
|
||||
if (type == DomainObjectEvent.RESTORED) {
|
||||
restoredHandler = handler;
|
||||
}
|
||||
else {
|
||||
@@ -168,7 +167,7 @@ public class TypedEventDispatcher {
|
||||
public void handleChangeRecord(DomainObjectChangeRecord rec) {
|
||||
//String typeName = DefaultTraceChangeType.getName(rec.getEventType());
|
||||
//CountsByType.compute(typeName, (k, v) -> v == null ? 1 : v + 1);
|
||||
if (rec.getEventType() == DomainObject.DO_OBJECT_RESTORED && restoredHandler != null) {
|
||||
if (rec.getEventType() == DomainObjectEvent.RESTORED && restoredHandler != null) {
|
||||
restoredHandler.accept(rec);
|
||||
return;
|
||||
}
|
||||
|
||||
+6
-17
@@ -28,10 +28,8 @@ import ghidra.framework.model.DomainObjectChangeRecord;
|
||||
* @param <U> the type of the object's attribute that changed
|
||||
*/
|
||||
public class DefaultTraceChangeType<T, U> implements TraceChangeType<T, U> {
|
||||
private static int nextType = 0x3ACE; // Stay far away from manually-assigned types
|
||||
// But not too far, since it makes the bit set for events gigantic.
|
||||
|
||||
private static final Map<Integer, String> TYPE_NAMES = new HashMap<>();
|
||||
private static final Map<TraceEventType, String> TYPE_NAMES = new HashMap<>();
|
||||
private static final Set<Field> FIELD_BACKLOG = new HashSet<>();
|
||||
|
||||
private static void procType(Field f, TraceChangeType<?, ?> type) {
|
||||
@@ -42,7 +40,7 @@ public class DefaultTraceChangeType<T, U> implements TraceChangeType<T, U> {
|
||||
if (kind.endsWith("ChangeType")) {
|
||||
kind = kind.substring(0, kind.length() - "ChangeType".length());
|
||||
}
|
||||
TYPE_NAMES.put(type.getType(), kind + "." + f.getName());
|
||||
TYPE_NAMES.put(type.getEventType(), kind + "." + f.getName());
|
||||
}
|
||||
|
||||
private static <C extends TraceChangeType<?, ?>> void procField(Field f, Class<C> cls,
|
||||
@@ -96,26 +94,17 @@ public class DefaultTraceChangeType<T, U> implements TraceChangeType<T, U> {
|
||||
return "TYPE_0x" + Integer.toHexString(type);
|
||||
}
|
||||
|
||||
private static int nextType() {
|
||||
return nextType++;
|
||||
}
|
||||
|
||||
private final int type;
|
||||
private final TraceEventType eventType;
|
||||
|
||||
public DefaultTraceChangeType() {
|
||||
this.type = nextType();
|
||||
this.eventType = new TraceEventType(getClass().getSimpleName());
|
||||
|
||||
scanTypeNames(getClass());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSubType() {
|
||||
return 0;
|
||||
public TraceEventType getEventType() {
|
||||
return eventType;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
|
||||
+4
-4
@@ -27,7 +27,7 @@ public class TraceChangeRecord<T, U> extends DomainObjectChangeRecord {
|
||||
|
||||
public TraceChangeRecord(TraceChangeType<T, U> type, TraceAddressSpace space, T affectedObject,
|
||||
U oldValue, U newValue) {
|
||||
super(type.getType(), type.getSubType(), oldValue, newValue);
|
||||
super(type.getEventType(), oldValue, newValue);
|
||||
this.type = type;
|
||||
this.space = space;
|
||||
this.affectedObject = affectedObject;
|
||||
@@ -36,7 +36,7 @@ public class TraceChangeRecord<T, U> extends DomainObjectChangeRecord {
|
||||
|
||||
public TraceChangeRecord(TraceChangeType<T, U> type, TraceAddressSpace space, T affectedObject,
|
||||
U newValue) {
|
||||
super(type.getType(), type.getSubType(), null, newValue);
|
||||
super(type.getEventType(), null, newValue);
|
||||
this.type = type;
|
||||
this.space = space;
|
||||
this.affectedObject = affectedObject;
|
||||
@@ -45,7 +45,7 @@ public class TraceChangeRecord<T, U> extends DomainObjectChangeRecord {
|
||||
|
||||
public TraceChangeRecord(TraceChangeType<T, U> type, TraceAddressSpace space,
|
||||
T affectedObject) {
|
||||
super(type.getType(), type.getSubType(), null, null);
|
||||
super(type.getEventType(), null, null);
|
||||
this.type = type;
|
||||
this.space = space;
|
||||
this.affectedObject = affectedObject;
|
||||
@@ -53,7 +53,7 @@ public class TraceChangeRecord<T, U> extends DomainObjectChangeRecord {
|
||||
}
|
||||
|
||||
public TraceChangeRecord(TraceChangeType<T, U> type, TraceAddressSpace space) {
|
||||
super(type.getType(), type.getSubType(), null, null);
|
||||
super(type.getEventType(), null, null);
|
||||
this.type = type;
|
||||
this.space = space;
|
||||
this.affectedObject = null;
|
||||
|
||||
+1
-3
@@ -16,7 +16,5 @@
|
||||
package ghidra.trace.util;
|
||||
|
||||
public interface TraceChangeType<T, U> {
|
||||
int getType();
|
||||
|
||||
int getSubType();
|
||||
TraceEventType getEventType();
|
||||
}
|
||||
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
/* ###
|
||||
* IP: GHIDRA
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package ghidra.trace.util;
|
||||
|
||||
import ghidra.framework.model.DomainObjectEventIdGenerator;
|
||||
import ghidra.framework.model.EventType;
|
||||
|
||||
/**
|
||||
* EventTypes for trace events. This implementation exists because trace event types are not
|
||||
* currently structured as enums. This current implementation will not give a very good toString as
|
||||
* its actual event name is unknown, so it uses its event category class + its actual assigned
|
||||
* numerical id.
|
||||
*/
|
||||
public class TraceEventType implements EventType {
|
||||
|
||||
private final int id = DomainObjectEventIdGenerator.next();
|
||||
private String name;
|
||||
|
||||
TraceEventType(String name) {
|
||||
this.name = name + "(" + id + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
+18
-16
@@ -23,7 +23,7 @@ import ghidra.framework.model.*;
|
||||
import ghidra.framework.plugintool.ComponentProviderAdapter;
|
||||
import ghidra.program.model.address.AddressSet;
|
||||
import ghidra.program.model.listing.Program;
|
||||
import ghidra.program.util.ChangeManager;
|
||||
import ghidra.program.util.ProgramEvent;
|
||||
import ghidra.util.HelpLocation;
|
||||
import ghidra.util.table.*;
|
||||
|
||||
@@ -84,26 +84,28 @@ public class FunctionStartTableProvider extends ProgramAssociatedComponentProvid
|
||||
if (!isVisible()) {
|
||||
return;
|
||||
}
|
||||
if (ev.containsEvent(DomainObject.DO_OBJECT_RESTORED)) {
|
||||
if (ev.contains(DomainObjectEvent.RESTORED)) {
|
||||
model.reload();
|
||||
contextChanged();
|
||||
}
|
||||
for (int i = 0; i < ev.numRecords(); ++i) {
|
||||
DomainObjectChangeRecord doRecord = ev.getChangeRecord(i);
|
||||
int eventType = doRecord.getEventType();
|
||||
switch (eventType) {
|
||||
case ChangeManager.DOCR_FUNCTION_ADDED:
|
||||
case ChangeManager.DOCR_FUNCTION_REMOVED:
|
||||
case ChangeManager.DOCR_CODE_ADDED:
|
||||
case ChangeManager.DOCR_CODE_REMOVED:
|
||||
case ChangeManager.DOCR_CODE_REPLACED:
|
||||
case ChangeManager.DOCR_MEM_REF_TYPE_CHANGED:
|
||||
case ChangeManager.DOCR_MEM_REFERENCE_ADDED:
|
||||
case ChangeManager.DOCR_MEM_REFERENCE_REMOVED:
|
||||
model.reload();
|
||||
contextChanged();
|
||||
default:
|
||||
break;
|
||||
EventType eventType = doRecord.getEventType();
|
||||
if (eventType instanceof ProgramEvent type) {
|
||||
switch (type) {
|
||||
case FUNCTION_ADDED:
|
||||
case FUNCTION_REMOVED:
|
||||
case CODE_ADDED:
|
||||
case CODE_REMOVED:
|
||||
case CODE_REPLACED:
|
||||
case REFERENCE_TYPE_CHANGED:
|
||||
case REFERENCE_ADDED:
|
||||
case REFERENCE_REMOVED:
|
||||
model.reload();
|
||||
contextChanged();
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+6
-6
@@ -15,6 +15,9 @@
|
||||
*/
|
||||
package ghidra.features.bsim.gui.search.results;
|
||||
|
||||
import static ghidra.framework.model.DomainObjectEvent.*;
|
||||
import static ghidra.program.util.ProgramEvent.*;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.net.MalformedURLException;
|
||||
@@ -44,13 +47,13 @@ import ghidra.features.bsim.query.description.*;
|
||||
import ghidra.features.bsim.query.facade.SFQueryInfo;
|
||||
import ghidra.features.bsim.query.facade.SFQueryResult;
|
||||
import ghidra.features.bsim.query.protocol.BSimFilter;
|
||||
import ghidra.framework.model.*;
|
||||
import ghidra.framework.model.DomainObjectChangedEvent;
|
||||
import ghidra.framework.model.DomainObjectListener;
|
||||
import ghidra.framework.plugintool.ComponentProviderAdapter;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.program.database.symbol.FunctionSymbol;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.listing.*;
|
||||
import ghidra.program.util.ChangeManager;
|
||||
import ghidra.util.HelpLocation;
|
||||
import ghidra.util.Msg;
|
||||
import ghidra.util.datastruct.Counter;
|
||||
@@ -582,12 +585,9 @@ public class BSimSearchResultsProvider extends ComponentProviderAdapter {
|
||||
|
||||
@Override
|
||||
public void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
if (ev.containsEvent(ChangeManager.DOCR_SYMBOL_RENAMED) ||
|
||||
ev.containsEvent(DomainObject.DO_OBJECT_RESTORED)) {
|
||||
if (ev.contains(SYMBOL_RENAMED, RESTORED)) {
|
||||
matchesModel.fireTableDataChanged();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,21 +15,21 @@
|
||||
*/
|
||||
package ghidra.app.merge;
|
||||
|
||||
import java.rmi.NoSuchObjectException;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
|
||||
import ghidra.framework.main.ProgramaticUseOnly;
|
||||
import ghidra.framework.model.*;
|
||||
import ghidra.framework.plugintool.*;
|
||||
import ghidra.program.model.listing.Program;
|
||||
import ghidra.util.Msg;
|
||||
|
||||
import java.rmi.NoSuchObjectException;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
|
||||
/**
|
||||
* Plugin that provides a merge component provider.
|
||||
*/
|
||||
public abstract class MergeManagerPlugin extends Plugin implements ProgramaticUseOnly,
|
||||
DomainObjectListener {
|
||||
public abstract class MergeManagerPlugin extends Plugin
|
||||
implements ProgramaticUseOnly, DomainObjectListener {
|
||||
|
||||
protected MergeManager mergeManager;
|
||||
protected MergeManagerProvider provider;
|
||||
@@ -180,21 +180,19 @@ public abstract class MergeManagerPlugin extends Plugin implements ProgramaticUs
|
||||
public void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
// Only concerned about error which will be the only change record
|
||||
DomainObjectChangeRecord docr = ev.getChangeRecord(0);
|
||||
if (!domainFileErrorOccurred && docr.getEventType() == DomainObject.DO_OBJECT_ERROR) {
|
||||
if (!domainFileErrorOccurred && docr.getEventType() == DomainObjectEvent.ERROR) {
|
||||
domainFileErrorOccurred = true;
|
||||
String msg;
|
||||
Throwable t = (Throwable) docr.getNewValue();
|
||||
if (t instanceof NoSuchObjectException) {
|
||||
msg =
|
||||
"Merge is closing due to an unrecoverable error!"
|
||||
+ "\nThis error can be caused when your system becomes"
|
||||
+ "\nsuspended or due to a server/network problem.";
|
||||
msg = "Merge is closing due to an unrecoverable error!" +
|
||||
"\nThis error can be caused when your system becomes" +
|
||||
"\nsuspended or due to a server/network problem.";
|
||||
}
|
||||
else {
|
||||
msg =
|
||||
"Merge is closing due to an unrecoverable error!"
|
||||
+ "\n \nSuch failures are generally due to an IO Error caused"
|
||||
+ "\nby the local filesystem or server.";
|
||||
msg = "Merge is closing due to an unrecoverable error!" +
|
||||
"\n \nSuch failures are generally due to an IO Error caused" +
|
||||
"\nby the local filesystem or server.";
|
||||
}
|
||||
|
||||
//abort();
|
||||
|
||||
+88
-103
@@ -346,21 +346,6 @@ public class AutoAnalysisManager implements DomainObjectListener {
|
||||
debugOn = b;
|
||||
}
|
||||
|
||||
private boolean isFunctionModifierChange(ProgramChangeRecord functionChangeRecord) {
|
||||
int subType = functionChangeRecord.getSubEventType();
|
||||
return subType == ChangeManager.FUNCTION_CHANGED_THUNK ||
|
||||
subType == ChangeManager.FUNCTION_CHANGED_INLINE ||
|
||||
subType == ChangeManager.FUNCTION_CHANGED_NORETURN ||
|
||||
subType == ChangeManager.FUNCTION_CHANGED_CALL_FIXUP ||
|
||||
subType == ChangeManager.FUNCTION_CHANGED_PURGE;
|
||||
}
|
||||
|
||||
private boolean isFunctionSignatureChange(ProgramChangeRecord functionChangeRecord) {
|
||||
int subType = functionChangeRecord.getSubEventType();
|
||||
return subType == ChangeManager.FUNCTION_CHANGED_PARAMETERS ||
|
||||
subType == ChangeManager.FUNCTION_CHANGED_RETURN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
if (program == null) {
|
||||
@@ -380,97 +365,97 @@ public class AutoAnalysisManager implements DomainObjectListener {
|
||||
boolean optionsChanged = false;
|
||||
for (int i = 0; i < eventCnt; ++i) {
|
||||
DomainObjectChangeRecord doRecord = ev.getChangeRecord(i);
|
||||
if (doRecord.getEventType() == ChangeManager.DOCR_LANGUAGE_CHANGED) {
|
||||
if (doRecord.getEventType() == ProgramEvent.LANGUAGE_CHANGED) {
|
||||
initializeAnalyzers();
|
||||
}
|
||||
|
||||
int eventType = doRecord.getEventType();
|
||||
ProgramChangeRecord pcr;
|
||||
|
||||
switch (eventType) {
|
||||
case DomainObject.DO_OBJECT_RESTORED:
|
||||
case DomainObject.DO_PROPERTY_CHANGED:
|
||||
if (!optionsChanged) {
|
||||
initializeOptions();
|
||||
Preferences.store();
|
||||
optionsChanged = true;
|
||||
}
|
||||
break;
|
||||
// TODO: Add Symbol analyzer type
|
||||
// case ChangeManager.DOCR_SYMBOL_ADDED:
|
||||
// case ChangeManager.DOCR_SYMBOL_RENAMED:
|
||||
// pcr = (ProgramChangeRecord) doRecord;
|
||||
// // if a function is created using the current name, don't throw symbol added/renamed
|
||||
// // split variable changed/added from SYMBOL added - change record is already different
|
||||
// if (pcr.getObject() != null && pcr.getObject() instanceof VariableSymbolDB) {
|
||||
EventType eventType = doRecord.getEventType();
|
||||
if (eventType == DomainObjectEvent.RESTORED ||
|
||||
eventType == DomainObjectEvent.PROPERTY_CHANGED) {
|
||||
if (!optionsChanged) {
|
||||
initializeOptions();
|
||||
Preferences.store();
|
||||
optionsChanged = true;
|
||||
}
|
||||
}
|
||||
else if (eventType instanceof ProgramEvent pe) {
|
||||
ProgramChangeRecord pcr = (ProgramChangeRecord) doRecord;
|
||||
switch (pe) {
|
||||
case FUNCTION_CHANGED:
|
||||
FunctionChangeRecord fcr = (FunctionChangeRecord) doRecord;
|
||||
Address entry = fcr.getFunction().getEntryPoint();
|
||||
if (fcr.isFunctionSignatureChange()) {
|
||||
functionSignatureChanged(entry);
|
||||
}
|
||||
else if (fcr.isFunctionModifierChange()) {
|
||||
functionModifierChanged(entry);
|
||||
}
|
||||
break;
|
||||
case FUNCTION_ADDED:
|
||||
case FUNCTION_BODY_CHANGED:
|
||||
Function func = (Function) pcr.getObject();
|
||||
if (!func.isExternal()) {
|
||||
functionDefined(func.getEntryPoint());
|
||||
}
|
||||
break;
|
||||
case FUNCTION_REMOVED:
|
||||
Address oldEntry = pcr.getStart();
|
||||
functionTasks.notifyRemoved(oldEntry);
|
||||
break;
|
||||
case FALLTHROUGH_CHANGED:
|
||||
case FLOW_OVERRIDE_CHANGED:
|
||||
case LENGTH_OVERRIDE_CHANGED:
|
||||
// TODO: not sure if this should be done this way or explicitly
|
||||
// via the application commands (this is inconsistent with other
|
||||
// codeDefined cases which do not rely on change events (e.g., disassembly)
|
||||
codeDefined(new AddressSet(pcr.getStart()));
|
||||
break;
|
||||
// FIXME: must resolve cyclic issues before this can be done
|
||||
// case MEM_REFERENCE_ADDED:
|
||||
// // Allow high-priority reference-driven code analyzers a
|
||||
// // shot at processing computed flows determined during
|
||||
// // constant propagation.
|
||||
// pcr = (ProgramChangeRecord) doRecord;
|
||||
// Reference ref = (Reference) pcr.getNewValue();
|
||||
// RefType refType = ref.getReferenceType();
|
||||
// if (refType.isComputed()) {
|
||||
// codeDefined(ref.getFromAddress());
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
// Symbol sym = null;
|
||||
// Object newValue = pcr.getNewValue();
|
||||
// if (newValue != null && newValue instanceof Symbol) {
|
||||
// sym = (Symbol) newValue;
|
||||
// } else if (pcr.getObject() != null && pcr.getObject() instanceof Symbol) {
|
||||
// sym = (Symbol) pcr.getObject();
|
||||
// }
|
||||
// if (sym == null) {
|
||||
// break;
|
||||
// }
|
||||
// SymbolType symbolType = sym.getSymbolType();
|
||||
// if ((symbolType == SymbolType.CODE || symbolType == SymbolType.FUNCTION) && sym.getSource() != SourceType.DEFAULT) {
|
||||
// symbolTasks.notifyAdded(sym.getAddress());
|
||||
// }
|
||||
// break;
|
||||
case ChangeManager.DOCR_FUNCTION_CHANGED:
|
||||
pcr = (ProgramChangeRecord) doRecord;
|
||||
Function func = (Function) pcr.getObject();
|
||||
if (isFunctionSignatureChange(pcr)) {
|
||||
functionSignatureChanged(func.getEntryPoint());
|
||||
}
|
||||
else if (isFunctionModifierChange(pcr)) {
|
||||
functionModifierChanged(func.getEntryPoint());
|
||||
}
|
||||
break;
|
||||
case ChangeManager.DOCR_FUNCTION_ADDED:
|
||||
case ChangeManager.DOCR_FUNCTION_BODY_CHANGED:
|
||||
pcr = (ProgramChangeRecord) doRecord;
|
||||
func = (Function) pcr.getObject();
|
||||
if (!func.isExternal()) {
|
||||
functionDefined(func.getEntryPoint());
|
||||
}
|
||||
break;
|
||||
case ChangeManager.DOCR_FUNCTION_REMOVED:
|
||||
pcr = (ProgramChangeRecord) doRecord;
|
||||
Address oldEntry = pcr.getStart();
|
||||
functionTasks.notifyRemoved(oldEntry);
|
||||
break;
|
||||
case ChangeManager.DOCR_FALLTHROUGH_CHANGED:
|
||||
case ChangeManager.DOCR_FLOWOVERRIDE_CHANGED:
|
||||
case ChangeManager.DOCR_LENGTH_OVERRIDE_CHANGED:
|
||||
// TODO: not sure if this should be done this way or explicitly
|
||||
// via the application commands (this is inconsistent with other
|
||||
// codeDefined cases which do not rely on change events (e.g., disassembly)
|
||||
pcr = (ProgramChangeRecord) doRecord;
|
||||
codeDefined(new AddressSet(pcr.getStart()));
|
||||
break;
|
||||
// FIXME: must resolve cyclic issues before this can be done
|
||||
// case ChangeManager.DOCR_MEM_REFERENCE_ADDED:
|
||||
// // Allow high-priority reference-driven code analyzers a
|
||||
// // shot at processing computed flows determined during
|
||||
// // constant propagation.
|
||||
// pcr = (ProgramChangeRecord) doRecord;
|
||||
// Reference ref = (Reference) pcr.getNewValue();
|
||||
// RefType refType = ref.getReferenceType();
|
||||
// if (refType.isComputed()) {
|
||||
// codeDefined(ref.getFromAddress());
|
||||
// }
|
||||
// break;
|
||||
case ChangeManager.DOCR_CODE_ADDED:
|
||||
pcr = (ProgramChangeRecord) doRecord;
|
||||
if (pcr.getNewValue() instanceof Data) {
|
||||
AddressSet addressSet = new AddressSet(pcr.getStart(), pcr.getEnd());
|
||||
dataDefined(addressSet);
|
||||
}
|
||||
break;
|
||||
case CODE_ADDED:
|
||||
if (pcr.getNewValue() instanceof Data) {
|
||||
AddressSet addressSet = new AddressSet(pcr.getStart(), pcr.getEnd());
|
||||
dataDefined(addressSet);
|
||||
}
|
||||
break;
|
||||
// TODO: Add Symbol analyzer type
|
||||
// case SYMBOL_ADDED:
|
||||
// case SYMBOL_RENAMED:
|
||||
// pcr = (ProgramChangeRecord) doRecord;
|
||||
// // if a function is created using the current name, don't throw symbol added/renamed
|
||||
// // split variable changed/added from SYMBOL added - change record is already different
|
||||
// if (pcr.getObject() != null &&
|
||||
// pcr.getObject() instanceof VariableSymbolDB) {
|
||||
// break;
|
||||
// }
|
||||
// Symbol sym = null;
|
||||
// Object newValue = pcr.getNewValue();
|
||||
// if (newValue != null && newValue instanceof Symbol) {
|
||||
// sym = (Symbol) newValue;
|
||||
// }
|
||||
// else if (pcr.getObject() != null && pcr.getObject() instanceof Symbol) {
|
||||
// sym = (Symbol) pcr.getObject();
|
||||
// }
|
||||
// if (sym == null) {
|
||||
// break;
|
||||
// }
|
||||
// SymbolType symbolType = sym.getSymbolType();
|
||||
// if ((symbolType == SymbolType.CODE || symbolType == SymbolType.FUNCTION) &&
|
||||
// sym.getSource() != SourceType.DEFAULT) {
|
||||
// symbolTasks.notifyAdded(sym.getAddress());
|
||||
// }
|
||||
// break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+34
-43
@@ -15,6 +15,9 @@
|
||||
*/
|
||||
package ghidra.app.plugin.core.bookmark;
|
||||
|
||||
import static ghidra.framework.model.DomainObjectEvent.*;
|
||||
import static ghidra.program.util.ProgramEvent.*;
|
||||
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.util.*;
|
||||
|
||||
@@ -166,8 +169,8 @@ public class BookmarkPlugin extends ProgramPlugin
|
||||
}
|
||||
};
|
||||
icon = new GIcon("icon.plugin.bookmark.select");
|
||||
selectionAction.setPopupMenuData(
|
||||
new MenuData(new String[] { "Select Bookmark Locations" }, icon));
|
||||
selectionAction
|
||||
.setPopupMenuData(new MenuData(new String[] { "Select Bookmark Locations" }, icon));
|
||||
selectionAction.setToolBarData(new ToolBarData(icon));
|
||||
selectionAction.setEnabled(true);
|
||||
tool.addLocalAction(provider, selectionAction);
|
||||
@@ -294,57 +297,45 @@ public class BookmarkPlugin extends ProgramPlugin
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
public synchronized void domainObjectChanged(DomainObjectChangedEvent event) {
|
||||
|
||||
if (ev.containsEvent(DomainObject.DO_OBJECT_RESTORED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCK_MOVED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCK_REMOVED)) {
|
||||
if (event.contains(RESTORED, MEMORY_BLOCK_MOVED, MEMORY_BLOCK_REMOVED)) {
|
||||
scheduleUpdate(null);
|
||||
provider.reload();
|
||||
return;
|
||||
}
|
||||
if (!event.contains(BOOKMARK_REMOVED, BOOKMARK_ADDED, BOOKMARK_CHANGED, BOOKMARK_TYPE_ADDED,
|
||||
BOOKMARK_TYPE_REMOVED)) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < ev.numRecords(); i++) {
|
||||
DomainObjectChangeRecord record = ev.getChangeRecord(i);
|
||||
for (int i = 0; i < event.numRecords(); i++) {
|
||||
DomainObjectChangeRecord record = event.getChangeRecord(i);
|
||||
|
||||
int eventType = record.getEventType();
|
||||
if (!(record instanceof ProgramChangeRecord)) {
|
||||
EventType eventType = record.getEventType();
|
||||
if (!(record instanceof ProgramChangeRecord rec)) {
|
||||
continue;
|
||||
}
|
||||
switch (eventType) {
|
||||
|
||||
case ChangeManager.DOCR_BOOKMARK_REMOVED: {
|
||||
ProgramChangeRecord rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
Bookmark bookmark = (Bookmark) rec.getObject();
|
||||
bookmarkRemoved(bookmark);
|
||||
break;
|
||||
if (eventType instanceof ProgramEvent ev) {
|
||||
switch (ev) {
|
||||
case BOOKMARK_REMOVED:
|
||||
bookmarkRemoved((Bookmark) rec.getObject());
|
||||
break;
|
||||
case BOOKMARK_ADDED:
|
||||
bookmarkAdded((Bookmark) rec.getObject());
|
||||
break;
|
||||
case BOOKMARK_CHANGED:
|
||||
bookmarkChanged((Bookmark) rec.getObject());
|
||||
break;
|
||||
case BOOKMARK_TYPE_ADDED:
|
||||
BookmarkType bookmarkType = (BookmarkType) rec.getObject();
|
||||
if (bookmarkType != null) {
|
||||
typeAdded(bookmarkType.getTypeString());
|
||||
}
|
||||
break;
|
||||
default:
|
||||
repaintMgr.update();
|
||||
}
|
||||
|
||||
case ChangeManager.DOCR_BOOKMARK_ADDED: {
|
||||
ProgramChangeRecord rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
Bookmark bookmark = (Bookmark) rec.getObject();
|
||||
bookmarkAdded(bookmark);
|
||||
break;
|
||||
}
|
||||
|
||||
case ChangeManager.DOCR_BOOKMARK_CHANGED: {
|
||||
ProgramChangeRecord rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
Bookmark bookmark = (Bookmark) rec.getObject();
|
||||
bookmarkChanged(bookmark);
|
||||
break;
|
||||
}
|
||||
|
||||
case ChangeManager.DOCR_BOOKMARK_TYPE_ADDED: {
|
||||
ProgramChangeRecord rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
BookmarkType bookmarkType = (BookmarkType) rec.getObject();
|
||||
if (bookmarkType != null) {
|
||||
typeAdded(bookmarkType.getTypeString());
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
repaintMgr.update();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+29
-24
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package ghidra.app.plugin.core.calltree;
|
||||
|
||||
import static ghidra.framework.model.DomainObjectEvent.*;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.util.List;
|
||||
@@ -1052,39 +1054,42 @@ public class CallTreeProvider extends ComponentProviderAdapter implements Domain
|
||||
return; // nothing to update
|
||||
}
|
||||
|
||||
if (event.containsEvent(DomainObject.DO_OBJECT_RESTORED)) {
|
||||
if (event.contains(RESTORED)) {
|
||||
setStale(true);
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < event.numRecords(); i++) {
|
||||
DomainObjectChangeRecord domainObjectRecord = event.getChangeRecord(i);
|
||||
int eventType = domainObjectRecord.getEventType();
|
||||
|
||||
switch (eventType) {
|
||||
case ChangeManager.DOCR_MEMORY_BLOCK_MOVED:
|
||||
case ChangeManager.DOCR_MEMORY_BLOCK_REMOVED:
|
||||
case ChangeManager.DOCR_SYMBOL_ADDED:
|
||||
case ChangeManager.DOCR_SYMBOL_REMOVED:
|
||||
case ChangeManager.DOCR_MEM_REFERENCE_ADDED:
|
||||
case ChangeManager.DOCR_MEM_REFERENCE_REMOVED:
|
||||
setStale(true);
|
||||
break;
|
||||
case ChangeManager.DOCR_SYMBOL_RENAMED:
|
||||
Symbol symbol = (Symbol) ((ProgramChangeRecord) domainObjectRecord).getObject();
|
||||
if (!(symbol instanceof FunctionSymbol)) {
|
||||
EventType eventType = domainObjectRecord.getEventType();
|
||||
if (eventType instanceof ProgramEvent type) {
|
||||
switch (type) {
|
||||
case MEMORY_BLOCK_MOVED:
|
||||
case MEMORY_BLOCK_REMOVED:
|
||||
case SYMBOL_ADDED:
|
||||
case SYMBOL_REMOVED:
|
||||
case REFERENCE_ADDED:
|
||||
case REFERENCE_REMOVED:
|
||||
setStale(true);
|
||||
break;
|
||||
}
|
||||
case SYMBOL_RENAMED:
|
||||
Symbol symbol =
|
||||
(Symbol) ((ProgramChangeRecord) domainObjectRecord).getObject();
|
||||
if (!(symbol instanceof FunctionSymbol)) {
|
||||
break;
|
||||
}
|
||||
|
||||
FunctionSymbol functionSymbol = (FunctionSymbol) symbol;
|
||||
Function function = (Function) functionSymbol.getObject();
|
||||
if (updateRootNodes(function)) {
|
||||
return; // the entire tree will be rebuilt
|
||||
}
|
||||
FunctionSymbol functionSymbol = (FunctionSymbol) symbol;
|
||||
Function function = (Function) functionSymbol.getObject();
|
||||
if (updateRootNodes(function)) {
|
||||
return; // the entire tree will be rebuilt
|
||||
}
|
||||
|
||||
incomingTree.runTask(new UpdateFunctionNodeTask(incomingTree, function));
|
||||
outgoingTree.runTask(new UpdateFunctionNodeTask(outgoingTree, function));
|
||||
break;
|
||||
incomingTree.runTask(new UpdateFunctionNodeTask(incomingTree, function));
|
||||
outgoingTree.runTask(new UpdateFunctionNodeTask(outgoingTree, function));
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -870,14 +870,14 @@ public abstract class AbstractCodeBrowserPlugin<P extends CodeViewerProvider> ex
|
||||
|
||||
@Override
|
||||
public void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
if (ev.containsEvent(DomainObject.DO_DOMAIN_FILE_CHANGED)) {
|
||||
if (ev.contains(DomainObjectEvent.FILE_CHANGED)) {
|
||||
connectedProvider.updateTitle();
|
||||
}
|
||||
|
||||
if (viewManager != null) {
|
||||
return;
|
||||
}
|
||||
if (ev.containsEvent(DomainObject.DO_OBJECT_RESTORED)) {
|
||||
if (ev.contains(DomainObjectEvent.RESTORED)) {
|
||||
viewChanged(currentProgram.getMemory());
|
||||
}
|
||||
}
|
||||
|
||||
+9
-9
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package ghidra.app.plugin.core.colorizer;
|
||||
|
||||
import static ghidra.program.util.ProgramEvent.*;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -40,7 +42,6 @@ import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.framework.plugintool.util.PluginStatus;
|
||||
import ghidra.program.model.address.*;
|
||||
import ghidra.program.model.listing.Program;
|
||||
import ghidra.program.util.ChangeManager;
|
||||
import ghidra.program.util.ProgramSelection;
|
||||
import ghidra.util.ColorUtils;
|
||||
import ghidra.util.HelpLocation;
|
||||
@@ -266,8 +267,9 @@ public class ColorizingPlugin extends ProgramPlugin implements DomainObjectListe
|
||||
return !set.isEmpty();
|
||||
}
|
||||
};
|
||||
clearAllAction.setPopupMenuData(new MenuData(new String[] { MENU_PULLRIGHT,
|
||||
"Clear All Colors" }, null, group, MenuData.NO_MNEMONIC, Integer.toString(subgroup++)));
|
||||
clearAllAction
|
||||
.setPopupMenuData(new MenuData(new String[] { MENU_PULLRIGHT, "Clear All Colors" },
|
||||
null, group, MenuData.NO_MNEMONIC, Integer.toString(subgroup++)));
|
||||
clearAllAction.setHelpLocation(helpLocation);
|
||||
|
||||
//
|
||||
@@ -299,9 +301,8 @@ public class ColorizingPlugin extends ProgramPlugin implements DomainObjectListe
|
||||
|
||||
@Override
|
||||
public void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
if (ev.containsEvent(ChangeManager.DOCR_INT_ADDRESS_SET_PROPERTY_MAP_ADDED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_INT_ADDRESS_SET_PROPERTY_MAP_REMOVED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_INT_ADDRESS_SET_PROPERTY_MAP_CHANGED)) {
|
||||
if (ev.contains(INT_PROPERTY_MAP_ADDED, INT_PROPERTY_MAP_REMOVED,
|
||||
INT_PROPERTY_MAP_CHANGED)) {
|
||||
updateManager.update();
|
||||
}
|
||||
}
|
||||
@@ -340,9 +341,8 @@ public class ColorizingPlugin extends ProgramPlugin implements DomainObjectListe
|
||||
color = MARKER_COLOR;
|
||||
}
|
||||
|
||||
markerSet =
|
||||
markerService.createPointMarker(MARKER_NAME, MARKER_DESCRIPTION, currentProgram,
|
||||
PRIORITY, false, true, false, color, null);
|
||||
markerSet = markerService.createPointMarker(MARKER_NAME, MARKER_DESCRIPTION,
|
||||
currentProgram, PRIORITY, false, true, false, color, null);
|
||||
}
|
||||
else {
|
||||
markerSet.clearAll();
|
||||
|
||||
+28
-67
@@ -15,20 +15,24 @@
|
||||
*/
|
||||
package ghidra.app.plugin.core.commentwindow;
|
||||
|
||||
import static ghidra.framework.model.DomainObjectEvent.*;
|
||||
import static ghidra.program.util.ProgramEvent.*;
|
||||
|
||||
import docking.action.DockingAction;
|
||||
import ghidra.app.CorePluginPackage;
|
||||
import ghidra.app.events.ProgramSelectionPluginEvent;
|
||||
import ghidra.app.plugin.PluginCategoryNames;
|
||||
import ghidra.app.plugin.ProgramPlugin;
|
||||
import ghidra.app.services.GoToService;
|
||||
import ghidra.framework.model.*;
|
||||
import ghidra.framework.model.DomainObjectChangedEvent;
|
||||
import ghidra.framework.model.DomainObjectListener;
|
||||
import ghidra.framework.plugintool.PluginInfo;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.framework.plugintool.util.PluginStatus;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.listing.CodeUnit;
|
||||
import ghidra.program.model.listing.Program;
|
||||
import ghidra.program.util.*;
|
||||
import ghidra.program.util.CommentChangeRecord;
|
||||
import ghidra.program.util.ProgramSelection;
|
||||
import ghidra.util.table.SelectionNavigationAction;
|
||||
import ghidra.util.table.actions.MakeProgramSelectionAction;
|
||||
import ghidra.util.task.SwingUpdateManager;
|
||||
@@ -78,81 +82,38 @@ public class CommentWindowPlugin extends ProgramPlugin implements DomainObjectLi
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
private int getCommentType(int type) {
|
||||
if (type == ChangeManager.DOCR_PRE_COMMENT_CHANGED) {
|
||||
return CodeUnit.PRE_COMMENT;
|
||||
}
|
||||
if (type == ChangeManager.DOCR_POST_COMMENT_CHANGED) {
|
||||
return CodeUnit.POST_COMMENT;
|
||||
}
|
||||
if (type == ChangeManager.DOCR_EOL_COMMENT_CHANGED) {
|
||||
return CodeUnit.EOL_COMMENT;
|
||||
}
|
||||
if (type == ChangeManager.DOCR_PLATE_COMMENT_CHANGED) {
|
||||
return CodeUnit.PLATE_COMMENT;
|
||||
}
|
||||
if ((type == ChangeManager.DOCR_REPEATABLE_COMMENT_CHANGED) ||
|
||||
(type == ChangeManager.DOCR_REPEATABLE_COMMENT_ADDED) ||
|
||||
(type == ChangeManager.DOCR_REPEATABLE_COMMENT_REMOVED) ||
|
||||
(type == ChangeManager.DOCR_REPEATABLE_COMMENT_CREATED) ||
|
||||
(type == ChangeManager.DOCR_REPEATABLE_COMMENT_DELETED)) {
|
||||
return CodeUnit.REPEATABLE_COMMENT;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
|
||||
// reload the table if an undo/redo or clear code with options event happens (it isn't the
|
||||
// same as a delete comment)
|
||||
if (ev.containsEvent(DomainObject.DO_OBJECT_RESTORED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_CODE_REMOVED)) {
|
||||
if (ev.contains(RESTORED, CODE_REMOVED)) {
|
||||
reload();
|
||||
return;
|
||||
}
|
||||
|
||||
// check for and handle commend added, comment deleted, and comment changed events
|
||||
if (ev.containsEvent(ChangeManager.DOCR_PRE_COMMENT_CHANGED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_POST_COMMENT_CHANGED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_EOL_COMMENT_CHANGED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_PLATE_COMMENT_CHANGED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_REPEATABLE_COMMENT_CHANGED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_REPEATABLE_COMMENT_ADDED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_REPEATABLE_COMMENT_REMOVED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_REPEATABLE_COMMENT_CREATED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_REPEATABLE_COMMENT_ADDED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_REPEATABLE_COMMENT_DELETED)) {
|
||||
ev.forEach(COMMENT_CHANGED, r -> {
|
||||
CommentChangeRecord ccr = (CommentChangeRecord) r;
|
||||
int commentType = ccr.getCommentType();
|
||||
String oldComment = ccr.getOldComment();
|
||||
String newComment = ccr.getNewComment();
|
||||
Address commentAddress = ccr.getStart();
|
||||
|
||||
for (DomainObjectChangeRecord record : ev) {
|
||||
|
||||
int type = record.getEventType();
|
||||
int commentType = getCommentType(type);
|
||||
if (commentType == -1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ProgramChangeRecord pRec = (ProgramChangeRecord) record;
|
||||
|
||||
String oldComment = (String) pRec.getOldValue();
|
||||
String newComment = (String) pRec.getNewValue();
|
||||
Address commentAddress = pRec.getStart();
|
||||
|
||||
// if old comment is null then the change is an add comment so add the comment to the table
|
||||
if (oldComment == null) {
|
||||
provider.commentAdded(commentAddress, getCommentType(type));
|
||||
}
|
||||
|
||||
// if the new comment is null then the change is a delete comment so remove the comment from the table
|
||||
else if (newComment == null) {
|
||||
provider.commentRemoved(commentAddress, getCommentType(type));
|
||||
}
|
||||
// otherwise, the comment is changed so repaint the table
|
||||
else {
|
||||
provider.getComponent().repaint();
|
||||
}
|
||||
// if old comment is null then the change is an add comment so add the comment to the table
|
||||
if (oldComment == null) {
|
||||
provider.commentAdded(commentAddress, commentType);
|
||||
}
|
||||
}
|
||||
|
||||
// if the new comment is null then the change is a delete comment so remove the comment from the table
|
||||
else if (newComment == null) {
|
||||
provider.commentRemoved(commentAddress, commentType);
|
||||
}
|
||||
// otherwise, the comment is changed so repaint the table
|
||||
else {
|
||||
provider.getComponent().repaint();
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
private void reload() {
|
||||
|
||||
+6
-8
@@ -83,9 +83,8 @@ import ghidra.util.task.TaskMonitor;
|
||||
servicesProvided = { DataTypeManagerService.class, DataTypeArchiveService.class }
|
||||
)
|
||||
//@formatter:on
|
||||
public class DataTypeManagerPlugin extends ProgramPlugin
|
||||
implements DomainObjectListener, DataTypeManagerService, DataTypeArchiveService,
|
||||
PopupActionProvider {
|
||||
public class DataTypeManagerPlugin extends ProgramPlugin implements DomainObjectListener,
|
||||
DataTypeManagerService, DataTypeArchiveService, PopupActionProvider {
|
||||
|
||||
private static final String EXTENSIONS_PATH_PREFIX = Path.GHIDRA_HOME + "/Extensions";
|
||||
|
||||
@@ -281,7 +280,7 @@ public class DataTypeManagerPlugin extends ProgramPlugin
|
||||
|
||||
@Override
|
||||
public void domainObjectChanged(DomainObjectChangedEvent event) {
|
||||
if (event.containsEvent(DomainObject.DO_OBJECT_RESTORED)) {
|
||||
if (event.contains(DomainObjectEvent.RESTORED)) {
|
||||
Object source = event.getSource();
|
||||
if (source instanceof DataTypeManagerDomainObject) {
|
||||
DataTypeManagerDomainObject domainObject = (DataTypeManagerDomainObject) source;
|
||||
@@ -290,7 +289,7 @@ public class DataTypeManagerPlugin extends ProgramPlugin
|
||||
editorManager.domainObjectRestored(domainObject);
|
||||
}
|
||||
}
|
||||
else if (event.containsEvent(DomainObject.DO_OBJECT_RENAMED)) {
|
||||
else if (event.contains(DomainObjectEvent.RENAMED)) {
|
||||
provider.programRenamed();
|
||||
}
|
||||
}
|
||||
@@ -580,9 +579,8 @@ public class DataTypeManagerPlugin extends ProgramPlugin
|
||||
|
||||
public void openProjectDataTypeArchive() {
|
||||
|
||||
OpenVersionedFileDialog<DataTypeArchive> dialog =
|
||||
new OpenVersionedFileDialog<>(tool, "Open Project Data Type Archive",
|
||||
DataTypeArchive.class);
|
||||
OpenVersionedFileDialog<DataTypeArchive> dialog = new OpenVersionedFileDialog<>(tool,
|
||||
"Open Project Data Type Archive", DataTypeArchive.class);
|
||||
dialog.setHelpLocation(new HelpLocation(HelpTopics.PROGRAM, "Open_File_Dialog"));
|
||||
dialog.addOkActionListener(ev -> {
|
||||
DomainFile domainFile = dialog.getDomainFile();
|
||||
|
||||
+18
-23
@@ -15,6 +15,9 @@
|
||||
*/
|
||||
package ghidra.app.plugin.core.datawindow;
|
||||
|
||||
import static ghidra.framework.model.DomainObjectEvent.*;
|
||||
import static ghidra.program.util.ProgramEvent.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
|
||||
@@ -26,7 +29,8 @@ import ghidra.app.plugin.PluginCategoryNames;
|
||||
import ghidra.app.plugin.ProgramPlugin;
|
||||
import ghidra.app.services.GoToService;
|
||||
import ghidra.app.services.ProgramTreeService;
|
||||
import ghidra.framework.model.*;
|
||||
import ghidra.framework.model.DomainObjectChangedEvent;
|
||||
import ghidra.framework.model.DomainObjectListener;
|
||||
import ghidra.framework.options.SaveState;
|
||||
import ghidra.framework.plugintool.*;
|
||||
import ghidra.framework.plugintool.util.PluginStatus;
|
||||
@@ -36,7 +40,8 @@ import ghidra.program.model.data.DataType;
|
||||
import ghidra.program.model.data.DataTypeManager;
|
||||
import ghidra.program.model.listing.Data;
|
||||
import ghidra.program.model.listing.Program;
|
||||
import ghidra.program.util.*;
|
||||
import ghidra.program.util.ProgramChangeRecord;
|
||||
import ghidra.program.util.ProgramSelection;
|
||||
import ghidra.util.table.SelectionNavigationAction;
|
||||
import ghidra.util.table.actions.MakeProgramSelectionAction;
|
||||
import ghidra.util.task.SwingUpdateManager;
|
||||
@@ -93,37 +98,27 @@ public class DataWindowPlugin extends ProgramPlugin implements DomainObjectListe
|
||||
|
||||
@Override
|
||||
public void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
if (ev.containsEvent(DomainObject.DO_OBJECT_RESTORED)) {
|
||||
if (ev.contains(RESTORED)) {
|
||||
resetTypes();
|
||||
reload();
|
||||
return;
|
||||
}
|
||||
if (ev.containsEvent(ChangeManager.DOCR_DATA_TYPE_ADDED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_DATA_TYPE_CHANGED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_DATA_TYPE_MOVED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_DATA_TYPE_RENAMED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_DATA_TYPE_REPLACED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_DATA_TYPE_SETTING_CHANGED)) {
|
||||
|
||||
if (ev.contains(DATA_TYPE_ADDED, DATA_TYPE_CHANGED, DATA_TYPE_MOVED, DATA_TYPE_RENAMED,
|
||||
DATA_TYPE_REPLACED, DATA_TYPE_SETTING_CHANGED)) {
|
||||
resetTypes();
|
||||
}
|
||||
if (ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCK_MOVED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCK_REMOVED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_CODE_REMOVED)) {
|
||||
|
||||
if (ev.contains(MEMORY_BLOCK_MOVED, MEMORY_BLOCK_REMOVED, CODE_REMOVED)) {
|
||||
reload();
|
||||
return; // if we are going to reload, no need to check for data additions.
|
||||
}
|
||||
if (ev.containsEvent(ChangeManager.DOCR_CODE_ADDED)) {
|
||||
for (int i = 0; i < ev.numRecords(); ++i) {
|
||||
DomainObjectChangeRecord doRecord = ev.getChangeRecord(i);
|
||||
int eventType = doRecord.getEventType();
|
||||
if (eventType == ChangeManager.DOCR_CODE_ADDED) {
|
||||
ProgramChangeRecord rec = (ProgramChangeRecord) doRecord;
|
||||
if (rec.getNewValue() instanceof Data) {
|
||||
provider.dataAdded(rec.getStart());
|
||||
}
|
||||
}
|
||||
|
||||
ev.forEach(CODE_ADDED, rec -> {
|
||||
if (rec.getNewValue() instanceof Data) {
|
||||
provider.dataAdded(((ProgramChangeRecord) rec).getStart());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void reload() {
|
||||
|
||||
+26
-26
@@ -15,6 +15,9 @@
|
||||
*/
|
||||
package ghidra.app.plugin.core.equate;
|
||||
|
||||
import static ghidra.framework.model.DomainObjectEvent.*;
|
||||
import static ghidra.program.util.ProgramEvent.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import docking.widgets.OptionDialog;
|
||||
@@ -23,7 +26,8 @@ import ghidra.app.plugin.PluginCategoryNames;
|
||||
import ghidra.app.plugin.ProgramPlugin;
|
||||
import ghidra.app.services.GoToService;
|
||||
import ghidra.framework.cmd.Command;
|
||||
import ghidra.framework.model.*;
|
||||
import ghidra.framework.model.DomainObjectChangedEvent;
|
||||
import ghidra.framework.model.DomainObjectListener;
|
||||
import ghidra.framework.plugintool.PluginInfo;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.framework.plugintool.util.PluginStatus;
|
||||
@@ -31,7 +35,6 @@ import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.listing.Program;
|
||||
import ghidra.program.model.symbol.Equate;
|
||||
import ghidra.program.model.symbol.EquateTable;
|
||||
import ghidra.program.util.ChangeManager;
|
||||
import ghidra.program.util.OperandFieldLocation;
|
||||
import ghidra.util.Msg;
|
||||
import ghidra.util.task.SwingUpdateManager;
|
||||
@@ -88,36 +91,33 @@ public class EquateTablePlugin extends ProgramPlugin implements DomainObjectList
|
||||
return;
|
||||
}
|
||||
|
||||
if (ev.containsEvent(DomainObject.DO_OBJECT_RESTORED)) {
|
||||
if (ev.contains(RESTORED)) {
|
||||
updateMgr.updateNow();
|
||||
return;
|
||||
}
|
||||
if (ev.containsEvent(ChangeManager.DOCR_EQUATE_ADDED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_EQUATE_REFERENCE_ADDED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_EQUATE_REFERENCE_REMOVED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_EQUATE_REMOVED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_EQUATE_RENAMED) ||
|
||||
|
||||
ev.containsEvent(ChangeManager.DOCR_SYMBOL_ADDED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_SYMBOL_REMOVED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_SYMBOL_RENAMED) ||
|
||||
|
||||
ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCK_ADDED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCK_MOVED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCK_REMOVED) ||
|
||||
|
||||
ev.containsEvent(ChangeManager.DOCR_FUNCTION_ADDED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_FUNCTION_CHANGED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_FUNCTION_REMOVED) ||
|
||||
|
||||
ev.containsEvent(ChangeManager.DOCR_CODE_ADDED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_CODE_MOVED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_CODE_REMOVED) ||
|
||||
|
||||
ev.containsEvent(ChangeManager.DOCR_DATA_TYPE_CHANGED)) {
|
||||
// @formatter:off
|
||||
if (ev.contains(EQUATE_ADDED,
|
||||
EQUATE_REFERENCE_ADDED,
|
||||
EQUATE_REFERENCE_REMOVED,
|
||||
EQUATE_REMOVED,
|
||||
EQUATE_RENAMED,
|
||||
SYMBOL_ADDED,
|
||||
SYMBOL_REMOVED,
|
||||
SYMBOL_RENAMED,
|
||||
MEMORY_BLOCK_ADDED,
|
||||
MEMORY_BLOCK_MOVED,
|
||||
MEMORY_BLOCK_REMOVED,
|
||||
FUNCTION_ADDED,
|
||||
FUNCTION_CHANGED,
|
||||
FUNCTION_REMOVED,
|
||||
CODE_ADDED,
|
||||
FRAGMENT_CHANGED,
|
||||
CODE_REMOVED,
|
||||
DATA_TYPE_CHANGED)) {
|
||||
|
||||
updateMgr.update();
|
||||
}
|
||||
// @formatter:on
|
||||
|
||||
}
|
||||
|
||||
|
||||
+10
-8
@@ -15,6 +15,9 @@
|
||||
*/
|
||||
package ghidra.app.plugin.core.function.tags;
|
||||
|
||||
import static ghidra.framework.model.DomainObjectEvent.*;
|
||||
import static ghidra.program.util.ProgramEvent.*;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.util.*;
|
||||
@@ -31,12 +34,14 @@ import generic.theme.GThemeDefaults.Colors;
|
||||
import ghidra.app.cmd.function.CreateFunctionTagCmd;
|
||||
import ghidra.app.context.ProgramActionContext;
|
||||
import ghidra.framework.cmd.Command;
|
||||
import ghidra.framework.model.*;
|
||||
import ghidra.framework.model.DomainObjectChangedEvent;
|
||||
import ghidra.framework.model.DomainObjectListener;
|
||||
import ghidra.framework.plugintool.ComponentProviderAdapter;
|
||||
import ghidra.program.database.function.FunctionManagerDB;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.listing.*;
|
||||
import ghidra.program.util.*;
|
||||
import ghidra.program.util.FunctionLocation;
|
||||
import ghidra.program.util.ProgramLocation;
|
||||
import ghidra.util.*;
|
||||
import ghidra.util.task.SwingUpdateManager;
|
||||
import resources.ResourceManager;
|
||||
@@ -160,16 +165,13 @@ public class FunctionTagProvider extends ComponentProviderAdapter implements Dom
|
||||
return;
|
||||
}
|
||||
|
||||
if (ev.containsEvent(DomainObject.DO_OBJECT_RESTORED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_FUNCTION_TAG_CREATED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_FUNCTION_TAG_DELETED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_TAG_REMOVED_FROM_FUNCTION) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_TAG_ADDED_TO_FUNCTION)) {
|
||||
if (ev.contains(RESTORED, FUNCTION_TAG_CREATED, FUNCTION_TAG_DELETED, FUNCTION_TAG_APPLIED,
|
||||
FUNCTION_TAG_UNAPPLIED)) {
|
||||
updater.updateLater();
|
||||
return;
|
||||
}
|
||||
|
||||
if (ev.containsEvent(ChangeManager.DOCR_FUNCTION_TAG_CHANGED)) {
|
||||
if (ev.contains(FUNCTION_TAG_CHANGED)) {
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
|
||||
+14
-23
@@ -19,25 +19,20 @@ import java.util.Set;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import ghidra.app.CorePluginPackage;
|
||||
import ghidra.app.events.ProgramActivatedPluginEvent;
|
||||
import ghidra.app.events.ProgramClosedPluginEvent;
|
||||
import ghidra.app.events.ProgramSelectionPluginEvent;
|
||||
import ghidra.app.events.*;
|
||||
import ghidra.app.plugin.PluginCategoryNames;
|
||||
import ghidra.app.plugin.ProgramPlugin;
|
||||
import ghidra.app.plugin.core.functioncompare.actions.CompareFunctionsAction;
|
||||
import ghidra.app.plugin.core.functioncompare.actions.CompareFunctionsFromListingAction;
|
||||
import ghidra.app.services.FunctionComparisonService;
|
||||
import ghidra.framework.model.DomainObject;
|
||||
import ghidra.framework.model.DomainObjectChangeRecord;
|
||||
import ghidra.framework.model.DomainObjectChangedEvent;
|
||||
import ghidra.framework.model.DomainObjectListener;
|
||||
import ghidra.framework.model.*;
|
||||
import ghidra.framework.plugintool.PluginInfo;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.framework.plugintool.util.PluginStatus;
|
||||
import ghidra.program.model.listing.Function;
|
||||
import ghidra.program.model.listing.Program;
|
||||
import ghidra.program.util.ChangeManager;
|
||||
import ghidra.program.util.ProgramChangeRecord;
|
||||
import ghidra.program.util.ProgramEvent;
|
||||
import ghidra.util.Swing;
|
||||
|
||||
/**
|
||||
@@ -114,19 +109,16 @@ public class FunctionComparisonPlugin extends ProgramPlugin
|
||||
for (int i = 0; i < ev.numRecords(); ++i) {
|
||||
DomainObjectChangeRecord doRecord = ev.getChangeRecord(i);
|
||||
|
||||
int eventType = doRecord.getEventType();
|
||||
|
||||
switch (eventType) {
|
||||
case DomainObject.DO_OBJECT_RESTORED:
|
||||
functionComparisonManager.domainObjectRestored(ev);
|
||||
break;
|
||||
case ChangeManager.DOCR_FUNCTION_REMOVED:
|
||||
ProgramChangeRecord rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
Function function = (Function) rec.getObject();
|
||||
if (function != null) {
|
||||
removeFunction(function);
|
||||
}
|
||||
break;
|
||||
EventType eventType = doRecord.getEventType();
|
||||
if (eventType == DomainObjectEvent.RESTORED) {
|
||||
functionComparisonManager.domainObjectRestored(ev);
|
||||
}
|
||||
else if (eventType == ProgramEvent.FUNCTION_REMOVED) {
|
||||
ProgramChangeRecord rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
Function function = (Function) rec.getObject();
|
||||
if (function != null) {
|
||||
removeFunction(function);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -168,8 +160,7 @@ public class FunctionComparisonPlugin extends ProgramPlugin
|
||||
}
|
||||
|
||||
@Override
|
||||
public FunctionComparisonProvider compareFunctions(Function source,
|
||||
Function target) {
|
||||
public FunctionComparisonProvider compareFunctions(Function source, Function target) {
|
||||
return getFromSwingBlocking(
|
||||
() -> functionComparisonManager.compareFunctions(source, target));
|
||||
}
|
||||
|
||||
+4
-6
@@ -21,7 +21,6 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
||||
|
||||
import docking.ComponentProviderActivationListener;
|
||||
import ghidra.framework.model.*;
|
||||
import ghidra.framework.plugintool.Plugin;
|
||||
import ghidra.program.model.listing.Function;
|
||||
import ghidra.program.model.listing.Program;
|
||||
|
||||
@@ -89,8 +88,7 @@ public class FunctionComparisonProviderManager implements FunctionComparisonProv
|
||||
* @param target the target function
|
||||
* @return the new comparison provider
|
||||
*/
|
||||
public FunctionComparisonProvider compareFunctions(Function source,
|
||||
Function target) {
|
||||
public FunctionComparisonProvider compareFunctions(Function source, Function target) {
|
||||
FunctionComparisonProvider provider = new MultiFunctionComparisonProvider(plugin);
|
||||
provider.addToTool();
|
||||
provider.getModel().compareFunctions(source, target);
|
||||
@@ -123,7 +121,7 @@ public class FunctionComparisonProviderManager implements FunctionComparisonProv
|
||||
* @param provider the provider to add the functions to
|
||||
*/
|
||||
public void compareFunctions(Function source, Function target,
|
||||
FunctionComparisonProvider provider) {
|
||||
FunctionComparisonProvider provider) {
|
||||
if (provider == null) {
|
||||
return;
|
||||
}
|
||||
@@ -215,8 +213,8 @@ public class FunctionComparisonProviderManager implements FunctionComparisonProv
|
||||
*/
|
||||
public void domainObjectRestored(DomainObjectChangedEvent ev) {
|
||||
for (DomainObjectChangeRecord domainObjectChangeRecord : ev) {
|
||||
int eventType = domainObjectChangeRecord.getEventType();
|
||||
if (eventType != DomainObject.DO_OBJECT_RESTORED) {
|
||||
EventType eventType = domainObjectChangeRecord.getEventType();
|
||||
if (eventType != DomainObjectEvent.RESTORED) {
|
||||
return;
|
||||
}
|
||||
Object source = ev.getSource();
|
||||
|
||||
+56
-53
@@ -15,6 +15,9 @@
|
||||
*/
|
||||
package ghidra.app.plugin.core.functionwindow;
|
||||
|
||||
import static ghidra.framework.model.DomainObjectEvent.*;
|
||||
import static ghidra.program.util.ProgramEvent.*;
|
||||
|
||||
import docking.action.DockingAction;
|
||||
import ghidra.app.CorePluginPackage;
|
||||
import ghidra.app.events.ProgramClosedPluginEvent;
|
||||
@@ -30,8 +33,8 @@ import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.listing.Function;
|
||||
import ghidra.program.model.listing.Program;
|
||||
import ghidra.program.model.symbol.Symbol;
|
||||
import ghidra.program.util.ChangeManager;
|
||||
import ghidra.program.util.ProgramChangeRecord;
|
||||
import ghidra.program.util.ProgramEvent;
|
||||
import ghidra.util.table.SelectionNavigationAction;
|
||||
import ghidra.util.table.actions.MakeProgramSelectionAction;
|
||||
import ghidra.util.task.SwingUpdateManager;
|
||||
@@ -110,9 +113,7 @@ public class FunctionWindowPlugin extends ProgramPlugin implements DomainObjectL
|
||||
return;
|
||||
}
|
||||
|
||||
if (ev.containsEvent(DomainObject.DO_OBJECT_RESTORED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCK_MOVED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCK_REMOVED)) {
|
||||
if (ev.contains(RESTORED, MEMORY_BLOCK_MOVED, MEMORY_BLOCK_REMOVED)) {
|
||||
provider.reload();
|
||||
return;
|
||||
}
|
||||
@@ -120,58 +121,60 @@ public class FunctionWindowPlugin extends ProgramPlugin implements DomainObjectL
|
||||
for (int i = 0; i < ev.numRecords(); ++i) {
|
||||
DomainObjectChangeRecord doRecord = ev.getChangeRecord(i);
|
||||
|
||||
int eventType = doRecord.getEventType();
|
||||
EventType eventType = doRecord.getEventType();
|
||||
|
||||
switch (eventType) {
|
||||
case ChangeManager.DOCR_CODE_ADDED:
|
||||
case ChangeManager.DOCR_CODE_REMOVED:
|
||||
swingMgr.update();
|
||||
break;
|
||||
if (eventType instanceof ProgramEvent type) {
|
||||
switch (type) {
|
||||
case CODE_ADDED:
|
||||
case CODE_REMOVED:
|
||||
swingMgr.update();
|
||||
break;
|
||||
|
||||
case ChangeManager.DOCR_FUNCTION_ADDED:
|
||||
ProgramChangeRecord rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
Function function = (Function) rec.getObject();
|
||||
provider.functionAdded(function);
|
||||
break;
|
||||
case ChangeManager.DOCR_FUNCTION_REMOVED:
|
||||
rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
function = (Function) rec.getObject();
|
||||
if (function != null) {
|
||||
provider.functionRemoved(function);
|
||||
}
|
||||
break;
|
||||
case ChangeManager.DOCR_FUNCTION_CHANGED:
|
||||
rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
function = (Function) rec.getObject();
|
||||
provider.update(function);
|
||||
break;
|
||||
case ChangeManager.DOCR_SYMBOL_ADDED:
|
||||
case ChangeManager.DOCR_SYMBOL_SET_AS_PRIMARY:
|
||||
rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
Symbol sym = (Symbol) rec.getNewValue();
|
||||
Address addr = sym.getAddress();
|
||||
function = currentProgram.getListing().getFunctionAt(addr);
|
||||
if (function != null) {
|
||||
case FUNCTION_ADDED:
|
||||
ProgramChangeRecord rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
Function function = (Function) rec.getObject();
|
||||
provider.functionAdded(function);
|
||||
break;
|
||||
case FUNCTION_REMOVED:
|
||||
rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
function = (Function) rec.getObject();
|
||||
if (function != null) {
|
||||
provider.functionRemoved(function);
|
||||
}
|
||||
break;
|
||||
case FUNCTION_CHANGED:
|
||||
rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
function = (Function) rec.getObject();
|
||||
provider.update(function);
|
||||
}
|
||||
break;
|
||||
case ChangeManager.DOCR_SYMBOL_RENAMED:
|
||||
rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
sym = (Symbol) rec.getObject();
|
||||
addr = sym.getAddress();
|
||||
function = currentProgram.getListing().getFunctionAt(addr);
|
||||
if (function != null) {
|
||||
provider.update(function);
|
||||
}
|
||||
break;
|
||||
/*case ChangeManager.DOCR_SYMBOL_REMOVED:
|
||||
rec = (ProgramChangeRecord)ev.getChangeRecord(i);
|
||||
addr = (Address)rec.getObject();
|
||||
function = currentProgram.getListing().getFunctionAt(addr);
|
||||
if (function != null) {
|
||||
provider.functionChanged(function);
|
||||
}
|
||||
break;*/
|
||||
break;
|
||||
case SYMBOL_ADDED:
|
||||
case SYMBOL_PRIMARY_STATE_CHANGED:
|
||||
rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
Symbol sym = (Symbol) rec.getNewValue();
|
||||
Address addr = sym.getAddress();
|
||||
function = currentProgram.getListing().getFunctionAt(addr);
|
||||
if (function != null) {
|
||||
provider.update(function);
|
||||
}
|
||||
break;
|
||||
case SYMBOL_RENAMED:
|
||||
rec = (ProgramChangeRecord) ev.getChangeRecord(i);
|
||||
sym = (Symbol) rec.getObject();
|
||||
addr = sym.getAddress();
|
||||
function = currentProgram.getListing().getFunctionAt(addr);
|
||||
if (function != null) {
|
||||
provider.update(function);
|
||||
}
|
||||
break;
|
||||
/*case SYMBOL_REMOVED:
|
||||
rec = (ProgramChangeRecord)ev.getChangeRecord(i);
|
||||
addr = (Address)rec.getObject();
|
||||
function = currentProgram.getListing().getFunctionAt(addr);
|
||||
if (function != null) {
|
||||
provider.functionChanged(function);
|
||||
}
|
||||
break;*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+6
-6
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package ghidra.app.plugin.core.graph;
|
||||
|
||||
import static ghidra.program.util.ProgramEvent.*;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
@@ -189,9 +191,7 @@ public abstract class AddressBasedGraphDisplayListener
|
||||
|
||||
@Override
|
||||
public void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
if (!(ev.containsEvent(ChangeManager.DOCR_SYMBOL_ADDED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_SYMBOL_RENAMED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_SYMBOL_REMOVED))) {
|
||||
if (!(ev.contains(SYMBOL_ADDED, SYMBOL_RENAMED, SYMBOL_REMOVED))) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -200,13 +200,13 @@ public abstract class AddressBasedGraphDisplayListener
|
||||
ProgramChangeRecord programRecord = (ProgramChangeRecord) record;
|
||||
Address address = programRecord.getStart();
|
||||
|
||||
if (record.getEventType() == ChangeManager.DOCR_SYMBOL_RENAMED) {
|
||||
if (record.getEventType() == ProgramEvent.SYMBOL_RENAMED) {
|
||||
handleSymbolAddedOrRenamed(address, (Symbol) programRecord.getObject());
|
||||
}
|
||||
else if (record.getEventType() == ChangeManager.DOCR_SYMBOL_ADDED) {
|
||||
else if (record.getEventType() == ProgramEvent.SYMBOL_ADDED) {
|
||||
handleSymbolAddedOrRenamed(address, (Symbol) programRecord.getNewValue());
|
||||
}
|
||||
else if (record.getEventType() == ChangeManager.DOCR_SYMBOL_REMOVED) {
|
||||
else if (record.getEventType() == ProgramEvent.SYMBOL_REMOVED) {
|
||||
handleSymbolRemoved(address);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -49,7 +49,7 @@ abstract class ExpandBlockModel implements DomainObjectListener {
|
||||
|
||||
@Override
|
||||
public void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
if (!ev.containsEvent(DomainObject.DO_OBJECT_RESTORED)) {
|
||||
if (!ev.contains(DomainObjectEvent.RESTORED)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
+9
-9
@@ -15,12 +15,16 @@
|
||||
*/
|
||||
package ghidra.app.plugin.core.memory;
|
||||
|
||||
import static ghidra.framework.model.DomainObjectEvent.*;
|
||||
import static ghidra.program.util.ProgramEvent.*;
|
||||
|
||||
import ghidra.app.CorePluginPackage;
|
||||
import ghidra.app.events.ProgramLocationPluginEvent;
|
||||
import ghidra.app.plugin.PluginCategoryNames;
|
||||
import ghidra.app.plugin.ProgramPlugin;
|
||||
import ghidra.app.services.GoToService;
|
||||
import ghidra.framework.model.*;
|
||||
import ghidra.framework.model.DomainObjectChangedEvent;
|
||||
import ghidra.framework.model.DomainObjectListener;
|
||||
import ghidra.framework.plugintool.PluginInfo;
|
||||
import ghidra.framework.plugintool.PluginTool;
|
||||
import ghidra.framework.plugintool.util.PluginStatus;
|
||||
@@ -28,7 +32,7 @@ import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.listing.Program;
|
||||
import ghidra.program.model.mem.Memory;
|
||||
import ghidra.program.model.mem.MemoryBlock;
|
||||
import ghidra.program.util.ChangeManager;
|
||||
import ghidra.program.util.ProgramEvent;
|
||||
import ghidra.program.util.ProgramLocation;
|
||||
|
||||
/**
|
||||
@@ -86,15 +90,11 @@ public class MemoryMapPlugin extends ProgramPlugin implements DomainObjectListen
|
||||
if (provider == null || !provider.isVisible()) {
|
||||
return;
|
||||
}
|
||||
if (ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCK_ADDED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCK_REMOVED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCK_MOVED) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCK_SPLIT) ||
|
||||
ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCKS_JOINED) ||
|
||||
ev.containsEvent(DomainObject.DO_OBJECT_RESTORED)) {
|
||||
if (ev.contains(MEMORY_BLOCK_ADDED, MEMORY_BLOCK_REMOVED, MEMORY_BLOCK_MOVED,
|
||||
MEMORY_BLOCK_SPLIT, MEMORY_BLOCKS_JOINED, RESTORED)) {
|
||||
this.provider.updateMap();
|
||||
}
|
||||
else if (ev.containsEvent(ChangeManager.DOCR_MEMORY_BLOCK_CHANGED)) {
|
||||
else if (ev.contains(ProgramEvent.MEMORY_BLOCK_CHANGED)) {
|
||||
this.provider.updateData();
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -56,7 +56,7 @@ class MoveBlockModel implements DomainObjectListener {
|
||||
*/
|
||||
@Override
|
||||
public void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
if (ev.containsEvent(DomainObject.DO_OBJECT_RESTORED)) {
|
||||
if (ev.contains(DomainObjectEvent.RESTORED)) {
|
||||
block = program.getMemory().getBlock(blockStart);
|
||||
}
|
||||
}
|
||||
|
||||
+14
-18
@@ -141,8 +141,7 @@ public class MyProgramChangesDisplayPlugin extends ProgramPlugin implements Doma
|
||||
checkInAction = new DockingAction("CheckIn", getName()) {
|
||||
@Override
|
||||
public void actionPerformed(ActionContext context) {
|
||||
AppInfo.getFrontEndTool()
|
||||
.checkIn(tool, currentProgram.getDomainFile());
|
||||
AppInfo.getFrontEndTool().checkIn(tool, currentProgram.getDomainFile());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -266,8 +265,7 @@ public class MyProgramChangesDisplayPlugin extends ProgramPlugin implements Doma
|
||||
*/
|
||||
private void updateChangeMarkers() {
|
||||
|
||||
Swing.assertSwingThread(
|
||||
"Change markers must be manipulated on the Swing thread");
|
||||
Swing.assertSwingThread("Change markers must be manipulated on the Swing thread");
|
||||
|
||||
if (currentProgram == null) {
|
||||
return;
|
||||
@@ -276,30 +274,28 @@ public class MyProgramChangesDisplayPlugin extends ProgramPlugin implements Doma
|
||||
ProgramChangeSet changeSet = currentProgram.getChanges();
|
||||
|
||||
if (programChangedLocally) {
|
||||
currentMyChangeMarks.setAddressSetCollection(
|
||||
changeSet.getAddressSetCollectionSinceLastSave());
|
||||
currentMyChangeMarks
|
||||
.setAddressSetCollection(changeSet.getAddressSetCollectionSinceLastSave());
|
||||
}
|
||||
|
||||
if (isTrackingServerChanges()) {
|
||||
if (programSaved) {
|
||||
currentChangesSinceCheckoutMarks.setAddressSetCollection(
|
||||
changeSet.getAddressSetCollectionSinceCheckout());
|
||||
currentChangesSinceCheckoutMarks
|
||||
.setAddressSetCollection(changeSet.getAddressSetCollectionSinceCheckout());
|
||||
}
|
||||
|
||||
if (programChangedRemotely) {
|
||||
currentOtherChangeMarks.setAddressSetCollection(
|
||||
new SingleAddressSetCollection(otherChangeSet));
|
||||
currentOtherChangeMarks
|
||||
.setAddressSetCollection(new SingleAddressSetCollection(otherChangeSet));
|
||||
}
|
||||
|
||||
// only update conflict markers when server changeSet changes or we end a transaction
|
||||
if (programChangedRemotely || updateConflicts) {
|
||||
AddressSet intersect =
|
||||
changeSet.getAddressSetCollectionSinceCheckout()
|
||||
.getCombinedAddressSet()
|
||||
.intersect(
|
||||
otherChangeSet);
|
||||
currentConflictChangeMarks.setAddressSetCollection(
|
||||
new SingleAddressSetCollection(intersect));
|
||||
AddressSet intersect = changeSet.getAddressSetCollectionSinceCheckout()
|
||||
.getCombinedAddressSet()
|
||||
.intersect(otherChangeSet);
|
||||
currentConflictChangeMarks
|
||||
.setAddressSetCollection(new SingleAddressSetCollection(intersect));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -355,7 +351,7 @@ public class MyProgramChangesDisplayPlugin extends ProgramPlugin implements Doma
|
||||
@Override
|
||||
public void domainObjectChanged(DomainObjectChangedEvent ev) {
|
||||
programChangedLocally = true;
|
||||
if (ev.containsEvent(DomainObject.DO_OBJECT_SAVED)) {
|
||||
if (ev.contains(DomainObjectEvent.SAVED)) {
|
||||
programSaved = true;
|
||||
}
|
||||
|
||||
|
||||
+38
-34
@@ -139,43 +139,47 @@ abstract class DataTypeLocationDescriptor extends LocationDescriptor {
|
||||
|
||||
for (int i = 0; i < changeEvent.numRecords(); i++) {
|
||||
DomainObjectChangeRecord domainObjectRecord = changeEvent.getChangeRecord(i);
|
||||
int eventType = domainObjectRecord.getEventType();
|
||||
// int eventType = domainObjectRecord.getEventType();
|
||||
EventType eventType = domainObjectRecord.getEventType();
|
||||
if (eventType == DomainObjectEvent.RESTORED) {
|
||||
return checkForAddressChange(domainObjectRecord);
|
||||
}
|
||||
if (eventType instanceof ProgramEvent type) {
|
||||
switch (type) {
|
||||
case FUNCTION_CHANGED:
|
||||
ProgramChangeRecord changeRecord = (ProgramChangeRecord) domainObjectRecord;
|
||||
Address functionAddress = changeRecord.getStart();
|
||||
if (referencesContain(functionAddress) &&
|
||||
functionContainsDataType(functionAddress)) {
|
||||
return checkForAddressChange(changeRecord);
|
||||
}
|
||||
break;
|
||||
|
||||
switch (eventType) {
|
||||
case ChangeManager.DOCR_FUNCTION_CHANGED:
|
||||
ProgramChangeRecord changeRecord = (ProgramChangeRecord) domainObjectRecord;
|
||||
Address functionAddress = changeRecord.getStart();
|
||||
if (referencesContain(functionAddress) &&
|
||||
functionContainsDataType(functionAddress)) {
|
||||
return checkForAddressChange(changeRecord);
|
||||
}
|
||||
break;
|
||||
|
||||
case ChangeManager.DOCR_MEMORY_BLOCK_MOVED:
|
||||
case ChangeManager.DOCR_MEMORY_BLOCK_REMOVED:
|
||||
case ChangeManager.DOCR_SYMBOL_REMOVED:
|
||||
case ChangeManager.DOCR_MEM_REFERENCE_REMOVED:
|
||||
case ChangeManager.DOCR_CODE_REMOVED:
|
||||
case ChangeManager.DOCR_FUNCTION_REMOVED:
|
||||
case ChangeManager.DOCR_VARIABLE_REFERENCE_REMOVED:
|
||||
case DomainObject.DO_OBJECT_RESTORED:
|
||||
return checkForAddressChange(domainObjectRecord);
|
||||
case ChangeManager.DOCR_CODE_ADDED:
|
||||
case ChangeManager.DOCR_MEMORY_BLOCK_ADDED:
|
||||
case ChangeManager.DOCR_SYMBOL_ADDED:
|
||||
case ChangeManager.DOCR_MEM_REFERENCE_ADDED:
|
||||
case ChangeManager.DOCR_FUNCTION_ADDED:
|
||||
case ChangeManager.DOCR_VARIABLE_REFERENCE_ADDED:
|
||||
case ChangeManager.DOCR_DATA_TYPE_RENAMED:
|
||||
case ChangeManager.DOCR_DATA_TYPE_REPLACED:
|
||||
// signal that the reference addresses may be out-of-date
|
||||
if (modelFreshnessListener != null) {
|
||||
modelFreshnessListener.stateChanged(new ChangeEvent(this));
|
||||
}
|
||||
return true;
|
||||
case MEMORY_BLOCK_MOVED:
|
||||
case MEMORY_BLOCK_REMOVED:
|
||||
case SYMBOL_REMOVED:
|
||||
case REFERENCE_REMOVED:
|
||||
case CODE_REMOVED:
|
||||
case FUNCTION_REMOVED:
|
||||
case VARIABLE_REFERENCE_REMOVED:
|
||||
return checkForAddressChange(domainObjectRecord);
|
||||
case CODE_ADDED:
|
||||
case MEMORY_BLOCK_ADDED:
|
||||
case SYMBOL_ADDED:
|
||||
case REFERENCE_ADDED:
|
||||
case FUNCTION_ADDED:
|
||||
case VARIABLE_REFERENCE_ADDED:
|
||||
case DATA_TYPE_RENAMED:
|
||||
case DATA_TYPE_REPLACED:
|
||||
// signal that the reference addresses may be out-of-date
|
||||
if (modelFreshnessListener != null) {
|
||||
modelFreshnessListener.stateChanged(new ChangeEvent(this));
|
||||
}
|
||||
return true;
|
||||
default:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
+4
-5
@@ -20,8 +20,7 @@ import java.awt.Color;
|
||||
import docking.widgets.fieldpanel.support.Highlight;
|
||||
import ghidra.app.plugin.core.navigation.FunctionUtils;
|
||||
import ghidra.app.util.viewer.field.*;
|
||||
import ghidra.framework.model.DomainObjectChangeRecord;
|
||||
import ghidra.framework.model.DomainObjectChangedEvent;
|
||||
import ghidra.framework.model.*;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.listing.*;
|
||||
import ghidra.program.util.*;
|
||||
@@ -76,18 +75,18 @@ class FunctionSignatureFieldLocationDescriptor extends LocationDescriptor {
|
||||
|
||||
for (int i = 0; i < changeEvent.numRecords(); i++) {
|
||||
DomainObjectChangeRecord domainObjectRecord = changeEvent.getChangeRecord(i);
|
||||
int eventType = domainObjectRecord.getEventType();
|
||||
EventType eventType = domainObjectRecord.getEventType();
|
||||
|
||||
if (domainObjectRecord instanceof ProgramChangeRecord) {
|
||||
ProgramChangeRecord programChangeRecord = (ProgramChangeRecord) domainObjectRecord;
|
||||
if (eventType == ChangeManager.DOCR_FUNCTION_REMOVED) {
|
||||
if (eventType == ProgramEvent.FUNCTION_REMOVED) {
|
||||
Address effectedEntryPoint = programChangeRecord.getStart();
|
||||
if (effectedEntryPoint.equals(function.getEntryPoint())) {
|
||||
checkForAddressChange(domainObjectRecord);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (eventType == ChangeManager.DOCR_MEM_REFERENCE_REMOVED) {
|
||||
else if (eventType == ProgramEvent.REFERENCE_REMOVED) {
|
||||
Address addr = programChangeRecord.getStart();
|
||||
Function functionContaining =
|
||||
program.getFunctionManager().getFunctionContaining(addr);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user