mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 02:39:44 +02:00
GP-3512 - Created 'ListenerSet' for improved listener usage
This commit is contained in:
parent
41076f3af0
commit
08a900afad
77 changed files with 1669 additions and 1564 deletions
|
@ -42,7 +42,7 @@ public class DbgDetachCommand extends AbstractDbgCommand<Void> {
|
|||
manager.fireThreadExited(t.getId(), process, pending);
|
||||
t.remove();
|
||||
}
|
||||
manager.getEventListeners().fire.processRemoved(process.getId(), DbgCause.Causes.UNCLAIMED);
|
||||
manager.getEventListeners().invoke().processRemoved(process.getId(), DbgCause.Causes.UNCLAIMED);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ public class DbgDebugInputCallbacks implements DebugInputCallbacks {
|
|||
|
||||
@Override
|
||||
public void startInput(long bufsize) {
|
||||
manager.getEventListeners().fire.promptChanged(">>>");
|
||||
manager.getEventListeners().invoke().promptChanged(">>>");
|
||||
CompletableFuture<String> cf = new CompletableFuture<String>();
|
||||
try {
|
||||
manager.setContinuation(cf);
|
||||
|
|
|
@ -206,7 +206,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
private final Map<Class<?>, DebugStatus> statusMap = new LinkedHashMap<>();
|
||||
private final Map<String, DebugStatus> statusByNameMap = new LinkedHashMap<>();
|
||||
private final ListenerSet<DbgEventsListener> listenersEvent =
|
||||
new ListenerSet<>(DbgEventsListener.class);
|
||||
new ListenerSet<>(DbgEventsListener.class, true);
|
||||
|
||||
private DebugEventInformation lastEventInformation;
|
||||
private DbgSession currentSession;
|
||||
|
@ -251,8 +251,8 @@ public class DbgManagerImpl implements DbgManager {
|
|||
thread.add();
|
||||
if (fire) {
|
||||
Causes cause = DbgCause.Causes.UNCLAIMED;
|
||||
getEventListeners().fire.threadCreated(thread, cause);
|
||||
getEventListeners().fire.threadSelected(thread, null, cause);
|
||||
getEventListeners().invoke().threadCreated(thread, cause);
|
||||
getEventListeners().invoke().threadSelected(thread, null, cause);
|
||||
}
|
||||
return threads.get(id);
|
||||
}
|
||||
|
@ -294,7 +294,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
for (DebugThreadId tid : toRemove) {
|
||||
removeThread(tid);
|
||||
}
|
||||
getEventListeners().fire.processRemoved(id, cause);
|
||||
getEventListeners().invoke().processRemoved(id, cause);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -303,7 +303,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
*
|
||||
* @param process the process that now has focus
|
||||
* @param cause the cause of the focus change
|
||||
* @param fire signal listeners
|
||||
* @param forEach() signal listeners
|
||||
* @return success status
|
||||
*/
|
||||
@Override
|
||||
|
@ -326,7 +326,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
DbgProcessImpl process = new DbgProcessImpl(this, id, pid, name);
|
||||
process.add();
|
||||
if (fire) {
|
||||
getEventListeners().fire.processAdded(process, DbgCause.Causes.UNCLAIMED);
|
||||
getEventListeners().invoke().processAdded(process, DbgCause.Causes.UNCLAIMED);
|
||||
}
|
||||
return processes.get(id);
|
||||
}
|
||||
|
@ -344,7 +344,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
if (sessions.remove(id) == null) {
|
||||
throw new IllegalArgumentException("There is no session with id " + id);
|
||||
}
|
||||
getEventListeners().fire.sessionRemoved(id, cause);
|
||||
getEventListeners().invoke().sessionRemoved(id, cause);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -366,7 +366,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
DbgSessionImpl session = new DbgSessionImpl(this, id);
|
||||
session.add();
|
||||
if (fire) {
|
||||
getEventListeners().fire.sessionAdded(session, DbgCause.Causes.UNCLAIMED);
|
||||
getEventListeners().invoke().sessionAdded(session, DbgCause.Causes.UNCLAIMED);
|
||||
}
|
||||
}
|
||||
return sessions.get(id);
|
||||
|
@ -748,8 +748,8 @@ public class DbgManagerImpl implements DbgManager {
|
|||
|
||||
DebugBreakpoint bp = evt.getInfo();
|
||||
DbgBreakpointInfo info = new DbgBreakpointInfo(bp, getEventProcess(), getEventThread());
|
||||
getEventListeners().fire.threadSelected(eventThread, null, evt.getCause());
|
||||
getEventListeners().fire.breakpointHit(info, evt.getCause());
|
||||
getEventListeners().invoke().threadSelected(eventThread, null, evt.getCause());
|
||||
getEventListeners().invoke().breakpointHit(info, evt.getCause());
|
||||
|
||||
String key = Integer.toHexString(bp.getId());
|
||||
if (statusByNameMap.containsKey(key)) {
|
||||
|
@ -766,8 +766,8 @@ public class DbgManagerImpl implements DbgManager {
|
|||
* @return retval handling/break status
|
||||
*/
|
||||
protected DebugStatus processException(DbgExceptionEvent evt, Void v) {
|
||||
getEventListeners().fire.eventSelected(evt, evt.getCause());
|
||||
getEventListeners().fire.threadSelected(eventThread, null, evt.getCause());
|
||||
getEventListeners().invoke().eventSelected(evt, evt.getCause());
|
||||
getEventListeners().invoke().threadSelected(eventThread, null, evt.getCause());
|
||||
|
||||
DebugExceptionRecord64 info = evt.getInfo();
|
||||
String key = Integer.toHexString(info.code);
|
||||
|
@ -789,9 +789,9 @@ public class DbgManagerImpl implements DbgManager {
|
|||
DbgProcessImpl process = getCurrentProcess();
|
||||
DbgThreadImpl thread = getThreadFromDebugProcessInfo(process, evt.getInfo());
|
||||
|
||||
getEventListeners().fire.eventSelected(evt, evt.getCause());
|
||||
getEventListeners().fire.threadCreated(thread, DbgCause.Causes.UNCLAIMED);
|
||||
getEventListeners().fire.threadSelected(thread, null, evt.getCause());
|
||||
getEventListeners().invoke().eventSelected(evt, evt.getCause());
|
||||
getEventListeners().invoke().threadCreated(thread, DbgCause.Causes.UNCLAIMED);
|
||||
getEventListeners().invoke().threadSelected(thread, null, evt.getCause());
|
||||
|
||||
String key = eventId.id();
|
||||
if (statusByNameMap.containsKey(key)) {
|
||||
|
@ -815,8 +815,8 @@ public class DbgManagerImpl implements DbgManager {
|
|||
thread.remove();
|
||||
}
|
||||
process.threadExited(eventId);
|
||||
getEventListeners().fire.eventSelected(evt, evt.getCause());
|
||||
getEventListeners().fire.threadExited(eventId, process, evt.getCause());
|
||||
getEventListeners().invoke().eventSelected(evt, evt.getCause());
|
||||
getEventListeners().invoke().threadExited(eventId, process, evt.getCause());
|
||||
|
||||
String key = eventId.id();
|
||||
if (statusByNameMap.containsKey(key)) {
|
||||
|
@ -842,7 +842,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
|
||||
//currentThread = evt.getThread();
|
||||
currentThread.setState(evt.getState(), evt.getCause(), evt.getReason());
|
||||
getEventListeners().fire.threadSelected(currentThread, evt.getFrame(), evt.getCause());
|
||||
getEventListeners().invoke().threadSelected(currentThread, evt.getFrame(), evt.getCause());
|
||||
|
||||
String key = eventId.id();
|
||||
if (statusByNameMap.containsKey(key)) {
|
||||
|
@ -861,9 +861,9 @@ public class DbgManagerImpl implements DbgManager {
|
|||
protected DebugStatus processProcessCreated(DbgProcessCreatedEvent evt, Void v) {
|
||||
DebugProcessInfo info = evt.getInfo();
|
||||
DbgProcessImpl proc = getProcessFromDebugProcessInfo(info);
|
||||
getEventListeners().fire.eventSelected(evt, evt.getCause());
|
||||
getEventListeners().fire.processAdded(proc, evt.getCause());
|
||||
getEventListeners().fire.processSelected(proc, evt.getCause());
|
||||
getEventListeners().invoke().eventSelected(evt, evt.getCause());
|
||||
getEventListeners().invoke().processAdded(proc, evt.getCause());
|
||||
getEventListeners().invoke().processSelected(proc, evt.getCause());
|
||||
|
||||
getThreadFromDebugProcessInfo(proc, info.initialThreadInfo);
|
||||
//getEventListeners().fire.threadCreated(thread, evt.getCause());
|
||||
|
@ -892,9 +892,9 @@ public class DbgManagerImpl implements DbgManager {
|
|||
DbgProcessImpl process = getCurrentProcess();
|
||||
process.setExitCode(Long.valueOf(evt.getInfo()));
|
||||
|
||||
getEventListeners().fire.eventSelected(evt, evt.getCause());
|
||||
getEventListeners().fire.threadExited(eventId, process, evt.getCause());
|
||||
getEventListeners().fire.processExited(process, evt.getCause());
|
||||
getEventListeners().invoke().eventSelected(evt, evt.getCause());
|
||||
getEventListeners().invoke().threadExited(eventId, process, evt.getCause());
|
||||
getEventListeners().invoke().processExited(process, evt.getCause());
|
||||
|
||||
for (DebugBreakpoint bpt : getBreakpoints()) {
|
||||
breaksById.remove(bpt.getId());
|
||||
|
@ -903,7 +903,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
thread.remove();
|
||||
}
|
||||
process.remove(evt.getCause());
|
||||
getEventListeners().fire.processRemoved(process.getId(), evt.getCause());
|
||||
getEventListeners().invoke().processRemoved(process.getId(), evt.getCause());
|
||||
|
||||
String key = process.getId().id();
|
||||
if (statusByNameMap.containsKey(key)) {
|
||||
|
@ -923,7 +923,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
DebugThreadId eventId = updateState();
|
||||
|
||||
currentProcess = evt.getProcess();
|
||||
getEventListeners().fire.processSelected(currentProcess, evt.getCause());
|
||||
getEventListeners().invoke().processSelected(currentProcess, evt.getCause());
|
||||
|
||||
String key = eventId.id();
|
||||
if (statusByNameMap.containsKey(key)) {
|
||||
|
@ -944,8 +944,8 @@ public class DbgManagerImpl implements DbgManager {
|
|||
DbgProcessImpl process = getCurrentProcess();
|
||||
DebugModuleInfo info = evt.getInfo();
|
||||
process.moduleLoaded(info);
|
||||
getEventListeners().fire.eventSelected(evt, evt.getCause());
|
||||
getEventListeners().fire.moduleLoaded(process, info, evt.getCause());
|
||||
getEventListeners().invoke().eventSelected(evt, evt.getCause());
|
||||
getEventListeners().invoke().moduleLoaded(process, info, evt.getCause());
|
||||
|
||||
String key = info.getModuleName();
|
||||
if (statusByNameMap.containsKey(key)) {
|
||||
|
@ -966,8 +966,8 @@ public class DbgManagerImpl implements DbgManager {
|
|||
DbgProcessImpl process = getCurrentProcess();
|
||||
DebugModuleInfo info = evt.getInfo();
|
||||
process.moduleUnloaded(info);
|
||||
getEventListeners().fire.eventSelected(evt, evt.getCause());
|
||||
getEventListeners().fire.moduleUnloaded(process, info, evt.getCause());
|
||||
getEventListeners().invoke().eventSelected(evt, evt.getCause());
|
||||
getEventListeners().invoke().moduleUnloaded(process, info, evt.getCause());
|
||||
|
||||
String key = info.getModuleName();
|
||||
if (statusByNameMap.containsKey(key)) {
|
||||
|
@ -1012,7 +1012,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
//System.err.println("RUNNING " + id);
|
||||
dbgState = DbgState.RUNNING;
|
||||
// NB: Needed by GADP variants, but not IN-VM
|
||||
getEventListeners().fire.memoryChanged(currentProcess, 0L, 0,
|
||||
getEventListeners().invoke().memoryChanged(currentProcess, 0L, 0,
|
||||
evt.getCause());
|
||||
processEvent(new DbgRunningEvent(eventThread.getId()));
|
||||
}
|
||||
|
@ -1056,7 +1056,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
if (key.value() == id) {
|
||||
DbgThread thread = getThread(key);
|
||||
if (thread != null) {
|
||||
getEventListeners().fire.threadSelected(thread, null, evt.getCause());
|
||||
getEventListeners().invoke().threadSelected(thread, null, evt.getCause());
|
||||
}
|
||||
processEvent(new DbgPromptChangedEvent(getControl().getPromptText()));
|
||||
break;
|
||||
|
@ -1080,7 +1080,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
DebugThreadId eventId = updateState();
|
||||
|
||||
currentSession = evt.getSession();
|
||||
getEventListeners().fire.sessionSelected(currentSession, evt.getCause());
|
||||
getEventListeners().invoke().sessionSelected(currentSession, evt.getCause());
|
||||
|
||||
String key = eventId.id();
|
||||
if (statusByNameMap.containsKey(key)) {
|
||||
|
@ -1118,23 +1118,23 @@ public class DbgManagerImpl implements DbgManager {
|
|||
|
||||
protected void processDebuggeeStateChanged(DbgDebuggeeStateChangeEvent evt, Void v) {
|
||||
if (evt.getFlags().contains(ChangeDebuggeeState.DATA)) {
|
||||
getEventListeners().fire.memoryChanged(currentProcess, 0L, 0, evt.getCause());
|
||||
getEventListeners().invoke().memoryChanged(currentProcess, 0L, 0, evt.getCause());
|
||||
}
|
||||
}
|
||||
|
||||
protected void processSystemErrorEvent(DbgSystemErrorEvent evt, Void v) {
|
||||
getEventListeners().fire.eventSelected(evt, evt.getCause());
|
||||
getEventListeners().invoke().eventSelected(evt, evt.getCause());
|
||||
String error = "SystemError " + evt.getError() + ":" + evt.getLevel();
|
||||
getEventListeners().fire.consoleOutput(error, 0);
|
||||
getEventListeners().invoke().consoleOutput(error, 0);
|
||||
}
|
||||
|
||||
protected void processConsoleOutput(DbgConsoleOutputEvent evt, Void v) {
|
||||
getEventListeners().fire.eventSelected(evt, evt.getCause());
|
||||
getEventListeners().fire.consoleOutput(evt.getInfo(), evt.getMask());
|
||||
getEventListeners().invoke().eventSelected(evt, evt.getCause());
|
||||
getEventListeners().invoke().consoleOutput(evt.getInfo(), evt.getMask());
|
||||
}
|
||||
|
||||
protected void processPromptChanged(DbgPromptChangedEvent evt, Void v) {
|
||||
getEventListeners().fire.promptChanged(evt.getPrompt());
|
||||
getEventListeners().invoke().promptChanged(evt.getPrompt());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1215,7 +1215,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
@Internal
|
||||
public void doBreakpointCreated(DbgBreakpointInfo newInfo, DbgCause cause) {
|
||||
addKnownBreakpoint(newInfo, true);
|
||||
getEventListeners().fire.breakpointCreated(newInfo, cause);
|
||||
getEventListeners().invoke().breakpointCreated(newInfo, cause);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1227,7 +1227,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
@Internal
|
||||
public void doBreakpointModified(DbgBreakpointInfo newInfo, DbgCause cause) {
|
||||
DbgBreakpointInfo oldInfo = addKnownBreakpoint(newInfo, true);
|
||||
getEventListeners().fire.breakpointModified(newInfo, oldInfo, cause);
|
||||
getEventListeners().invoke().breakpointModified(newInfo, oldInfo, cause);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1242,7 +1242,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
if (oldInfo == null) {
|
||||
return;
|
||||
}
|
||||
getEventListeners().fire.breakpointDeleted(oldInfo, cause);
|
||||
getEventListeners().invoke().breakpointDeleted(oldInfo, cause);
|
||||
oldInfo.dispose();
|
||||
}
|
||||
|
||||
|
@ -1251,7 +1251,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
if (Objects.equals(newInfo, oldInfo)) {
|
||||
return;
|
||||
}
|
||||
getEventListeners().fire.breakpointModified(newInfo, oldInfo, cause);
|
||||
getEventListeners().invoke().breakpointModified(newInfo, oldInfo, cause);
|
||||
}
|
||||
|
||||
@Internal
|
||||
|
@ -1637,7 +1637,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
}
|
||||
|
||||
public void fireThreadExited(DebugThreadId id, DbgProcessImpl process, DbgCause cause) {
|
||||
getEventListeners().fire.threadExited(id, process, cause);
|
||||
getEventListeners().invoke().threadExited(id, process, cause);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1771,7 +1771,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
if (mirror != null) {
|
||||
mirror.setOffset(currentProcess.getOffset());
|
||||
currentProcess = eventProcess = mirror;
|
||||
getEventListeners().fire.processSelected(eventProcess, Causes.UNCLAIMED);
|
||||
getEventListeners().invoke().processSelected(eventProcess, Causes.UNCLAIMED);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1786,7 +1786,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
if (mirror != null) {
|
||||
mirror.setOffset(currentThread.getOffset());
|
||||
currentThread = eventThread = mirror;
|
||||
getEventListeners().fire.threadSelected(eventThread, null, Causes.UNCLAIMED);
|
||||
getEventListeners().invoke().threadSelected(eventThread, null, Causes.UNCLAIMED);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1795,7 +1795,7 @@ public class DbgManagerImpl implements DbgManager {
|
|||
eventProcess = getProcessComputeIfAbsent(epid, so.getCurrentProcessSystemId(), so.getCurrentProcessExecutableName(), true);
|
||||
currentThread = eventThread = getThreadComputeIfAbsent(etid, (DbgProcessImpl) eventProcess,
|
||||
so.getCurrentThreadSystemId(), false);
|
||||
getEventListeners().fire.threadSelected(eventThread, null, Causes.UNCLAIMED);
|
||||
getEventListeners().invoke().threadSelected(eventThread, null, Causes.UNCLAIMED);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -58,7 +58,7 @@ public class DbgModuleImpl implements DbgModule {
|
|||
*/
|
||||
public void add() {
|
||||
process.addModule(this);
|
||||
manager.getEventListeners().fire.moduleLoaded(process, info, Causes.UNCLAIMED);
|
||||
manager.getEventListeners().invoke().moduleLoaded(process, info, Causes.UNCLAIMED);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -66,7 +66,7 @@ public class DbgModuleImpl implements DbgModule {
|
|||
*/
|
||||
public void remove() {
|
||||
process.removeModule(name);
|
||||
manager.getEventListeners().fire.moduleUnloaded(process, info, Causes.UNCLAIMED);
|
||||
manager.getEventListeners().invoke().moduleUnloaded(process, info, Causes.UNCLAIMED);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -93,7 +93,7 @@ public class DbgThreadImpl implements DbgThread {
|
|||
//manager.getEventListeners().fire.threadCreated(this, DbgCause.Causes.UNCLAIMED);
|
||||
process.addThread(this);
|
||||
state.addChangeListener((oldState, newState, pair) -> {
|
||||
this.manager.getEventListeners().fire.threadStateChanged(this, newState, pair.cause,
|
||||
this.manager.getEventListeners().invoke().threadStateChanged(this, newState, pair.cause,
|
||||
pair.reason);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -174,12 +174,12 @@ public interface DbgModelTargetBreakpointSpec extends //
|
|||
|
||||
/**
|
||||
* Update the enabled field
|
||||
*
|
||||
*
|
||||
* <p>
|
||||
* This does not actually toggle the breakpoint. It just updates the field and calls the proper
|
||||
* listeners. To actually toggle the breakpoint, use {@link #toggle(boolean)} instead, which if
|
||||
* effective, should eventually cause this method to be called.
|
||||
*
|
||||
*
|
||||
* @param enabled true if enabled, false if disabled
|
||||
* @param reason a description of the cause (not really used, yet)
|
||||
*/
|
||||
|
@ -207,8 +207,8 @@ public interface DbgModelTargetBreakpointSpec extends //
|
|||
public default void breakpointHit() {
|
||||
DbgModelTargetThread targetThread =
|
||||
getParentProcess().getThreads().getTargetThread(getManager().getEventThread());
|
||||
getActions().fire.breakpointHit((DbgModelTargetBreakpointSpec) getProxy(), targetThread,
|
||||
null, this);
|
||||
getActions().invoke()
|
||||
.breakpointHit((DbgModelTargetBreakpointSpec) getProxy(), targetThread, null, this);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -124,7 +124,7 @@ public interface DbgModelTargetRegisterBank extends DbgModelTargetObject, Target
|
|||
getParentThread().getThread().writeRegisters(toWrite).handle(seq::next);
|
||||
// TODO: Should probably filter only effective and normalized writes in the callback
|
||||
}).then(seq -> {
|
||||
manager.getEventListeners().fire.threadStateChanged(thread, thread.getState(),
|
||||
manager.getEventListeners().invoke().threadStateChanged(thread, thread.getState(),
|
||||
DbgCause.Causes.UNCLAIMED, DbgReason.Reasons.NONE);
|
||||
broadcast().registersUpdated(getProxy(), values);
|
||||
seq.exit();
|
||||
|
|
|
@ -110,7 +110,7 @@ public class DbgModelImpl extends AbstractDbgModel implements DebuggerObjectMode
|
|||
|
||||
@Override
|
||||
public void terminate() throws IOException {
|
||||
listeners.fire.modelClosed(DebuggerModelClosedReason.NORMAL);
|
||||
listeners.invoke().modelClosed(DebuggerModelClosedReason.NORMAL);
|
||||
root.invalidateSubtree(root, "Dbgeng is terminating");
|
||||
dbg.terminate();
|
||||
}
|
||||
|
|
|
@ -15,7 +15,8 @@
|
|||
*/
|
||||
package agent.dbgeng.model.impl;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo;
|
||||
|
@ -27,33 +28,21 @@ import ghidra.dbg.target.TargetBreakpointSpec;
|
|||
import ghidra.dbg.target.schema.TargetAttributeType;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchemaInfo;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
import ghidra.util.datastruct.ListenerMap.ListenerEntry;
|
||||
import ghidra.util.datastruct.ListenerSet;
|
||||
|
||||
@TargetObjectSchemaInfo(
|
||||
name = "BreakpointSpec",
|
||||
attributes = { //
|
||||
@TargetAttributeType( //
|
||||
@TargetObjectSchemaInfo(name = "BreakpointSpec", attributes = { //
|
||||
@TargetAttributeType( //
|
||||
name = TargetBreakpointSpec.CONTAINER_ATTRIBUTE_NAME, //
|
||||
type = DbgModelTargetBreakpointContainerImpl.class), //
|
||||
@TargetAttributeType( //
|
||||
@TargetAttributeType( //
|
||||
name = TargetBreakpointLocation.SPEC_ATTRIBUTE_NAME, //
|
||||
type = DbgModelTargetBreakpointSpecImpl.class), //
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetBreakpointSpecImpl.BPT_TYPE_ATTRIBUTE_NAME,
|
||||
type = String.class), //
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetBreakpointSpecImpl.BPT_DISP_ATTRIBUTE_NAME,
|
||||
type = String.class), //
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetBreakpointSpecImpl.BPT_PENDING_ATTRIBUTE_NAME,
|
||||
type = String.class), //
|
||||
@TargetAttributeType(
|
||||
name = DbgModelTargetBreakpointSpecImpl.BPT_TIMES_ATTRIBUTE_NAME,
|
||||
type = Integer.class), //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
},
|
||||
canonicalContainer = true)
|
||||
@TargetAttributeType(name = DbgModelTargetBreakpointSpecImpl.BPT_TYPE_ATTRIBUTE_NAME, type = String.class), //
|
||||
@TargetAttributeType(name = DbgModelTargetBreakpointSpecImpl.BPT_DISP_ATTRIBUTE_NAME, type = String.class), //
|
||||
@TargetAttributeType(name = DbgModelTargetBreakpointSpecImpl.BPT_PENDING_ATTRIBUTE_NAME, type = String.class), //
|
||||
@TargetAttributeType(name = DbgModelTargetBreakpointSpecImpl.BPT_TIMES_ATTRIBUTE_NAME, type = Integer.class), //
|
||||
@TargetAttributeType(type = Void.class) //
|
||||
}, canonicalContainer = true)
|
||||
public class DbgModelTargetBreakpointSpecImpl extends DbgModelTargetObjectImpl
|
||||
implements DbgModelTargetBreakpointSpec {
|
||||
|
||||
|
@ -69,28 +58,21 @@ public class DbgModelTargetBreakpointSpecImpl extends DbgModelTargetObjectImpl
|
|||
protected boolean enabled;
|
||||
|
||||
public void changeAttributeSet(String reason) {
|
||||
this.changeAttributes(List.of(), List.of(), Map.of(
|
||||
DISPLAY_ATTRIBUTE_NAME, "[" + info.getNumber() + "] " + info.getExpression(),
|
||||
RANGE_ATTRIBUTE_NAME, doGetRange(),
|
||||
SPEC_ATTRIBUTE_NAME, this,
|
||||
EXPRESSION_ATTRIBUTE_NAME, info.getExpression(),
|
||||
KINDS_ATTRIBUTE_NAME, getKinds(),
|
||||
this.changeAttributes(List.of(), List.of(),
|
||||
Map.of(DISPLAY_ATTRIBUTE_NAME, "[" + info.getNumber() + "] " + info.getExpression(),
|
||||
RANGE_ATTRIBUTE_NAME, doGetRange(), SPEC_ATTRIBUTE_NAME, this,
|
||||
EXPRESSION_ATTRIBUTE_NAME, info.getExpression(), KINDS_ATTRIBUTE_NAME, getKinds(),
|
||||
|
||||
BPT_TYPE_ATTRIBUTE_NAME, info.getType().name(),
|
||||
BPT_DISP_ATTRIBUTE_NAME, info.getDisp().name(),
|
||||
BPT_PENDING_ATTRIBUTE_NAME, info.getPending(),
|
||||
BPT_TIMES_ATTRIBUTE_NAME, info.getTimes()),
|
||||
BPT_TYPE_ATTRIBUTE_NAME, info.getType().name(), BPT_DISP_ATTRIBUTE_NAME,
|
||||
info.getDisp().name(), BPT_PENDING_ATTRIBUTE_NAME, info.getPending(),
|
||||
BPT_TIMES_ATTRIBUTE_NAME, info.getTimes()),
|
||||
reason);
|
||||
}
|
||||
|
||||
// Use strong references on actions
|
||||
// The values may be weak, but the keys, which are the same objects, are strong
|
||||
private final ListenerSet<TargetBreakpointAction> actions =
|
||||
new ListenerSet<>(TargetBreakpointAction.class) {
|
||||
// Use strong references on actions
|
||||
// The values may be weak, but the keys, which are the same objects, are strong
|
||||
protected Map<TargetBreakpointAction, ListenerEntry<? extends TargetBreakpointAction>> createMap() {
|
||||
return new LinkedHashMap<>();
|
||||
}
|
||||
};
|
||||
new ListenerSet<>(TargetBreakpointAction.class, false);
|
||||
|
||||
public DbgModelTargetBreakpointSpecImpl(DbgModelTargetBreakpointContainer breakpoints,
|
||||
DbgBreakpointInfo info) {
|
||||
|
@ -128,11 +110,11 @@ public class DbgModelTargetBreakpointSpecImpl extends DbgModelTargetObjectImpl
|
|||
|
||||
/**
|
||||
* Update the enabled field
|
||||
*
|
||||
*
|
||||
* This does not actually toggle the breakpoint. It just updates the field and calls the proper
|
||||
* listeners. To actually toggle the breakpoint, use {@link #toggle(boolean)} instead, which if
|
||||
* effective, should eventually cause this method to be called.
|
||||
*
|
||||
*
|
||||
* @param enabled true if enabled, false if disabled
|
||||
* @param reason a description of the cause (not really used, yet)
|
||||
*/
|
||||
|
|
|
@ -109,8 +109,10 @@ public class DbgModelTargetExceptionImpl extends DbgModelTargetObjectImpl
|
|||
.setFocus(this);
|
||||
changeAttributes(List.of(), List.of(), Map.of( //
|
||||
MODIFIED_ATTRIBUTE_NAME, true), "Refreshed");
|
||||
manager.getEventListeners().fire.consoleOutput(
|
||||
"Exception " + filter.getExceptionCode() + " : " + filter.getName() + "\n", 0);
|
||||
manager.getEventListeners()
|
||||
.invoke()
|
||||
.consoleOutput("Exception " + filter.getExceptionCode() + " : " +
|
||||
filter.getName() + "\n", 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -162,7 +162,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp
|
|||
return thread.writeRegisters(toWrite);
|
||||
// TODO: Should probably filter only effective and normalized writes in the callback
|
||||
}).thenAccept(__ -> {
|
||||
manager.getEventListeners().fire.threadStateChanged(thread, thread.getState(),
|
||||
manager.getEventListeners().invoke().threadStateChanged(thread, thread.getState(),
|
||||
DbgCause.Causes.UNCLAIMED, DbgReason.Reasons.NONE);
|
||||
broadcast().registersUpdated(getProxy(), values);
|
||||
}));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue