diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/DbgProcess.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/DbgProcess.java index 9607778443..2bfcd71cb3 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/DbgProcess.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/DbgProcess.java @@ -23,7 +23,6 @@ import agent.dbgeng.dbgeng.DebugProcessId; import agent.dbgeng.dbgeng.DebugThreadId; import agent.dbgeng.manager.DbgManager.ExecSuffix; import agent.dbgeng.manager.impl.DbgSectionImpl; -import ghidra.dbg.attributes.TypedTargetObjectRef; import ghidra.dbg.target.TargetAttachable; public interface DbgProcess extends DbgMemoryOperations { @@ -165,8 +164,7 @@ public interface DbgProcess extends DbgMemoryOperations { * @param ref the target process * @return a future that completes with a set of handles to all threads of the attached process */ - CompletableFuture> reattach( - TypedTargetObjectRef> ref); + CompletableFuture> reattach(TargetAttachable attachable); /** * Execute an arbitrary kd command, capturing its console output @@ -187,8 +185,8 @@ public interface DbgProcess extends DbgMemoryOperations { * Step the process * * Note that the command can complete before the process has finished stepping. The command - * completes as soon as the process is running. A separate stop event is emitted when the step is - * completed. + * completes as soon as the process is running. A separate stop event is emitted when the step + * is completed. * * @param suffix specifies how far to step, or on what conditions stepping ends. * @@ -200,8 +198,8 @@ public interface DbgProcess extends DbgMemoryOperations { * Step the process * * Note that the command can complete before the process has finished stepping. The command - * completes as soon as the process is running. A separate stop event is emitted when the step is - * completed. + * completes as soon as the process is running. A separate stop event is emitted when the step + * is completed. * * @param args specifies how far to step, or on what conditions stepping ends. * diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/cmd/DbgRequestFocusCommand.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/cmd/DbgRequestFocusCommand.java index 5ad4f9f95c..698ceddb8e 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/cmd/DbgRequestFocusCommand.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/cmd/DbgRequestFocusCommand.java @@ -17,29 +17,29 @@ package agent.dbgeng.manager.cmd; import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.model.iface1.DbgModelTargetFocusScope; -import ghidra.dbg.attributes.TargetObjectRef; +import ghidra.dbg.target.TargetObject; public class DbgRequestFocusCommand extends AbstractDbgCommand { - private DbgModelTargetFocusScope scope; - private TargetObjectRef ref; + private DbgModelTargetFocusScope scope; + private TargetObject obj; /** * Set focus for the current ref * * @param manager the manager to execute the command * @param scope in most cases the root object (must be an ancestor for the ref) - * @param ref the desired focus + * @param obj the desired focus */ - public DbgRequestFocusCommand(DbgManagerImpl manager, DbgModelTargetFocusScope scope, - TargetObjectRef ref) { + public DbgRequestFocusCommand(DbgManagerImpl manager, DbgModelTargetFocusScope scope, + TargetObject obj) { super(manager); this.scope = scope; - this.ref = ref; + this.obj = obj; } @Override public void invoke() { - scope.doRequestFocus(ref); + scope.doRequestFocus(obj); } } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgManagerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgManagerImpl.java index 2f8f3d9620..a72a0574eb 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgManagerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgManagerImpl.java @@ -15,7 +15,7 @@ */ package agent.dbgeng.manager.impl; -import static ghidra.async.AsyncUtils.*; +import static ghidra.async.AsyncUtils.sequence; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -44,7 +44,7 @@ import agent.dbgeng.model.iface1.DbgModelTargetFocusScope; import ghidra.async.*; import ghidra.async.seq.AsyncSequenceHandlerForRunner; import ghidra.comm.util.BitmaskSet; -import ghidra.dbg.attributes.TargetObjectRef; +import ghidra.dbg.target.TargetObject; import ghidra.dbg.util.HandlerMap; import ghidra.lifecycle.Internal; import ghidra.util.Msg; @@ -1400,9 +1400,9 @@ public class DbgManagerImpl implements DbgManager { return execute(new DbgSessionSelectCommand(this, session)); } - public CompletableFuture requestFocus(DbgModelTargetFocusScope scope, - TargetObjectRef ref) { - return execute(new DbgRequestFocusCommand(this, scope, ref)); + public CompletableFuture requestFocus(DbgModelTargetFocusScope scope, + TargetObject obj) { + return execute(new DbgRequestFocusCommand(this, scope, obj)); } @Override diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgProcessImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgProcessImpl.java index 96f897963e..0b0cce6de8 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgProcessImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/manager/impl/DbgProcessImpl.java @@ -15,7 +15,7 @@ */ package agent.dbgeng.manager.impl; -import static ghidra.async.AsyncUtils.*; +import static ghidra.async.AsyncUtils.sequence; import java.nio.ByteBuffer; import java.util.*; @@ -32,7 +32,6 @@ import agent.dbgeng.manager.DbgManager.ExecSuffix; import agent.dbgeng.manager.cmd.*; import ghidra.async.TypeSpec; import ghidra.comm.util.BitmaskSet; -import ghidra.dbg.attributes.TypedTargetObjectRef; import ghidra.dbg.target.TargetAttachable; import ghidra.util.Msg; @@ -267,8 +266,7 @@ public class DbgProcessImpl implements DbgProcess { } @Override - public CompletableFuture> reattach( - TypedTargetObjectRef> ref) { + public CompletableFuture> reattach(TargetAttachable attachable) { return sequence(TypeSpec.cls(DbgThread.class).set()).then((seq) -> { select().handle(seq::next); }).then((seq) -> { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelSelectableObject.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelSelectableObject.java index d8b0a5c5ea..fe25d3218f 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelSelectableObject.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelSelectableObject.java @@ -21,7 +21,7 @@ import agent.dbgeng.manager.DbgProcess; import agent.dbgeng.manager.DbgThread; import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.model.iface2.*; -import ghidra.dbg.attributes.TargetObjectRef; +import ghidra.dbg.target.TargetObject; public interface DbgModelSelectableObject extends DbgModelTargetObject { @@ -43,7 +43,7 @@ public interface DbgModelSelectableObject extends DbgModelTargetObject { } if (this instanceof DbgModelTargetStackFrame) { DbgModelTargetStackFrame tf = (DbgModelTargetStackFrame) this; - TargetObjectRef ref = tf.getThread(); + TargetObject ref = tf.getThread(); if (ref instanceof DbgModelTargetThread) { DbgModelTargetThread tt = (DbgModelTargetThread) ref; DbgThread thread = tt.getThread(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetAccessConditioned.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetAccessConditioned.java index 785aebacd3..543af41e1f 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetAccessConditioned.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetAccessConditioned.java @@ -25,12 +25,12 @@ import ghidra.dbg.target.TargetAccessConditioned; * * @param type for this */ -public interface DbgModelTargetAccessConditioned> - extends DbgModelTargetObject, TargetAccessConditioned { +public interface DbgModelTargetAccessConditioned + extends DbgModelTargetObject, TargetAccessConditioned { @Override - public TargetAccessibility getAccessibility(); + public boolean isAccessible(); - public void setAccessibility(TargetAccessibility accessibility); + public void setAccessible(boolean accessible); } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetAttachable.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetAttachable.java index f0afd3dea6..1b7f9bcc3d 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetAttachable.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetAttachable.java @@ -25,7 +25,6 @@ import ghidra.dbg.target.TargetAttachable; * * @param type for this */ -public interface DbgModelTargetAttachable> - extends DbgModelTargetObject, TargetAttachable { +public interface DbgModelTargetAttachable extends DbgModelTargetObject, TargetAttachable { } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetAttacher.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetAttacher.java index 55b7e999aa..41d5fdc45a 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetAttacher.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetAttacher.java @@ -15,9 +15,7 @@ */ package agent.dbgeng.model.iface1; -import java.util.List; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.atomic.AtomicReference; import agent.dbgeng.manager.DbgProcess; import agent.dbgeng.manager.impl.DbgProcessImpl; @@ -25,10 +23,8 @@ import agent.dbgeng.model.iface2.DbgModelTargetAvailable; import agent.dbgeng.model.iface2.DbgModelTargetObject; import ghidra.async.AsyncUtils; import ghidra.async.TypeSpec; -import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.attributes.TargetObjectRef; -import ghidra.dbg.attributes.TypedTargetObjectRef; -import ghidra.dbg.target.*; +import ghidra.dbg.target.TargetAttachable; +import ghidra.dbg.target.TargetAttacher; import ghidra.util.Msg; /** @@ -38,25 +34,17 @@ import ghidra.util.Msg; * * @param type for this */ -public interface DbgModelTargetAttacher> - extends DbgModelTargetObject, TargetAttacher { +public interface DbgModelTargetAttacher extends DbgModelTargetObject, TargetAttacher { @Override - public default CompletableFuture attach( - TypedTargetObjectRef> ref) { - getModel().assertMine(TargetObjectRef.class, ref); - List tPath = ref.getPath(); - AtomicReference process = new AtomicReference<>(); - AtomicReference attachable = new AtomicReference<>(); - return AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { - getModel().fetchModelObject(tPath).handle(seq::next); - }, TypeSpec.cls(TargetObject.class)).then((obj, seq) -> { - attachable.set((DbgModelTargetAvailable) DebuggerObjectModel.requireIface( - TargetAttachable.class, obj, tPath)); - getManager().addProcess().handle(seq::next); - }, process).then(seq -> { - process.get().attach((int) attachable.get().getPid()).handle(seq::nextIgnore); - }).finish().exceptionally((exc) -> { + public default CompletableFuture attach(TargetAttachable attachable) { + DbgModelTargetAvailable available = + getModel().assertMine(DbgModelTargetAvailable.class, attachable); + // TODO: This and the below new DbgProcessImpl seem to do the same thing + // Both should be expressed the same way + return getManager().addProcess().thenAccept(process -> { + process.attach(available.getPid()); + }).exceptionally((exc) -> { Msg.error(this, "attach failed"); return null; }); @@ -72,5 +60,4 @@ public interface DbgModelTargetAttacher> return null; }); } - } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetDeletable.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetDeletable.java index 9f32897639..15762e20d3 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetDeletable.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetDeletable.java @@ -27,8 +27,7 @@ import ghidra.dbg.target.TargetDeletable; * * @param type for this */ -public interface DbgModelTargetDeletable> - extends DbgModelTargetObject, TargetDeletable { +public interface DbgModelTargetDeletable extends DbgModelTargetObject, TargetDeletable { @Override public CompletableFuture delete(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetDetachable.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetDetachable.java index c2775869ae..075eda8b77 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetDetachable.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetDetachable.java @@ -28,8 +28,7 @@ import ghidra.dbg.target.TargetDetachable; * * @param type for this */ -public interface DbgModelTargetDetachable> - extends DbgModelTargetObject, TargetDetachable { +public interface DbgModelTargetDetachable extends DbgModelTargetObject, TargetDetachable { @Override public default CompletableFuture detach() { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetEnvironment.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetEnvironment.java index db2ea1a181..f663282234 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetEnvironment.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetEnvironment.java @@ -18,8 +18,7 @@ package agent.dbgeng.model.iface1; import agent.dbgeng.model.iface2.DbgModelTargetObject; import ghidra.dbg.target.TargetEnvironment; -public interface DbgModelTargetEnvironment> - extends DbgModelTargetObject, TargetEnvironment { +public interface DbgModelTargetEnvironment extends DbgModelTargetObject, TargetEnvironment { public void refreshInternal(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetEventScope.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetEventScope.java index aeb013d4d9..8757bf92cc 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetEventScope.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetEventScope.java @@ -23,7 +23,6 @@ import ghidra.dbg.target.TargetEventScope; * * @param type for this */ -public interface DbgModelTargetEventScope> - extends DbgModelTargetObject, TargetEventScope { +public interface DbgModelTargetEventScope extends DbgModelTargetObject, TargetEventScope { } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetExecutionStateful.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetExecutionStateful.java index c8b6e600ee..3c17ae449e 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetExecutionStateful.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetExecutionStateful.java @@ -29,8 +29,8 @@ import ghidra.dbg.target.TargetExecutionStateful; * * @param type for this */ -public interface DbgModelTargetExecutionStateful> - extends DbgModelTargetObject, TargetExecutionStateful { +public interface DbgModelTargetExecutionStateful + extends DbgModelTargetObject, TargetExecutionStateful { public default TargetExecutionState convertState(DbgState state) { switch (state) { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetFocusScope.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetFocusScope.java index 06a032cfd7..8e1e40b46f 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetFocusScope.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetFocusScope.java @@ -20,7 +20,6 @@ import java.util.concurrent.CompletableFuture; import agent.dbgeng.model.iface2.DbgModelTargetObject; import ghidra.async.AsyncUtils; import ghidra.dbg.agent.AbstractTargetObject; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.error.DebuggerIllegalArgumentException; import ghidra.dbg.target.TargetFocusScope; import ghidra.dbg.target.TargetObject; @@ -33,8 +32,7 @@ import ghidra.dbg.util.PathUtils; * * @param type for this */ -public interface DbgModelTargetFocusScope> - extends DbgModelTargetObject, TargetFocusScope { +public interface DbgModelTargetFocusScope extends DbgModelTargetObject, TargetFocusScope { @Override public DbgModelSelectableObject getFocus(); @@ -45,38 +43,36 @@ public interface DbgModelTargetFocusScope> // NB: requestFocus request change in active object - propagates down to manager // (but, of course, may then cause change in state) @Override - public default CompletableFuture requestFocus(TargetObjectRef ref) { - return getManager().requestFocus(this, ref); + public default CompletableFuture requestFocus(TargetObject obj) { + return getManager().requestFocus(this, obj); } - public default CompletableFuture doRequestFocus(TargetObjectRef ref) { + public default CompletableFuture doRequestFocus(TargetObject obj) { if (getManager().isWaiting()) { return CompletableFuture.completedFuture(null); } - getModel().assertMine(TargetObjectRef.class, ref); - if (ref.equals(getFocus())) { + getModel().assertMine(TargetObject.class, obj); + if (obj.equals(getFocus())) { return CompletableFuture.completedFuture(null); } - if (!PathUtils.isAncestor(this.getPath(), ref.getPath())) { + if (!PathUtils.isAncestor(this.getPath(), obj.getPath())) { throw new DebuggerIllegalArgumentException("Can only focus a successor of the scope"); } - return ref.fetch().thenCompose(obj -> { - TargetObject cur = obj; - while (cur != null) { - if (cur instanceof DbgModelSelectableObject) { - DbgModelSelectableObject sel = (DbgModelSelectableObject) cur; - setFocus(sel); - return sel.select(); - } - if (cur instanceof AbstractTargetObject) { - AbstractTargetObject def = (AbstractTargetObject) cur; - cur = def.getImplParent(); - continue; - } - throw new AssertionError(); + TargetObject cur = obj; + while (cur != null) { + if (cur instanceof DbgModelSelectableObject) { + DbgModelSelectableObject sel = (DbgModelSelectableObject) cur; + setFocus(sel); + return sel.select(); } - return AsyncUtils.NIL; - }); + if (cur instanceof AbstractTargetObject) { + AbstractTargetObject def = (AbstractTargetObject) cur; + cur = def.getParent(); + continue; + } + throw new AssertionError(); + } + return AsyncUtils.NIL; } } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetInterpreter.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetInterpreter.java index 980005854d..23c0ffe3a0 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetInterpreter.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetInterpreter.java @@ -27,8 +27,7 @@ import ghidra.dbg.target.TargetInterpreter; * * @param type for this */ -public interface DbgModelTargetInterpreter> - extends DbgModelTargetObject, TargetInterpreter { +public interface DbgModelTargetInterpreter extends DbgModelTargetObject, TargetInterpreter { @Override public default CompletableFuture execute(String cmd) { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetInterruptible.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetInterruptible.java index 1e4f376454..3c8778e593 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetInterruptible.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetInterruptible.java @@ -27,8 +27,7 @@ import ghidra.dbg.target.TargetInterruptible; * * @param type for this */ -public interface DbgModelTargetInterruptible> - extends DbgModelTargetObject, TargetInterruptible { +public interface DbgModelTargetInterruptible extends DbgModelTargetObject, TargetInterruptible { @Override public default CompletableFuture interrupt() { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetKillable.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetKillable.java index 9000f2716c..470b9293b6 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetKillable.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetKillable.java @@ -28,8 +28,7 @@ import ghidra.dbg.target.TargetKillable; * * @param type for this */ -public interface DbgModelTargetKillable> - extends DbgModelTargetObject, TargetKillable { +public interface DbgModelTargetKillable extends DbgModelTargetObject, TargetKillable { @Override public default CompletableFuture kill() { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetLauncher.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetLauncher.java index d0e518b9aa..5a45c98b16 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetLauncher.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetLauncher.java @@ -32,8 +32,7 @@ import ghidra.dbg.target.TargetLauncher.TargetCmdLineLauncher; * * @param type for this */ -public interface DbgModelTargetLauncher> - extends DbgModelTargetObject, TargetCmdLineLauncher { +public interface DbgModelTargetLauncher extends DbgModelTargetObject, TargetCmdLineLauncher { @Override public default CompletableFuture launch(List args) { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetMethod.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetMethod.java index aa8760c4ca..2f1342f92e 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetMethod.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetMethod.java @@ -23,7 +23,6 @@ import ghidra.dbg.target.TargetMethod; * * @param type for this */ -public interface DbgModelTargetMethod> - extends DbgModelTargetObject, TargetMethod { +public interface DbgModelTargetMethod extends DbgModelTargetObject, TargetMethod { } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetResumable.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetResumable.java index 7dd3097bff..38b4598a15 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetResumable.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetResumable.java @@ -28,8 +28,7 @@ import ghidra.dbg.target.TargetResumable; * * @param type for this */ -public interface DbgModelTargetResumable> - extends DbgModelTargetObject, TargetResumable { +public interface DbgModelTargetResumable extends DbgModelTargetObject, TargetResumable { @Override public default CompletableFuture resume() { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetSteppable.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetSteppable.java index dec9c6a18f..c5d4c8a072 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetSteppable.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface1/DbgModelTargetSteppable.java @@ -30,8 +30,7 @@ import ghidra.dbg.target.TargetSteppable; * * @param type for this */ -public interface DbgModelTargetSteppable> - extends DbgModelTargetObject, TargetSteppable { +public interface DbgModelTargetSteppable extends DbgModelTargetObject, TargetSteppable { default ExecSuffix convertToDbg(TargetStepKind kind) { switch (kind) { @@ -77,6 +76,7 @@ public interface DbgModelTargetSteppable> } } + @Override default CompletableFuture step(Map args) { DbgThread thread = getManager().getCurrentThread(); return thread.step(args); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetAvailable.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetAvailable.java index f6f9d63099..a162c52fa7 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetAvailable.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetAvailable.java @@ -17,8 +17,7 @@ package agent.dbgeng.model.iface2; import ghidra.dbg.target.TargetAttachable; -public interface DbgModelTargetAvailable - extends DbgModelTargetObject, TargetAttachable { +public interface DbgModelTargetAvailable extends DbgModelTargetObject, TargetAttachable { public long getPid(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointContainer.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointContainer.java index 9fa88029eb..808ddb5a52 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointContainer.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointContainer.java @@ -27,11 +27,15 @@ import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind; import ghidra.dbg.target.schema.*; import ghidra.program.model.address.AddressRange; -@TargetObjectSchemaInfo(name = "BreakpointContainer", elements = { - @TargetElementType(type = DbgModelTargetBreakpointSpec.class) }, attributes = { - @TargetAttributeType(type = Void.class) }, canonicalContainer = true) -public interface DbgModelTargetBreakpointContainer extends DbgModelTargetObject, - TargetBreakpointContainer, DbgEventsListenerAdapter { +@TargetObjectSchemaInfo( + name = "BreakpointContainer", + elements = { + @TargetElementType(type = DbgModelTargetBreakpointSpec.class) }, + attributes = { + @TargetAttributeType(type = Void.class) }, + canonicalContainer = true) +public interface DbgModelTargetBreakpointContainer + extends DbgModelTargetObject, TargetBreakpointContainer, DbgEventsListenerAdapter { /* @Override diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointLocation.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointLocation.java index b2934001a5..c8f7940e78 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointLocation.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointLocation.java @@ -15,17 +15,17 @@ */ package agent.dbgeng.model.iface2; -import ghidra.dbg.attributes.TargetObjectRefList; +import ghidra.dbg.attributes.TargetObjectList; import ghidra.dbg.target.TargetBreakpointLocation; import ghidra.program.model.address.Address; public interface DbgModelTargetBreakpointLocation - extends DbgModelTargetObject, TargetBreakpointLocation { + extends DbgModelTargetObject, TargetBreakpointLocation { @Override public Address getAddress(); @Override - public TargetObjectRefList getAffects(); + public TargetObjectList getAffects(); } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointSpec.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointSpec.java index 436cfe0012..80b9b69358 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointSpec.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetBreakpointSpec.java @@ -21,16 +21,16 @@ import java.util.concurrent.CompletableFuture; import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo; import agent.dbgeng.model.iface1.DbgModelTargetBptHelper; -import ghidra.dbg.attributes.TargetObjectRefList; +import ghidra.dbg.attributes.TargetObjectList; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetBreakpointContainer.TargetBreakpointKindSet; import ghidra.program.model.address.*; public interface DbgModelTargetBreakpointSpec extends // DbgModelTargetObject, // - TargetBreakpointSpec, // - TargetBreakpointLocation, // - TargetDeletable, // + TargetBreakpointSpec, // + TargetBreakpointLocation, // + TargetDeletable, // DbgModelTargetBptHelper { String BPT_ACCESS_ATTRIBUTE_NAME = "Access"; @@ -129,9 +129,9 @@ public interface DbgModelTargetBreakpointSpec extends // return getModel().getAddress("ram", info.addrAsLong()); } - public default TargetObjectRefList doGetAffects() { + public default TargetObjectList doGetAffects() { DbgModelTargetProcess process = getParentProcess(); - return TargetObjectRefList.of(process); + return TargetObjectList.of(process); } public default void updateInfo(DbgBreakpointInfo oldInfo, DbgBreakpointInfo newInfo, diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetConnector.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetConnector.java index 154c86a3ef..6b9961e517 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetConnector.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetConnector.java @@ -23,7 +23,7 @@ import ghidra.dbg.target.TargetLauncher; import ghidra.dbg.target.TargetMethod.TargetParameterMap; public interface DbgModelTargetConnector - extends DbgModelSelectableObject, TargetLauncher { + extends DbgModelSelectableObject, TargetLauncher { @Override public default String getDisplay() { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetEnvironmentEx.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetEnvironmentEx.java index 3f98101500..d1e4d59dbc 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetEnvironmentEx.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetEnvironmentEx.java @@ -17,8 +17,7 @@ package agent.dbgeng.model.iface2; import ghidra.dbg.target.TargetEnvironment; -public interface DbgModelTargetEnvironmentEx - extends DbgModelTargetObject, TargetEnvironment { +public interface DbgModelTargetEnvironmentEx extends DbgModelTargetObject, TargetEnvironment { public void refreshInternal(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetMemoryContainer.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetMemoryContainer.java index 07a532abd1..b111c278f7 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetMemoryContainer.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetMemoryContainer.java @@ -21,8 +21,7 @@ import agent.dbgeng.manager.DbgModuleMemory; import ghidra.dbg.target.TargetMemory; import ghidra.program.model.address.Address; -public interface DbgModelTargetMemoryContainer - extends DbgModelTargetObject, TargetMemory { +public interface DbgModelTargetMemoryContainer extends DbgModelTargetObject, TargetMemory { public DbgModelTargetMemoryRegion getTargetMemory(DbgModuleMemory region); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetMemoryRegion.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetMemoryRegion.java index 889214e5d9..1537df006a 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetMemoryRegion.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetMemoryRegion.java @@ -18,8 +18,7 @@ package agent.dbgeng.model.iface2; import ghidra.dbg.target.TargetMemoryRegion; import ghidra.program.model.address.AddressRange; -public interface DbgModelTargetMemoryRegion - extends DbgModelTargetObject, TargetMemoryRegion { +public interface DbgModelTargetMemoryRegion extends DbgModelTargetObject, TargetMemoryRegion { @Override public AddressRange getRange(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetModule.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetModule.java index 9aae249837..ebbb8e9ff5 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetModule.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetModule.java @@ -23,9 +23,7 @@ import ghidra.dbg.target.TargetModule; import ghidra.dbg.target.TargetObject; import ghidra.program.model.address.*; -public interface DbgModelTargetModule extends // - DbgModelTargetObject, // - TargetModule { +public interface DbgModelTargetModule extends DbgModelTargetObject, TargetModule { DbgModule getDbgModule(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetModuleContainer.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetModuleContainer.java index f554afc42b..9d4a3cc4f3 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetModuleContainer.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetModuleContainer.java @@ -21,13 +21,11 @@ import agent.dbgeng.model.iface1.DbgModelTargetEventScope; import ghidra.dbg.target.TargetModule; import ghidra.dbg.target.TargetModuleContainer; -public interface DbgModelTargetModuleContainer extends // - //DbgModelTargetObject, - DbgModelTargetEventScope, // - TargetModuleContainer { +public interface DbgModelTargetModuleContainer + extends /*DbgModelTargetObject,*/ DbgModelTargetEventScope, TargetModuleContainer { @Override - public CompletableFuture> addSyntheticModule(String name); + public CompletableFuture addSyntheticModule(String name); public CompletableFuture getTargetModule(String name); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetModuleSection.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetModuleSection.java index 03a7e80ece..8f4883cb6a 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetModuleSection.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetModuleSection.java @@ -18,8 +18,7 @@ package agent.dbgeng.model.iface2; import ghidra.dbg.target.TargetSection; import ghidra.program.model.address.AddressRange; -public interface DbgModelTargetModuleSection - extends DbgModelTargetObject, TargetSection { +public interface DbgModelTargetModuleSection extends DbgModelTargetObject, TargetSection { @Override public AddressRange getRange(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetObject.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetObject.java index 1139a5a5cf..c18e4f623a 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetObject.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetObject.java @@ -25,7 +25,6 @@ import agent.dbgeng.model.AbstractDbgModel; import ghidra.dbg.agent.InvalidatableTargetObjectIf; import ghidra.dbg.agent.SpiTargetObject; import ghidra.dbg.target.TargetObject; -import ghidra.dbg.target.TargetObject.TargetObjectListener; import ghidra.dbg.util.CollectionUtils.Delta; import ghidra.util.datastruct.ListenerSet; @@ -61,8 +60,6 @@ public interface DbgModelTargetObject extends SpiTargetObject, InvalidatableTarg @Override public CompletableFuture> fetchAttributes(); - public TargetObject getImplParent(); - public Delta changeAttributes(List remove, Map add, String reason); public CompletableFuture> requestNativeAttributes(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetProcess.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetProcess.java index a1e2a020ea..4c052740d5 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetProcess.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetProcess.java @@ -29,18 +29,18 @@ import ghidra.dbg.util.PathUtils; public interface DbgModelTargetProcess extends // TargetAggregate, // - TargetProcess, // - DbgModelTargetExecutionStateful, // - DbgModelTargetAccessConditioned, // - DbgModelTargetAttacher, // - DbgModelTargetAttachable, // - DbgModelTargetLauncher, // - DbgModelTargetDeletable, // - DbgModelTargetDetachable, // - DbgModelTargetKillable, // - DbgModelTargetResumable, // - DbgModelTargetSteppable, // - DbgModelTargetInterruptible, // + TargetProcess, // + DbgModelTargetExecutionStateful, // + DbgModelTargetAccessConditioned, // + DbgModelTargetAttacher, // + DbgModelTargetAttachable, // + DbgModelTargetLauncher, // + DbgModelTargetDeletable, // + DbgModelTargetDetachable, // + DbgModelTargetKillable, // + DbgModelTargetResumable, // + DbgModelTargetSteppable, // + DbgModelTargetInterruptible, // DbgEventsListenerAdapter, // DbgModelSelectableObject { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetProcessContainer.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetProcessContainer.java index facc3f527a..4da4997744 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetProcessContainer.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetProcessContainer.java @@ -22,7 +22,7 @@ import agent.dbgeng.model.iface1.DbgModelTargetEventScope; public interface DbgModelTargetProcessContainer extends // //DbgModelTargetObject, - DbgModelTargetEventScope, // + DbgModelTargetEventScope, // DbgEventsListenerAdapter { public DbgModelTargetProcess getTargetProcess(DebugProcessId id); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegister.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegister.java index 13ce18e8fd..a1f665b22c 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegister.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegister.java @@ -18,8 +18,7 @@ package agent.dbgeng.model.iface2; import agent.dbgeng.manager.impl.DbgRegister; import ghidra.dbg.target.TargetRegister; -public interface DbgModelTargetRegister - extends DbgModelTargetObject, TargetRegister { +public interface DbgModelTargetRegister extends DbgModelTargetObject, TargetRegister { @Override public int getBitLength(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegisterBank.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegisterBank.java index e462228c91..d15e5e4d4a 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegisterBank.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegisterBank.java @@ -30,8 +30,7 @@ import ghidra.dbg.util.ConversionUtils; import ghidra.util.Msg; import ghidra.util.datastruct.ListenerSet; -public interface DbgModelTargetRegisterBank - extends DbgModelTargetObject, TargetRegisterBank { +public interface DbgModelTargetRegisterBank extends DbgModelTargetObject, TargetRegisterBank { public DbgModelTargetRegister getTargetRegister(DbgRegister register); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegisterContainer.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegisterContainer.java index 29c0180c7b..09b7cb4cd0 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegisterContainer.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegisterContainer.java @@ -19,7 +19,7 @@ import agent.dbgeng.manager.impl.DbgRegister; import ghidra.dbg.target.TargetRegisterContainer; public interface DbgModelTargetRegisterContainer - extends DbgModelTargetObject, TargetRegisterContainer { + extends DbgModelTargetObject, TargetRegisterContainer { public DbgModelTargetRegister getTargetRegister(DbgRegister register); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegisterContainerAndBank.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegisterContainerAndBank.java index 726c9b6c07..d26d0a370e 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegisterContainerAndBank.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRegisterContainerAndBank.java @@ -19,9 +19,8 @@ import agent.dbgeng.manager.impl.DbgRegister; import ghidra.dbg.target.TargetRegisterBank; import ghidra.dbg.target.TargetRegisterContainer; -public interface DbgModelTargetRegisterContainerAndBank extends DbgModelTargetObject, // - TargetRegisterContainer, // - TargetRegisterBank { +public interface DbgModelTargetRegisterContainerAndBank + extends DbgModelTargetObject, TargetRegisterContainer, TargetRegisterBank { public DbgModelTargetRegister getTargetRegister(DbgRegister register); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRoot.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRoot.java index fc94a3db81..beb267a06d 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRoot.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetRoot.java @@ -20,11 +20,11 @@ import agent.dbgeng.model.iface1.*; public interface DbgModelTargetRoot extends // ///DbgModelTargetObject, - DbgModelTargetAccessConditioned, // - DbgModelTargetAttacher, // - DbgModelTargetEventScope, // - DbgModelTargetLauncher, // - DbgModelTargetFocusScope, // + DbgModelTargetAccessConditioned, // + DbgModelTargetAttacher, // + DbgModelTargetEventScope, // + DbgModelTargetLauncher, // + DbgModelTargetFocusScope, // DbgEventsListenerAdapter { void setDefaultConnector(DbgModelTargetConnector defaultConnector); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSession.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSession.java index d3ea9fe6e6..83c958d331 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSession.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSession.java @@ -30,12 +30,12 @@ import ghidra.dbg.target.TargetFocusScope.TargetFocusScopeListener; import ghidra.dbg.util.PathUtils; public interface DbgModelTargetSession extends // - DbgModelTargetAccessConditioned, // - //DbgModelTargetFocusScope, // - DbgModelTargetExecutionStateful, // - DbgModelTargetInterpreter, // - DbgModelTargetInterruptible, // - DbgModelTargetResumable, // + DbgModelTargetAccessConditioned, // + //DbgModelTargetFocusScope, // + DbgModelTargetExecutionStateful, // + DbgModelTargetInterpreter, // + DbgModelTargetInterruptible, // + DbgModelTargetResumable, // DbgEventsListenerAdapter, // DbgModelSelectableObject, // TargetFocusScopeListener, // diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSessionAttributes.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSessionAttributes.java index f4657555db..4178e7f3fc 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSessionAttributes.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSessionAttributes.java @@ -20,7 +20,7 @@ import agent.dbgeng.model.iface1.DbgModelTargetEnvironment; public interface DbgModelTargetSessionAttributes extends //DbgModelTargetObject, - DbgModelTargetEnvironment, // + DbgModelTargetEnvironment, // DbgEventsListenerAdapter { } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetStack.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetStack.java index fab2d9445a..806dc7ef1f 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetStack.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetStack.java @@ -19,7 +19,7 @@ import agent.dbgeng.manager.DbgStackFrame; import ghidra.dbg.target.TargetStack; public interface DbgModelTargetStack - extends DbgModelTargetObject, TargetStack { + extends DbgModelTargetObject, TargetStack { public DbgModelTargetStackFrame getTargetFrame(DbgStackFrame frame); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetStackFrame.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetStackFrame.java index c22ecbcfc9..fab0c3731e 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetStackFrame.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetStackFrame.java @@ -23,7 +23,6 @@ import agent.dbgeng.manager.DbgStackFrame; import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.manager.impl.DbgThreadImpl; import agent.dbgeng.model.iface1.DbgModelSelectableObject; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.TargetStackFrame; import ghidra.program.model.address.Address; @@ -31,7 +30,7 @@ import ghidra.program.model.address.AddressSpace; public interface DbgModelTargetStackFrame extends // //DbgModelTargetObject, - TargetStackFrame, // + TargetStackFrame, // DbgEventsListenerAdapter, // DbgModelSelectableObject { @@ -90,7 +89,7 @@ public interface DbgModelTargetStackFrame extends // public void setFrame(DbgStackFrame frame); - public TargetObjectRef getThread(); + public TargetObject getThread(); public Address getPC(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSymbol.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSymbol.java index ebdc7437d1..6837bfe1cb 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSymbol.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSymbol.java @@ -18,8 +18,7 @@ package agent.dbgeng.model.iface2; import ghidra.dbg.target.TargetSymbol; import ghidra.program.model.address.Address; -public interface DbgModelTargetSymbol - extends DbgModelTargetObject, TargetSymbol { +public interface DbgModelTargetSymbol extends DbgModelTargetObject, TargetSymbol { @Override public boolean isConstant(); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSymbolContainer.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSymbolContainer.java index 995f7617d7..5b38aff825 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSymbolContainer.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetSymbolContainer.java @@ -19,8 +19,7 @@ import agent.dbgeng.manager.impl.DbgMinimalSymbol; import agent.dbgeng.model.impl.DbgModelTargetSymbolImpl; import ghidra.dbg.target.TargetSymbolNamespace; -public interface DbgModelTargetSymbolContainer - extends DbgModelTargetObject, TargetSymbolNamespace { +public interface DbgModelTargetSymbolContainer extends DbgModelTargetObject, TargetSymbolNamespace { public DbgModelTargetSymbolImpl getTargetSymbol(DbgMinimalSymbol symbol); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetThread.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetThread.java index a432be03df..0d24c15cda 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetThread.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetThread.java @@ -28,10 +28,10 @@ import ghidra.dbg.target.TargetThread; import ghidra.dbg.util.PathUtils; public interface DbgModelTargetThread extends // - TargetThread, // - DbgModelTargetAccessConditioned, // - DbgModelTargetExecutionStateful, // - DbgModelTargetSteppable, // + TargetThread, // + DbgModelTargetAccessConditioned, // + DbgModelTargetExecutionStateful, // + DbgModelTargetSteppable, // DbgEventsListenerAdapter, // DbgModelSelectableObject { diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetThreadContainer.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetThreadContainer.java index a36da91bd2..460d19fb27 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetThreadContainer.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/iface2/DbgModelTargetThreadContainer.java @@ -22,7 +22,7 @@ import agent.dbgeng.model.iface1.DbgModelTargetEventScope; public interface DbgModelTargetThreadContainer extends // //DbgModelTargetObject, - DbgModelTargetEventScope, // + DbgModelTargetEventScope, // DbgEventsListenerAdapter { public void threadCreated(DbgThread thread); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetMemoryContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetMemoryContainerImpl.java index db964fa429..04995966b7 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetMemoryContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetMemoryContainerImpl.java @@ -29,17 +29,20 @@ import agent.dbgeng.manager.impl.DbgManagerImpl; import agent.dbgeng.model.iface2.*; import ghidra.dbg.error.DebuggerMemoryAccessException; import ghidra.dbg.error.DebuggerModelAccessException; -import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility; import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.schema.*; import ghidra.program.model.address.Address; import ghidra.util.datastruct.WeakValueHashMap; -@TargetObjectSchemaInfo(name = "Memory", elements = { // - @TargetElementType(type = DbgModelTargetMemoryRegionImpl.class) // -}, attributes = { // - @TargetAttributeType(type = Void.class) // -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "Memory", + elements = { + @TargetElementType(type = DbgModelTargetMemoryRegionImpl.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class DbgModelTargetMemoryContainerImpl extends DbgModelTargetObjectImpl implements DbgModelTargetMemoryContainer { @@ -256,12 +259,11 @@ public class DbgModelTargetMemoryContainerImpl extends DbgModelTargetObjectImpl @Override public void onRunning() { invalidateMemoryCaches(); - setAccessibility(TargetAccessibility.INACCESSIBLE); + setAccessible(false); } @Override protected void update() { requestElements(true); } - } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleContainerImpl.java index ef36e9f64e..e5db2bbac7 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleContainerImpl.java @@ -30,11 +30,15 @@ import ghidra.dbg.target.schema.*; import ghidra.lifecycle.Internal; import ghidra.util.Msg; -@TargetObjectSchemaInfo(name = "ModuleContainer", elements = { // - @TargetElementType(type = DbgModelTargetModuleImpl.class) // -}, attributes = { // - @TargetAttributeType(type = Void.class) // -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "ModuleContainer", + elements = { // + @TargetElementType(type = DbgModelTargetModuleImpl.class) // + }, + attributes = { // + @TargetAttributeType(type = Void.class) // + }, + canonicalContainer = true) public class DbgModelTargetModuleContainerImpl extends DbgModelTargetObjectImpl implements DbgModelTargetModuleContainer { // NOTE: -file-list-shared-libraries omits the main module and system-supplied DSO. @@ -97,7 +101,7 @@ public class DbgModelTargetModuleContainerImpl extends DbgModelTargetObjectImpl } @Override - public CompletableFuture> addSyntheticModule(String name) { + public CompletableFuture addSyntheticModule(String name) { throw new UnsupportedOperationException("Dbgeng Does not support synthetic modules"); } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleSectionImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleSectionImpl.java index 2b2df5ca83..6f1eb35fd1 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleSectionImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetModuleSectionImpl.java @@ -23,11 +23,14 @@ import agent.dbgeng.model.iface2.DbgModelTargetModuleSection; import ghidra.dbg.target.schema.*; import ghidra.program.model.address.*; -@TargetObjectSchemaInfo(name = "Section", elements = { // - @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType(type = Void.class) // -}) +@TargetObjectSchemaInfo( + name = "Section", + elements = { // + @TargetElementType(type = Void.class) // + }, + attributes = { // + @TargetAttributeType(type = Void.class) // + }) public class DbgModelTargetModuleSectionImpl extends DbgModelTargetObjectImpl implements DbgModelTargetModuleSection { protected static final String OBJFILE_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "objfile"; @@ -45,7 +48,7 @@ public class DbgModelTargetModuleSectionImpl extends DbgModelTargetObjectImpl range = new AddressRangeImpl(min, max); changeAttributes(List.of(), List.of(), Map.of( // - MODULE_ATTRIBUTE_NAME, sections.getImplParent(), // + MODULE_ATTRIBUTE_NAME, sections.getParent(), // RANGE_ATTRIBUTE_NAME, range, // DISPLAY_ATTRIBUTE_NAME, section.getName(), // UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED // diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetObjectImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetObjectImpl.java index 876dfe8fad..0b2b292976 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetObjectImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetObjectImpl.java @@ -26,7 +26,6 @@ import agent.dbgeng.model.iface1.DbgModelTargetExecutionStateful; import agent.dbgeng.model.iface2.*; import ghidra.dbg.agent.DefaultTargetObject; import ghidra.dbg.target.*; -import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility; import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibilityListener; import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState; import ghidra.dbg.target.schema.TargetObjectSchema; @@ -34,7 +33,7 @@ import ghidra.dbg.target.schema.TargetObjectSchema; public class DbgModelTargetObjectImpl extends DefaultTargetObject implements DbgModelTargetObject { - protected TargetAccessibility accessibility = TargetAccessibility.ACCESSIBLE; + protected boolean accessible = true; protected final DbgStateListener accessListener = this::checkExited; private boolean modified; @@ -61,22 +60,21 @@ public class DbgModelTargetObjectImpl extends DefaultTargetObject) { + if (this instanceof DbgModelTargetAccessConditioned) { changeAttributes(List.of(), List.of(), Map.of( // - TargetAccessConditioned.ACCESSIBLE_ATTRIBUTE_NAME, - accessibility == TargetAccessibility.ACCESSIBLE // + TargetAccessConditioned.ACCESSIBLE_ATTRIBUTE_NAME, accessible // ), "Accessibility changed"); - DbgModelTargetAccessConditioned accessConditioned = - (DbgModelTargetAccessConditioned) this; + DbgModelTargetAccessConditioned accessConditioned = + (DbgModelTargetAccessConditioned) this; listeners.fire(TargetAccessibilityListener.class) - .accessibilityChanged(accessConditioned, accessibility); + .accessibilityChanged(accessConditioned, accessible); } } @@ -86,16 +84,16 @@ public class DbgModelTargetObjectImpl extends DefaultTargetObject stateful = (DbgModelTargetExecutionStateful) this; + DbgModelTargetExecutionStateful stateful = (DbgModelTargetExecutionStateful) this; stateful.setExecutionState(exec, "Refreshed"); } } @@ -153,7 +151,7 @@ public class DbgModelTargetObjectImpl extends DefaultTargetObject> scope = new AtomicReference<>(); + AtomicReference scope = new AtomicReference<>(); AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { DebugModelConventions.findSuitable(DbgModelTargetFocusScope.class, this) .handle(seq::next); @@ -146,25 +162,16 @@ public class DbgModelTargetProcessImpl extends DbgModelTargetObjectImpl } @Override - public CompletableFuture attach(TypedTargetObjectRef> ref) { - getModel().assertMine(TargetObjectRef.class, ref); + public CompletableFuture attach(TargetAttachable attachable) { + getModel().assertMine(TargetObject.class, attachable); // NOTE: Get the object and type check it myself. // The typed ref could have been unsafely cast - List tPath = ref.getPath(); - return AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { - getModel().fetchModelObject(tPath).handle(seq::next); - }, TypeSpec.cls(TargetObject.class)).then((obj, seq) -> { - TargetAttachable attachable = - DebuggerObjectModel.requireIface(TargetAttachable.class, obj, tPath); - process.reattach(attachable); - }).finish(); + return process.reattach(attachable).thenApply(set -> null); } @Override public CompletableFuture attach(long pid) { - return AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { - process.attach(pid).handle(seq::nextIgnore); - }).finish(); + return process.attach(pid).thenApply(set -> null); } @Override @@ -218,7 +225,7 @@ public class DbgModelTargetProcessImpl extends DbgModelTargetObjectImpl @Override public void onExit() { super.onExit(); - DbgModelTargetProcessContainer processes = (DbgModelTargetProcessContainer) getImplParent(); + DbgModelTargetProcessContainer processes = (DbgModelTargetProcessContainer) getParent(); processes.processRemoved(process.getId(), DbgCause.Causes.UNCLAIMED); } @@ -244,8 +251,7 @@ public class DbgModelTargetProcessImpl extends DbgModelTargetObjectImpl } @Override - public TargetAccessibility getAccessibility() { - return accessibility; + public boolean isAccessible() { + return accessible; } - } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterContainerImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterContainerImpl.java index 4138d9534e..ae595a6bf0 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterContainerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRegisterContainerImpl.java @@ -26,22 +26,24 @@ import agent.dbgeng.manager.impl.DbgRegisterSet; import agent.dbgeng.model.iface2.*; import ghidra.async.AsyncUtils; import ghidra.async.TypeSpec; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.error.DebuggerRegisterAccessException; -import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility; import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.TargetRegisterBank; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.ConversionUtils; -@TargetObjectSchemaInfo(name = "RegisterContainer", elements = { // - @TargetElementType(type = DbgModelTargetRegisterImpl.class) // -}, attributes = { // - @TargetAttributeType( // - name = TargetRegisterBank.DESCRIPTIONS_ATTRIBUTE_NAME, // - type=DbgModelTargetRegisterContainerImpl.class), - @TargetAttributeType(type = Void.class) // -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "RegisterContainer", + elements = { + @TargetElementType(type = DbgModelTargetRegisterImpl.class) + }, + attributes = { + @TargetAttributeType( + name = TargetRegisterBank.DESCRIPTIONS_ATTRIBUTE_NAME, + type = DbgModelTargetRegisterContainerImpl.class), + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImpl implements DbgModelTargetRegisterContainerAndBank { @@ -139,7 +141,7 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp }, TypeSpec.cls(DbgRegisterSet.class)).then((regs, seq) -> { fetchElements().handle(seq::nextIgnore); }).then(seq -> { - Map regs = getCachedElements(); + Map regs = getCachedElements(); Map toWrite = new LinkedHashMap<>(); for (Map.Entry ent : values.entrySet()) { String regname = ent.getKey(); @@ -168,12 +170,12 @@ public class DbgModelTargetRegisterContainerImpl extends DbgModelTargetObjectImp public void onRunning() { // NB: We don't want to do this apparently //invalidateRegisterCaches(); - setAccessibility(TargetAccessibility.INACCESSIBLE); + setAccessible(false); } @Override public void onStopped() { - setAccessibility(TargetAccessibility.ACCESSIBLE); + setAccessible(true); if (thread.equals(getManager().getEventThread())) { readRegistersNamed(getCachedElements().keySet()); } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRootImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRootImpl.java index a934314d9d..e7d619f6d7 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRootImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetRootImpl.java @@ -32,26 +32,26 @@ import ghidra.dbg.util.PathUtils; @TargetObjectSchemaInfo( name = "Debugger", - elements = { // - @TargetElementType(type = Void.class) // + elements = { + @TargetElementType(type = Void.class) }, - attributes = { // + attributes = { @TargetAttributeType( name = "Available", type = DbgModelTargetAvailableContainerImpl.class, required = true, - fixed = true), // + fixed = true), @TargetAttributeType( name = "Connectors", type = DbgModelTargetConnectorContainerImpl.class, required = true, - fixed = true), // + fixed = true), @TargetAttributeType( name = "Sessions", type = DbgModelTargetSessionContainerImpl.class, required = true, - fixed = true), // - @TargetAttributeType(type = Void.class) // + fixed = true), + @TargetAttributeType(type = Void.class) }) public class DbgModelTargetRootImpl extends DbgModelDefaultTargetModelRoot implements DbgModelTargetRoot { @@ -152,8 +152,8 @@ public class DbgModelTargetRootImpl extends DbgModelDefaultTargetModelRoot } @Override - public TargetAccessibility getAccessibility() { - return accessibility; + public boolean isAccessible() { + return accessible; } } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSessionImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSessionImpl.java index 8218489a16..c38f966d8e 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSessionImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetSessionImpl.java @@ -27,13 +27,23 @@ import agent.dbgeng.model.iface2.DbgModelTargetSession; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; -@TargetObjectSchemaInfo(name = "Session", elements = { // - @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType(name = "Attributes", type = DbgModelTargetSessionAttributesImpl.class, fixed = true), // - @TargetAttributeType(name = "Processes", type = DbgModelTargetProcessContainerImpl.class, required = true, fixed = true), // - @TargetAttributeType(type = Void.class) // -}) +@TargetObjectSchemaInfo( + name = "Session", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType( + name = "Attributes", + type = DbgModelTargetSessionAttributesImpl.class, + fixed = true), + @TargetAttributeType( + name = "Processes", + type = DbgModelTargetProcessContainerImpl.class, + required = true, + fixed = true), + @TargetAttributeType(type = Void.class) + }) public class DbgModelTargetSessionImpl extends DbgModelTargetObjectImpl implements DbgModelTargetSession { @@ -87,8 +97,8 @@ public class DbgModelTargetSessionImpl extends DbgModelTargetObjectImpl } @Override - public TargetAccessibility getAccessibility() { - return accessibility; + public boolean isAccessible() { + return accessible; } @Override diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackFrameImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackFrameImpl.java index f40abbd3b7..f379647510 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackFrameImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackFrameImpl.java @@ -28,27 +28,52 @@ import agent.dbgeng.model.iface2.*; import ghidra.async.AsyncUtils; import ghidra.async.TypeSpec; import ghidra.dbg.DebugModelConventions; -import ghidra.dbg.attributes.TargetObjectRef; +import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; import ghidra.program.model.address.Address; -@TargetObjectSchemaInfo(name = "StackFrame", elements = { // - @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType(name = DbgModelTargetStackFrame.FUNC_ATTRIBUTE_NAME, type = String.class), // - @TargetAttributeType(name = DbgModelTargetStackFrame.FUNC_TABLE_ENTRY_ATTRIBUTE_NAME, type = String.class), // - @TargetAttributeType(name = DbgModelTargetStackFrame.INST_OFFSET_ATTRIBUTE_NAME, type = String.class), // - @TargetAttributeType(name = DbgModelTargetStackFrame.FRAME_OFFSET_ATTRIBUTE_NAME, type = String.class), // - @TargetAttributeType(name = DbgModelTargetStackFrame.RETURN_OFFSET_ATTRIBUTE_NAME, type = String.class), // - @TargetAttributeType(name = DbgModelTargetStackFrame.STACK_OFFSET_ATTRIBUTE_NAME, type = String.class), // - @TargetAttributeType(name = DbgModelTargetStackFrame.VIRTUAL_ATTRIBUTE_NAME, type = Boolean.class), // - @TargetAttributeType(name = DbgModelTargetStackFrame.PARAM0_ATTRIBUTE_NAME, type = String.class), // - @TargetAttributeType(name = DbgModelTargetStackFrame.PARAM1_ATTRIBUTE_NAME, type = String.class), // - @TargetAttributeType(name = DbgModelTargetStackFrame.PARAM2_ATTRIBUTE_NAME, type = String.class), // - @TargetAttributeType(name = DbgModelTargetStackFrame.PARAM3_ATTRIBUTE_NAME, type = String.class), // - @TargetAttributeType(type = Void.class) // -}) +@TargetObjectSchemaInfo( + name = "StackFrame", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType( + name = DbgModelTargetStackFrame.FUNC_ATTRIBUTE_NAME, + type = String.class), + @TargetAttributeType( + name = DbgModelTargetStackFrame.FUNC_TABLE_ENTRY_ATTRIBUTE_NAME, + type = String.class), + @TargetAttributeType( + name = DbgModelTargetStackFrame.INST_OFFSET_ATTRIBUTE_NAME, + type = String.class), + @TargetAttributeType( + name = DbgModelTargetStackFrame.FRAME_OFFSET_ATTRIBUTE_NAME, + type = String.class), + @TargetAttributeType( + name = DbgModelTargetStackFrame.RETURN_OFFSET_ATTRIBUTE_NAME, + type = String.class), + @TargetAttributeType( + name = DbgModelTargetStackFrame.STACK_OFFSET_ATTRIBUTE_NAME, + type = String.class), + @TargetAttributeType( + name = DbgModelTargetStackFrame.VIRTUAL_ATTRIBUTE_NAME, + type = Boolean.class), + @TargetAttributeType( + name = DbgModelTargetStackFrame.PARAM0_ATTRIBUTE_NAME, + type = String.class), + @TargetAttributeType( + name = DbgModelTargetStackFrame.PARAM1_ATTRIBUTE_NAME, + type = String.class), + @TargetAttributeType( + name = DbgModelTargetStackFrame.PARAM2_ATTRIBUTE_NAME, + type = String.class), + @TargetAttributeType( + name = DbgModelTargetStackFrame.PARAM3_ATTRIBUTE_NAME, + type = String.class), + @TargetAttributeType(type = Void.class) + }) public class DbgModelTargetStackFrameImpl extends DbgModelTargetObjectImpl implements DbgModelTargetStackFrame { @@ -100,7 +125,7 @@ public class DbgModelTargetStackFrameImpl extends DbgModelTargetObjectImpl @Override public void threadSelected(DbgThread eventThread, DbgStackFrame eventFrame, DbgCause cause) { if (eventFrame != null && eventFrame.equals(frame)) { - AtomicReference> scope = new AtomicReference<>(); + AtomicReference scope = new AtomicReference<>(); AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { DebugModelConventions.findSuitable(DbgModelTargetFocusScope.class, this) .handle(seq::next); @@ -154,7 +179,7 @@ public class DbgModelTargetStackFrameImpl extends DbgModelTargetObjectImpl } @Override - public TargetObjectRef getThread() { + public TargetObject getThread() { return thread.getParent(); } diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackImpl.java index d3217d052b..979c6233f1 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetStackImpl.java @@ -22,17 +22,20 @@ import java.util.stream.Collectors; import agent.dbgeng.manager.DbgStackFrame; import agent.dbgeng.model.iface2.*; -import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility; import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.schema.*; import ghidra.util.Msg; import ghidra.util.datastruct.WeakValueHashMap; -@TargetObjectSchemaInfo(name = "Stack", elements = { // - @TargetElementType(type = DbgModelTargetStackFrameImpl.class) // -}, attributes = { // - @TargetAttributeType(type = Void.class) // -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "Stack", + elements = { + @TargetElementType(type = DbgModelTargetStackFrameImpl.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class DbgModelTargetStackImpl extends DbgModelTargetObjectImpl implements DbgModelTargetStack { @@ -84,12 +87,12 @@ public class DbgModelTargetStackImpl extends DbgModelTargetObjectImpl public void onRunning() { // NB: We don't want to do this apparently //invalidateRegisterCaches(); - setAccessibility(TargetAccessibility.INACCESSIBLE); + setAccessible(false); } @Override public void onStopped() { - setAccessibility(TargetAccessibility.ACCESSIBLE); + setAccessible(true); if (thread.getThread().getId().equals(getManager().getEventThread().getId())) { update(); } @@ -101,6 +104,7 @@ public class DbgModelTargetStackImpl extends DbgModelTargetObjectImpl * GDB doesn't produce stack change events, but they should only ever happen by running a * target. Thus, every time we're STOPPED, this method should be called. */ + @Override public void update() { requestElements(true).exceptionally(e -> { Msg.error(this, "Could not update stack " + this + " on STOPPED"); diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetThreadImpl.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetThreadImpl.java index ee508079b4..53d781063e 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetThreadImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/java/agent/dbgeng/model/impl/DbgModelTargetThreadImpl.java @@ -33,14 +33,25 @@ import ghidra.dbg.target.TargetEnvironment; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; -@TargetObjectSchemaInfo(name = "Thread", elements = { // - @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType(name = "Registers", type = DbgModelTargetRegisterContainerImpl.class, required = true, fixed = true), // - @TargetAttributeType(name = "Stack", type = DbgModelTargetStackImpl.class, required = true, fixed = true), // - @TargetAttributeType(name = TargetEnvironment.ARCH_ATTRIBUTE_NAME, type = String.class), // - @TargetAttributeType(type = Void.class) // -}) +@TargetObjectSchemaInfo( + name = "Thread", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType( + name = "Registers", + type = DbgModelTargetRegisterContainerImpl.class, + required = true, + fixed = true), + @TargetAttributeType( + name = "Stack", + type = DbgModelTargetStackImpl.class, + required = true, + fixed = true), + @TargetAttributeType(name = TargetEnvironment.ARCH_ATTRIBUTE_NAME, type = String.class), + @TargetAttributeType(type = Void.class) + }) public class DbgModelTargetThreadImpl extends DbgModelTargetObjectImpl implements DbgModelTargetThread { @@ -107,7 +118,7 @@ public class DbgModelTargetThreadImpl extends DbgModelTargetObjectImpl @Override public void threadSelected(DbgThread eventThread, DbgStackFrame frame, DbgCause cause) { if (eventThread.equals(thread)) { - AtomicReference> scope = new AtomicReference<>(); + AtomicReference scope = new AtomicReference<>(); AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { DebugModelConventions.findSuitable(DbgModelTargetFocusScope.class, this) .handle(seq::next); @@ -170,8 +181,8 @@ public class DbgModelTargetThreadImpl extends DbgModelTargetObjectImpl } @Override - public TargetAccessibility getAccessibility() { - return accessibility; + public boolean isAccessible() { + return accessible; } @Override diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/test/java/agent/dbgeng/model/AbstractModelForDbgTest.java b/Ghidra/Debug/Debugger-agent-dbgeng/src/test/java/agent/dbgeng/model/AbstractModelForDbgTest.java index 5595882956..0514b23551 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/test/java/agent/dbgeng/model/AbstractModelForDbgTest.java +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/test/java/agent/dbgeng/model/AbstractModelForDbgTest.java @@ -16,6 +16,7 @@ package agent.dbgeng.model; import static agent.dbgeng.testutil.DummyProc.runProc; +import static ghidra.lifecycle.Unfinished.TODO; import static org.junit.Assert.*; import java.util.*; @@ -33,12 +34,10 @@ import ghidra.async.*; import ghidra.dbg.DebugModelConventions; import ghidra.dbg.DebugModelConventions.AllRequiredAccess; import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.attributes.TargetObjectRef; -import ghidra.dbg.attributes.TargetObjectRefList; +import ghidra.dbg.attributes.TargetObjectList; import ghidra.dbg.error.DebuggerModelNoSuchPathException; import ghidra.dbg.error.DebuggerModelTypeException; import ghidra.dbg.target.*; -import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility; import ghidra.dbg.target.TargetBreakpointContainer.TargetBreakpointKindSet; import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind; import ghidra.dbg.target.TargetConsole.Channel; @@ -139,7 +138,7 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { model.fetchModelObject("Doesn't exist").handle(seq::next); }, TypeSpec.cls(TargetObject.class)).then((obj, seq) -> { @@ -156,7 +155,7 @@ public abstract class AbstractModelForDbgTest AtomicReference root = new AtomicReference<>(); AtomicReference access = new AtomicReference<>(); - AtomicReference> launcher = new AtomicReference<>(); + AtomicReference launcher = new AtomicReference<>(); TypeSpec> t = TypeSpec.auto(); waitOn(AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { @@ -169,7 +168,7 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Finding TargetLauncher..."); DebugModelConventions.findSuitable(DbgModelTargetLauncher.class, root.get()) @@ -179,11 +178,10 @@ public abstract class AbstractModelForDbgTest launcher.get().launch("notepad", "junk.txt").handle(seq::nextIgnore); }).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Getting Processes (after launch)..."); model.fetchObjectElements(List.of("Sessions", "[0]")) - .thenCompose(DebugModelConventions::fetchAll) .handle(seq::next); }, t).then((children, seq) -> { Msg.debug(this, "Processes after: " + children); @@ -201,7 +199,7 @@ public abstract class AbstractModelForDbgTest AtomicReference root = new AtomicReference<>(); AtomicReference session = new AtomicReference<>(); AtomicReference rootAccess = new AtomicReference<>(); - AtomicReference> launcher = new AtomicReference<>(); + AtomicReference launcher = new AtomicReference<>(); AtomicReference launcherAccess = new AtomicReference<>(); TypeSpec> t = TypeSpec.auto(); @@ -215,7 +213,7 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, rootAccess).then(seq -> { Msg.debug(this, "Waiting for session access..."); - rootAccess.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + rootAccess.get().waitValue(true).handle(seq::next); }).then(seq -> { model.fetchModelObject(List.of("Sessions", "[0]")).handle(seq::next); }, session).then(seq -> { @@ -224,22 +222,21 @@ public abstract class AbstractModelForDbgTest session.get()).handle(seq::next); }, TypeSpec.cls(TargetObject.class)).then((obj, seq) -> { assertTrue(obj.getInterfaceNames().contains("Launcher")); - launcher.set((DbgModelTargetLauncher) obj); + launcher.set((DbgModelTargetLauncher) obj); Msg.debug(this, "Tracking process access..."); DebugModelConventions.trackAccessibility(obj).handle(seq::next); }, launcherAccess).then(seq -> { Msg.debug(this, "Waiting for process access..."); - launcherAccess.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + launcherAccess.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Launching..."); launcher.get().launch("notepad", "junk.txt").handle(seq::nextIgnore); }).then(seq -> { Msg.debug(this, "Waiting for session access (again)..."); - rootAccess.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + rootAccess.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Getting Processes (after launch)..."); model.fetchObjectElements(List.of("Sessions", "[0]", "Processes")) - .thenCompose(DebugModelConventions::fetchAll) .handle(seq::next); }, t).then((elements, seq) -> { Msg.debug(this, "Processes after: " + elements); @@ -267,10 +264,9 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { model.fetchObjectElements(List.of("Sessions", "[0]", "Available")) - .thenCompose(DebugModelConventions::fetchAll) .handle(seq::next); }, DebuggerObjectModel.ELEMENT_MAP_TYPE).then((available, seq) -> { assertTrue(available.containsKey(Long.toString(np.pid))); @@ -298,7 +294,7 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Finding TargetLauncher..."); DebugModelConventions.findSuitable(TargetAttacher.class, root.get()) @@ -306,16 +302,11 @@ public abstract class AbstractModelForDbgTest seq::next); }, proc).then(seq -> { Msg.debug(this, "Attaching to bogus path..."); - TargetAttacher attacher = proc.get().as(TargetAttacher.tclass); - attacher.attach( - model.createRef("Sessions", "[0]", "Available", "[" + np.pid + "]") - .as( - TargetAttachable.tclass)) - .handle( - seq::nextIgnore); + TargetAttacher attacher = proc.get().as(TargetAttacher.class); + TODO(); + seq.next(null, null); }).then(seq -> { model.fetchObjectElements(List.of("Sessions", "[0]", "Processes")) - .thenCompose(DebugModelConventions::fetchAll) .handle(seq::next); // NB: listProcesses will fail if no process is being debugged }, DebuggerObjectModel.ELEMENT_MAP_TYPE).then((processes, seq) -> { @@ -332,8 +323,8 @@ public abstract class AbstractModelForDbgTest AtomicReference root = new AtomicReference<>(); AtomicReference access = new AtomicReference<>(); - AtomicReference> attacher = new AtomicReference<>(); - AtomicReference> attachable = new AtomicReference<>(); + AtomicReference attacher = new AtomicReference<>(); + AtomicReference attachable = new AtomicReference<>(); TypeSpec> t = TypeSpec.auto(); waitOn(AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { @@ -346,7 +337,7 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { // Msg.debug(this, "Getting Processes (before attach)..."); // model.getObjectElements(List.of("Sessions", "[0]", "Processes")).handle(seq::next); @@ -366,7 +357,7 @@ public abstract class AbstractModelForDbgTest .thenAccept(o -> { Msg.debug(this, " Got Attachable: " + o); assertTrue(o.getInterfaceNames().contains("Attachable")); - attachable.set((TargetAttachable) o); + attachable.set((TargetAttachable) o); })); fence.ready().handle(seq::next); }).then(seq -> { @@ -374,11 +365,10 @@ public abstract class AbstractModelForDbgTest attacher.get().attach(attachable.get()).handle(seq::nextIgnore); }).then(seq -> { Msg.debug(this, "Waiting for session access (again)..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Getting Processes (after attach)..."); model.fetchObjectElements(List.of("Sessions", "[0]", "Processes")) - .thenCompose(DebugModelConventions::fetchAll) .handle(seq::next); }, t).then((elements, seq) -> { Msg.debug(this, "Processes after: " + elements); @@ -386,7 +376,7 @@ public abstract class AbstractModelForDbgTest Msg.debug(this, "Killing..."); TargetObject attached = elements.get("0"); assertTrue(attached.getInterfaceNames().contains("Killable")); - TargetKillable killable = (TargetKillable) attached; + TargetKillable killable = (TargetKillable) attached; killable.kill().handle(seq::next); }).finish()); } @@ -412,7 +402,7 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Finding TargetLauncher..."); DebugModelConventions.findSuitable(TargetAttacher.class, root.get()) @@ -420,17 +410,15 @@ public abstract class AbstractModelForDbgTest seq::next); }, obj).then(seq -> { Msg.debug(this, "Attaching..."); - TargetAttacher attacher = obj.get().as(TargetAttacher.tclass); - attacher.attach(model.createRef("Sessions", "[0]", "Available", "[" + np.pid + "]") - .as(TargetAttachable.tclass)) + TargetAttacher attacher = obj.get().as(TargetAttacher.class); + attacher.attach(np.pid) .handle(seq::nextIgnore); }).then(seq -> { Msg.debug(this, "Waiting for session access (again, again)..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Getting Processes (after attach)..."); model.fetchObjectElements(List.of("Sessions", "[0]", "Processes")) - .thenCompose(DebugModelConventions::fetchAll) .handle(seq::next); }, t).then((elements, seq) -> { Msg.debug(this, "Processes after: " + elements); @@ -438,7 +426,7 @@ public abstract class AbstractModelForDbgTest Msg.debug(this, "Killing..."); TargetObject attached = elements.get("0"); assertTrue(attached.getInterfaceNames().contains("Killable")); - TargetKillable killable = (TargetKillable) attached; + TargetKillable killable = (TargetKillable) attached; killable.kill().handle(seq::next); }).finish()); } @@ -464,7 +452,7 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Finding TargetLauncher..."); DebugModelConventions.findSuitable(TargetAttacher.class, root.get()) @@ -472,29 +460,25 @@ public abstract class AbstractModelForDbgTest seq::next); }, obj).then(seq -> { Msg.debug(this, "Attaching..."); - TargetAttacher attacher = obj.get().as(TargetAttacher.tclass); - attacher.attach( - model.createRef("Sessions", "[0]", "Available", "[" + np.pid + "]") - .as( - TargetAttachable.tclass)) + TargetAttacher attacher = obj.get().as(TargetAttacher.class); + attacher.attach(np.pid) .handle(seq::nextIgnore); }).then(seq -> { Msg.debug(this, "Waiting for session access (again, again)..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Getting Process 1..."); model.fetchModelObject("Sessions", "[0]", "Processes", "[0]").handle(seq::next); }, obj).then(seq -> { Msg.debug(this, "Resuming..."); - TargetResumable resumable = obj.get().as(TargetResumable.tclass); + TargetResumable resumable = obj.get().as(TargetResumable.class); resumable.resume().handle(seq::next); }).then(seq -> { Msg.debug(this, "Waiting for session access (after resume)..."); - access.get().waitValue(TargetAccessibility.INACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Getting Processes (after attach)..."); model.fetchObjectElements(List.of("Sessions", "[0]", "Processes")) - .thenCompose(DebugModelConventions::fetchAll) .handle(seq::next); }, t).then((elements, seq) -> { Msg.debug(this, "Processes after: " + elements); @@ -502,7 +486,7 @@ public abstract class AbstractModelForDbgTest Msg.debug(this, "Killing..."); TargetObject attached = elements.get("0"); assertTrue(attached.getInterfaceNames().contains("Killable")); - TargetKillable killable = (TargetKillable) attached; + TargetKillable killable = (TargetKillable) attached; killable.kill().handle(seq::nextIgnore); }).finish()); } @@ -526,29 +510,29 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Finding TargetLauncher..."); DebugModelConventions.findSuitable(DbgModelTargetLauncher.class, root.get()) .handle(seq::next); }, obj).then(seq -> { Msg.debug(this, "Launching..."); - TargetLauncher launcher = obj.get().as(TargetLauncher.tclass); + TargetLauncher launcher = obj.get().as(TargetLauncher.class); launcher.launch(Map.of(TargetCmdLineLauncher.CMDLINE_ARGS_NAME, "notepad junk.txt")) .handle(seq::nextIgnore); }).then(seq -> { Msg.debug(this, "Waiting for session access (again)..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Getting Process 1..."); model.fetchModelObject("Sessions", "[0]", "Processes", "[0]").handle(seq::next); }, obj).then(seq -> { Msg.debug(this, "Resuming..."); - TargetResumable resumable = obj.get().as(TargetResumable.tclass); + TargetResumable resumable = obj.get().as(TargetResumable.class); resumable.resume().handle(seq::next); }).then(seq -> { Msg.debug(this, "Waiting for session access (after resume)..."); - access.get().waitValue(TargetAccessibility.INACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).finish()); } } @@ -572,7 +556,7 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Finding TargetLauncher..."); DebugModelConventions.findSuitable(TargetAttacher.class, root.get()) @@ -580,10 +564,9 @@ public abstract class AbstractModelForDbgTest seq::next); }, proc).then(seq -> { Msg.debug(this, "Attaching to bogus path..."); - TargetAttacher attacher = proc.get().as(TargetAttacher.tclass); - attacher.attach(model.createRef("Sessions", "[0]", "Available", "Process -1") - .as(TargetAttachable.tclass)) - .handle(seq::nextIgnore); + TargetAttacher attacher = proc.get().as(TargetAttacher.class); + TODO(); + seq.next(null, null); }).finish()); } } @@ -607,7 +590,7 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Finding TargetLauncher..."); DebugModelConventions.findSuitable(TargetAttacher.class, root.get()) @@ -615,11 +598,9 @@ public abstract class AbstractModelForDbgTest seq::next); }, proc).then(seq -> { Msg.debug(this, "Attaching to bogus path..."); - TargetAttacher attacher = proc.get().as(TargetAttacher.tclass); - attacher.attach(model.createRef("Sessions", "[0]", "Available") - .as( - TargetAttachable.tclass)) - .handle(seq::nextIgnore); + TargetAttacher attacher = proc.get().as(TargetAttacher.class); + TODO(); + seq.next(null, null); }).finish()); fail("Exception expected"); } @@ -662,10 +643,10 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Running command..."); - TargetInterpreter interpreter = root.get().as(TargetInterpreter.tclass); + TargetInterpreter interpreter = root.get().as(TargetInterpreter.class); interpreter.execute(".echo xyzzy").handle(seq::next); }).then(seq -> { Msg.debug(this, "Waiting for expected output..."); @@ -705,10 +686,10 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Running command with capture..."); - TargetInterpreter interpreter = root.get().as(TargetInterpreter.tclass); + TargetInterpreter interpreter = root.get().as(TargetInterpreter.class); interpreter.executeCapture(".echo xyzzy").handle(seq::next); }, TypeSpec.STRING).then((out, seq) -> { Msg.debug(this, "Captured: " + out); @@ -725,7 +706,7 @@ public abstract class AbstractModelForDbgTest AtomicReference root = new AtomicReference<>(); AtomicReference access = new AtomicReference<>(); - AtomicReference> breaks = new AtomicReference<>(); + AtomicReference breaks = new AtomicReference<>(); waitOn(AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { m.init().handle(seq::next); @@ -737,7 +718,7 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Finding breakpoint container..."); DebugModelConventions.findSuitable(TargetBreakpointContainer.class, root.get()) @@ -752,7 +733,7 @@ public abstract class AbstractModelForDbgTest } } - public static final TypeSpec>> BL_COL_SPEC = + public static final TypeSpec> BL_COL_SPEC = null; @Test @@ -762,9 +743,9 @@ public abstract class AbstractModelForDbgTest AtomicReference root = new AtomicReference<>(); AtomicReference access = new AtomicReference<>(); - AtomicReference> launcher = new AtomicReference<>(); - AtomicReference> breaks = new AtomicReference<>(); - AtomicReference> eff = new AtomicReference<>(); + AtomicReference launcher = new AtomicReference<>(); + AtomicReference breaks = new AtomicReference<>(); + AtomicReference loc = new AtomicReference<>(); waitOn(AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { m.init().handle(seq::next); @@ -776,7 +757,7 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Finding TargetLauncher..."); DebugModelConventions.findSuitable(DbgModelTargetLauncher.class, root.get()) @@ -801,20 +782,19 @@ public abstract class AbstractModelForDbgTest Msg.debug(this, "Getting breakpoint specs..."); breaks.get() .fetchElements() - .thenCompose(DebugModelConventions::fetchAll) .handle(seq::next); }, DebuggerObjectModel.ELEMENT_MAP_TYPE).then((specs, seq) -> { Msg.debug(this, "Got specs: " + specs); assertEquals(1, specs.size()); - TargetBreakpointSpec spec = specs.get("0").as(TargetBreakpointSpec.tclass); + TargetBreakpointSpec spec = specs.get("0").as(TargetBreakpointSpec.class); spec.getLocations().handle(seq::next); }, BL_COL_SPEC).then((es, seq) -> { Msg.debug(this, "Got effectives: " + es); assertEquals(1, es.size()); - eff.set(es.iterator().next()); - Address addr = eff.get().getAddress(); + loc.set(es.iterator().next()); + Address addr = loc.get().getAddress(); Msg.debug(this, "Got address: " + addr); - TargetObjectRefList list = eff.get().getAffects(); + TargetObjectList list = loc.get().getAffects(); Msg.debug(this, "Got affects: " + list); assertEquals(1, list.size()); seq.exit(); @@ -829,8 +809,8 @@ public abstract class AbstractModelForDbgTest AtomicReference root = new AtomicReference<>(); AtomicReference access = new AtomicReference<>(); - AtomicReference> breaks = new AtomicReference<>(); - AtomicReference> launcher = new AtomicReference<>(); + AtomicReference breaks = new AtomicReference<>(); + AtomicReference launcher = new AtomicReference<>(); AtomicReference obj = new AtomicReference<>(); waitOn(AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { m.init().handle(seq::next); @@ -842,18 +822,20 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Finding TargetLauncher..."); - DebugModelConventions.findSuitable(DbgModelTargetLauncher.class, root.get()) + DebugModelConventions.findSuitable(TargetLauncher.class, root.get()) .handle( seq::next); }, launcher).then(seq -> { Msg.debug(this, "Launching..."); - launcher.get().launch("notepad", "junk.txt").handle(seq::nextIgnore); + launcher.get() + .launch(Map.of("args", List.of("notepad", "junk.txt"))) + .handle(seq::nextIgnore); }).then(seq -> { Msg.debug(this, "Waiting for session access (again)..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Finding breakpoint container..."); DebugModelConventions.findSuitable(TargetBreakpointContainer.class, root.get()) @@ -869,20 +851,17 @@ public abstract class AbstractModelForDbgTest model.fetchModelObject("Sessions", "[0]", "Processes", "[0]").handle(seq::next); }, obj).then(seq -> { Msg.debug(this, "Resuming..."); - TargetResumable resumable = obj.get().as(TargetResumable.tclass); + TargetResumable resumable = obj.get().as(TargetResumable.class); resumable.resume().handle(seq::next); }).then(seq -> { Msg.debug(this, "Waiting for session access (after resume)..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { - obj.get() - .fetchSubElements("Threads", "[0]", "Stack") - .thenCompose(DebugModelConventions::fetchAll) - .handle(seq::next); + obj.get().fetchSubElements("Threads", "[0]", "Stack").handle(seq::next); }, DebuggerObjectModel.ELEMENT_MAP_TYPE).then((frames, seq) -> { Msg.debug(this, "Got stack:"); for (Map.Entry ent : frames.entrySet()) { - TargetStackFrame frame = ent.getValue().as(TargetStackFrame.tclass); + TargetStackFrame frame = ent.getValue().as(TargetStackFrame.class); Msg.debug(this, ent.getKey() + ": " + frame.getProgramCounter()); } long offset = frames.get("0") @@ -904,10 +883,10 @@ public abstract class AbstractModelForDbgTest AtomicReference root = new AtomicReference<>(); AtomicReference access = new AtomicReference<>(); - AtomicReference> launcher = new AtomicReference<>(); + AtomicReference launcher = new AtomicReference<>(); AtomicReference proc = new AtomicReference<>(); - AtomicReference> bank = new AtomicReference<>(); - Set> descs = new LinkedHashSet<>(); + AtomicReference bank = new AtomicReference<>(); + Set descs = new LinkedHashSet<>(); waitOn(AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { m.init().handle(seq::next); @@ -919,7 +898,7 @@ public abstract class AbstractModelForDbgTest DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Finding TargetLauncher..."); DebugModelConventions.findSuitable(DbgModelTargetLauncher.class, root.get()) @@ -927,10 +906,12 @@ public abstract class AbstractModelForDbgTest seq::next); }, launcher).then(seq -> { Msg.debug(this, "Launching..."); - launcher.get().launch("notepad", "junk.txt").handle(seq::nextIgnore); + launcher.get() + .launch(Map.of("args", List.of("notepad", "junk.txt"))) + .handle(seq::nextIgnore); }).then(seq -> { Msg.debug(this, "Waiting for session access (again)..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Getting Process 1..."); model.fetchModelObject(List.of("Sessions", "[0]", "Processes", "[0]")) @@ -938,18 +919,17 @@ public abstract class AbstractModelForDbgTest seq::next); }, proc).then(seq -> { proc.get().fetchSuccessor("Threads", "[0]", "Stack", "[0]").thenAccept(top -> { - bank.set(top.as(TargetRegisterBank.tclass)); + bank.set(top.as(TargetRegisterBank.class)); }).handle(seq::next); }).then(seq -> { Msg.debug(this, "Got bank: " + bank.get()); Msg.debug(this, "Descriptions ref: " + bank.get().getDescriptions()); - bank.get().getDescriptions().fetch().handle(seq::next); - }, TypeSpec.cls(TargetRegisterContainer.wclass)).then((cont, seq) -> { + TargetRegisterContainer cont = bank.get().getDescriptions(); Msg.debug(this, "Register descriptions: " + cont); cont.getRegisters().thenAccept(descs::addAll).handle(seq::next); }).then(seq -> { Msg.debug(this, "Elements: "); - for (TargetRegister reg : descs) { + for (TargetRegister reg : descs) { Msg.debug(this, " " + reg.getIndex() + ": " + reg.getBitLength()); } bank.get().readRegisters(descs).handle(seq::next); @@ -982,7 +962,7 @@ public abstract class AbstractModelForDbgTest DebuggerObjectModel model = m.getModel(); AtomicReference root = new AtomicReference<>(); - AtomicReference> scope = new AtomicReference<>(); + AtomicReference scope = new AtomicReference<>(); AtomicReference access = new AtomicReference<>(); AtomicReference processes = new AtomicReference<>(); AtomicReference obj1 = new AtomicReference<>(); @@ -993,13 +973,13 @@ public abstract class AbstractModelForDbgTest TargetObjectListener procListener = new TargetObjectListener() { @Override public void elementsChanged(TargetObject parent, Collection removed, - Map added) { + Map added) { processCount.set(processes.get().getCachedElements().size(), null); } }; TargetFocusScopeListener focusListener = new TargetFocusScopeListener() { @Override - public void focusChanged(TargetFocusScope object, TargetObjectRef focused) { + public void focusChanged(TargetFocusScope object, TargetObject focused) { // Truncate the path to the parent process focusProcPath.set(focused.getPath().subList(0, 2), null); } @@ -1011,13 +991,13 @@ public abstract class AbstractModelForDbgTest Msg.debug(this, "Getting session root object"); model.fetchModelObject("Sessions", "[0]").handle(seq::next); }, root).then(seq -> { - scope.set(root.get().as(TargetFocusScope.tclass)); + scope.set(root.get().as(TargetFocusScope.class)); scope.get().addListener(focusListener); Msg.debug(this, "Tracking session access..."); DebugModelConventions.trackAccessibility(root.get()).handle(seq::next); }, access).then(seq -> { Msg.debug(this, "Waiting for session access..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { Msg.debug(this, "Finding TargetLauncher..."); DebugModelConventions.findSuitable(DbgModelTargetLauncher.class, root.get()) @@ -1025,12 +1005,8 @@ public abstract class AbstractModelForDbgTest seq::next); }, obj1).then(seq -> { Msg.debug(this, "Attaching..."); - TargetAttacher attacher = obj1.get().as(TargetAttacher.tclass); - attacher.attach( - model.createRef("Sessions", "[0]", "Available", "[" + np.pid + "]") - .as( - TargetAttachable.tclass)) - .handle(seq::nextIgnore); + TargetAttacher attacher = obj1.get().as(TargetAttacher.class); + attacher.attach(np.pid).handle(seq::nextIgnore); }).then(seq -> { Msg.debug(this, "Getting processes container"); model.fetchModelObject("Sessions", "[0]", "Processes").handle(seq::next); @@ -1042,12 +1018,12 @@ public abstract class AbstractModelForDbgTest seq::next); }, obj2).then(seq -> { Msg.debug(this, "Creating another process"); - TargetLauncher launcher = obj2.get().as(TargetLauncher.tclass); + TargetLauncher launcher = obj2.get().as(TargetLauncher.class); launcher.launch(Map.of(TargetCmdLineLauncher.CMDLINE_ARGS_NAME, "notepad junk.txt")) .handle(seq::nextIgnore); }).then(seq -> { Msg.debug(this, "Waiting for session access (again)..."); - access.get().waitValue(TargetAccessibility.ACCESSIBLE).handle(seq::next); + access.get().waitValue(true).handle(seq::next); }).then(seq -> { assertTrue(PathUtils.isAncestor(List.of("Sessions", "[0]", "Processes", "[1]"), scope.get().getFocus().getPath())); @@ -1056,9 +1032,9 @@ public abstract class AbstractModelForDbgTest Msg.debug(this, "Requesting focus on process 0"); AsyncFence fence = new AsyncFence(); - TargetObjectRef i2 = model.createRef("Sessions", "[0]", "Processes", "[0]"); - fence.include(focusProcPath.waitValue(i2.getPath())); - fence.include(scope.get().requestFocus(i2)); + TargetObject p2 = model.getModelObject("Sessions", "[0]", "Processes", "[0]"); + fence.include(focusProcPath.waitValue(p2.getPath())); + fence.include(scope.get().requestFocus(p2)); fence.ready().handle(seq::next); }).then(seq -> { assertTrue(PathUtils.isAncestor(List.of("Sessions", "[0]", "Processes", "[0]"), diff --git a/Ghidra/Debug/Debugger-agent-dbgmodel-traceloader/ghidra_scripts/PopulateTraceRemote.java b/Ghidra/Debug/Debugger-agent-dbgmodel-traceloader/ghidra_scripts/PopulateTraceRemote.java index 26328d6be6..9290cf3029 100644 --- a/Ghidra/Debug/Debugger-agent-dbgmodel-traceloader/ghidra_scripts/PopulateTraceRemote.java +++ b/Ghidra/Debug/Debugger-agent-dbgmodel-traceloader/ghidra_scripts/PopulateTraceRemote.java @@ -1,4 +1,3 @@ - /* ### * IP: GHIDRA * @@ -162,13 +161,13 @@ public class PopulateTraceRemote extends GhidraScript { Set models = targets.getModels(); DebuggerObjectModel model = (DebuggerObjectModel) models.toArray()[0]; - TargetInterpreter interpreter = - DebugModelConventions.findSuitable(TargetInterpreter.tclass, model.createRef()).get(); + TargetInterpreter interpreter = + DebugModelConventions.findSuitable(TargetInterpreter.class, model.getModelRoot()).get(); interpreter.execute(".opendump " + f.getAbsolutePath()).get(); interpreter.execute("g"); - TargetAttacher attacher = - DebugModelConventions.findSuitable(TargetAttacher.tclass, model.createRef()).get(); + TargetAttacher attacher = + DebugModelConventions.findSuitable(TargetAttacher.class, model.getModelRoot()).get(); // TODO: Is "Available" the correct path? - attacher.attach(model.createRef("Available", "[0]").as(TargetAttachable.tclass)).get(); + attacher.attach(model.getModelObject("Available", "[0]").as(TargetAttachable.class)).get(); } } diff --git a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/jna/cmd/DbgListElementsCommand.java b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/jna/cmd/DbgListElementsCommand.java index 5ecbae4b5c..fbbe571521 100644 --- a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/jna/cmd/DbgListElementsCommand.java +++ b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/jna/cmd/DbgListElementsCommand.java @@ -23,7 +23,6 @@ import agent.dbgmodel.dbgmodel.main.ModelObject; import agent.dbgmodel.gadp.impl.WrappedDbgModel; import agent.dbgmodel.manager.DbgManager2Impl; import agent.dbgmodel.model.impl.*; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.TargetObject; import ghidra.dbg.util.PathUtils; @@ -53,7 +52,7 @@ public class DbgListElementsCommand extends AbstractDbgCommand(); List list = access.getElements(path); - Map existingElements = + Map existingElements = targetObject.getCachedElements(); for (ModelObject obj : list) { diff --git a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetObjectImpl.java b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetObjectImpl.java index a18a0d8063..a6542676c9 100644 --- a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetObjectImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetObjectImpl.java @@ -32,7 +32,6 @@ import agent.dbgmodel.jna.dbgmodel.DbgModelNative.TypeKind; import agent.dbgmodel.manager.DbgManager2Impl; import ghidra.dbg.agent.DefaultTargetObject; import ghidra.dbg.target.*; -import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility; import ghidra.dbg.target.TargetBreakpointContainer.TargetBreakpointKindSet; import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind; import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState; @@ -49,7 +48,7 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject elementsByKey = new WeakValueHashMap<>(); protected DbgModelSelectableObject focus; - public TargetAccessibility accessibility = TargetAccessibility.ACCESSIBLE; + public boolean accessible = true; private ModelObject modelObject = null; protected Map intrinsics = new TreeMap<>(TargetObjectKeyComparator.ATTRIBUTE); @@ -214,11 +213,10 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject stateful = (TargetExecutionStateful) proxy; + TargetExecutionStateful stateful = (TargetExecutionStateful) proxy; TargetExecutionState state = stateful.getExecutionState(); attrs.put(TargetExecutionStateful.STATE_ATTRIBUTE_NAME, state); } @@ -269,12 +267,12 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject { if (obj instanceof DbgModelTargetExecutionStateful) { - DbgModelTargetExecutionStateful stateful = - (DbgModelTargetExecutionStateful) obj; + DbgModelTargetExecutionStateful stateful = + (DbgModelTargetExecutionStateful) obj; TargetExecutionState execState = stateful.convertState(state); stateful.setExecutionState(execState, reason); } @@ -379,7 +379,7 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot } listeners.fire(TargetBreakpointListener.class) - .breakpointHit((TargetBreakpointContainer) bpt.getParent(), + .breakpointHit((TargetBreakpointContainer) bpt.getParent(), getParentProcess(), null, bpt, bpt); bpt.breakpointHit(); }); @@ -492,13 +492,12 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot } @Override - public TargetAccessibility getAccessibility() { - return accessibility; + public boolean isAccessible() { + return accessible; } @Override - public void setAccessibility(TargetAccessibility accessibility) { - this.accessibility = accessibility; + public void setAccessible(boolean accessible) { + this.accessible = accessible; } - } diff --git a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetSystemMarkerImpl.java b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetSystemMarkerImpl.java index e3a02320d9..f213a792f1 100644 --- a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetSystemMarkerImpl.java +++ b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DbgModel2TargetSystemMarkerImpl.java @@ -23,7 +23,7 @@ import agent.dbgeng.model.iface1.DbgModelTargetInterruptible; import agent.dbgeng.model.iface2.DbgModelTargetObject; public class DbgModel2TargetSystemMarkerImpl extends DbgModel2TargetObjectImpl - implements DbgModelTargetInterruptible { + implements DbgModelTargetInterruptible { // NB: this is an invisible marker whose only purpose if to enable an // interrupt when connecting in kernel-mode to a running target diff --git a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DelegateDbgModel2TargetObject.java b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DelegateDbgModel2TargetObject.java index 2a9d276458..a87d1a8951 100644 --- a/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DelegateDbgModel2TargetObject.java +++ b/Ghidra/Debug/Debugger-agent-dbgmodel/src/main/java/agent/dbgmodel/model/impl/DelegateDbgModel2TargetObject.java @@ -19,7 +19,6 @@ import java.lang.invoke.MethodHandles; import java.lang.ref.Cleaner; import java.lang.ref.Cleaner.Cleanable; import java.util.*; -import java.util.concurrent.CompletableFuture; import agent.dbgeng.manager.*; import agent.dbgeng.manager.breakpoint.DbgBreakpointInfo; @@ -27,16 +26,14 @@ import agent.dbgeng.model.iface1.*; import agent.dbgeng.model.iface2.*; import agent.dbgmodel.dbgmodel.main.ModelObject; import agent.dbgmodel.jna.dbgmodel.DbgModelNative.ModelObjectKind; -import ghidra.async.AsyncUtils; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointAction; import ghidra.dbg.util.PathUtils; import ghidra.util.datastruct.ListenerSet; public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl implements // - DbgModelTargetAccessConditioned, // - DbgModelTargetExecutionStateful, // + DbgModelTargetAccessConditioned, // + DbgModelTargetExecutionStateful, // DbgModel2TargetProxy, DbgModelTargetBptHelper { // Probably don-t need any of the handler-map or annotation stuff @@ -198,7 +195,7 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp } public DelegateDbgModel2TargetObject clone(String key, ModelObject modelObject) { - DbgModelTargetObject p = (DbgModelTargetObject) getImplParent(); + DbgModelTargetObject p = (DbgModelTargetObject) getParent(); List> mixins = new ArrayList<>(); Class mixin = lookupWrapperType(key, p.getName()); if (mixin != null) { @@ -209,27 +206,11 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp return delegate; } - @Override - @SuppressWarnings({ "unchecked", "rawtypes" }) - public CompletableFuture fetch() { - return (CompletableFuture) CompletableFuture.completedFuture(proxy); - } - @Override public DbgModelTargetObject getProxy() { return (DbgModelTargetObject) proxy; } - @SuppressWarnings("unchecked") - @Override - public CompletableFuture fetchParent() { - TargetObjectRef p = getParent(); - if (p == null) { - return AsyncUtils.nil(); - } - return (CompletableFuture) p.fetch(); - } - protected static String getHintForObject(ModelObject obj) { ModelObjectKind kind = obj.getKind(); String ret = kind == null ? "" : kind.name(); @@ -309,35 +290,34 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp public void onRunning() { invalidate(); - setAccessibility(TargetAccessibility.INACCESSIBLE); + setAccessible(false); } public void onStopped() { - setAccessibility(TargetAccessibility.ACCESSIBLE); + setAccessible(true); update(); } public void onExit() { - setAccessibility(TargetAccessibility.ACCESSIBLE); + setAccessible(true); } @Override - public TargetAccessibility getAccessibility() { - return accessibility; + public boolean isAccessible() { + return accessible; } @Override - public void setAccessibility(TargetAccessibility accessibility) { + public void setAccessible(boolean accessible) { synchronized (attributes) { - if (this.accessibility == accessibility) { + if (this.accessible == accessible) { return; } - this.accessibility = accessibility; + this.accessible = accessible; } if (proxy instanceof TargetAccessConditioned) { changeAttributes(List.of(), List.of(), Map.of( // - TargetAccessConditioned.ACCESSIBLE_ATTRIBUTE_NAME, - accessibility == TargetAccessibility.ACCESSIBLE // + TargetAccessConditioned.ACCESSIBLE_ATTRIBUTE_NAME, accessible // ), "Accessibility changed"); } } diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelImpl.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelImpl.java index e249c5f3c6..4404ae242f 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelImpl.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelImpl.java @@ -26,7 +26,6 @@ import ghidra.async.AsyncUtils; import ghidra.dbg.DebuggerModelClosedReason; import ghidra.dbg.agent.AbstractDebuggerObjectModel; import ghidra.dbg.error.DebuggerUserException; -import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility; import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.schema.AnnotatedSchemaContext; import ghidra.dbg.target.schema.TargetObjectSchema; @@ -102,11 +101,11 @@ public class GdbModelImpl extends AbstractDebuggerObjectModel { } case RUNNING: { session.invalidateMemoryAndRegisterCaches(); - session.setAccessibility(TargetAccessibility.INACCESSIBLE); + session.setAccessible(false); break; } case STOPPED: { - session.setAccessibility(TargetAccessibility.ACCESSIBLE); + session.setAccessible(true); break; } case EXIT: { diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelSelectableObject.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelSelectableObject.java index a14b616dff..04558ac680 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelSelectableObject.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelSelectableObject.java @@ -17,8 +17,8 @@ package agent.gdb.model.impl; import java.util.concurrent.CompletableFuture; -import ghidra.dbg.attributes.TargetObjectRef; +import ghidra.dbg.target.TargetObject; -interface GdbModelSelectableObject extends TargetObjectRef { +interface GdbModelSelectableObject extends TargetObject { CompletableFuture select(); } diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetAttachable.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetAttachable.java index 529c08b903..6170100dd0 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetAttachable.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetAttachable.java @@ -25,14 +25,17 @@ import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; -@TargetObjectSchemaInfo(name = "Attachable", elements = { - @TargetElementType(type = Void.class) -}, attributes = { - @TargetAttributeType(type = Void.class) -}) +@TargetObjectSchemaInfo( + name = "Attachable", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }) public class GdbModelTargetAttachable extends DefaultTargetObject - implements TargetAttachable { + implements TargetAttachable { protected static final String PID_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "pid"; // TODO: DESCRIPTION, TYPE, USER? diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetAvailableContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetAvailableContainer.java index 7daf9c66c9..4a6b16080d 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetAvailableContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetAvailableContainer.java @@ -26,9 +26,12 @@ import ghidra.dbg.target.schema.TargetAttributeType; import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.util.datastruct.WeakValueHashMap; -@TargetObjectSchemaInfo(name = "AvailableContainer", attributes = { - @TargetAttributeType(type = Void.class) -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "AvailableContainer", + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class GdbModelTargetAvailableContainer extends DefaultTargetObject { public static final String NAME = "Available"; diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointContainer.java index 74698d8ed8..d8eb4f6a59 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointContainer.java @@ -34,13 +34,15 @@ import ghidra.program.model.address.AddressRange; import ghidra.util.Msg; import ghidra.util.datastruct.WeakValueHashMap; -@TargetObjectSchemaInfo(name = "BreakpointContainer", attributes = { - @TargetAttributeType(type = Void.class) -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "BreakpointContainer", + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class GdbModelTargetBreakpointContainer extends DefaultTargetObject - implements TargetBreakpointContainer, - GdbEventsListenerAdapter { + implements TargetBreakpointContainer, GdbEventsListenerAdapter { public static final String NAME = "Breakpoints"; protected static final TargetBreakpointKindSet SUPPORTED_KINDS = diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointLocation.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointLocation.java index 82b42bb5cb..0f5aa44321 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointLocation.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointLocation.java @@ -25,22 +25,25 @@ import agent.gdb.manager.parsing.GdbCValueParser; import agent.gdb.manager.parsing.GdbParsingUtils.GdbParseError; import generic.Unique; import ghidra.dbg.agent.DefaultTargetObject; -import ghidra.dbg.attributes.TargetObjectRefList; -import ghidra.dbg.attributes.TargetObjectRefList.DefaultTargetObjectRefList; +import ghidra.dbg.attributes.TargetObjectList; +import ghidra.dbg.attributes.TargetObjectList.DefaultTargetObjectList; import ghidra.dbg.target.TargetBreakpointLocation; import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; import ghidra.program.model.address.Address; -@TargetObjectSchemaInfo(name = "BreakpointLocation", elements = { - @TargetElementType(type = Void.class) -}, attributes = { - @TargetAttributeType(type = Void.class) -}) +@TargetObjectSchemaInfo( + name = "BreakpointLocation", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }) public class GdbModelTargetBreakpointLocation extends DefaultTargetObject - implements TargetBreakpointLocation { + implements TargetBreakpointLocation { protected static String indexLocation(GdbBreakpointLocation loc) { return PathUtils.makeIndex(loc.getSub()); } @@ -54,7 +57,7 @@ public class GdbModelTargetBreakpointLocation protected Address address; protected Integer length; - protected final TargetObjectRefList affects; + protected final TargetObjectList affects; protected String display; public GdbModelTargetBreakpointLocation(GdbModelTargetBreakpointSpec spec, @@ -133,15 +136,15 @@ public class GdbModelTargetBreakpointLocation return length; } - protected TargetObjectRefList doGetAffects() { + protected TargetObjectList doGetAffects() { return loc.getInferiorIds() .stream() .map(impl.session.inferiors::getTargetInferior) - .collect(Collectors.toCollection(DefaultTargetObjectRefList::new)); + .collect(Collectors.toCollection(DefaultTargetObjectList::new)); } @Override - public TargetObjectRefList getAffects() { + public TargetObjectList getAffects() { return affects; } diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointSpec.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointSpec.java index 78ccb0dd60..f0d27a5b16 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointSpec.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetBreakpointSpec.java @@ -34,13 +34,15 @@ import ghidra.util.Msg; import ghidra.util.datastruct.ListenerSet; import ghidra.util.datastruct.WeakValueHashMap; -@TargetObjectSchemaInfo(name = "BreakpointSpec", attributes = { - @TargetAttributeType(type = Void.class) -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "BreakpointSpec", + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class GdbModelTargetBreakpointSpec extends DefaultTargetObject - implements TargetBreakpointSpec, - TargetDeletable { + implements TargetBreakpointSpec, TargetDeletable { protected static String indexBreakpoint(GdbBreakpointInfo info) { return PathUtils.makeIndex(info.getNumber()); diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetEnvironment.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetEnvironment.java index fcb01d51fc..40cf93ed39 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetEnvironment.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetEnvironment.java @@ -25,14 +25,17 @@ import ghidra.dbg.target.TargetEnvironment; import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.schema.*; -@TargetObjectSchemaInfo(name = "Environment", elements = { - @TargetElementType(type = Void.class) -}, attributes = { - @TargetAttributeType(type = Void.class) -}) +@TargetObjectSchemaInfo( + name = "Environment", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }) public class GdbModelTargetEnvironment extends DefaultTargetObject - implements TargetEnvironment { + implements TargetEnvironment { public static final String NAME = "Environment"; public static final String VISIBLE_ARCH_ATTRIBUTE_NAME = "arch"; diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetInferior.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetInferior.java index cb330264ca..6a6cd114f7 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetInferior.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetInferior.java @@ -22,8 +22,6 @@ import agent.gdb.manager.GdbInferior; import agent.gdb.manager.GdbManager.ExecSuffix; import ghidra.async.AsyncFence; import ghidra.dbg.agent.DefaultTargetObject; -import ghidra.dbg.attributes.TargetObjectRef; -import ghidra.dbg.attributes.TypedTargetObjectRef; import ghidra.dbg.error.DebuggerModelNoSuchPathException; import ghidra.dbg.error.DebuggerModelTypeException; import ghidra.dbg.target.*; @@ -40,18 +38,10 @@ import ghidra.util.Msg; attributes = { @TargetAttributeType(type = Void.class) }) public class GdbModelTargetInferior - extends DefaultTargetObject implements // - TargetProcess, // - TargetAggregate, // - TargetExecutionStateful, // - TargetAttacher, // - TargetDeletable, // - TargetDetachable, // - TargetKillable, // - TargetCmdLineLauncher, // - TargetResumable, // - TargetSteppable, // - GdbModelSelectableObject { + extends DefaultTargetObject + implements TargetProcess, TargetAggregate, TargetExecutionStateful, TargetAttacher, + TargetDeletable, TargetDetachable, TargetKillable, TargetCmdLineLauncher, TargetResumable, + TargetSteppable, GdbModelSelectableObject { public static final String EXIT_CODE_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "exit_code"; @@ -186,16 +176,17 @@ public class GdbModelTargetInferior } @Override - public CompletableFuture attach(TypedTargetObjectRef> ref) { - impl.assertMine(TargetObjectRef.class, ref); + public CompletableFuture attach(TargetAttachable attachable) { + impl.assertMine(TargetObject.class, attachable); // NOTE: These can change at any time. Just use the path to derive the target PID - if (!Objects.equals(PathUtils.parent(ref.getPath()), impl.session.available.getPath())) { + if (!Objects.equals(PathUtils.parent(attachable.getPath()), + impl.session.available.getPath())) { throw new DebuggerModelTypeException( "Target of attach must be a child of " + impl.session.available.getPath()); } long pid; try { - pid = Long.parseLong(ref.getIndex()); + pid = Long.parseLong(attachable.getIndex()); } catch (IllegalArgumentException e) { throw new DebuggerModelNoSuchPathException("Badly-formatted PID", e); diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetMemoryRegion.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetMemoryRegion.java index b45dbe64aa..9d9d93a191 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetMemoryRegion.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetMemoryRegion.java @@ -26,14 +26,17 @@ import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; import ghidra.program.model.address.*; -@TargetObjectSchemaInfo(name = "MemoryRegion", elements = { - @TargetElementType(type = Void.class) -}, attributes = { - @TargetAttributeType(type = Void.class) -}) +@TargetObjectSchemaInfo( + name = "MemoryRegion", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }) public class GdbModelTargetMemoryRegion extends DefaultTargetObject - implements TargetMemoryRegion { + implements TargetMemoryRegion { protected static final String OBJFILE_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "objfile"; protected static final String OFFSET_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "offset"; @@ -121,7 +124,11 @@ public class GdbModelTargetMemoryRegion return true; // TODO } - @TargetAttributeType(name = OBJFILE_ATTRIBUTE_NAME, required = true, fixed = true, hidden = true) + @TargetAttributeType( + name = OBJFILE_ATTRIBUTE_NAME, + required = true, + fixed = true, + hidden = true) public String getObjfile() { return objfile; } diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModule.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModule.java index 23db7cc4e6..1a05f92d2e 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModule.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModule.java @@ -29,14 +29,17 @@ import ghidra.dbg.util.PathUtils; import ghidra.program.model.address.*; import ghidra.util.Msg; -@TargetObjectSchemaInfo(name = "Module", elements = { // - @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType(type = Void.class) // -}) +@TargetObjectSchemaInfo( + name = "Module", + elements = { // + @TargetElementType(type = Void.class) // + }, + attributes = { // + @TargetAttributeType(type = Void.class) // + }) public class GdbModelTargetModule extends DefaultTargetObject - implements TargetModule { + implements TargetModule { public static final String VISIBLE_RANGE_ATTRIBUTE_NAME = "range"; public static final String VISIBLE_MODULE_NAME_ATTRIBUTE_NAME = "module name"; diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModuleContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModuleContainer.java index b3a7fccb62..987ef7d823 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModuleContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModuleContainer.java @@ -40,7 +40,7 @@ import ghidra.util.Msg; canonicalContainer = true) public class GdbModelTargetModuleContainer extends DefaultTargetObject - implements TargetModuleContainer { + implements TargetModuleContainer { // NOTE: -file-list-shared-libraries omits the main module and system-supplied DSO. public static final String NAME = "Modules"; @@ -78,7 +78,7 @@ public class GdbModelTargetModuleContainer } @Override - public CompletableFuture> addSyntheticModule(String name) { + public CompletableFuture addSyntheticModule(String name) { throw new DebuggerUserException("GDB Does not support synthetic modules"); } diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetProcessMemory.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetProcessMemory.java index 5d1ea29a1a..06f0ddc885 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetProcessMemory.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetProcessMemory.java @@ -38,12 +38,15 @@ import ghidra.program.model.address.*; import ghidra.util.Msg; import ghidra.util.datastruct.WeakValueHashMap; -@TargetObjectSchemaInfo(name = "Memory", attributes = { - @TargetAttributeType(type = Void.class) -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "Memory", + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class GdbModelTargetProcessMemory extends DefaultTargetObject - implements TargetMemory { + implements TargetMemory { public static final String NAME = "Memory"; protected final GdbModelImpl impl; diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetRegister.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetRegister.java index 8fd50eda33..7e0dbc39b2 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetRegister.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetRegister.java @@ -25,14 +25,17 @@ import ghidra.dbg.target.TargetRegister; import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; -@TargetObjectSchemaInfo(name = "RegisterDescriptor", elements = { - @TargetElementType(type = Void.class) -}, attributes = { - @TargetAttributeType(type = Void.class) -}) +@TargetObjectSchemaInfo( + name = "RegisterDescriptor", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }) public class GdbModelTargetRegister extends DefaultTargetObject - implements TargetRegister { + implements TargetRegister { protected static String indexRegister(GdbRegister register) { String name = register.getName(); diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetRegisterContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetRegisterContainer.java index 71727075ca..23e14c3a7a 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetRegisterContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetRegisterContainer.java @@ -29,12 +29,15 @@ import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.util.Msg; import ghidra.util.datastruct.WeakValueHashMap; -@TargetObjectSchemaInfo(name = "RegisterContainer", attributes = { - @TargetAttributeType(type = Void.class) -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "RegisterContainer", + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class GdbModelTargetRegisterContainer extends DefaultTargetObject - implements TargetRegisterContainer { + implements TargetRegisterContainer { public static final String NAME = "Registers"; protected final GdbModelImpl impl; diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSection.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSection.java index ce36ba83d0..5a6a047380 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSection.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSection.java @@ -26,14 +26,17 @@ import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; import ghidra.program.model.address.*; -@TargetObjectSchemaInfo(name = "Section", elements = { - @TargetElementType(type = Void.class) -}, attributes = { - @TargetAttributeType(type = Void.class) -}) +@TargetObjectSchemaInfo( + name = "Section", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }) public class GdbModelTargetSection extends DefaultTargetObject - implements TargetSection { + implements TargetSection { public static final String VISIBLE_RANGE_ATTRIBUTE_NAME = "range"; diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSectionContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSectionContainer.java index 59a6c82eb2..62232af62c 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSectionContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSectionContainer.java @@ -26,9 +26,12 @@ import ghidra.dbg.target.schema.TargetAttributeType; import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.util.datastruct.WeakValueHashMap; -@TargetObjectSchemaInfo(name = "SectionContainer", attributes = { - @TargetAttributeType(type = Void.class) -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "SectionContainer", + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class GdbModelTargetSectionContainer extends DefaultTargetObject { public static final String NAME = "Sections"; diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSession.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSession.java index a1831fae3e..395f39b895 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSession.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSession.java @@ -21,11 +21,7 @@ import java.util.concurrent.CompletableFuture; import agent.gdb.manager.*; import ghidra.async.AsyncUtils; -import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.agent.AbstractTargetObject; import ghidra.dbg.agent.DefaultTargetModelRoot; -import ghidra.dbg.attributes.TargetObjectRef; -import ghidra.dbg.attributes.TypedTargetObjectRef; import ghidra.dbg.error.DebuggerIllegalArgumentException; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetLauncher.TargetCmdLineLauncher; @@ -41,16 +37,10 @@ import ghidra.util.Msg; attributes = { @TargetAttributeType(type = Void.class) }) -public class GdbModelTargetSession extends DefaultTargetModelRoot implements // - TargetAccessConditioned, - TargetAttacher, - TargetFocusScope, - TargetInterpreter, - TargetInterruptible, - TargetCmdLineLauncher, - TargetEventScope, - GdbConsoleOutputListener, - GdbEventsListenerAdapter { +public class GdbModelTargetSession extends DefaultTargetModelRoot implements + TargetAccessConditioned, TargetAttacher, TargetFocusScope, TargetInterpreter, + TargetInterruptible, TargetCmdLineLauncher, TargetEventScope, + GdbConsoleOutputListener, GdbEventsListenerAdapter { protected static final String GDB_PROMPT = "(gdb)"; protected final GdbModelImpl impl; @@ -60,7 +50,7 @@ public class GdbModelTargetSession extends DefaultTargetModelRoot implements // protected final GdbModelTargetAvailableContainer available; protected final GdbModelTargetBreakpointContainer breakpoints; - private TargetAccessibility accessibility = TargetAccessibility.ACCESSIBLE; + private boolean accessible = true; protected GdbModelSelectableObject focus; protected String debugger = "gdb"; // Used by GdbModelTargetEnvironment @@ -77,7 +67,7 @@ public class GdbModelTargetSession extends DefaultTargetModelRoot implements // inferiors.getName(), inferiors, // available.getName(), available, // breakpoints.getName(), breakpoints, // - ACCESSIBLE_ATTRIBUTE_NAME, accessibility == TargetAccessibility.ACCESSIBLE, // + ACCESSIBLE_ATTRIBUTE_NAME, accessible, // PROMPT_ATTRIBUTE_NAME, GDB_PROMPT, // DISPLAY_ATTRIBUTE_NAME, display, // TargetMethod.PARAMETERS_ATTRIBUTE_NAME, TargetCmdLineLauncher.PARAMETERS, // @@ -167,22 +157,22 @@ public class GdbModelTargetSession extends DefaultTargetModelRoot implements // setFocus(f); } - public void setAccessibility(TargetAccessibility accessibility) { + public void setAccessible(boolean accessible) { synchronized (attributes) { - if (this.accessibility == accessibility) { + if (this.accessible == accessible) { return; } - this.accessibility = accessibility; + this.accessible = accessible; changeAttributes(List.of(), Map.of( // - ACCESSIBLE_ATTRIBUTE_NAME, accessibility == TargetAccessibility.ACCESSIBLE // + ACCESSIBLE_ATTRIBUTE_NAME, accessible // ), "Accessibility changed"); } - listeners.fire(TargetAccessibilityListener.class).accessibilityChanged(this, accessibility); + listeners.fire(TargetAccessibilityListener.class).accessibilityChanged(this, accessible); } @Override - public TargetAccessibility getAccessibility() { - return accessibility; + public boolean isAccessible() { + return accessible; } @Override @@ -194,17 +184,10 @@ public class GdbModelTargetSession extends DefaultTargetModelRoot implements // } @Override - public CompletableFuture attach(TypedTargetObjectRef> ref) { - getModel().assertMine(TargetObjectRef.class, ref); - List tPath = ref.getPath(); - return impl.fetchModelObject(tPath).thenCompose(obj -> { - GdbModelTargetAttachable attachable = (GdbModelTargetAttachable) DebuggerObjectModel - .requireIface(TargetAttachable.class, obj, tPath); - // TODO: Find first unused inferior? - return impl.gdb.addInferior().thenCompose(inf -> { - return inf.attach(attachable.pid).thenApply(__ -> null); - }); - }); + public CompletableFuture attach(TargetAttachable attachable) { + GdbModelTargetAttachable mine = + getModel().assertMine(GdbModelTargetAttachable.class, attachable); + return attach(mine.pid); } @Override @@ -237,31 +220,24 @@ public class GdbModelTargetSession extends DefaultTargetModelRoot implements // } @Override - public CompletableFuture requestFocus(TargetObjectRef ref) { - impl.assertMine(TargetObjectRef.class, ref); + public CompletableFuture requestFocus(TargetObject obj) { + impl.assertMine(TargetObject.class, obj); /** * Yes, this is pointless, since I'm the root, but do it right (TM), since this may change * or be used as an example for other implementations. */ - if (!PathUtils.isAncestor(this.getPath(), ref.getPath())) { + if (!PathUtils.isAncestor(this.getPath(), obj.getPath())) { throw new DebuggerIllegalArgumentException("Can only focus a successor of the scope"); } - return ref.fetch().thenCompose(obj -> { - TargetObject cur = obj; - while (cur != null) { - if (cur instanceof GdbModelSelectableObject) { - GdbModelSelectableObject sel = (GdbModelSelectableObject) cur; - return sel.select(); - } - if (cur instanceof AbstractTargetObject) { - AbstractTargetObject def = (AbstractTargetObject) cur; - cur = def.getImplParent(); - continue; - } - throw new AssertionError(); + TargetObject cur = obj; + while (cur != null) { + if (cur instanceof GdbModelSelectableObject) { + GdbModelSelectableObject sel = (GdbModelSelectableObject) cur; + return sel.select(); } - return AsyncUtils.NIL; - }); + cur = cur.getParent(); + } + return AsyncUtils.NIL; } protected void invalidateMemoryAndRegisterCaches() { diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStack.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStack.java index 38404790c9..d85c6a1904 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStack.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStack.java @@ -30,12 +30,15 @@ import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.util.Msg; import ghidra.util.datastruct.WeakValueHashMap; -@TargetObjectSchemaInfo(name = "Stack", attributes = { - @TargetAttributeType(type = Void.class) -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "Stack", + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class GdbModelTargetStack extends DefaultTargetObject - implements TargetStack { + implements TargetStack { public static final String NAME = "Stack"; protected final GdbModelImpl impl; diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStackFrame.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStackFrame.java index bf67244e15..123270551e 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStackFrame.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetStackFrame.java @@ -31,14 +31,16 @@ import ghidra.lifecycle.Internal; import ghidra.program.model.address.Address; import ghidra.util.Msg; -@TargetObjectSchemaInfo(name = "StackFrame", elements = { - @TargetElementType(type = Void.class) -}, attributes = { - @TargetAttributeType(type = Void.class) -}) +@TargetObjectSchemaInfo( + name = "StackFrame", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }) public class GdbModelTargetStackFrame extends DefaultTargetObject - implements TargetStackFrame, - TargetRegisterBank, GdbModelSelectableObject { + implements TargetStackFrame, TargetRegisterBank, GdbModelSelectableObject { public static final String FUNC_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "function"; public static final String FROM_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "from"; // TODO @@ -87,7 +89,10 @@ public class GdbModelTargetStackFrame extends DefaultTargetObject { public static final String NAME = "Registers"; diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbol.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbol.java index 9e06586bcd..0947d9a5f7 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbol.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbol.java @@ -26,14 +26,17 @@ import ghidra.dbg.target.schema.*; import ghidra.dbg.util.PathUtils; import ghidra.program.model.address.Address; -@TargetObjectSchemaInfo(name = "Symbol", elements = { - @TargetElementType(type = Void.class) -}, attributes = { - @TargetAttributeType(type = Void.class) -}) +@TargetObjectSchemaInfo( + name = "Symbol", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }) public class GdbModelTargetSymbol extends DefaultTargetObject - implements TargetSymbol { + implements TargetSymbol { protected static String indexSymbol(GdbMinimalSymbol symbol) { return symbol.getName(); } diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbolContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbolContainer.java index 810a21b3cf..900f1a000e 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbolContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSymbolContainer.java @@ -27,12 +27,15 @@ import ghidra.dbg.target.schema.TargetAttributeType; import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.util.datastruct.WeakValueHashMap; -@TargetObjectSchemaInfo(name = "SymbolContainer", attributes = { - @TargetAttributeType(type = Void.class) -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "SymbolContainer", + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class GdbModelTargetSymbolContainer extends DefaultTargetObject - implements TargetSymbolNamespace { + implements TargetSymbolNamespace { public static final String NAME = "Symbols"; protected final GdbModelImpl impl; diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetThread.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetThread.java index 6800ea9e87..3c91449467 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetThread.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetThread.java @@ -40,8 +40,7 @@ import ghidra.util.Msg; @TargetAttributeType(type = Void.class) }) public class GdbModelTargetThread extends DefaultTargetObject implements - TargetThread, TargetExecutionStateful, - TargetSteppable, GdbModelSelectableObject { + TargetThread, TargetExecutionStateful, TargetSteppable, GdbModelSelectableObject { protected static final TargetStepKindSet SUPPORTED_KINDS = TargetStepKindSet.of( // TargetStepKind.ADVANCE, // TargetStepKind.FINISH, // diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetThreadContainer.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetThreadContainer.java index 4152f6c54d..06e7045c2d 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetThreadContainer.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetThreadContainer.java @@ -27,9 +27,12 @@ import ghidra.dbg.target.schema.TargetAttributeType; import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.util.datastruct.WeakValueHashMap; -@TargetObjectSchemaInfo(name = "ThreadContainer", attributes = { - @TargetAttributeType(type = Void.class) -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "ThreadContainer", + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class GdbModelTargetThreadContainer extends DefaultTargetObject { public static final String NAME = "Threads"; diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/test/java/agent/gdb/model/AbstractModelForGdbTest.java b/Ghidra/Debug/Debugger-agent-gdb/src/test/java/agent/gdb/model/AbstractModelForGdbTest.java index 3c4741b023..7c15c90d5e 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/test/java/agent/gdb/model/AbstractModelForGdbTest.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/test/java/agent/gdb/model/AbstractModelForGdbTest.java @@ -17,6 +17,7 @@ package agent.gdb.model; import static ghidra.dbg.testutil.DummyProc.run; import static ghidra.dbg.testutil.DummyProc.which; +import static ghidra.lifecycle.Unfinished.TODO; import static org.junit.Assert.*; import java.util.*; @@ -33,11 +34,9 @@ import agent.gdb.model.impl.GdbModelTargetInferior; import agent.gdb.model.impl.GdbModelTargetStackFrame; import ghidra.async.AsyncReference; import ghidra.async.AsyncUtils; -import ghidra.dbg.DebugModelConventions; import ghidra.dbg.DebugModelConventions.AllRequiredAccess; import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.attributes.TargetObjectRef; -import ghidra.dbg.attributes.TargetObjectRefList; +import ghidra.dbg.attributes.TargetObjectList; import ghidra.dbg.error.DebuggerModelNoSuchPathException; import ghidra.dbg.error.DebuggerModelTypeException; import ghidra.dbg.target.*; @@ -185,12 +184,12 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Waiting for session access..."); waitAcc(access); Msg.debug(this, "Getting Inferiors (before launch)..."); - Map inferiors = + Map inferiors = waitOn(model.fetchObjectElements(List.of("Inferiors"))); Msg.debug(this, "Inferiors before: " + inferiors); assertEquals(1, inferiors.size()); Msg.debug(this, "Finding TargetLauncher..."); - TargetLauncher launcher = suitable(TargetLauncher.tclass, root); + TargetLauncher launcher = suitable(TargetLauncher.class, root); Msg.debug(this, "Launching..."); waitOn(launcher.launch( Map.of(TargetCmdLineLauncher.CMDLINE_ARGS_NAME, "/bin/echo Hello, World!"))); @@ -221,8 +220,8 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Waiting for inferior access..."); waitAcc(infAccess); Msg.debug(this, "Reflecting parameters"); - TargetLauncher launcher = inferior.as(TargetLauncher.tclass); - for (ParameterDescription param : launcher.getParameters().values()) { + TargetLauncher launcher = inferior.as(TargetLauncher.class); + for (ParameterDescription param : launcher.getParameters().values()) { Msg.info(this, " Parameter: " + param); } waitOn(launcher.launch(Map.of("args", "/bin/echo Hello, World!"))); @@ -230,7 +229,7 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Waiting for session access (again)..."); waitAcc(rootAccess); Msg.debug(this, "Getting Inferiors (after launch)..."); - Map inferiors = + Map inferiors = waitOn(model.fetchObjectElements(List.of("Inferiors"))); Msg.debug(this, "Inferiors after: " + inferiors); assertEquals(1, inferiors.size()); @@ -260,7 +259,7 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Waiting for session access (again)..."); waitAcc(rootAccess); Msg.debug(this, "Getting Inferiors (after launch)..."); - Map inferiors = + Map inferiors = waitOn(model.fetchObjectElements(List.of("Inferiors"))); Msg.debug(this, "Inferiors after: " + inferiors); assertEquals(1, inferiors.size()); @@ -278,7 +277,7 @@ public abstract class AbstractModelForGdbTest AllRequiredAccess access = access(root); Msg.debug(this, "Waiting for session access..."); waitAcc(access); - Map available = + Map available = waitOn(model.fetchObjectElements(List.of("Available"))); assertTrue(available.containsKey(Long.toString(dd.pid))); } @@ -296,16 +295,16 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Waiting for session access..."); waitAcc(access); Msg.debug(this, "Getting Inferiors (before attach)..."); - Map inferiors = + Map inferiors = waitOn(model.fetchObjectElements(List.of("Inferiors"))); Msg.debug(this, "Inferiors before: " + inferiors); assertEquals(1, inferiors.size()); Msg.debug(this, "Finding TargetAttacher..."); - TargetAttacher attacher = suitable(TargetAttacher.tclass, root); + TargetAttacher attacher = suitable(TargetAttacher.class, root); Msg.debug(this, " Got TargetAttacher: " + attacher); - TargetAttachable attachable = + TargetAttachable attachable = waitOn(model.fetchModelObject("Available", "[" + dd.pid + "]")) - .as(TargetAttachable.tclass); + .as(TargetAttachable.class); Msg.debug(this, " Got Attachable: " + attachable); Msg.debug(this, "Attaching..."); waitOn(attacher.attach(attachable)); @@ -316,8 +315,7 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Inferiors after: " + inferiors); assertEquals(2, inferiors.size()); Msg.debug(this, "Killing..."); - TargetKillable killable = - waitOn(inferiors.get("2").as(TargetKillable.tclass).fetch()); + TargetKillable killable = inferiors.get("2").as(TargetKillable.class); waitOn(killable.kill()); } } @@ -335,7 +333,7 @@ public abstract class AbstractModelForGdbTest waitAcc(access); Msg.debug(this, "Getting Inferior 1..."); TargetObject inferior = waitOn(model.fetchModelObject(List.of("Inferiors", "[1]"))); - TargetAttacher attacher = inferior.as(TargetAttacher.tclass); + TargetAttacher attacher = inferior.as(TargetAttacher.class); Msg.debug(this, "Waiting for session access (again)..."); waitAcc(access); Msg.debug(this, "Attaching..."); @@ -343,13 +341,13 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Waiting for session access (again, again)..."); waitAcc(access); Msg.debug(this, "Getting Inferiors (after attach)..."); - Map inferiors = + Map inferiors = waitOn(model.fetchObjectElements(List.of("Inferiors"))); Msg.debug(this, "Inferiors after: " + inferiors); assertEquals(1, inferiors.size()); Msg.debug(this, "Killing..."); - TargetObject attached = waitOn(inferiors.get("1").fetch()); - TargetKillable killable = attached.as(TargetKillable.tclass); + TargetObject attached = inferiors.get("1"); + TargetKillable killable = attached.as(TargetKillable.class); waitOn(killable.kill()); } } @@ -392,9 +390,8 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Getting Inferior 1..."); TargetObject inferior = waitOn(model.fetchModelObject("Inferiors", "[1]")); Msg.debug(this, "Attaching to bogus path..."); - TargetAttacher attacher = inferior.as(TargetAttacher.tclass); - waitOn(attacher.attach(model.createRef("Available", "Process -1") - .as(TargetAttachable.tclass))); + TargetAttacher attacher = inferior.as(TargetAttacher.class); + TODO(); } } @@ -412,8 +409,9 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Getting Inferior 1..."); TargetObject inferior = waitOn(model.fetchModelObject("Inferiors", "[1]")); Msg.debug(this, "Attaching to bogus path..."); - TargetAttacher attacher = inferior.as(TargetAttacher.tclass); - waitOn(attacher.attach(model.createRef("Available").as(TargetAttachable.tclass))); + TargetAttacher attacher = inferior.as(TargetAttacher.class); + // NOTE: Technically, the "as" call is causing it here. + waitOn(attacher.attach(model.getModelObject("Available").as(TargetAttachable.class))); fail("Exception expected"); } } @@ -524,7 +522,7 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Waiting for session access..."); waitAcc(access); Msg.debug(this, "Finding breakpoint container..."); - TargetBreakpointContainer breaks = suitable(TargetBreakpointContainer.tclass, root); + TargetBreakpointContainer breaks = suitable(TargetBreakpointContainer.class, root); Msg.debug(this, "Got: " + breaks); TargetBreakpointKindSet kinds = breaks.getSupportedBreakpointKinds(); Msg.debug(this, "Supports: " + kinds); @@ -547,22 +545,21 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Setting file to " + specimen + "..."); cli(root, "file " + specimen); Msg.debug(this, "Finding breakpoint container..."); - TargetBreakpointContainer breaks = suitable(TargetBreakpointContainer.tclass, root); + TargetBreakpointContainer breaks = suitable(TargetBreakpointContainer.class, root); Msg.debug(this, "Placing breakpoint..."); waitOn(breaks.placeBreakpoint("func", Set.of(TargetBreakpointKind.SOFTWARE))); Msg.debug(this, "Getting breakpoint specs..."); - Map specs = waitOn(breaks.fetchElements()); + Map specs = waitOn(breaks.fetchElements()); Msg.debug(this, "Got specs: " + specs); assertEquals(1, specs.size()); - TargetBreakpointSpec spec = - waitOn(specs.get("1").as(TargetBreakpointSpec.tclass).fetch()); - Collection> ls = waitOn(spec.getLocations()); + TargetBreakpointSpec spec = specs.get("1").as(TargetBreakpointSpec.class); + Collection ls = waitOn(spec.getLocations()); Msg.debug(this, "Got locations: " + ls); assertEquals(1, ls.size()); - TargetBreakpointLocation loc = ls.iterator().next(); + TargetBreakpointLocation loc = ls.iterator().next(); Address addr = loc.getAddress(); Msg.debug(this, "Got address: " + addr); - TargetObjectRefList list = loc.getAffects(); + TargetObjectList list = loc.getAffects(); Msg.debug(this, "Got affects: " + list); assertEquals(1, list.size()); } @@ -583,24 +580,23 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Setting file to " + specimen + "..."); cli(root, "file " + specimen); Msg.debug(this, "Finding breakpoint container..."); - TargetBreakpointContainer breaks = suitable(TargetBreakpointContainer.tclass, root); + TargetBreakpointContainer breaks = suitable(TargetBreakpointContainer.class, root); Msg.debug(this, "Placing breakpoint..."); waitOn(breaks.placeBreakpoint("int_var", Set.of(TargetBreakpointKind.READ, TargetBreakpointKind.WRITE))); Msg.debug(this, "Getting breakpoint specs..."); - Map specs = waitOn(breaks.fetchElements()); + Map specs = waitOn(breaks.fetchElements()); Msg.debug(this, "Got specs: " + specs); assertEquals(1, specs.size()); - TargetBreakpointSpec spec = - waitOn(specs.get("1").as(TargetBreakpointSpec.tclass).fetch()); - Collection> ls = waitOn(spec.getLocations()); + TargetBreakpointSpec spec = specs.get("1").as(TargetBreakpointSpec.class); + Collection ls = waitOn(spec.getLocations()); Msg.debug(this, "Got locations: " + ls); assertEquals(1, ls.size()); - TargetBreakpointLocation loc = ls.iterator().next(); + TargetBreakpointLocation loc = ls.iterator().next(); Address addr = loc.getAddress(); Msg.debug(this, "Got address: " + addr); assertNotNull(addr); - TargetObjectRefList list = loc.getAffects(); + TargetObjectList list = loc.getAffects(); Msg.debug(this, "Got affects: " + list); assertEquals(1, list.size()); } @@ -611,7 +607,7 @@ public abstract class AbstractModelForGdbTest try (ModelHost m = modelHost()) { DebuggerObjectModel model = m.getModel(); Set
locAddresses = new HashSet<>(); - Set locAffecteds = new HashSet<>(); + Set locAffecteds = new HashSet<>(); init(m); Msg.debug(this, "Getting root object"); @@ -628,33 +624,32 @@ public abstract class AbstractModelForGdbTest waitAcc(access); Msg.debug(this, "Setting to stay attached to forks"); cli(root, "set detach-on-fork off"); - TargetBreakpointContainer breaks = - suitable(TargetBreakpointContainer.tclass, inferior); + TargetBreakpointContainer breaks = + suitable(TargetBreakpointContainer.class, inferior); Msg.debug(this, "Setting break on func"); waitOn(breaks.placeBreakpoint("func", Set.of(TargetBreakpointKind.SOFTWARE))); Msg.debug(this, "Resuming execution (first time)"); resume(inferior); Msg.debug(this, "Waiting for session access..."); waitAcc(access); - Map inferiors = + Map inferiors = waitOn(model.fetchObjectElements("Inferiors")); Msg.debug(this, "After first break, inferiors are: " + inferiors); assertEquals(2, inferiors.size()); // NOTE: Breakpoint 1 was the temporary one on 'main' - Map ls = + Map ls = waitOn(model.fetchObjectElements("Breakpoints", "[2]")); Msg.debug(this, "Locations: " + ls); assertEquals(2, ls.size()); - for (TargetObjectRef ref : ls.values()) { - TargetBreakpointLocation loc = - waitOn(ref.as(TargetBreakpointLocation.tclass).fetch()); + for (TargetObject obj : ls.values()) { + TargetBreakpointLocation loc = obj.as(TargetBreakpointLocation.class); locAddresses.add(loc.getAddress()); locAffecteds.addAll(loc.getAffects()); } Msg.debug(this, "Addresses: " + locAddresses + ", affected: " + locAffecteds); assertEquals(1, locAddresses.size()); assertEquals(Set.of(List.of("Inferiors", "[1]"), List.of("Inferiors", "[2]")), - locAffecteds.stream().map(TargetObjectRef::getPath).collect(Collectors.toSet())); + locAffecteds.stream().map(TargetObject::getPath).collect(Collectors.toSet())); } } @@ -663,16 +658,16 @@ public abstract class AbstractModelForGdbTest public void testExpForkWithListeners() throws Throwable { ElementTrackingListener infListener = new ElementTrackingListener<>(TargetObject.class); - ElementTrackingListener> bkListener = - new ElementTrackingListener<>(TargetBreakpointSpec.tclass); - ElementTrackingListener> blListener = - new ElementTrackingListener<>(TargetBreakpointLocation.tclass); + ElementTrackingListener bkListener = + new ElementTrackingListener<>(TargetBreakpointSpec.class); + ElementTrackingListener blListener = + new ElementTrackingListener<>(TargetBreakpointLocation.class); EventSequenceListener evtListener = new EventSequenceListener(); try (ModelHost m = modelHost()) { DebuggerObjectModel model = m.getModel(); Set
ebAddresses = new HashSet<>(); - Set ebAffecteds = new HashSet<>(); + Set ebAffecteds = new HashSet<>(); init(m); Msg.debug(this, "Getting root object"); @@ -687,8 +682,7 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Installing listener for inferiors"); infCont.addListener(infListener); Msg.debug(this, "Getting inferiors"); - Map inferiors = waitOn(infCont.fetchElements() - .thenCompose(DebugModelConventions::fetchAll)); + Map inferiors = waitOn(infCont.fetchElements()); infListener.putAll(inferiors); Msg.debug(this, "Launching..."); launch(infListener.elements.get("1"), @@ -697,24 +691,22 @@ public abstract class AbstractModelForGdbTest waitAcc(access); Msg.debug(this, "Setting to stay attached to forks"); cli(root, "set detach-on-fork off"); - TargetBreakpointContainer bkCont = - suitable(TargetBreakpointContainer.tclass, infCont); + TargetBreakpointContainer bkCont = + suitable(TargetBreakpointContainer.class, infCont); Msg.debug(this, "Installing listener for breakpoints"); bkCont.addListener(bkListener); Msg.debug(this, "Getting breakpoints"); - Map bkElems = waitOn(bkCont.fetchElements() - .thenCompose(DebugModelConventions::fetchAll)); + Map bkElems = waitOn(bkCont.fetchElements()); bkListener.putAll(bkElems); Msg.debug(this, "Setting break on func"); waitOn(bkCont.placeBreakpoint("func", Set.of(TargetBreakpointKind.SOFTWARE))); Msg.debug(this, "Breakpoint elements: " + bkListener.elements); - TargetBreakpointSpec bk2 = + TargetBreakpointSpec bk2 = waitOn(bkListener.refElement("2").waitUntil(t -> t != null)); Msg.debug(this, "Installing listener on Breakpoint 2"); bk2.addListener(blListener); Msg.debug(this, "Getting locations for 2"); - Map bk2ls = waitOn(bk2.fetchElements() - .thenCompose(DebugModelConventions::fetchAll)); + Map bk2ls = waitOn(bk2.fetchElements()); blListener.putAll(bk2ls); Msg.debug(this, "Resuming execution (first time)"); resume(infListener.elements.get("1")); @@ -727,14 +719,14 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Locations: " + blListener.elements); assertEquals(2, blListener.elements.size()); for (TargetObject obj : blListener.elements.values()) { - TargetBreakpointLocation eb = obj.as(TargetBreakpointLocation.tclass); + TargetBreakpointLocation eb = obj.as(TargetBreakpointLocation.class); ebAddresses.add(eb.getAddress()); ebAffecteds.addAll(eb.getAffects()); } Msg.debug(this, "Addresses: " + ebAddresses + ", affected: " + ebAffecteds); assertEquals(1, ebAddresses.size()); assertEquals(Set.of(List.of("Inferiors", "[1]"), List.of("Inferiors", "[2]")), - ebAffecteds.stream().map(TargetObjectRef::getPath).collect(Collectors.toSet())); + ebAffecteds.stream().map(TargetObject::getPath).collect(Collectors.toSet())); // Getting more precise than this could become fragile, as library paths vary TargetEventType lastType = null; @@ -779,7 +771,7 @@ public abstract class AbstractModelForGdbTest Map.of(TargetCmdLineLauncher.CMDLINE_ARGS_NAME, which("expCloneExit"))); Msg.debug(this, "Waiting for session access (again)..."); waitAcc(access); - TargetBreakpointContainer breaks = + TargetBreakpointContainer breaks = suitable(TargetBreakpointContainer.class, inferior); Msg.debug(this, "Setting break on work"); waitOn(breaks.placeBreakpoint("work", Set.of(TargetBreakpointKind.SOFTWARE))); @@ -787,7 +779,7 @@ public abstract class AbstractModelForGdbTest resume(inferior); Msg.debug(this, "Waiting for session access..."); waitAcc(access); - Map threads = + Map threads = waitOn(model.fetchObjectElements("Inferiors", "[1]", "Threads")); Msg.debug(this, "After first break, threads are: " + threads); assertEquals(2, threads.size()); @@ -816,11 +808,11 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Waiting for session access (again)..."); waitAcc(access); Msg.debug(this, "Getting symbol to overwrite"); - TargetSymbol overwrite = waitOn(inferior.fetchSuccessor( - "Modules", "[" + expPrint + "]", "Symbols", "[overwrite]")).as(TargetSymbol.tclass); + TargetSymbol overwrite = waitOn(inferior.fetchSuccessor( + "Modules", "[" + expPrint + "]", "Symbols", "[overwrite]")).as(TargetSymbol.class); Msg.debug(this, "Symbol 'overwrite' is at addr: " + overwrite.getValue()); Msg.debug(this, "Getting Memory"); - TargetMemory memory = (TargetMemory) waitOn(inferior.fetchSuccessor("Memory")); + TargetMemory memory = (TargetMemory) waitOn(inferior.fetchSuccessor("Memory")); Msg.debug(this, "Writing"); waitOn(memory.writeMemory(overwrite.getValue(), toWrite.getBytes())); Msg.debug(this, "Getting thread (for stepping)"); @@ -864,7 +856,7 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Waiting for session access (again)..."); waitAcc(access); Msg.debug(this, "Finding breakpoint container..."); - TargetBreakpointContainer breaks = suitable(TargetBreakpointContainer.tclass, root); + TargetBreakpointContainer breaks = suitable(TargetBreakpointContainer.class, root); Msg.debug(this, "Placing breakpoint..."); waitOn(breaks.placeBreakpoint("write", Set.of(TargetBreakpointKind.SOFTWARE))); Msg.debug(this, "Resuming..."); @@ -872,11 +864,10 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Waiting for session access (after resume)..."); waitAcc(access); Map frames = - waitOn(inferior.fetchSubElements("Threads", "[1]", "Stack") - .thenCompose(DebugModelConventions::fetchAll)); + waitOn(inferior.fetchSubElements("Threads", "[1]", "Stack")); Msg.debug(this, "Got stack:"); for (Map.Entry ent : frames.entrySet()) { - TargetStackFrame frame = ent.getValue().as(TargetStackFrame.tclass); + TargetStackFrame frame = ent.getValue().as(TargetStackFrame.class); Msg.debug(this, ent.getKey() + ": " + frame.getProgramCounter()); } assertEquals("write", frames.get("0") @@ -892,7 +883,7 @@ public abstract class AbstractModelForGdbTest public void testRegisters() throws Throwable { try (ModelHost m = modelHost()) { DebuggerObjectModel model = m.getModel(); - Set> descs = new LinkedHashSet<>(); + Set descs = new LinkedHashSet<>(); init(m); Msg.debug(this, "Getting root object"); @@ -906,16 +897,15 @@ public abstract class AbstractModelForGdbTest launch(inferior, Map.of(TargetCmdLineLauncher.CMDLINE_ARGS_NAME, "echo Hello, World!")); Msg.debug(this, "Waiting for session access (again)..."); waitAcc(access); - TargetRegisterBank bank = + TargetRegisterBank bank = waitOn(inferior.fetchSuccessor("Threads", "[1]", "Stack", "[0]")) - .as(TargetRegisterBank.tclass); + .as(TargetRegisterBank.class); Msg.debug(this, "Got bank: " + bank); - Msg.debug(this, "Descriptions ref: " + bank.getDescriptions()); - TargetRegisterContainer cont = waitOn(bank.getDescriptions().fetch()); + TargetRegisterContainer cont = bank.getDescriptions(); Msg.debug(this, "Register descriptions: " + cont); descs.addAll(waitOn(cont.getRegisters())); Msg.debug(this, "Elements: "); - for (TargetRegister reg : descs) { + for (TargetRegister reg : descs) { Msg.debug(this, " " + reg.getIndex() + ": " + reg.getBitLength()); } Map data = waitOn(bank.readRegisters(descs)); @@ -941,12 +931,12 @@ public abstract class AbstractModelForGdbTest try (ModelHost m = modelHost()) { DebuggerObjectModel model = m.getModel(); - AsyncReference focus = new AsyncReference<>(); + AsyncReference focus = new AsyncReference<>(); AsyncReference inferiorCount = new AsyncReference<>(); TargetFocusScopeListener focusListener = new TargetFocusScopeListener() { @Override - public void focusChanged(TargetFocusScope object, TargetObjectRef focused) { + public void focusChanged(TargetFocusScope object, TargetObject focused) { focus.set(focused, null); } }; @@ -965,7 +955,7 @@ public abstract class AbstractModelForGdbTest TargetObjectListener infListener = new TargetObjectListener() { @Override public void elementsChanged(TargetObject parent, Collection removed, - Map added) { + Map added) { inferiorCount.set(infCont.getCachedElements().size(), null); } }; @@ -974,9 +964,9 @@ public abstract class AbstractModelForGdbTest Msg.debug(this, "Creating another inferior"); cli(root, "add-inferior"); waitOn(inferiorCount.waitValue(2)); - assertEquals(model.createRef("Inferiors", "[1]"), getFocus(root)); - focus(root, model.createRef("Inferiors", "[2]")); - assertEquals(model.createRef("Inferiors", "[2]"), getFocus(root)); + assertSame(model.getModelObject("Inferiors", "[1]"), getFocus(root)); + focus(root, model.getModelObject("Inferiors", "[2]")); + assertSame(model.getModelObject("Inferiors", "[2]"), getFocus(root)); } } @@ -985,12 +975,12 @@ public abstract class AbstractModelForGdbTest try (ModelHost m = modelHost()) { DebuggerObjectModel model = m.getModel(); - Deque focusSeq = new LinkedList<>(); + Deque focusSeq = new LinkedList<>(); AsyncReference focusSeqSize = new AsyncReference<>(); TargetFocusScopeListener focusListener = new TargetFocusScopeListener() { @Override - public void focusChanged(TargetFocusScope object, TargetObjectRef focused) { + public void focusChanged(TargetFocusScope object, TargetObject focused) { Msg.debug(this, "Focused: " + focused); if (focused instanceof TargetProcess) { return; @@ -1016,7 +1006,7 @@ public abstract class AbstractModelForGdbTest launch(inferior, Map.of(TargetCmdLineLauncher.CMDLINE_ARGS_NAME, "/bin/echo Hello, World!")); waitOn(focusSeqSize.waitValue(1)); - assertEquals(model.createRef(PathUtils.parse("Inferiors[1].Threads[1].Stack[0]")), + assertEquals(model.getModelObject(PathUtils.parse("Inferiors[1].Threads[1].Stack[0]")), focusSeq.peekLast()); } } diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/test/java/agent/gdb/model/EventSequenceListener.java b/Ghidra/Debug/Debugger-agent-gdb/src/test/java/agent/gdb/model/EventSequenceListener.java index 8266257697..8d4d2ce47a 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/test/java/agent/gdb/model/EventSequenceListener.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/test/java/agent/gdb/model/EventSequenceListener.java @@ -17,7 +17,6 @@ package agent.gdb.model; import java.util.*; -import ghidra.dbg.attributes.TypedTargetObjectRef; import ghidra.dbg.target.TargetEventScope; import ghidra.dbg.target.TargetEventScope.TargetEventScopeListener; import ghidra.dbg.target.TargetEventScope.TargetEventType; @@ -25,14 +24,13 @@ import ghidra.dbg.target.TargetThread; public class EventSequenceListener implements TargetEventScopeListener { public static class EventRecord { - public final TargetEventScope object; - public final TypedTargetObjectRef> eventThread; + public final TargetEventScope object; + public final TargetThread eventThread; public final TargetEventType type; public final String description; public final List parameters; - public EventRecord(TargetEventScope object, - TypedTargetObjectRef> eventThread, TargetEventType type, + public EventRecord(TargetEventScope object, TargetThread eventThread, TargetEventType type, String description, List parameters) { this.object = object; this.eventThread = eventThread; @@ -80,8 +78,7 @@ public class EventSequenceListener implements TargetEventScopeListener { public final List events = new ArrayList<>(); @Override - public void event(TargetEventScope object, - TypedTargetObjectRef> eventThread, TargetEventType type, + public void event(TargetEventScope object, TargetThread eventThread, TargetEventType type, String description, List parameters) { events.add(new EventRecord(object, eventThread, type, description, parameters)); } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/DelegateGadpClientTargetObject.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/DelegateGadpClientTargetObject.java index 8314b16193..68302306c6 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/DelegateGadpClientTargetObject.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/DelegateGadpClientTargetObject.java @@ -30,7 +30,6 @@ import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.gadp.protocol.Gadp.EventNotification.EvtCase; import ghidra.dbg.memory.CachedMemory; import ghidra.dbg.target.TargetAccessConditioned; -import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility; import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibilityListener; import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointAction; import ghidra.dbg.target.TargetObject; @@ -211,11 +210,6 @@ public class DelegateGadpClientTargetObject return ifaces; } - @Override - public CompletableFuture fetch() { - return CompletableFuture.completedFuture(getProxy()); - } - @Override public CompletableFuture resync(boolean attributes, boolean elements) { return client.sendChecked(Gadp.ResyncRequest.newBuilder() diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClient.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClient.java index 97346e0f66..e92c7b7d0c 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClient.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClient.java @@ -34,7 +34,6 @@ import ghidra.async.*; import ghidra.dbg.DebuggerModelClosedReason; import ghidra.dbg.agent.*; import ghidra.dbg.agent.AbstractTargetObject.ProxyFactory; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.error.*; import ghidra.dbg.gadp.GadpVersion; import ghidra.dbg.gadp.error.*; @@ -575,17 +574,6 @@ public class GadpClient extends AbstractDebuggerObjectModel return factory; } - @Override - public TargetObjectRef createRef(List path) { - synchronized (lock) { - GadpClientTargetObject proxy = modelProxies.get(path); - if (proxy != null) { - return proxy; - } - } - return super.createRef(path); - } - @Override public TargetObject getModelObject(List path) { return getProxy(path, false); diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetAccessConditioned.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetAccessConditioned.java index fb01a4f52c..2304b2b91c 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetAccessConditioned.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetAccessConditioned.java @@ -19,12 +19,12 @@ import ghidra.dbg.gadp.client.annot.GadpAttributeChangeCallback; import ghidra.dbg.target.TargetAccessConditioned; public interface GadpClientTargetAccessConditioned - extends GadpClientTargetObject, TargetAccessConditioned { + extends GadpClientTargetObject, TargetAccessConditioned { @GadpAttributeChangeCallback(ACCESSIBLE_ATTRIBUTE_NAME) default void handleAccessibleChanged(Object accessible) { getDelegate().getListeners() .fire(TargetAccessibilityListener.class) - .accessibilityChanged(this, fromObj(accessible)); + .accessibilityChanged(this, (Boolean) accessible); } } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetAttachable.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetAttachable.java index 3177e477d0..6fc7674542 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetAttachable.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetAttachable.java @@ -17,7 +17,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetAttachable; -public interface GadpClientTargetAttachable - extends GadpClientTargetObject, TargetAttachable { +public interface GadpClientTargetAttachable extends GadpClientTargetObject, TargetAttachable { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetAttacher.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetAttacher.java index 5ef5e2714c..c906cc89b4 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetAttacher.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetAttacher.java @@ -17,31 +17,26 @@ package ghidra.dbg.gadp.client; import java.util.concurrent.CompletableFuture; -import ghidra.dbg.attributes.TargetObjectRef; -import ghidra.dbg.attributes.TypedTargetObjectRef; import ghidra.dbg.gadp.protocol.Gadp; -import ghidra.dbg.target.TargetAttachable; -import ghidra.dbg.target.TargetAttacher; +import ghidra.dbg.target.*; -public interface GadpClientTargetAttacher - extends GadpClientTargetObject, TargetAttacher { +public interface GadpClientTargetAttacher extends GadpClientTargetObject, TargetAttacher { @Override - default CompletableFuture attach( - TypedTargetObjectRef> ref) { + default CompletableFuture attach(TargetAttachable attachable) { getDelegate().assertValid(); - getModel().assertMine(TargetObjectRef.class, ref); + getModel().assertMine(TargetObject.class, attachable); return getModel().sendChecked(Gadp.AttachRequest.newBuilder() .setPath(GadpValueUtils.makePath(getPath())) - .setTarget(GadpValueUtils.makePath(ref.getPath())), + .setTarget(GadpValueUtils.makePath(attachable.getPath())), Gadp.AttachReply.getDefaultInstance()).thenApply(rep -> null); } @Override - default CompletableFuture attach(long id) { + default CompletableFuture attach(long pid) { getDelegate().assertValid(); return getModel().sendChecked(Gadp.AttachRequest.newBuilder() .setPath(GadpValueUtils.makePath(getPath())) - .setPid(id), + .setPid(pid), Gadp.AttachReply.getDefaultInstance()).thenApply(rep -> null); } } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetBreakpointContainer.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetBreakpointContainer.java index 003dc05b54..b217a1dad7 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetBreakpointContainer.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetBreakpointContainer.java @@ -18,8 +18,6 @@ package ghidra.dbg.gadp.client; import java.util.Set; import java.util.concurrent.CompletableFuture; -import ghidra.dbg.attributes.TargetObjectRef; -import ghidra.dbg.attributes.TypedTargetObjectRef; import ghidra.dbg.gadp.client.annot.GadpEventHandler; import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.gadp.protocol.Gadp.Path; @@ -29,8 +27,8 @@ import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind; import ghidra.program.model.address.AddressRange; import ghidra.util.datastruct.ListenerSet; -public interface GadpClientTargetBreakpointContainer extends GadpClientTargetObject, - TargetBreakpointContainer { +public interface GadpClientTargetBreakpointContainer + extends GadpClientTargetObject, TargetBreakpointContainer { @Override default CompletableFuture placeBreakpoint(AddressRange range, @@ -63,18 +61,16 @@ public interface GadpClientTargetBreakpointContainer extends GadpClientTargetObj @GadpEventHandler(Gadp.EventNotification.EvtCase.BREAK_HIT_EVENT) default void handleBreakHitEvent(Gadp.EventNotification notification) { Gadp.BreakHitEvent evt = notification.getBreakHitEvent(); - TargetObjectRef trapped = getModel().getProxy(evt.getTrapped().getEList(), true); + TargetObject trapped = getModel().getProxy(evt.getTrapped().getEList(), true); Path framePath = evt.getFrame(); - TypedTargetObjectRef> frame = - framePath == null || framePath.getECount() == 0 ? null - : getModel().getProxy(framePath.getEList(), true).as(TargetStackFrame.tclass); + TargetStackFrame frame = framePath == null || framePath.getECount() == 0 ? null + : getModel().getProxy(framePath.getEList(), true).as(TargetStackFrame.class); Path specPath = evt.getSpec(); - TypedTargetObjectRef> spec = specPath == null ? null - : getModel().getProxy(specPath.getEList(), true).as(TargetBreakpointSpec.tclass); + TargetBreakpointSpec spec = specPath == null ? null + : getModel().getProxy(specPath.getEList(), true).as(TargetBreakpointSpec.class); Path bptPath = evt.getEffective(); - TypedTargetObjectRef> breakpoint = bptPath == null - ? null - : getModel().getProxy(bptPath.getEList(), true).as(TargetBreakpointLocation.tclass); + TargetBreakpointLocation breakpoint = bptPath == null ? null + : getModel().getProxy(bptPath.getEList(), true).as(TargetBreakpointLocation.class); getDelegate().getListeners() .fire(TargetBreakpointListener.class) .breakpointHit(this, trapped, frame, spec, breakpoint); diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetBreakpointLocation.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetBreakpointLocation.java index 7e32371bed..3a704a06e1 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetBreakpointLocation.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetBreakpointLocation.java @@ -18,7 +18,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetBreakpointLocation; public interface GadpClientTargetBreakpointLocation - extends GadpClientTargetObject, - TargetBreakpointLocation { - + extends GadpClientTargetObject, TargetBreakpointLocation { + // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetBreakpointSpec.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetBreakpointSpec.java index 3e24193ee2..145c049dbc 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetBreakpointSpec.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetBreakpointSpec.java @@ -24,7 +24,7 @@ import ghidra.dbg.util.ValueUtils; import ghidra.util.datastruct.ListenerSet; public interface GadpClientTargetBreakpointSpec - extends GadpClientTargetObject, TargetBreakpointSpec { + extends GadpClientTargetObject, TargetBreakpointSpec { @Override default CompletableFuture toggle(boolean enabled) { diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetConsole.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetConsole.java index 0e18e61ec9..ba52bea01e 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetConsole.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetConsole.java @@ -22,8 +22,7 @@ import com.google.protobuf.ByteString; import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.target.TargetConsole; -public interface GadpClientTargetConsole - extends GadpClientTargetObject, TargetConsole { +public interface GadpClientTargetConsole extends GadpClientTargetObject, TargetConsole { @Override default CompletableFuture write(byte[] data) { diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDataTypeMember.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDataTypeMember.java index 396977929b..6775f174b0 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDataTypeMember.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDataTypeMember.java @@ -18,6 +18,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetDataTypeMember; public interface GadpClientTargetDataTypeMember - extends GadpClientTargetObject, TargetDataTypeMember { + extends GadpClientTargetObject, TargetDataTypeMember { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDataTypeNamespace.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDataTypeNamespace.java index 1dc83e41e4..986cc7a0a3 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDataTypeNamespace.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDataTypeNamespace.java @@ -18,6 +18,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetDataTypeNamespace; public interface GadpClientTargetDataTypeNamespace - extends GadpClientTargetObject, TargetDataTypeNamespace { + extends GadpClientTargetObject, TargetDataTypeNamespace { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDeletable.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDeletable.java index 19a6072791..91d2e87b5a 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDeletable.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDeletable.java @@ -20,8 +20,7 @@ import java.util.concurrent.CompletableFuture; import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.target.TargetDeletable; -public interface GadpClientTargetDeletable - extends GadpClientTargetObject, TargetDeletable { +public interface GadpClientTargetDeletable extends GadpClientTargetObject, TargetDeletable { @Override default CompletableFuture delete() { getDelegate().assertValid(); diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDetachable.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDetachable.java index d38e4a130f..49ce405835 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDetachable.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetDetachable.java @@ -20,8 +20,7 @@ import java.util.concurrent.CompletableFuture; import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.target.TargetDetachable; -public interface GadpClientTargetDetachable - extends GadpClientTargetObject, TargetDetachable { +public interface GadpClientTargetDetachable extends GadpClientTargetObject, TargetDetachable { @Override default CompletableFuture detach() { getDelegate().assertValid(); diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetEnvironment.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetEnvironment.java index 49f289ae91..8f5196fdea 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetEnvironment.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetEnvironment.java @@ -17,7 +17,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetEnvironment; -public interface GadpClientTargetEnvironment - extends GadpClientTargetObject, TargetEnvironment { +public interface GadpClientTargetEnvironment extends GadpClientTargetObject, TargetEnvironment { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetEventScope.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetEventScope.java index 3f82a492ac..9d4a348825 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetEventScope.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetEventScope.java @@ -17,21 +17,18 @@ package ghidra.dbg.gadp.client; import java.util.List; -import ghidra.dbg.attributes.TypedTargetObjectRef; import ghidra.dbg.gadp.client.annot.GadpEventHandler; import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.target.TargetEventScope; import ghidra.dbg.target.TargetThread; -public interface GadpClientTargetEventScope - extends GadpClientTargetObject, TargetEventScope { +public interface GadpClientTargetEventScope extends GadpClientTargetObject, TargetEventScope { @GadpEventHandler(Gadp.EventNotification.EvtCase.TARGET_EVENT) default void handleDebuggerEvent(Gadp.EventNotification notification) { Gadp.TargetEvent evt = notification.getTargetEvent(); Gadp.Path threadPath = evt.getEventThread(); - TypedTargetObjectRef> thread = - threadPath == null || threadPath.getECount() == 0 ? null - : getModel().getProxy(threadPath.getEList(), true).as(TargetThread.tclass); + TargetThread thread = threadPath == null || threadPath.getECount() == 0 ? null + : getModel().getProxy(threadPath.getEList(), true).as(TargetThread.class); TargetEventType type = GadpValueUtils.getTargetEventType(evt.getType()); String description = evt.getDescription(); List parameters = diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetExecutionStateful.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetExecutionStateful.java index eb82410a95..1f38b061f7 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetExecutionStateful.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetExecutionStateful.java @@ -20,7 +20,7 @@ import ghidra.dbg.target.TargetExecutionStateful; import ghidra.dbg.util.ValueUtils; public interface GadpClientTargetExecutionStateful - extends GadpClientTargetObject, TargetExecutionStateful { + extends GadpClientTargetObject, TargetExecutionStateful { default TargetExecutionState stateFromObj(Object obj) { return ValueUtils.expectType(obj, TargetExecutionState.class, this, diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetFocusScope.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetFocusScope.java index b6f3897eae..3ce1dbf4fb 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetFocusScope.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetFocusScope.java @@ -17,21 +17,20 @@ package ghidra.dbg.gadp.client; import java.util.concurrent.CompletableFuture; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.error.DebuggerIllegalArgumentException; import ghidra.dbg.gadp.client.annot.GadpAttributeChangeCallback; import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.target.TargetFocusScope; +import ghidra.dbg.target.TargetObject; import ghidra.dbg.util.PathUtils; import ghidra.dbg.util.ValueUtils; -public interface GadpClientTargetFocusScope - extends GadpClientTargetObject, TargetFocusScope { +public interface GadpClientTargetFocusScope extends GadpClientTargetObject, TargetFocusScope { @Override - default CompletableFuture requestFocus(TargetObjectRef obj) { + default CompletableFuture requestFocus(TargetObject obj) { getDelegate().assertValid(); - getModel().assertMine(TargetObjectRef.class, obj); + getModel().assertMine(TargetObject.class, obj); // The server should detect this error, but we can detect it here without sending a request if (!PathUtils.isAncestor(getPath(), obj.getPath())) { throw new DebuggerIllegalArgumentException("Can only focus a successor of the scope"); @@ -43,8 +42,8 @@ public interface GadpClientTargetFocusScope .thenApply(__ -> null); } - default TargetObjectRef refFromObj(Object obj) { - return ValueUtils.expectType(obj, TargetObjectRef.class, this, FOCUS_ATTRIBUTE_NAME, this, + default TargetObject focusFromObj(Object obj) { + return ValueUtils.expectType(obj, TargetObject.class, this, FOCUS_ATTRIBUTE_NAME, this, true); } @@ -52,6 +51,6 @@ public interface GadpClientTargetFocusScope default void handleFocusChanged(Object focus) { getDelegate().getListeners() .fire(TargetFocusScopeListener.class) - .focusChanged(this, refFromObj(focus)); + .focusChanged(this, focusFromObj(focus)); } } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetInterpreter.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetInterpreter.java index 4f1bc22d26..fc3c06ede6 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetInterpreter.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetInterpreter.java @@ -22,8 +22,7 @@ import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.target.TargetInterpreter; import ghidra.dbg.util.ValueUtils; -public interface GadpClientTargetInterpreter - extends GadpClientTargetObject, TargetInterpreter { +public interface GadpClientTargetInterpreter extends GadpClientTargetObject, TargetInterpreter { @Override default CompletableFuture execute(String cmd) { diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetInterruptible.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetInterruptible.java index a66a864268..29551026a9 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetInterruptible.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetInterruptible.java @@ -20,8 +20,7 @@ import java.util.concurrent.CompletableFuture; import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.target.TargetInterruptible; -public interface GadpClientTargetInterruptible - extends GadpClientTargetObject, TargetInterruptible { +public interface GadpClientTargetInterruptible extends GadpClientTargetObject, TargetInterruptible { @Override default CompletableFuture interrupt() { getDelegate().assertValid(); diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetKillable.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetKillable.java index 59f6465d2c..edbcf0a780 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetKillable.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetKillable.java @@ -20,8 +20,7 @@ import java.util.concurrent.CompletableFuture; import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.target.TargetKillable; -public interface GadpClientTargetKillable - extends GadpClientTargetObject, TargetKillable { +public interface GadpClientTargetKillable extends GadpClientTargetObject, TargetKillable { @Override default CompletableFuture kill() { getDelegate().assertValid(); diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetLauncher.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetLauncher.java index 4f02517187..e8362ca87c 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetLauncher.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetLauncher.java @@ -23,8 +23,7 @@ import ghidra.dbg.target.TargetLauncher; import ghidra.dbg.target.TargetMethod; import ghidra.dbg.target.TargetMethod.TargetParameterMap; -public interface GadpClientTargetLauncher - extends GadpClientTargetObject, TargetLauncher { +public interface GadpClientTargetLauncher extends GadpClientTargetObject, TargetLauncher { @Override default CompletableFuture launch(Map arguments) { getDelegate().assertValid(); diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetMemory.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetMemory.java index e0035d2a39..6dc613e00c 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetMemory.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetMemory.java @@ -28,8 +28,7 @@ import ghidra.dbg.target.TargetMemory; import ghidra.lifecycle.Internal; import ghidra.program.model.address.*; -public interface GadpClientTargetMemory - extends GadpClientTargetObject, TargetMemory { +public interface GadpClientTargetMemory extends GadpClientTargetObject, TargetMemory { @Internal default MemoryReader getRawReader(AddressSpace space) { diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetMemoryRegion.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetMemoryRegion.java index 8aa3873a03..c070a91f2e 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetMemoryRegion.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetMemoryRegion.java @@ -17,7 +17,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetMemoryRegion; -public interface GadpClientTargetMemoryRegion - extends GadpClientTargetObject, TargetMemoryRegion { +public interface GadpClientTargetMemoryRegion extends GadpClientTargetObject, TargetMemoryRegion { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetMethod.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetMethod.java index 9a51e43ee6..3dffabe7ed 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetMethod.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetMethod.java @@ -21,8 +21,7 @@ import java.util.concurrent.CompletableFuture; import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.target.TargetMethod; -public interface GadpClientTargetMethod - extends GadpClientTargetObject, TargetMethod { +public interface GadpClientTargetMethod extends GadpClientTargetObject, TargetMethod { @Override default CompletableFuture invoke(Map arguments) { getDelegate().assertValid(); diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetModule.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetModule.java index 2bb6546dad..3b198937fd 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetModule.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetModule.java @@ -17,7 +17,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetModule; -public interface GadpClientTargetModule - extends GadpClientTargetObject, TargetModule { +public interface GadpClientTargetModule extends GadpClientTargetObject, TargetModule { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetModuleContainer.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetModuleContainer.java index 7a241ba5c7..de6efe483f 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetModuleContainer.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetModuleContainer.java @@ -18,6 +18,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetModuleContainer; public interface GadpClientTargetModuleContainer - extends GadpClientTargetObject, TargetModuleContainer { + extends GadpClientTargetObject, TargetModuleContainer { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetNamedDataType.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetNamedDataType.java index 45fa43b09a..bce58bedb6 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetNamedDataType.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetNamedDataType.java @@ -17,7 +17,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetNamedDataType; -public interface GadpClientTargetNamedDataType - extends GadpClientTargetObject, TargetNamedDataType { +public interface GadpClientTargetNamedDataType extends GadpClientTargetObject, TargetNamedDataType { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetProcess.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetProcess.java index 5933d04715..3806c63214 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetProcess.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetProcess.java @@ -17,7 +17,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetProcess; -public interface GadpClientTargetProcess - extends GadpClientTargetObject, TargetProcess { +public interface GadpClientTargetProcess extends GadpClientTargetObject, TargetProcess { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetRegister.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetRegister.java index 73dc4ab570..7d9574b9d7 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetRegister.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetRegister.java @@ -17,7 +17,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetRegister; -public interface GadpClientTargetRegister - extends GadpClientTargetObject, TargetRegister { +public interface GadpClientTargetRegister extends GadpClientTargetObject, TargetRegister { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetRegisterBank.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetRegisterBank.java index 2bafa2ecca..e9cd3500a2 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetRegisterBank.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetRegisterBank.java @@ -22,8 +22,7 @@ import ghidra.dbg.gadp.client.annot.GadpEventHandler; import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.target.TargetRegisterBank; -public interface GadpClientTargetRegisterBank - extends GadpClientTargetObject, TargetRegisterBank { +public interface GadpClientTargetRegisterBank extends GadpClientTargetObject, TargetRegisterBank { @Override default CompletableFuture> readRegistersNamed( diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetRegisterContainer.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetRegisterContainer.java index c368501295..670f245ef5 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetRegisterContainer.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetRegisterContainer.java @@ -18,6 +18,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetRegisterContainer; public interface GadpClientTargetRegisterContainer - extends GadpClientTargetObject, TargetRegisterContainer { + extends GadpClientTargetObject, TargetRegisterContainer { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetResumable.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetResumable.java index 3a7c5dfd23..be8c551fb0 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetResumable.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetResumable.java @@ -20,8 +20,7 @@ import java.util.concurrent.CompletableFuture; import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.target.TargetResumable; -public interface GadpClientTargetResumable - extends GadpClientTargetObject, TargetResumable { +public interface GadpClientTargetResumable extends GadpClientTargetObject, TargetResumable { @Override default CompletableFuture resume() { getDelegate().assertValid(); diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSection.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSection.java index 003b55da07..88bdd940bf 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSection.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSection.java @@ -17,7 +17,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetSection; -public interface GadpClientTargetSection - extends GadpClientTargetObject, TargetSection { +public interface GadpClientTargetSection extends GadpClientTargetObject, TargetSection { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetStack.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetStack.java index 68442b2b8a..9da600ed8b 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetStack.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetStack.java @@ -17,7 +17,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetStack; -public interface GadpClientTargetStack - extends GadpClientTargetObject, TargetStack { +public interface GadpClientTargetStack extends GadpClientTargetObject, TargetStack { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetStackFrame.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetStackFrame.java index 34680447dc..4283d11617 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetStackFrame.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetStackFrame.java @@ -17,7 +17,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetStackFrame; -public interface GadpClientTargetStackFrame - extends GadpClientTargetObject, TargetStackFrame { +public interface GadpClientTargetStackFrame extends GadpClientTargetObject, TargetStackFrame { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSteppable.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSteppable.java index 8c217eb123..ffd329d161 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSteppable.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSteppable.java @@ -20,8 +20,7 @@ import java.util.concurrent.CompletableFuture; import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.target.TargetSteppable; -public interface GadpClientTargetSteppable - extends GadpClientTargetObject, TargetSteppable { +public interface GadpClientTargetSteppable extends GadpClientTargetObject, TargetSteppable { @Override default CompletableFuture step(TargetStepKind kind) { getDelegate().assertValid(); diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSymbol.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSymbol.java index 6aa3d76a52..3dbc610d2b 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSymbol.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSymbol.java @@ -17,7 +17,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetSymbol; -public interface GadpClientTargetSymbol - extends GadpClientTargetObject, TargetSymbol { +public interface GadpClientTargetSymbol extends GadpClientTargetObject, TargetSymbol { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSymbolNamespace.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSymbolNamespace.java index 4662c06227..ba4c29ac03 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSymbolNamespace.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetSymbolNamespace.java @@ -18,6 +18,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetSymbolNamespace; public interface GadpClientTargetSymbolNamespace - extends GadpClientTargetObject, TargetSymbolNamespace { + extends GadpClientTargetObject, TargetSymbolNamespace { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetThread.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetThread.java index d5ff60b1d7..62a39100de 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetThread.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpClientTargetThread.java @@ -17,7 +17,6 @@ package ghidra.dbg.gadp.client; import ghidra.dbg.target.TargetThread; -public interface GadpClientTargetThread - extends GadpClientTargetObject, TargetThread { +public interface GadpClientTargetThread extends GadpClientTargetObject, TargetThread { // Nothing to add } diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpValueUtils.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpValueUtils.java index 486aa928f2..9203ccc2fe 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpValueUtils.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/client/GadpValueUtils.java @@ -25,7 +25,7 @@ import com.google.protobuf.ByteString; import ghidra.dbg.DebuggerObjectModel; import ghidra.dbg.attributes.*; -import ghidra.dbg.attributes.TargetObjectRefList.DefaultTargetObjectRefList; +import ghidra.dbg.attributes.TargetObjectList.DefaultTargetObjectList; import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.gadp.protocol.Gadp.ModelObjectDelta; import ghidra.dbg.target.TargetAttacher.TargetAttachKind; @@ -49,10 +49,10 @@ import ghidra.util.Msg; public enum GadpValueUtils { ; - public static TargetObjectRefList getRefList(DebuggerObjectModel model, Gadp.PathList list) { - TargetObjectRefList result = new DefaultTargetObjectRefList<>(); + public static TargetObjectList getObjList(DebuggerObjectModel model, Gadp.PathList list) { + TargetObjectList result = new DefaultTargetObjectList<>(); for (Gadp.Path path : list.getPathList()) { - result.add(model.createRef(path.getEList())); + result.add(model.getModelObject(path.getEList())); } return result; } @@ -330,11 +330,11 @@ public enum GadpValueUtils { return Gadp.Path.newBuilder().addAllE(path).build(); } - public static Gadp.Path makePath(TargetObjectRef ref) { - return makePath(ref.getPath()); + public static Gadp.Path makePath(TargetObject obj) { + return makePath(obj.getPath()); } - public static Gadp.PathList makePathList(TargetObjectRefList list) { + public static Gadp.PathList makePathList(TargetObjectList list) { return Gadp.PathList.newBuilder() .addAllPath(list.stream().map(p -> makePath(p)).collect(Collectors.toList())) .build(); @@ -436,9 +436,9 @@ public enum GadpValueUtils { case VT_UPDATE_MODE: return TargetUpdateMode.class; case VT_PATH: - return TargetObjectRef.class; + return TargetObject.class; case VT_PATH_LIST: - return TargetObjectRefList.class; + return TargetObjectList.class; case VT_TYPE: return Class.class; case UNRECOGNIZED: @@ -525,10 +525,10 @@ public enum GadpValueUtils { if (type == TargetUpdateMode.class) { return Gadp.ValueType.VT_UPDATE_MODE; } - if (type == TargetObjectRef.class) { + if (type == TargetObject.class) { return Gadp.ValueType.VT_PATH; } - if (type == TargetObjectRefList.class) { + if (type == TargetObjectList.class) { return Gadp.ValueType.VT_PATH_LIST; } if (type == Class.class) { @@ -624,11 +624,11 @@ public enum GadpValueUtils { b.setObjectStub(Gadp.ModelObjectStub.getDefaultInstance()); // NOTE: Never produce info. That is a special case for object retrieval. } - else if (value instanceof TargetObjectRef) { - b.setPathValue(makePath((TargetObjectRef) value)); + else if (value instanceof TargetObject) { + b.setPathValue(makePath((TargetObject) value)); } - else if (value instanceof TargetObjectRefList) { - b.setPathListValue(makePathList((TargetObjectRefList) value)); + else if (value instanceof TargetObjectList) { + b.setPathListValue(makePathList((TargetObjectList) value)); } else if (value instanceof Class) { b.setTypeValue(makeValueType((Class) value)); @@ -712,7 +712,7 @@ public enum GadpValueUtils { case PATH_VALUE: return model.getModelObject(value.getPathValue().getEList()); case PATH_LIST_VALUE: - return getRefList(model, value.getPathListValue()); + return getObjList(model, value.getPathListValue()); case OBJECT_STUB: return model.getModelObject(path); case TYPE_VALUE: diff --git a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/server/GadpClientHandler.java b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/server/GadpClientHandler.java index 127139bfdb..1325550804 100644 --- a/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/server/GadpClientHandler.java +++ b/Ghidra/Debug/Debugger-gadp/src/main/java/ghidra/dbg/gadp/server/GadpClientHandler.java @@ -27,11 +27,8 @@ import ghidra.async.TypeSpec; import ghidra.comm.service.AbstractAsyncClientHandler; import ghidra.dbg.DebuggerModelListener; import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.attributes.TargetObjectRef; -import ghidra.dbg.attributes.TypedTargetObjectRef; import ghidra.dbg.error.*; import ghidra.dbg.gadp.GadpVersion; -import ghidra.dbg.gadp.client.GadpClientTargetAttachable; import ghidra.dbg.gadp.client.GadpValueUtils; import ghidra.dbg.gadp.error.GadpErrorException; import ghidra.dbg.gadp.protocol.Gadp; @@ -123,7 +120,7 @@ public class GadpClientHandler @Override public void elementsChanged(TargetObject parent, Collection removed, - Map added) { + Map added) { if (!sock.isOpen()) { return; } @@ -178,10 +175,9 @@ public class GadpClientHandler } @Override - public void breakpointHit(TargetBreakpointContainer container, TargetObjectRef trapped, - TypedTargetObjectRef> frame, - TypedTargetObjectRef> spec, - TypedTargetObjectRef> breakpoint) { + public void breakpointHit(TargetBreakpointContainer container, TargetObject trapped, + TargetStackFrame frame, TargetBreakpointSpec spec, + TargetBreakpointLocation breakpoint) { if (!sock.isOpen()) { return; } @@ -213,7 +209,7 @@ public class GadpClientHandler } @Override - public void memoryReadError(TargetMemory memory, AddressRange range, + public void memoryReadError(TargetMemory memory, AddressRange range, DebuggerMemoryAccessException e) { if (!sock.isOpen()) { return; @@ -229,7 +225,7 @@ public class GadpClientHandler } @Override - public void memoryUpdated(TargetMemory memory, Address address, byte[] data) { + public void memoryUpdated(TargetMemory memory, Address address, byte[] data) { if (!sock.isOpen()) { return; } @@ -244,7 +240,7 @@ public class GadpClientHandler } @Override - public void registersUpdated(TargetRegisterBank bank, Map updates) { + public void registersUpdated(TargetRegisterBank bank, Map updates) { if (!sock.isOpen()) { return; } @@ -258,8 +254,7 @@ public class GadpClientHandler } @Override - public void event(TargetEventScope object, - TypedTargetObjectRef> eventThread, TargetEventType type, + public void event(TargetEventScope object, TargetThread eventThread, TargetEventType type, String description, List parameters) { if (!sock.isOpen()) { return; @@ -456,7 +451,7 @@ public class GadpClientHandler .build()); } - protected T isObjectValuedAttribute(TargetObject parent, + protected T isObjectValuedAttribute(TargetObject parent, Map.Entry ent, Class cls) { Object val = ent.getValue(); if (!cls.isAssignableFrom(val.getClass())) { @@ -469,8 +464,8 @@ public class GadpClientHandler return ref; } - protected CompletableFuture sendDelta( - List parentPath, Delta deltaE, Delta deltaA) { + protected CompletableFuture sendDelta( + List parentPath, Delta deltaE, Delta deltaA) { return channel.write(Gadp.RootMessage.newBuilder() .setEventNotification(Gadp.EventNotification.newBuilder() .setPath(GadpValueUtils.makePath(parentPath)) @@ -482,13 +477,18 @@ public class GadpClientHandler .build()); } + protected TargetObject getObjectChecked(List path) { + return DebuggerObjectModel.requireNonNull(model.getModelObject(path), path); + } + + protected TargetObject getObjectChecked(Gadp.Path path) { + return getObjectChecked(path.getEList()); + } + protected CompletableFuture processInvoke(int seqno, Gadp.InvokeRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetMethod method = - DebuggerObjectModel.requireIface(TargetMethod.class, obj, path); - return method.invoke(GadpValueUtils.getArguments(model, req.getArgumentList())); - }).thenCompose(result -> { + TargetMethod method = getObjectChecked(req.getPath()).as(TargetMethod.class); + Map arguments = GadpValueUtils.getArguments(model, req.getArgumentList()); + return method.invoke(arguments).thenCompose(result -> { return model.flushEvents().thenApply(__ -> result); }).thenCompose(result -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -513,24 +513,24 @@ public class GadpClientHandler }); } + protected CompletableFuture performAttach(Gadp.AttachRequest req, + TargetAttacher attacher) { + switch (req.getSpecCase()) { + case TARGET: + TargetAttachable attachable = + getObjectChecked(req.getTarget()).as(TargetAttachable.class); + return attacher.attach(attachable); + case PID: + return attacher.attach(req.getPid()); + default: + throw new GadpErrorException(Gadp.ErrorCode.EC_BAD_REQUEST, + "Unrecognized attach specification:" + req); + } + } + protected CompletableFuture processAttach(int seqno, Gadp.AttachRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetAttacher attacher = - DebuggerObjectModel.requireIface(TargetAttacher.class, obj, path); - switch (req.getSpecCase()) { - case TARGET: - TypedTargetObjectRef attachable = - model.createRef(req.getTarget().getEList()) - .as(GadpClientTargetAttachable.class); - return attacher.attach(attachable); - case PID: - return attacher.attach(req.getPid()); - default: - throw new GadpErrorException(Gadp.ErrorCode.EC_BAD_REQUEST, - "Unrecognized attach specification:" + req); - } - }).thenCompose(__ -> { + TargetAttacher attacher = getObjectChecked(req.getPath()).as(TargetAttacher.class); + return performAttach(req, attacher).thenCompose(__ -> { return model.flushEvents(); }).thenCompose(__ -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -540,23 +540,25 @@ public class GadpClientHandler }); } + protected CompletableFuture performBreakCreate(Gadp.BreakCreateRequest req, + TargetBreakpointContainer breaks) { + Set kinds = GadpValueUtils.getBreakKindSet(req.getKinds()); + switch (req.getSpecCase()) { + case EXPRESSION: + return breaks.placeBreakpoint(req.getExpression(), kinds); + case ADDRESS: + AddressRange range = server.getAddressRange(req.getAddress()); + return breaks.placeBreakpoint(range, kinds); + default: + throw new GadpErrorException(Gadp.ErrorCode.EC_BAD_REQUEST, + "Unrecognized breakpoint specification: " + req); + } + } + protected CompletableFuture processBreakCreate(int seqno, Gadp.BreakCreateRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetBreakpointContainer breaks = - DebuggerObjectModel.requireIface(TargetBreakpointContainer.class, obj, path); - Set kinds = GadpValueUtils.getBreakKindSet(req.getKinds()); - switch (req.getSpecCase()) { - case EXPRESSION: - return breaks.placeBreakpoint(req.getExpression(), kinds); - case ADDRESS: - AddressRange range = server.getAddressRange(req.getAddress()); - return breaks.placeBreakpoint(range, kinds); - default: - throw new GadpErrorException(Gadp.ErrorCode.EC_BAD_REQUEST, - "Unrecognized breakpoint specification: " + req); - } - }).thenCompose(__ -> { + TargetBreakpointContainer breaks = + getObjectChecked(req.getPath()).as(TargetBreakpointContainer.class); + return performBreakCreate(req, breaks).thenCompose(__ -> { return model.flushEvents(); }).thenCompose(__ -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -567,12 +569,8 @@ public class GadpClientHandler } protected CompletableFuture processBreakToggle(int seqno, Gadp.BreakToggleRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetBreakpointSpec spec = - DebuggerObjectModel.requireIface(TargetBreakpointSpec.tclass, obj, path); - return spec.toggle(req.getEnabled()); - }).thenCompose(__ -> { + TargetBreakpointSpec spec = getObjectChecked(req.getPath()).as(TargetBreakpointSpec.class); + return spec.toggle(req.getEnabled()).thenCompose(__ -> { return model.flushEvents(); }).thenCompose(__ -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -583,12 +581,8 @@ public class GadpClientHandler } protected CompletableFuture processDelete(int seqno, Gadp.DeleteRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetDeletable del = - DebuggerObjectModel.requireIface(TargetDeletable.tclass, obj, path); - return del.delete(); - }).thenCompose(__ -> { + TargetDeletable del = getObjectChecked(req.getPath()).as(TargetDeletable.class); + return del.delete().thenCompose(__ -> { return model.flushEvents(); }).thenCompose(__ -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -599,12 +593,8 @@ public class GadpClientHandler } protected CompletableFuture processDetach(int seqno, Gadp.DetachRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetDetachable det = - DebuggerObjectModel.requireIface(TargetDetachable.tclass, obj, path); - return det.detach(); - }).thenCompose(__ -> { + TargetDetachable det = getObjectChecked(req.getPath()).as(TargetDetachable.class); + return det.detach().thenCompose(__ -> { return model.flushEvents(); }).thenCompose(__ -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -614,16 +604,17 @@ public class GadpClientHandler }); } + protected CompletableFuture performExecute(Gadp.ExecuteRequest req, + TargetInterpreter interpreter) { + if (req.getCapture()) { + return interpreter.executeCapture(req.getCommand()); + } + return interpreter.execute(req.getCommand()).thenApply(__ -> ""); + } + protected CompletableFuture processExecute(int seqno, Gadp.ExecuteRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetInterpreter interpreter = - DebuggerObjectModel.requireIface(TargetInterpreter.tclass, obj, path); - if (req.getCapture()) { - return interpreter.executeCapture(req.getCommand()); - } - return interpreter.execute(req.getCommand()).thenApply(__ -> ""); - }).thenCompose(out -> { + TargetInterpreter interpreter = getObjectChecked(req.getPath()).as(TargetInterpreter.class); + return performExecute(req, interpreter).thenCompose(out -> { return model.flushEvents().thenApply(__ -> out); }).thenCompose(out -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -634,12 +625,9 @@ public class GadpClientHandler } protected CompletableFuture processFocus(int seqno, Gadp.FocusRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetFocusScope scope = - DebuggerObjectModel.requireIface(TargetFocusScope.tclass, obj, path); - return scope.requestFocus(model.createRef(req.getFocus().getEList())); - }).thenCompose(__ -> { + TargetFocusScope scope = getObjectChecked(req.getPath()).as(TargetFocusScope.class); + TargetObject focus = getObjectChecked(req.getFocus()); + return scope.requestFocus(focus).thenCompose(__ -> { return model.flushEvents(); }).thenCompose(__ -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -650,12 +638,9 @@ public class GadpClientHandler } protected CompletableFuture processInterrupt(int seqno, Gadp.InterruptRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetInterruptible interruptible = - DebuggerObjectModel.requireIface(TargetInterruptible.tclass, obj, path); - return interruptible.interrupt(); - }).thenCompose(__ -> { + TargetInterruptible interruptible = + getObjectChecked(req.getPath()).as(TargetInterruptible.class); + return interruptible.interrupt().thenCompose(__ -> { return model.flushEvents(); }).thenCompose(__ -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -667,10 +652,9 @@ public class GadpClientHandler protected CompletableFuture processCacheInvalidate(int seqno, Gadp.CacheInvalidateRequest req) { + TargetObject obj = getObjectChecked(req.getPath()); List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - return DebuggerObjectModel.requireNonNull(obj, path).invalidateCaches(); - }).thenCompose(__ -> { + return obj.invalidateCaches().thenCompose(__ -> { return model.flushEvents(); }).thenCompose(__ -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -681,12 +665,8 @@ public class GadpClientHandler } protected CompletableFuture processKill(int seqno, Gadp.KillRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetKillable killable = - DebuggerObjectModel.requireIface(TargetKillable.class, obj, path); - return killable.kill(); - }).thenCompose(__ -> { + TargetKillable killable = getObjectChecked(req.getPath()).as(TargetKillable.class); + return killable.kill().thenCompose(__ -> { return model.flushEvents(); }).thenCompose(__ -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -697,13 +677,9 @@ public class GadpClientHandler } protected CompletableFuture processLaunch(int seqno, Gadp.LaunchRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - Msg.debug(this, "Launching: " + Thread.currentThread()); - TargetLauncher launcher = - DebuggerObjectModel.requireIface(TargetLauncher.class, obj, path); - return launcher.launch(GadpValueUtils.getArguments(model, req.getArgumentList())); - }).thenCompose(__ -> { + TargetLauncher launcher = getObjectChecked(req.getPath()).as(TargetLauncher.class); + Map arguments = GadpValueUtils.getArguments(model, req.getArgumentList()); + return launcher.launch(arguments).thenCompose(__ -> { Msg.debug(this, "Flushing events after launch: " + Thread.currentThread()); return model.flushEvents(); }).thenCompose(__ -> { @@ -716,32 +692,27 @@ public class GadpClientHandler } protected CompletableFuture processMemoryRead(int seqno, Gadp.MemoryReadRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetMemory memory = - DebuggerObjectModel.requireIface(TargetMemory.class, obj, path); - AddressRange range = GadpValueUtils.getAddressRange(memory.getModel(), req.getRange()); - return memory.readMemory(range.getMinAddress(), (int) range.getLength()); - }).thenCompose(data -> { + TargetMemory memory = getObjectChecked(req.getPath()).as(TargetMemory.class); + AddressRange range = GadpValueUtils.getAddressRange(memory.getModel(), req.getRange()); + CompletableFuture read = + memory.readMemory(range.getMinAddress(), (int) range.getLength()); + return read.thenCompose(data -> { return model.flushEvents().thenApply(__ -> data); }).thenCompose(data -> { return channel.write(Gadp.RootMessage.newBuilder() .setSequence(seqno) .setMemoryReadReply( - Gadp.MemoryReadReply.newBuilder().setContent(ByteString.copyFrom(data))) + Gadp.MemoryReadReply.newBuilder() + .setContent(ByteString.copyFrom(data))) .build()); }); } protected CompletableFuture processMemoryWrite(int seqno, Gadp.MemoryWriteRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetMemory memory = - DebuggerObjectModel.requireIface(TargetMemory.class, obj, path); - Address start = GadpValueUtils.getAddress(memory.getModel(), req.getStart()); - // TODO: Spare a copy by specifying a ByteBuffer variant of writeMemory? - return memory.writeMemory(start, req.getContent().toByteArray()); - }).thenCompose(__ -> { + TargetMemory memory = getObjectChecked(req.getPath()).as(TargetMemory.class); + Address start = GadpValueUtils.getAddress(memory.getModel(), req.getStart()); + // TODO: Spare a copy by specifying a ByteBuffer variant of writeMemory? + return memory.writeMemory(start, req.getContent().toByteArray()).thenCompose(__ -> { return model.flushEvents(); }).thenCompose(__ -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -752,12 +723,8 @@ public class GadpClientHandler } protected CompletableFuture processRegisterRead(int seqno, Gadp.RegisterReadRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetRegisterBank bank = - DebuggerObjectModel.requireIface(TargetRegisterBank.class, obj, path); - return bank.readRegistersNamed(req.getNameList()); - }).thenCompose(data -> { + TargetRegisterBank bank = getObjectChecked(req.getPath()).as(TargetRegisterBank.class); + return bank.readRegistersNamed(req.getNameList()).thenCompose(data -> { return model.flushEvents().thenApply(__ -> data); }).thenCompose(data -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -769,16 +736,12 @@ public class GadpClientHandler } protected CompletableFuture processRegisterWrite(int seqno, Gadp.RegisterWriteRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetRegisterBank bank = - DebuggerObjectModel.requireIface(TargetRegisterBank.class, obj, path); - Map values = new LinkedHashMap<>(); - for (Gadp.RegisterValue rv : req.getValueList()) { - values.put(rv.getName(), rv.getContent().toByteArray()); - } - return bank.writeRegistersNamed(values); - }).thenCompose(__ -> { + TargetRegisterBank bank = getObjectChecked(req.getPath()).as(TargetRegisterBank.class); + Map values = new LinkedHashMap<>(); + for (Gadp.RegisterValue rv : req.getValueList()) { + values.put(rv.getName(), rv.getContent().toByteArray()); + } + return bank.writeRegistersNamed(values).thenCompose(__ -> { return model.flushEvents(); }).thenCompose(__ -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -789,12 +752,8 @@ public class GadpClientHandler } protected CompletableFuture processResume(int seqno, Gadp.ResumeRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetResumable resumable = - DebuggerObjectModel.requireIface(TargetResumable.class, obj, path); - return resumable.resume(); - }).thenCompose(__ -> { + TargetResumable resumable = getObjectChecked(req.getPath()).as(TargetResumable.class); + return resumable.resume().thenCompose(__ -> { return model.flushEvents(); }).thenCompose(__ -> { return channel.write(Gadp.RootMessage.newBuilder() @@ -805,12 +764,8 @@ public class GadpClientHandler } protected CompletableFuture processStep(int seqno, Gadp.StepRequest req) { - List path = req.getPath().getEList(); - return model.fetchModelObject(path).thenCompose(obj -> { - TargetSteppable steppable = - DebuggerObjectModel.requireIface(TargetSteppable.class, obj, path); - return steppable.step(GadpValueUtils.getStepKind(req.getKind())); - }).thenCompose(__ -> { + TargetSteppable steppable = getObjectChecked(req.getPath()).as(TargetSteppable.class); + return steppable.step(GadpValueUtils.getStepKind(req.getKind())).thenCompose(__ -> { return model.flushEvents(); }).thenCompose(__ -> { return channel.write(Gadp.RootMessage.newBuilder() diff --git a/Ghidra/Debug/Debugger-gadp/src/test/java/ghidra/dbg/gadp/GadpClientServerTest.java b/Ghidra/Debug/Debugger-gadp/src/test/java/ghidra/dbg/gadp/GadpClientServerTest.java index c2467fcb1d..95bc68b62d 100644 --- a/Ghidra/Debug/Debugger-gadp/src/test/java/ghidra/dbg/gadp/GadpClientServerTest.java +++ b/Ghidra/Debug/Debugger-gadp/src/test/java/ghidra/dbg/gadp/GadpClientServerTest.java @@ -36,10 +36,8 @@ import com.google.protobuf.GeneratedMessageV3; import generic.ID; import generic.Unique; import ghidra.async.*; -import ghidra.dbg.DebugModelConventions; import ghidra.dbg.DebuggerModelListener; import ghidra.dbg.agent.*; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.attributes.TargetStringList; import ghidra.dbg.gadp.GadpClientServerTest.EventListener.CallEntry; import ghidra.dbg.gadp.client.GadpClient; @@ -53,7 +51,8 @@ import ghidra.dbg.target.TargetFocusScope.TargetFocusScopeListener; import ghidra.dbg.target.TargetLauncher.TargetCmdLineLauncher; import ghidra.dbg.target.TargetMethod.ParameterDescription; import ghidra.dbg.target.TargetMethod.TargetParameterMap; -import ghidra.dbg.target.TargetObject.*; +import ghidra.dbg.target.TargetObject.TargetObjectListener; +import ghidra.dbg.target.TargetObject.TargetUpdateMode; import ghidra.dbg.target.schema.TargetAttributeType; import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.dbg.util.*; @@ -285,7 +284,7 @@ public class GadpClientServerTest { @TargetObjectSchemaInfo(name = "Session") public class TestGadpTargetSession extends DefaultTargetModelRoot - implements TargetFocusScope { + implements TargetFocusScope { protected final TestGadpTargetAvailableContainer available = new TestGadpTargetAvailableContainer(this); protected final TestGadpTargetProcessContainer processes = @@ -331,7 +330,7 @@ public class GadpClientServerTest { } @Override - public CompletableFuture requestFocus(TargetObjectRef obj) { + public CompletableFuture requestFocus(TargetObject obj) { throw new UnsupportedOperationException(); } } @@ -372,7 +371,7 @@ public class GadpClientServerTest { "List of other people to greet individually"))); public class TestGadpTargetMethod extends TestTargetObject> - implements TargetMethod { + implements TargetMethod { public TestGadpTargetMethod(TestTargetObject parent, String key) { super(parent.getModel(), parent, key, "Method"); @@ -398,7 +397,7 @@ public class GadpClientServerTest { public class TestGadpTargetProcessContainer extends TestTargetObject - implements TargetLauncher { + implements TargetLauncher { public TestGadpTargetProcessContainer(TestGadpTargetSession session) { super(session.getModel(), session, "Processes", "ProcessContainer"); } @@ -445,7 +444,7 @@ public class GadpClientServerTest { public class TestGadpTargetAvailable extends TestTargetObject - implements TargetAttachable { + implements TargetAttachable { public TestGadpTargetAvailable(TestGadpTargetAvailableContainer available, int pid, String cmd) { @@ -657,8 +656,7 @@ public class GadpClientServerTest { assertEquals(List.of(), root.getPath()); // Do fetchAll to create objects and populate their caches Map available = - waitOn(model.fetchObjectElements(PathUtils.parse("Available")) - .thenCompose(DebugModelConventions::fetchAll)); + waitOn(model.fetchObjectElements(PathUtils.parse("Available"))); assertEquals(2, available.size()); Object cmd = waitOn(model.fetchModelValue(PathUtils.parse("Available[1].cmd"))); assertEquals("echo", cmd); @@ -678,8 +676,7 @@ public class GadpClientServerTest { assertEquals(List.of(), root.getPath()); // Do fetchAll to create objects and populate their caches Map available = - waitOn(client.fetchObjectElements(PathUtils.parse("Available")) - .thenCompose(DebugModelConventions::fetchAll)); + waitOn(client.fetchObjectElements(PathUtils.parse("Available"))); assertEquals(2, available.size()); monitored.reset(); Object cmd = waitOn(client.fetchModelValue(PathUtils.parse("Available[1].cmd"))); @@ -701,10 +698,10 @@ public class GadpClientServerTest { waitOn(AsyncUtils.completable(TypeSpec.VOID, socket::connect, runner.server.getLocalAddress())); waitOn(client.connect()); - TargetObject procCont = + TargetObject greet = waitOn(client.fetchModelObject(PathUtils.parse("Available.greet"))); - assertTrue(procCont.getInterfaceNames().contains("Method")); - TargetMethod method = procCont.as(TargetMethod.tclass); + assertTrue(greet.getInterfaceNames().contains("Method")); + TargetMethod method = greet.as(TargetMethod.class); assertEquals(PARAMS, method.getParameters()); assertEquals(Integer.class, method.getReturnType()); @@ -746,8 +743,7 @@ public class GadpClientServerTest { * attributes are fetched the first time. */ Map attrs = waitOn(avail.fetchAttributes()); - TargetObjectRef methodRef = (TargetObjectRef) attrs.get("greet"); - TargetMethod method = waitOn(methodRef.as(TargetMethod.tclass).fetch()); + TargetMethod method = (TargetMethod) attrs.get("greet"); assertNotNull(method); CompletableFuture future1 = avail.fetchAttribute("greet(World)"); @@ -780,7 +776,7 @@ public class GadpClientServerTest { waitOn(AsyncUtils.completable(TypeSpec.VOID, socket::connect, runner.server.getLocalAddress())); waitOn(client.connect()); - Map elements = + Map elements = waitOn(client.fetchObjectElements(List.of())); assertEquals(0, elements.size()); Map attributes = waitOn(client.fetchObjectAttributes(List.of())); @@ -790,8 +786,8 @@ public class GadpClientServerTest { TargetObject.UPDATE_MODE_ATTRIBUTE_NAME), attributes.keySet()); Object procContAttr = attributes.get("Processes"); - TargetObjectRef procContRef = (TargetObjectRef) procContAttr; - assertEquals(List.of("Processes"), procContRef.getPath()); + TargetObject procCont = (TargetObject) procContAttr; + assertEquals(List.of("Processes"), procCont.getPath()); waitOn(client.close()); } finally { @@ -809,7 +805,7 @@ public class GadpClientServerTest { waitOn(client.connect()); TargetObject procCont = waitOn(client.fetchModelObject(List.of("Processes"))); assertTrue(procCont.getInterfaceNames().contains("Launcher")); - TargetLauncher launcher = procCont.as(TargetLauncher.tclass); + TargetLauncher launcher = procCont.as(TargetLauncher.class); waitOn(launcher.launch( Map.of(TargetCmdLineLauncher.CMDLINE_ARGS_NAME, "/bin/echo Hello, World!"))); waitOn(client.close()); @@ -828,9 +824,9 @@ public class GadpClientServerTest { List invocations = new ArrayList<>(); // Any listener which calls .get on a child ref would do.... // This object-getting listener is the pattern that revealed this problem, though. - TargetObjectListener listener = new TargetObjectFetchingListener() { + TargetObjectListener listener = new TargetObjectListener() { @Override - public void elementsChangedObjects(TargetObject parent, Collection removed, + public void elementsChanged(TargetObject parent, Collection removed, Map added) { invocations.add(new ElementsChangedInvocation(parent, removed, added)); } @@ -843,7 +839,7 @@ public class GadpClientServerTest { waitOn(client.connect()); TargetObject avail = waitOn(client.fetchModelObject(List.of("Available"))); avail.addListener(listener); - Map elements = waitOn(avail.fetchElements()); + Map elements = waitOn(avail.fetchElements()); Msg.debug(this, "Elements: " + elements); waitOn(client.close()); } @@ -861,7 +857,7 @@ public class GadpClientServerTest { AtomicBoolean failed = new AtomicBoolean(); TargetFocusScopeListener focusListener = new TargetFocusScopeListener() { @Override - public void focusChanged(TargetFocusScope object, TargetObjectRef focused) { + public void focusChanged(TargetFocusScope object, TargetObject focused) { Msg.info(this, "Focus changed to " + focused); if (!focusPath.complete(focused.getPath())) { failed.set(true); @@ -878,16 +874,15 @@ public class GadpClientServerTest { session.addListener(focusListener); TargetObject procCont = waitOn(client.fetchModelObject(List.of("Processes"))); assertTrue(procCont.getInterfaceNames().contains("Launcher")); - TargetLauncher launcher = procCont.as(TargetLauncher.tclass); + TargetLauncher launcher = procCont.as(TargetLauncher.class); waitOn(launcher.launch( Map.of(TargetCmdLineLauncher.CMDLINE_ARGS_NAME, "/bin/echo Hello, World!"))); launches.clear(); // Don't care. Just free it up. Map attrs = waitOn(client.fetchObjectAttributes(List.of())); assertTrue(attrs.containsKey(TargetFocusScope.FOCUS_ATTRIBUTE_NAME)); - TargetObjectRef ref = - (TargetObjectRef) attrs.get(TargetFocusScope.FOCUS_ATTRIBUTE_NAME); + TargetObject focus = (TargetObject) attrs.get(TargetFocusScope.FOCUS_ATTRIBUTE_NAME); // NOTE: Could be actual object, but need not be - assertEquals(List.of("Processes", "[0]"), ref.getPath()); + assertEquals(List.of("Processes", "[0]"), focus.getPath()); waitOn(focusPath); waitOn(client.close()); @@ -928,7 +923,7 @@ public class GadpClientServerTest { TargetObject procContainer = waitOn(client.fetchModelObject(List.of("Processes"))); assertTrue(procContainer.getInterfaceNames().contains("Launcher")); procContainer.addListener(elemL); - TargetLauncher launcher = procContainer.as(TargetLauncher.tclass); + TargetLauncher launcher = procContainer.as(TargetLauncher.class); waitOn(launcher.launch( Map.of(TargetCmdLineLauncher.CMDLINE_ARGS_NAME, "/bin/echo Hello, World!"))); waitOn(elemL.count.waitValue(1)); @@ -940,7 +935,7 @@ public class GadpClientServerTest { assertEquals(procContainer, eci.parent); assertEquals(List.of(), List.copyOf(eci.removed)); assertEquals(1, eci.added.size()); - Entry ent = + Entry ent = eci.added.entrySet().iterator().next(); assertEquals("0", ent.getKey()); assertEquals(List.of("Processes", "[0]"), ent.getValue().getPath()); @@ -965,8 +960,7 @@ public class GadpClientServerTest { TargetObject availCont = waitOn(client.fetchModelObject(PathUtils.parse("Available"))); availCont.addListener(elemL); - Map avail1 = waitOn(availCont.fetchElements() - .thenCompose(DebugModelConventions::fetchAll)); + Map avail1 = waitOn(availCont.fetchElements()); assertEquals(2, avail1.size()); for (TargetObject a : avail1.values()) { assertTrue(a.isValid()); @@ -987,8 +981,7 @@ public class GadpClientServerTest { } assertEquals(1, availCont.getCachedElements().size()); - Map avail2 = waitOn(availCont.fetchElements() - .thenCompose(DebugModelConventions::fetchAll)); + Map avail2 = waitOn(availCont.fetchElements()); assertEquals(1, avail2.size()); assertEquals("cat", avail2.get("1").getCachedAttribute("cmd")); @@ -1073,8 +1066,7 @@ public class GadpClientServerTest { TargetObject availCont = waitOn(client.fetchModelObject(PathUtils.parse("Available"))); availCont.addListener(invL); - for (TargetObject avail : waitOn(availCont.fetchElements() - .thenCompose(DebugModelConventions::fetchAll)).values()) { + for (TargetObject avail : waitOn(availCont.fetchElements()).values()) { avail.addListener(invL); } @@ -1188,16 +1180,16 @@ public class GadpClientServerTest { runner.server.getLocalAddress())); waitOn(client.connect()); runner.server.model.session.addLinks(); - TargetObjectRef linkRef = - (TargetObjectRef) waitOn(client.fetchModelValue(PathUtils.parse("Links[1]"))); - assertTrue(linkRef instanceof TargetObject); - TargetObject link = + TargetObject linkVal = + (TargetObject) waitOn(client.fetchModelValue(PathUtils.parse("Links[1]"))); + assertTrue(linkVal instanceof TargetObject); + TargetObject linkObj = waitOn(client.fetchModelObject(PathUtils.parse("Links[1]"))); - assertSame(linkRef, link); + assertSame(linkVal, linkObj); TargetObject canonical = waitOn(client.fetchModelObject(PathUtils.parse("Available[2]"))); - assertSame(canonical, link); - assertEquals(PathUtils.parse("Available[2]"), link.getPath()); + assertSame(canonical, linkObj); + assertEquals(PathUtils.parse("Available[2]"), linkObj.getPath()); waitOn(client.close()); } finally { @@ -1276,7 +1268,7 @@ public class GadpClientServerTest { @Override public void elementsChanged(TargetObject parent, Collection removed, - Map added) { + Map added) { record.add(new CallEntry("elementsChanged", List.of(parent, removed, added))); } diff --git a/Ghidra/Debug/Debugger-gadp/src/test/java/ghidra/dbg/gadp/client/GadpClientTest.java b/Ghidra/Debug/Debugger-gadp/src/test/java/ghidra/dbg/gadp/client/GadpClientTest.java index a4a8dc29c0..a45ceec022 100644 --- a/Ghidra/Debug/Debugger-gadp/src/test/java/ghidra/dbg/gadp/client/GadpClientTest.java +++ b/Ghidra/Debug/Debugger-gadp/src/test/java/ghidra/dbg/gadp/client/GadpClientTest.java @@ -34,7 +34,6 @@ import org.junit.Test; import generic.Unique; import ghidra.async.AsyncUtils; import ghidra.async.TypeSpec; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.gadp.GadpVersion; import ghidra.dbg.gadp.protocol.Gadp; import ghidra.dbg.gadp.util.AsyncProtobufMessageChannel; @@ -402,7 +401,7 @@ public class GadpClientTest { TargetObject parent = waitOn(fetchParent); parent.addListener(elemL); - CompletableFuture> fetchElements = + CompletableFuture> fetchElements = parent.fetchElements(); srv.handleResyncElements(parentPath, false, Map.of()); assertEquals(Map.of(), waitOn(fetchElements)); @@ -413,9 +412,9 @@ public class GadpClientTest { waitOn(elemL.count.waitValue(1)); ElementsChangedInvocation changed = Unique.assertOne(elemL.invocations); assertEquals(parent, changed.parent); - TargetObjectRef childRef = Unique.assertOne(changed.added.values()); - assertTrue(childRef instanceof GadpClientTargetObject); - assertEquals(elem0Path, childRef.getPath()); + TargetObject child = Unique.assertOne(changed.added.values()); + assertTrue(child instanceof GadpClientTargetObject); + assertEquals(elem0Path, child.getPath()); } assertEquals(1, elemL.count.get().intValue()); // After connection is closed } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointContainer.java index adfb8e8387..cb5440bb98 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointContainer.java @@ -31,13 +31,17 @@ import ghidra.dbg.target.schema.*; import ghidra.program.model.address.AddressRange; import ghidra.util.datastruct.WeakValueHashMap; -@TargetObjectSchemaInfo(name = "BreakpointContainer", elements = { // - @TargetElementType(type = JdiModelTargetBreakpointSpec.class) // -}, attributes = { // - @TargetAttributeType(type = Void.class) // -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "BreakpointContainer", + elements = { // + @TargetElementType(type = JdiModelTargetBreakpointSpec.class) // + }, + attributes = { // + @TargetAttributeType(type = Void.class) // + }, + canonicalContainer = true) public class JdiModelTargetBreakpointContainer extends JdiModelTargetObjectImpl implements - TargetBreakpointContainer, JdiEventsListenerAdapter { + TargetBreakpointContainer, JdiEventsListenerAdapter { protected static final TargetBreakpointKindSet SUPPORTED_KINDS = TargetBreakpointKindSet.of(TargetBreakpointKind.values()); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointSpec.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointSpec.java index 1230b3837a..8510766aec 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointSpec.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetBreakpointSpec.java @@ -28,18 +28,20 @@ import ghidra.dbg.target.schema.TargetObjectSchemaInfo; import ghidra.dbg.util.CollectionUtils.Delta; import ghidra.util.datastruct.ListenerSet; -@TargetObjectSchemaInfo(name = "BreakpointSpec", attributes = { // - @TargetAttributeType( // +@TargetObjectSchemaInfo( + name = "BreakpointSpec", + attributes = { // + @TargetAttributeType( // name = TargetBreakpointSpec.CONTAINER_ATTRIBUTE_NAME, // type = JdiModelTargetBreakpointContainer.class), // - @TargetAttributeType( // + @TargetAttributeType( // name = TargetBreakpointLocation.SPEC_ATTRIBUTE_NAME, // type = JdiModelTargetBreakpointSpec.class), // - @TargetAttributeType(type = Void.class) // -}, canonicalContainer = true) -public class JdiModelTargetBreakpointSpec extends JdiModelTargetObjectImpl implements // - TargetBreakpointSpec, // - JdiModelTargetDeletable { + @TargetAttributeType(type = Void.class) // + }, + canonicalContainer = true) +public class JdiModelTargetBreakpointSpec extends JdiModelTargetObjectImpl + implements TargetBreakpointSpec, JdiModelTargetDeletable { protected JdiBreakpointInfo info; protected TargetBreakpointKindSet kinds; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnector.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnector.java index 4b3a0f9706..3721b570d9 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnector.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnector.java @@ -29,18 +29,34 @@ import ghidra.dbg.target.TargetMethod.ParameterDescription; import ghidra.dbg.target.TargetMethod.TargetParameterMap; import ghidra.dbg.target.schema.*; -@TargetObjectSchemaInfo(name = "Connector", elements = { // - @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType(name = "Description", type = String.class, required = true, fixed = true), // - @TargetAttributeType(name = "Default Arguments", type = Object.class, required = true, fixed = true), // - @TargetAttributeType(name = "Transport", type = Object.class, required = true, fixed = true), // - @TargetAttributeType(type = Void.class) // -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "Connector", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType( + name = "Description", + type = String.class, + required = true, + fixed = true), + @TargetAttributeType( + name = "Default Arguments", + type = Object.class, + required = true, + fixed = true), + @TargetAttributeType( + name = "Transport", + type = Object.class, + required = true, + fixed = true), + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class JdiModelTargetConnector extends JdiModelTargetObjectImpl implements JdiModelSelectableObject, // TODO: Make a JidModelTargetLaunchingConnector and JdiModelTargetAttachingConnector - JdiModelTargetLauncher { + JdiModelTargetLauncher { protected final JdiModelTargetConnectorContainer connectors; protected final Connector cx; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnectorContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnectorContainer.java index 6c4ce6c31a..41b4a27657 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnectorContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConnectorContainer.java @@ -27,11 +27,15 @@ import ghidra.async.AsyncUtils; import ghidra.dbg.target.schema.*; import ghidra.util.Msg; -@TargetObjectSchemaInfo(name = "ConnectorContainer", elements = { // - @TargetElementType(type = JdiModelTargetConnector.class) // -}, attributes = { // - @TargetAttributeType(type = Void.class) // -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "ConnectorContainer", + elements = { + @TargetElementType(type = JdiModelTargetConnector.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class JdiModelTargetConnectorContainer extends JdiModelTargetObjectImpl { protected final JdiModelTargetRoot root; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConstantPool.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConstantPool.java index f28b2b0a62..30a1fc58c2 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConstantPool.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetConstantPool.java @@ -24,14 +24,18 @@ import ghidra.dbg.target.TargetSection; import ghidra.dbg.target.schema.*; import ghidra.program.model.address.AddressRange; -@TargetObjectSchemaInfo(name = "ConstantPool", elements = { // - @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType(type = Void.class) // -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "ConstantPool", + elements = { // + @TargetElementType(type = Void.class) // + }, + attributes = { // + @TargetAttributeType(type = Void.class) // + }, + canonicalContainer = true) public class JdiModelTargetConstantPool extends JdiModelTargetObjectImpl implements // //TargetMemory, - TargetMemoryRegion, TargetSection { + TargetMemoryRegion, TargetSection { private AddressRange range; private byte[] pool; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModuleContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModuleContainer.java index 3d613a7f2f..7fcfb6f397 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModuleContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetModuleContainer.java @@ -30,13 +30,17 @@ import ghidra.dbg.target.schema.*; import ghidra.lifecycle.Internal; import ghidra.util.Msg; -@TargetObjectSchemaInfo(name = "TargetModuleContainer", elements = { // - @TargetElementType(type = JdiModelTargetModule.class) // -}, attributes = { // - @TargetAttributeType(type = Void.class) // -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "TargetModuleContainer", + elements = { // + @TargetElementType(type = JdiModelTargetModule.class) // + }, + attributes = { // + @TargetAttributeType(type = Void.class) // + }, + canonicalContainer = true) public class JdiModelTargetModuleContainer extends JdiModelTargetObjectImpl - implements TargetModuleContainer { + implements TargetModuleContainer { protected final JdiModelTargetVM vm; @@ -75,7 +79,7 @@ public class JdiModelTargetModuleContainer extends JdiModelTargetObjectImpl } @Override - public CompletableFuture> addSyntheticModule(String name) { + public CompletableFuture addSyntheticModule(String name) { throw new DebuggerUserException("GDB Does not support synthetic modules"); } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetProcess.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetProcess.java index 80dffd412a..95e8fb7693 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetProcess.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetProcess.java @@ -30,16 +30,17 @@ import ghidra.dbg.target.schema.*; import ghidra.lifecycle.Internal; import ghidra.util.Msg; -@TargetObjectSchemaInfo(name = "Process", elements = { // - @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType(name = "state", type = TargetExecutionState.class, hidden = true), // - @TargetAttributeType(type = Void.class) // -}) -public class JdiModelTargetProcess extends JdiModelTargetObjectImpl implements // - JdiModelTargetConsole, // - JdiConsoleOutputListener, // - JdiModelSelectableObject { +@TargetObjectSchemaInfo( + name = "Process", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType(name = "state", type = TargetExecutionState.class, hidden = true), + @TargetAttributeType(type = Void.class) + }) +public class JdiModelTargetProcess extends JdiModelTargetObjectImpl + implements JdiModelTargetConsole, JdiConsoleOutputListener, JdiModelSelectableObject { public static String getUniqueId(Process obj) { return Long.toHexString(obj.pid()); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetReferenceType.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetReferenceType.java index 34757a048d..90ba642341 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetReferenceType.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetReferenceType.java @@ -27,14 +27,16 @@ import ghidra.dbg.target.schema.*; import ghidra.program.model.address.Address; import ghidra.program.model.address.AddressRangeImpl; -@TargetObjectSchemaInfo(name = "ReferenceType", elements = { // - @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType(name = "Attributes", type = JdiModelTargetAttributesContainer.class), // - @TargetAttributeType(type = Object.class) // -}) -public class JdiModelTargetReferenceType extends JdiModelTargetType implements // - TargetModule { +@TargetObjectSchemaInfo( + name = "ReferenceType", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType(name = "Attributes", type = JdiModelTargetAttributesContainer.class), + @TargetAttributeType(type = Object.class) + }) +public class JdiModelTargetReferenceType extends JdiModelTargetType implements TargetModule { protected final ReferenceType reftype; private long maxInstances = 100; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegister.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegister.java index d2b878e192..850b9911c4 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegister.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegister.java @@ -27,16 +27,18 @@ import ghidra.dbg.target.schema.*; import ghidra.dbg.util.ConversionUtils; import ghidra.program.model.address.Address; -@TargetObjectSchemaInfo(name = "RegisterDescriptor", elements = { // - @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType( // - name = TargetRegister.CONTAINER_ATTRIBUTE_NAME, // - type = JdiModelTargetRegisterContainer.class), // - @TargetAttributeType(type = Void.class) // -}) -public class JdiModelTargetRegister extends JdiModelTargetObjectImpl implements // - TargetRegister { +@TargetObjectSchemaInfo( + name = "RegisterDescriptor", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType( + name = TargetRegister.CONTAINER_ATTRIBUTE_NAME, + type = JdiModelTargetRegisterContainer.class), + @TargetAttributeType(type = Void.class) + }) +public class JdiModelTargetRegister extends JdiModelTargetObjectImpl implements TargetRegister { protected final String name; protected Address addr; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegisterContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegisterContainer.java index 82cd628b98..153bdbf40a 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegisterContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRegisterContainer.java @@ -26,14 +26,17 @@ import ghidra.dbg.target.TargetRegisterContainer; import ghidra.dbg.target.schema.*; import ghidra.util.Msg; -@TargetObjectSchemaInfo(name = "TargetRegisterContainer", elements = { // - @TargetElementType(type = JdiModelTargetRegister.class) // -}, attributes = { // - @TargetAttributeType(type = Void.class) // -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "TargetRegisterContainer", + elements = { + @TargetElementType(type = JdiModelTargetRegister.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class JdiModelTargetRegisterContainer extends JdiModelTargetObjectImpl - implements TargetRegisterBank, - TargetRegisterContainer { + implements TargetRegisterBank, TargetRegisterContainer { private final Map registersByName = new HashMap<>(); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRoot.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRoot.java index e250e892ac..d7a70fe894 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRoot.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetRoot.java @@ -25,17 +25,17 @@ import com.sun.jdi.connect.Connector.Argument; import ghidra.async.AsyncUtils; import ghidra.dbg.DebugModelConventions; -import ghidra.dbg.agent.AbstractTargetObject; import ghidra.dbg.agent.DefaultTargetModelRoot; -import ghidra.dbg.attributes.TargetObjectRef; -import ghidra.dbg.error.DebuggerIllegalArgumentException; import ghidra.dbg.jdi.manager.*; import ghidra.dbg.jdi.model.iface1.*; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; import ghidra.dbg.target.*; +import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibilityListener; +import ghidra.dbg.target.TargetFocusScope.TargetFocusScopeListener; +import ghidra.dbg.target.TargetLauncher.TargetCmdLineLauncher; import ghidra.dbg.target.TargetMethod.TargetParameterMap; +import ghidra.dbg.target.TargetObject.TargetUpdateMode; import ghidra.dbg.target.schema.*; -import ghidra.dbg.util.PathUtils; import ghidra.util.Msg; /** @@ -48,23 +48,38 @@ import ghidra.util.Msg; * {@link DebugModelConventions#findSuitable(Class, TargetObject)} requires a unique answer. That * would mean neither attach nor launch will be enabled anywhere except on a connector.... */ -@TargetObjectSchemaInfo(name = "Debugger", elements = { // - @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType(name = "Attributes", type = JdiModelTargetAttributesContainer.class, required = true, fixed = true), // - @TargetAttributeType(name = "Connectors", type = JdiModelTargetConnectorContainer.class, required = true, fixed = true), // - @TargetAttributeType(name = "VirtualMachines", type = JdiModelTargetVMContainer.class, required = true, fixed = true), // - @TargetAttributeType(type = Void.class) // -}) +@TargetObjectSchemaInfo( + name = "Debugger", + elements = { // + @TargetElementType(type = Void.class) // + }, + attributes = { // + @TargetAttributeType( + name = "Attributes", + type = JdiModelTargetAttributesContainer.class, + required = true, + fixed = true), // + @TargetAttributeType( + name = "Connectors", + type = JdiModelTargetConnectorContainer.class, + required = true, + fixed = true), // + @TargetAttributeType( + name = "VirtualMachines", + type = JdiModelTargetVMContainer.class, + required = true, + fixed = true), // + @TargetAttributeType(type = Void.class) // + }) public class JdiModelTargetRoot extends DefaultTargetModelRoot implements // - JdiModelTargetAccessConditioned, // - //JdiModelTargetAttacher, // - JdiModelTargetFocusScope, // - //TargetFocusScope, // - //JdiModelTargetInterpreter, // - JdiModelTargetInterruptible, // - JdiModelTargetLauncher, // - JdiModelTargetEventScope, // + JdiModelTargetAccessConditioned, // + //JdiModelTargetAttacher, // + JdiModelTargetFocusScope, // + //TargetFocusScope, // + //JdiModelTargetInterpreter, // + JdiModelTargetInterruptible, // + JdiModelTargetLauncher, // + JdiModelTargetEventScope, // JdiEventsListenerAdapter { protected static final String JDB_PROMPT = ">"; @@ -76,7 +91,7 @@ public class JdiModelTargetRoot extends DefaultTargetModelRoot implements // protected final JdiModelTargetConnectorContainer connectors; protected JdiModelTargetAttributesContainer addedAttributes; - private TargetAccessibility accessibility = TargetAccessibility.ACCESSIBLE; + private boolean accessible = true; protected JdiModelSelectableObject focus; protected String debugger = "Jdi"; // Used by JdiModelTargetEnvironment @@ -96,7 +111,7 @@ public class JdiModelTargetRoot extends DefaultTargetModelRoot implements // connectors, // addedAttributes // ), Map.of( // - ACCESSIBLE_ATTRIBUTE_NAME, accessibility == TargetAccessibility.ACCESSIBLE, // + ACCESSIBLE_ATTRIBUTE_NAME, accessible, // DISPLAY_ATTRIBUTE_NAME, display, // TargetMethod.PARAMETERS_ATTRIBUTE_NAME, TargetCmdLineLauncher.PARAMETERS, // UPDATE_MODE_ATTRIBUTE_NAME, TargetUpdateMode.FIXED // @@ -163,22 +178,22 @@ public class JdiModelTargetRoot extends DefaultTargetModelRoot implements // setFocus(f); } - public void setAccessibility(TargetAccessibility accessibility) { + public void setAccessible(boolean accessible) { synchronized (attributes) { - if (this.accessibility == accessibility) { + if (this.accessible == accessible) { return; } - this.accessibility = accessibility; + this.accessible = accessible; changeAttributes(List.of(), List.of(), Map.of( // - ACCESSIBLE_ATTRIBUTE_NAME, accessibility == TargetAccessibility.ACCESSIBLE // + ACCESSIBLE_ATTRIBUTE_NAME, accessible // ), "Accessibility changed"); } - listeners.fire(TargetAccessibilityListener.class).accessibilityChanged(this, accessibility); + listeners.fire(TargetAccessibilityListener.class).accessibilityChanged(this, accessible); } @Override - public TargetAccessibility getAccessibility() { - return accessibility; + public boolean isAccessible() { + return accessible; } @Override @@ -238,34 +253,6 @@ public class JdiModelTargetRoot extends DefaultTargetModelRoot implements // return AsyncUtils.NIL; } - @Override - public CompletableFuture requestFocus(TargetObjectRef ref) { - impl.assertMine(TargetObjectRef.class, ref); - /** - * Yes, this is pointless, since I'm the root, but do it right (TM), since this may change - * or be used as an example for other implementations. - */ - if (!PathUtils.isAncestor(this.getPath(), ref.getPath())) { - throw new DebuggerIllegalArgumentException("Can only focus a successor of the scope"); - } - return ref.fetch().thenCompose(obj -> { - TargetObject cur = obj; - while (cur != null) { - if (cur instanceof JdiModelSelectableObject) { - JdiModelSelectableObject sel = (JdiModelSelectableObject) cur; - return sel.select(); - } - if (cur instanceof AbstractTargetObject) { - AbstractTargetObject def = (AbstractTargetObject) cur; - cur = def.getImplParent(); - continue; - } - throw new AssertionError(); - } - return AsyncUtils.NIL; - }); - } - protected void invalidateMemoryAndRegisterCaches() { vms.invalidateMemoryAndRegisterCaches(); } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSection.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSection.java index e511ebbe64..adfd9af53a 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSection.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSection.java @@ -26,14 +26,17 @@ import ghidra.dbg.target.TargetSection; import ghidra.dbg.target.schema.*; import ghidra.program.model.address.AddressRange; -@TargetObjectSchemaInfo(name = "Section", elements = { // - @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType(type = Void.class) // -}) +@TargetObjectSchemaInfo( + name = "Section", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }) public class JdiModelTargetSection extends JdiModelTargetObjectImpl implements // //TargetMemory, - TargetMemoryRegion, TargetSection { + TargetMemoryRegion, TargetSection { protected final Method method; private AddressRange range; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSectionContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSectionContainer.java index e6aff99466..890abb9d46 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSectionContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetSectionContainer.java @@ -26,13 +26,17 @@ import ghidra.dbg.target.schema.*; import ghidra.program.model.address.Address; import ghidra.program.model.address.AddressSpace; -@TargetObjectSchemaInfo(name = "TargetSectionContainer", elements = { // - @TargetElementType(type = JdiModelTargetSection.class) // -}, attributes = { // - @TargetAttributeType(type = Void.class) // -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "TargetSectionContainer", + elements = { + @TargetElementType(type = JdiModelTargetSection.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class JdiModelTargetSectionContainer extends JdiModelTargetObjectImpl - implements TargetMemory { + implements TargetMemory { protected final JdiModelTargetReferenceType reftype; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStack.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStack.java index beab7ea43c..f982fe0954 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStack.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStack.java @@ -26,13 +26,17 @@ import ghidra.dbg.target.schema.*; import ghidra.util.Msg; import ghidra.util.datastruct.WeakValueHashMap; -@TargetObjectSchemaInfo(name = "Stack", elements = { // - @TargetElementType(type = JdiModelTargetStackFrame.class) // -}, attributes = { // - @TargetAttributeType(type = Void.class) // -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "Stack", + elements = { + @TargetElementType(type = JdiModelTargetStackFrame.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) public class JdiModelTargetStack extends JdiModelTargetObjectImpl - implements TargetStack { + implements TargetStack { protected final JdiModelTargetThread thread; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStackFrame.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStackFrame.java index de21bf9571..80930d3e42 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStackFrame.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetStackFrame.java @@ -34,14 +34,17 @@ import ghidra.dbg.target.schema.*; import ghidra.program.model.address.Address; import ghidra.util.Msg; -@TargetObjectSchemaInfo(name = "StackFrame", elements = { // - @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType(type = Object.class) // -}) +@TargetObjectSchemaInfo( + name = "StackFrame", + elements = { + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType(type = Object.class) + }) public class JdiModelTargetStackFrame extends JdiModelTargetObjectImpl - implements TargetStackFrame, // - //TargetRegisterBank, // + implements TargetStackFrame, // + //TargetRegisterBank, // JdiEventsListenerAdapter, // JdiModelSelectableObject { @@ -127,7 +130,7 @@ public class JdiModelTargetStackFrame extends JdiModelTargetObjectImpl @Override public void threadSelected(ThreadReference eventThread, StackFrame eventFrame, JdiCause cause) { if (eventThread.equals(thread.thread) && eventFrame.equals(frame)) { - AtomicReference> scope = new AtomicReference<>(); + AtomicReference scope = new AtomicReference<>(); AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { DebugModelConventions.findSuitable(JdiModelTargetFocusScope.class, this) .handle(seq::next); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThread.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThread.java index 7ad6bc47a8..3a40880409 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThread.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThread.java @@ -34,25 +34,37 @@ import ghidra.dbg.target.schema.*; import ghidra.lifecycle.Internal; import ghidra.util.Msg; -@TargetObjectSchemaInfo(name = "Thread", elements = { // - @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType(name = "Attributes", type = JdiModelTargetAttributesContainer.class), // - @TargetAttributeType(name = "Registers", type = JdiModelTargetRegisterContainer.class, required = true, fixed = true), // - @TargetAttributeType(name = "Stack", type = JdiModelTargetStack.class, required = true, fixed = true), // - @TargetAttributeType(name = "Status", type = Integer.class), // - @TargetAttributeType(name = "UID", type = Long.class, fixed = true), // - @TargetAttributeType(type = Object.class) // -}, canonicalContainer = true) +@TargetObjectSchemaInfo( + name = "Thread", + elements = { // + @TargetElementType(type = Void.class) + }, + attributes = { + @TargetAttributeType(name = "Attributes", type = JdiModelTargetAttributesContainer.class), + @TargetAttributeType( + name = "Registers", + type = JdiModelTargetRegisterContainer.class, + required = true, + fixed = true), + @TargetAttributeType( + name = "Stack", + type = JdiModelTargetStack.class, + required = true, + fixed = true), + @TargetAttributeType(name = "Status", type = Integer.class), + @TargetAttributeType(name = "UID", type = Long.class, fixed = true), + @TargetAttributeType(type = Object.class) // + }, + canonicalContainer = true) public class JdiModelTargetThread extends JdiModelTargetObjectReference implements // - TargetThread, // - JdiModelTargetAccessConditioned, // - JdiModelTargetExecutionStateful, // - JdiModelTargetInterruptible, // - JdiModelTargetKillable, // - JdiModelTargetResumable, // - JdiModelTargetSteppable, // - //TargetSuspendable, + TargetThread, // + JdiModelTargetAccessConditioned, // + JdiModelTargetExecutionStateful, // + JdiModelTargetInterruptible, // + JdiModelTargetKillable, // + JdiModelTargetResumable, // + JdiModelTargetSteppable, // + // TargetSuspendable, JdiEventsListenerAdapter, // JdiModelSelectableObject { @@ -177,6 +189,7 @@ public class JdiModelTargetThread extends JdiModelTargetObjectReference implemen return CompletableFuture.completedFuture(null); } + @Override public CompletableFuture init() { AsyncFence fence = new AsyncFence(); //fence.include(requestAttributes(true)); @@ -264,7 +277,7 @@ public class JdiModelTargetThread extends JdiModelTargetObjectReference implemen @Override public void threadSelected(ThreadReference eventThread, StackFrame frame, JdiCause cause) { if (eventThread.equals(thread) && frame == null) { - AtomicReference> scope = new AtomicReference<>(); + AtomicReference scope = new AtomicReference<>(); AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { DebugModelConventions.findSuitable(JdiModelTargetFocusScope.class, this) .handle(seq::next); @@ -400,9 +413,7 @@ public class JdiModelTargetThread extends JdiModelTargetObjectReference implemen } @Override - public TargetAccessibility getAccessibility() { - return thread.isSuspended() ? TargetAccessibility.ACCESSIBLE - : TargetAccessibility.INACCESSIBLE; + public boolean isAccessible() { + return thread.isSuspended(); } - } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadContainer.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadContainer.java index a445fcdb39..d61d15c55b 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadContainer.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetThreadContainer.java @@ -30,14 +30,17 @@ import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState; import ghidra.dbg.target.schema.*; import ghidra.util.datastruct.WeakValueHashMap; -@TargetObjectSchemaInfo(name = "ThreadContainer", elements = { // - @TargetElementType(type = JdiModelTargetThread.class) // -}, attributes = { // - @TargetAttributeType(type = Void.class) // -}, canonicalContainer = true) -public class JdiModelTargetThreadContainer extends JdiModelTargetObjectImpl implements // - JdiModelTargetEventScope, // - JdiEventsListenerAdapter { +@TargetObjectSchemaInfo( + name = "ThreadContainer", + elements = { + @TargetElementType(type = JdiModelTargetThread.class) + }, + attributes = { + @TargetAttributeType(type = Void.class) + }, + canonicalContainer = true) +public class JdiModelTargetThreadContainer extends JdiModelTargetObjectImpl + implements JdiModelTargetEventScope, JdiEventsListenerAdapter { private List threads; diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVM.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVM.java index dce9995d9c..f64936033f 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVM.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/JdiModelTargetVM.java @@ -45,28 +45,46 @@ import ghidra.lifecycle.Internal; * TODO: Implementing {@link TargetLauncher} here doesn't seem right. While it's convenient from a * UI perspective, it doesn't make sense semantically. */ -@TargetObjectSchemaInfo(name = "VM", elements = { // -// @TargetElementType(type = Void.class) // -}, attributes = { // - @TargetAttributeType(name = "Attributes", type = JdiModelTargetAttributesContainer.class), // - @TargetAttributeType(name = "Breakpoints", type = JdiModelTargetBreakpointContainer.class, fixed = true), // - @TargetAttributeType(name = "Classes", type = JdiModelTargetClassContainer.class, fixed = true), // - @TargetAttributeType(name = "Modules", type = JdiModelTargetModuleContainer.class, fixed = true), // - @TargetAttributeType(name = "Threads", type = JdiModelTargetThreadContainer.class, required = true, fixed = true), // - @TargetAttributeType(name = "ThreadGroups", type = JdiModelTargetThreadGroupContainer.class, fixed = true), // - @TargetAttributeType(type = Object.class) // -}, canonicalContainer = true) +@TargetObjectSchemaInfo(name = "VM", elements = { +// @TargetElementType(type = Void.class) +}, + attributes = { + @TargetAttributeType(name = "Attributes", type = JdiModelTargetAttributesContainer.class), + @TargetAttributeType( + name = "Breakpoints", + type = JdiModelTargetBreakpointContainer.class, + fixed = true), + @TargetAttributeType( + name = "Classes", + type = JdiModelTargetClassContainer.class, + fixed = true), + @TargetAttributeType( + name = "Modules", + type = JdiModelTargetModuleContainer.class, + fixed = true), + @TargetAttributeType( + name = "Threads", + type = JdiModelTargetThreadContainer.class, + required = true, + fixed = true), + @TargetAttributeType( + name = "ThreadGroups", + type = JdiModelTargetThreadGroupContainer.class, + fixed = true), + @TargetAttributeType(type = Object.class) + }, + canonicalContainer = true) public class JdiModelTargetVM extends JdiModelTargetObjectImpl implements // - TargetProcess, // + TargetProcess, // TargetAggregate, // - JdiModelTargetEnvironment, // - JdiModelTargetAccessConditioned, // - JdiModelTargetExecutionStateful, // - JdiModelTargetLauncher, // - JdiModelTargetDeletable, // - JdiModelTargetKillable, // - JdiModelTargetResumable, // - JdiModelTargetInterruptible, // + JdiModelTargetEnvironment, // + JdiModelTargetAccessConditioned, // + JdiModelTargetExecutionStateful, // + JdiModelTargetLauncher, // + JdiModelTargetDeletable, // + JdiModelTargetKillable, // + JdiModelTargetResumable, // + JdiModelTargetInterruptible, // JdiEventsListenerAdapter, // JdiModelSelectableObject { @@ -139,7 +157,7 @@ public class JdiModelTargetVM extends JdiModelTargetObjectImpl implements // threads // ), Map.of( // STATE_ATTRIBUTE_NAME, TargetExecutionState.ALIVE, // - ACCESSIBLE_ATTRIBUTE_NAME, getAccessibility() == TargetAccessibility.ACCESSIBLE, // + ACCESSIBLE_ATTRIBUTE_NAME, isAccessible(), // DISPLAY_ATTRIBUTE_NAME, updateDisplay(), // ARCH_ATTRIBUTE_NAME, vm.name(), // DEBUGGER_ATTRIBUTE_NAME, vm.description(), // @@ -306,7 +324,7 @@ public class JdiModelTargetVM extends JdiModelTargetObjectImpl implements // @Override public void vmSelected(VirtualMachine eventVM, JdiCause cause) { if (eventVM.equals(vm)) { - AtomicReference> scope = new AtomicReference<>(); + AtomicReference scope = new AtomicReference<>(); AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { DebugModelConventions.findSuitable(JdiModelTargetFocusScope.class, this) .handle(seq::next); @@ -435,12 +453,13 @@ public class JdiModelTargetVM extends JdiModelTargetObjectImpl implements // } @Override - public TargetAccessibility getAccessibility() { + public boolean isAccessible() { for (JdiModelTargetThread thread : threads.threadsById.values()) { - if (thread.getAccessibility() == TargetAccessibility.ACCESSIBLE) - return TargetAccessibility.ACCESSIBLE; + if (thread.isAccessible()) { + return true; + } } - return TargetAccessibility.INACCESSIBLE; + return false; } } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetAccessConditioned.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetAccessConditioned.java index 5cca69c099..6bb204bd30 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetAccessConditioned.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetAccessConditioned.java @@ -25,10 +25,10 @@ import ghidra.dbg.target.TargetAccessConditioned; * * @param type for this */ -public interface JdiModelTargetAccessConditioned> - extends JdiModelTargetObject, TargetAccessConditioned { +public interface JdiModelTargetAccessConditioned + extends JdiModelTargetObject, TargetAccessConditioned { @Override - public TargetAccessibility getAccessibility(); + public boolean isAccessible(); } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetAttacher.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetAttacher.java index cd4d499653..7cade62ff5 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetAttacher.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetAttacher.java @@ -17,7 +17,6 @@ package ghidra.dbg.jdi.model.iface1; import java.util.concurrent.CompletableFuture; -import ghidra.dbg.attributes.TypedTargetObjectRef; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; import ghidra.dbg.target.TargetAttachable; import ghidra.dbg.target.TargetAttacher; @@ -29,12 +28,10 @@ import ghidra.dbg.target.TargetAttacher; * * @param type for this */ -public interface JdiModelTargetAttacher> - extends JdiModelTargetObject, TargetAttacher { +public interface JdiModelTargetAttacher extends JdiModelTargetObject, TargetAttacher { @Override - public CompletableFuture attach( - TypedTargetObjectRef> ref); + public CompletableFuture attach(TargetAttachable attachable); @Override public CompletableFuture attach(long pid); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetConsole.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetConsole.java index 9d684fc878..5df15c7508 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetConsole.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetConsole.java @@ -25,7 +25,6 @@ import ghidra.dbg.target.TargetConsole; * * @param type for this */ -public interface JdiModelTargetConsole> - extends JdiModelTargetObject, TargetConsole { +public interface JdiModelTargetConsole extends JdiModelTargetObject, TargetConsole { } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetDeletable.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetDeletable.java index 601761ef03..1c62584c52 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetDeletable.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetDeletable.java @@ -27,8 +27,7 @@ import ghidra.dbg.target.TargetDeletable; * * @param type for this */ -public interface JdiModelTargetDeletable> - extends JdiModelTargetObject, TargetDeletable { +public interface JdiModelTargetDeletable extends JdiModelTargetObject, TargetDeletable { @Override public CompletableFuture delete(); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetDetachable.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetDetachable.java index c76f0d22ce..1466de4e26 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetDetachable.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetDetachable.java @@ -27,8 +27,7 @@ import ghidra.dbg.target.TargetDetachable; * * @param type for this */ -public interface JdiModelTargetDetachable> - extends JdiModelTargetObject, TargetDetachable { +public interface JdiModelTargetDetachable extends JdiModelTargetObject, TargetDetachable { @Override public CompletableFuture detach(); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetEnvironment.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetEnvironment.java index 504a17a61d..fffdf5a938 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetEnvironment.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetEnvironment.java @@ -18,8 +18,7 @@ package ghidra.dbg.jdi.model.iface1; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; import ghidra.dbg.target.TargetEnvironment; -public interface JdiModelTargetEnvironment> - extends JdiModelTargetObject, TargetEnvironment { +public interface JdiModelTargetEnvironment extends JdiModelTargetObject, TargetEnvironment { public void refreshInternal(); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetEventScope.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetEventScope.java index 581169d28b..68dafed1cb 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetEventScope.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetEventScope.java @@ -23,7 +23,6 @@ import ghidra.dbg.target.TargetEventScope; * * @param type for this */ -public interface JdiModelTargetEventScope> - extends JdiModelTargetObject, TargetEventScope { +public interface JdiModelTargetEventScope extends JdiModelTargetObject, TargetEventScope { } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetExecutionStateful.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetExecutionStateful.java index 4376742a0b..ecd0ee4b24 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetExecutionStateful.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetExecutionStateful.java @@ -28,8 +28,8 @@ import ghidra.dbg.target.TargetExecutionStateful; * * @param type for this */ -public interface JdiModelTargetExecutionStateful> - extends JdiModelTargetObject, TargetExecutionStateful { +public interface JdiModelTargetExecutionStateful + extends JdiModelTargetObject, TargetExecutionStateful { public default void setExecutionState(TargetExecutionState state, String reason) { changeAttributes(List.of(), Map.of( // diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetFocusScope.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetFocusScope.java index 17629f308f..9753cfffe0 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetFocusScope.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetFocusScope.java @@ -16,12 +16,8 @@ package ghidra.dbg.jdi.model.iface1; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.atomic.AtomicReference; import ghidra.async.AsyncUtils; -import ghidra.async.TypeSpec; -import ghidra.dbg.DebugModelConventions; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.error.DebuggerIllegalArgumentException; import ghidra.dbg.jdi.model.iface2.JdiModelTargetObject; import ghidra.dbg.target.TargetFocusScope; @@ -35,8 +31,7 @@ import ghidra.dbg.util.PathUtils; * * @param type for this */ -public interface JdiModelTargetFocusScope> - extends JdiModelTargetObject, TargetFocusScope { +public interface JdiModelTargetFocusScope extends JdiModelTargetObject, TargetFocusScope { @Override public JdiModelSelectableObject getFocus(); @@ -47,40 +42,23 @@ public interface JdiModelTargetFocusScope> // NB: requestFocus request change in active object - propagates down to manager // (but, of course, may then cause change in state) @Override - public default CompletableFuture requestFocus(TargetObjectRef ref) { - getModel().assertMine(TargetObjectRef.class, ref); - if (ref.equals(getFocus())) { + public default CompletableFuture requestFocus(TargetObject obj) { + getModel().assertMine(TargetObject.class, obj); + if (obj.equals(getFocus())) { return CompletableFuture.completedFuture(null); } - if (!PathUtils.isAncestor(this.getPath(), ref.getPath())) { + if (!PathUtils.isAncestor(this.getPath(), obj.getPath())) { throw new DebuggerIllegalArgumentException("Can only focus a successor of the scope"); } - return AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { - ref.fetch().handle(seq::next); - }, TypeSpec.cls(TargetObject.class)).then((obj, seq) -> { - TargetObject cur = obj; - while (cur != null) { - if (cur instanceof JdiModelSelectableObject) { - JdiModelSelectableObject sel = (JdiModelSelectableObject) cur; - sel.select().handle(seq::exit); - AtomicReference> scope = new AtomicReference<>(); - AsyncUtils.sequence(TypeSpec.VOID).then(seqx -> { - DebugModelConventions.findSuitable(JdiModelTargetFocusScope.class, sel) - .handle(seqx::next); - }, scope).then(seqx -> { - scope.get().setFocus(sel); - }).finish(); - break; - } - if (cur instanceof JdiModelTargetObject) { - JdiModelTargetObject def = (JdiModelTargetObject) cur; - cur = def.getImplParent(); - continue; - } - throw new AssertionError(); + TargetObject cur = obj; + while (cur != null) { + if (cur instanceof JdiModelSelectableObject) { + JdiModelSelectableObject sel = (JdiModelSelectableObject) cur; + setFocus(sel); + return sel.select(); } - seq.exit(); - }).finish(); + cur = cur.getParent(); + } + return AsyncUtils.NIL; } - } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetInterruptible.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetInterruptible.java index 09540853dd..755bb70b73 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetInterruptible.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetInterruptible.java @@ -27,8 +27,7 @@ import ghidra.dbg.target.TargetInterruptible; * * @param type for this */ -public interface JdiModelTargetInterruptible> - extends JdiModelTargetObject, TargetInterruptible { +public interface JdiModelTargetInterruptible extends JdiModelTargetObject, TargetInterruptible { @Override public CompletableFuture interrupt(); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetKillable.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetKillable.java index e23fd09f6b..15f27efa70 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetKillable.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetKillable.java @@ -27,8 +27,7 @@ import ghidra.dbg.target.TargetKillable; * * @param type for this */ -public interface JdiModelTargetKillable> - extends JdiModelTargetObject, TargetKillable { +public interface JdiModelTargetKillable extends JdiModelTargetObject, TargetKillable { @Override public CompletableFuture kill(); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetLauncher.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetLauncher.java index 72d29dc54d..d6b87e10f7 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetLauncher.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetLauncher.java @@ -32,8 +32,7 @@ import ghidra.dbg.target.TargetMethod.ParameterDescription; * * @param type for this */ -public interface JdiModelTargetLauncher> - extends JdiModelTargetObject, TargetLauncher { +public interface JdiModelTargetLauncher extends JdiModelTargetObject, TargetLauncher { static ParameterDescription createBooleanParameter(BooleanArgument arg) { return ParameterDescription.create(Boolean.class, arg.name(), arg.mustSpecify(), diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetMethod.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetMethod.java index be9f0fc3d6..84cd629670 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetMethod.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetMethod.java @@ -23,7 +23,6 @@ import ghidra.dbg.target.TargetMethod; * * @param type for this */ -public interface JdiModelTargetMethod> - extends JdiModelTargetObject, TargetMethod { +public interface JdiModelTargetMethod extends JdiModelTargetObject, TargetMethod { } diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetResumable.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetResumable.java index e48a3518c7..e48412c3a0 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetResumable.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetResumable.java @@ -27,8 +27,7 @@ import ghidra.dbg.target.TargetResumable; * * @param type for this */ -public interface JdiModelTargetResumable> - extends JdiModelTargetObject, TargetResumable { +public interface JdiModelTargetResumable extends JdiModelTargetObject, TargetResumable { @Override public CompletableFuture resume(); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetSteppable.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetSteppable.java index c76771b9d4..574630bd30 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetSteppable.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface1/JdiModelTargetSteppable.java @@ -27,8 +27,7 @@ import ghidra.dbg.target.TargetSteppable; * * @param type for this */ -public interface JdiModelTargetSteppable> - extends JdiModelTargetObject, TargetSteppable { +public interface JdiModelTargetSteppable extends JdiModelTargetObject, TargetSteppable { @Override CompletableFuture step(TargetStepKind kind); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface2/JdiModelTargetAttachable.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface2/JdiModelTargetAttachable.java index 685bc07c92..23303dcffc 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface2/JdiModelTargetAttachable.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface2/JdiModelTargetAttachable.java @@ -23,8 +23,7 @@ import ghidra.dbg.target.TargetAttachable; * The targets this launcher creates ought to appear in its successors. * */ -public interface JdiModelTargetAttachable - extends JdiModelTargetObject, TargetAttachable { +public interface JdiModelTargetAttachable extends JdiModelTargetObject, TargetAttachable { public long getId(); diff --git a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface2/JdiModelTargetObject.java b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface2/JdiModelTargetObject.java index 4b5191b60c..14b150bc35 100644 --- a/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface2/JdiModelTargetObject.java +++ b/Ghidra/Debug/Debugger-jpda/src/main/java/ghidra/dbg/jdi/model/iface2/JdiModelTargetObject.java @@ -53,8 +53,6 @@ public interface JdiModelTargetObject extends TargetObject, InvalidatableTargetO @Override public CompletableFuture> fetchAttributes(); - public TargetObject getImplParent(); - public Delta changeAttributes(List remove, Map add, String reason); public ListenerSet getListeners(); diff --git a/Ghidra/Debug/Debugger-jpda/src/test/java/ghidra/dbg/jdi/model/JdiModelTest.java b/Ghidra/Debug/Debugger-jpda/src/test/java/ghidra/dbg/jdi/model/JdiModelTest.java index 2056b5dea5..225bdbc19c 100644 --- a/Ghidra/Debug/Debugger-jpda/src/test/java/ghidra/dbg/jdi/model/JdiModelTest.java +++ b/Ghidra/Debug/Debugger-jpda/src/test/java/ghidra/dbg/jdi/model/JdiModelTest.java @@ -22,7 +22,6 @@ import org.junit.*; import generic.Unique; import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.jdi.JdiExperimentsTest; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetMethod.ParameterDescription; @@ -45,8 +44,8 @@ public class JdiModelTest implements DebuggerModelTestUtils { @Test public void testConnectorParameterReflection() throws Throwable { - for (TargetObjectRef connRef : waitOn(model.fetchObjectElements("Connectors")).values()) { - TargetLauncher launcher = waitOn(connRef.as(TargetLauncher.tclass).fetch()); + for (TargetObject conn : waitOn(model.fetchObjectElements("Connectors")).values()) { + TargetLauncher launcher = conn.as(TargetLauncher.class); Msg.info(this, "Launcher: " + launcher); for (ParameterDescription desc : launcher.getParameters().values()) { Msg.info(this, " " + desc); @@ -57,7 +56,7 @@ public class JdiModelTest implements DebuggerModelTestUtils { @Test @Ignore("TODO") // Not important public void testCommandLineLauncher() throws Throwable { - TargetLauncher launcher = (TargetLauncher) waitOn( + TargetLauncher launcher = (TargetLauncher) waitOn( model.fetchModelObject(PathUtils.parse("Connectors[com.sun.jdi.CommandLineLaunch]"))); Map parameters = new HashMap<>(); parameters.put("main", JdiExperimentsTest.HelloWorld.class.getName()); @@ -65,9 +64,8 @@ public class JdiModelTest implements DebuggerModelTestUtils { parameters.put("vmexec", "java"); waitOn(launcher.launch(parameters)); - TargetObjectRef vmRef = + TargetObject vm = Unique.assertOne(waitOn(model.fetchObjectElements("VirtualMachines")).values()); - TargetObject vm = waitOn(vmRef.fetch()); - waitOn(((TargetKillable) vm).kill()); + waitOn(vm.as(TargetKillable.class).kill()); } } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/event/ModelObjectFocusedPluginEvent.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/event/ModelObjectFocusedPluginEvent.java index 07834fc911..95a6de0e93 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/event/ModelObjectFocusedPluginEvent.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/event/ModelObjectFocusedPluginEvent.java @@ -15,7 +15,7 @@ */ package ghidra.app.plugin.core.debug.event; -import ghidra.dbg.attributes.TargetObjectRef; +import ghidra.dbg.target.TargetObject; import ghidra.framework.plugintool.PluginEvent; /** @@ -24,7 +24,7 @@ import ghidra.framework.plugintool.PluginEvent; public class ModelObjectFocusedPluginEvent extends PluginEvent { static final String NAME = "Object Focused"; - private final TargetObjectRef focusRef; + private final TargetObject focus; /** * Construct a new plugin event. @@ -32,9 +32,9 @@ public class ModelObjectFocusedPluginEvent extends PluginEvent { * @param source name of the plugin that created this event * @param focusRef the object (ref) associated with this event */ - public ModelObjectFocusedPluginEvent(String source, TargetObjectRef focusRef) { + public ModelObjectFocusedPluginEvent(String source, TargetObject focus) { super(source, NAME); - this.focusRef = focusRef; + this.focus = focus; } /** @@ -42,7 +42,7 @@ public class ModelObjectFocusedPluginEvent extends PluginEvent { * * @return the focused object ref */ - public TargetObjectRef getFocusRef() { - return focusRef; + public TargetObject getFocus() { + return focus; } } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/AbstractDebuggerWrappedConsoleConnection.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/AbstractDebuggerWrappedConsoleConnection.java index b9bb6d92e9..5c7e5c513d 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/AbstractDebuggerWrappedConsoleConnection.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/AbstractDebuggerWrappedConsoleConnection.java @@ -85,7 +85,7 @@ public abstract class AbstractDebuggerWrappedConsoleConnection i, String prompt) { + public void promptChanged(TargetInterpreter i, String prompt) { Swing.runLater(() -> guiConsole.setPrompt(prompt)); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/DebuggerInterpreterPlugin.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/DebuggerInterpreterPlugin.java index cecbf8ce70..21fa362e84 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/DebuggerInterpreterPlugin.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/DebuggerInterpreterPlugin.java @@ -57,7 +57,7 @@ public class DebuggerInterpreterPlugin extends AbstractDebuggerPlugin } @Override - public DebuggerInterpreterConnection showConsole(TargetConsole targetConsole) { + public DebuggerInterpreterConnection showConsole(TargetConsole targetConsole) { DebuggerInterpreterConnection conn; synchronized (connections) { conn = connections.computeIfAbsent(targetConsole, c -> createConnection(targetConsole)); @@ -67,7 +67,7 @@ public class DebuggerInterpreterPlugin extends AbstractDebuggerPlugin } @Override - public DebuggerInterpreterConnection showConsole(TargetInterpreter targetInterpreter) { + public DebuggerInterpreterConnection showConsole(TargetInterpreter targetInterpreter) { DebuggerInterpreterConnection conn; synchronized (connections) { conn = connections.computeIfAbsent(targetInterpreter, @@ -101,7 +101,7 @@ public class DebuggerInterpreterPlugin extends AbstractDebuggerPlugin connection.runInBackground(); } - protected DebuggerInterpreterConnection createConnection(TargetConsole targetConsole) { + protected DebuggerInterpreterConnection createConnection(TargetConsole targetConsole) { DebuggerWrappedConsoleConnection conn = new DebuggerWrappedConsoleConnection(this, targetConsole); createConsole(conn); @@ -109,7 +109,7 @@ public class DebuggerInterpreterPlugin extends AbstractDebuggerPlugin } protected DebuggerInterpreterConnection createConnection( - TargetInterpreter targetInterpreter) { + TargetInterpreter targetInterpreter) { DebuggerWrappedInterpreterConnection conn = new DebuggerWrappedInterpreterConnection(this, targetInterpreter); createConsole(conn); diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/DebuggerWrappedConsoleConnection.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/DebuggerWrappedConsoleConnection.java index aca8d3101d..334b3ecb99 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/DebuggerWrappedConsoleConnection.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/DebuggerWrappedConsoleConnection.java @@ -20,10 +20,10 @@ import java.util.concurrent.CompletableFuture; import ghidra.dbg.target.TargetConsole; public class DebuggerWrappedConsoleConnection - extends AbstractDebuggerWrappedConsoleConnection> { + extends AbstractDebuggerWrappedConsoleConnection { public DebuggerWrappedConsoleConnection(DebuggerInterpreterPlugin plugin, - TargetConsole targetConsole) { + TargetConsole targetConsole) { super(plugin, targetConsole); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/DebuggerWrappedInterpreterConnection.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/DebuggerWrappedInterpreterConnection.java index 960f792815..c0b2dcb602 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/DebuggerWrappedInterpreterConnection.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/interpreters/DebuggerWrappedInterpreterConnection.java @@ -21,10 +21,10 @@ import ghidra.app.plugin.core.interpreter.InterpreterConsole; import ghidra.dbg.target.TargetInterpreter; public class DebuggerWrappedInterpreterConnection - extends AbstractDebuggerWrappedConsoleConnection> { + extends AbstractDebuggerWrappedConsoleConnection { public DebuggerWrappedInterpreterConnection(DebuggerInterpreterPlugin plugin, - TargetInterpreter interpreter) { + TargetInterpreter interpreter) { super(plugin, interpreter); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsPlugin.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsPlugin.java index 4dfa5969c8..7c3e91d7e7 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsPlugin.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsPlugin.java @@ -27,9 +27,7 @@ import ghidra.app.plugin.core.debug.DebuggerPluginPackage; import ghidra.app.plugin.core.debug.event.*; import ghidra.app.services.*; import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.attributes.TargetObjectRef; -import ghidra.dbg.target.TargetFocusScope; -import ghidra.dbg.target.TargetInterpreter; +import ghidra.dbg.target.*; import ghidra.framework.options.SaveState; import ghidra.framework.plugintool.*; import ghidra.framework.plugintool.annotation.AutoServiceConsumed; @@ -38,28 +36,27 @@ import ghidra.program.model.listing.Program; import ghidra.util.Swing; import ghidra.util.datastruct.CollectionChangeListener; -@PluginInfo( // - shortDescription = "Debugger objects manager", // - description = "GUI to manage connections to external debuggers and trace recording", // - category = PluginCategoryNames.DEBUGGER, // - packageName = DebuggerPluginPackage.NAME, // - status = PluginStatus.RELEASED, // - eventsConsumed = { // - ProgramActivatedPluginEvent.class, // for default launch executable path - ProgramOpenedPluginEvent.class, // - ProgramSelectionPluginEvent.class, // - TraceActivatedPluginEvent.class, // - TraceOpenedPluginEvent.class, // - TraceClosedPluginEvent.class, // - ModelActivatedPluginEvent.class, // - }, // - servicesProvided = { ObjectUpdateService.class }, // - servicesRequired = { // - DebuggerTraceManagerService.class, // - DebuggerModelService.class, // - DebuggerInterpreterService.class, // - } // -) +@PluginInfo( + shortDescription = "Debugger objects manager", + description = "GUI to manage connections to external debuggers and trace recording", + category = PluginCategoryNames.DEBUGGER, + packageName = DebuggerPluginPackage.NAME, + status = PluginStatus.RELEASED, + eventsConsumed = { + ProgramActivatedPluginEvent.class, // for default launch executable path + ProgramOpenedPluginEvent.class, + ProgramSelectionPluginEvent.class, + TraceActivatedPluginEvent.class, + TraceOpenedPluginEvent.class, + TraceClosedPluginEvent.class, + ModelActivatedPluginEvent.class, + }, + servicesProvided = { ObjectUpdateService.class }, + servicesRequired = { + DebuggerTraceManagerService.class, + DebuggerModelService.class, + DebuggerInterpreterService.class, + }) public class DebuggerObjectsPlugin extends AbstractDebuggerPlugin implements ObjectUpdateService, CollectionChangeListener { @@ -161,7 +158,7 @@ public class DebuggerObjectsPlugin extends AbstractDebuggerPlugin SwingUtilities.invokeLater(r); } - public void showConsole(TargetInterpreter interpreter) { + public void showConsole(TargetInterpreter interpreter) { Swing.runIfSwingOrRunLater(() -> { interpreterService.showConsole(interpreter); }); @@ -241,7 +238,7 @@ public class DebuggerObjectsPlugin extends AbstractDebuggerPlugin System.err.println("modelModified " + model); } - public void setFocus(TargetFocusScope object, TargetObjectRef focused) { + public void setFocus(TargetFocusScope object, TargetObject focused) { for (DebuggerObjectsProvider p : providers) { p.setFocus(object, focused); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java index f4f5605f60..8838cc436c 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsProvider.java @@ -47,14 +47,12 @@ import ghidra.app.services.*; import ghidra.async.AsyncUtils; import ghidra.async.TypeSpec; import ghidra.dbg.*; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.error.DebuggerMemoryAccessException; import ghidra.dbg.target.*; -import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility; import ghidra.dbg.target.TargetConsole.Channel; import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState; import ghidra.dbg.target.TargetLauncher.TargetCmdLineLauncher; -import ghidra.dbg.target.TargetObject.TargetObjectFetchingListener; +import ghidra.dbg.target.TargetObject.TargetObjectListener; import ghidra.dbg.target.TargetSteppable.TargetStepKind; import ghidra.dbg.util.PathUtils; import ghidra.framework.options.AutoOptions; @@ -73,7 +71,7 @@ import ghidra.util.table.GhidraTable; import resources.ResourceManager; public class DebuggerObjectsProvider extends ComponentProviderAdapter implements //AllTargetObjectListenerAdapter, - TargetObjectFetchingListener, // + TargetObjectListener, // DebuggerModelListener, // ObjectContainerListener { @@ -113,70 +111,70 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements public static final String OPTION_NAME_DEFAULT_BACKGROUND_COLOR = "Object Colors.Background"; @AutoOptionDefined( // - name = OPTION_NAME_DEFAULT_FOREGROUND_COLOR, // - description = "The default foreground color of items in the objects tree", // - help = @HelpInfo(anchor = "colors") // + name = OPTION_NAME_DEFAULT_FOREGROUND_COLOR, // + description = "The default foreground color of items in the objects tree", // + help = @HelpInfo(anchor = "colors") // ) Color defaultForegroundColor = Color.BLACK; @AutoOptionDefined( // - name = OPTION_NAME_DEFAULT_BACKGROUND_COLOR, // - description = "The default background color of items in the objects tree", // - help = @HelpInfo(anchor = "colors") // + name = OPTION_NAME_DEFAULT_BACKGROUND_COLOR, // + description = "The default background color of items in the objects tree", // + help = @HelpInfo(anchor = "colors") // ) Color defaultBackgroundColor = Color.WHITE; @AutoOptionDefined( // - name = OPTION_NAME_INVISIBLE_FOREGROUND_COLOR, // - description = "The foreground color for items normally not visible (toggleable)", // - help = @HelpInfo(anchor = "colors") // + name = OPTION_NAME_INVISIBLE_FOREGROUND_COLOR, // + description = "The foreground color for items normally not visible (toggleable)", // + help = @HelpInfo(anchor = "colors") // ) Color invisibleForegroundColor = Color.LIGHT_GRAY; @AutoOptionDefined( // - name = OPTION_NAME_MODIFIED_FOREGROUND_COLOR, // - description = "The foreground color for modified items in the objects tree", // - help = @HelpInfo(anchor = "colors") // + name = OPTION_NAME_MODIFIED_FOREGROUND_COLOR, // + description = "The foreground color for modified items in the objects tree", // + help = @HelpInfo(anchor = "colors") // ) Color modifiedForegroundColor = Color.RED; @AutoOptionDefined( // - name = OPTION_NAME_SUBSCRIBED_FOREGROUND_COLOR, // - description = "The foreground color for subscribed items in the objects tree", // - help = @HelpInfo(anchor = "colors") // + name = OPTION_NAME_SUBSCRIBED_FOREGROUND_COLOR, // + description = "The foreground color for subscribed items in the objects tree", // + help = @HelpInfo(anchor = "colors") // ) Color subscribedForegroundColor = Color.BLACK; @AutoOptionDefined( // - name = OPTION_NAME_ERROR_FOREGROUND_COLOR, // - description = "The foreground color for items in error", // - help = @HelpInfo(anchor = "colors") // + name = OPTION_NAME_ERROR_FOREGROUND_COLOR, // + description = "The foreground color for items in error", // + help = @HelpInfo(anchor = "colors") // ) Color errorForegroundColor = Color.RED; @AutoOptionDefined( // - name = OPTION_NAME_INTRINSIC_FOREGROUND_COLOR, // - description = "The foreground color for intrinsic items in the objects tree", // - help = @HelpInfo(anchor = "colors") // + name = OPTION_NAME_INTRINSIC_FOREGROUND_COLOR, // + description = "The foreground color for intrinsic items in the objects tree", // + help = @HelpInfo(anchor = "colors") // ) Color intrinsicForegroundColor = Color.BLUE; @AutoOptionDefined( // - name = OPTION_NAME_TARGET_FOREGROUND_COLOR, // - description = "The foreground color for target object items in the objects tree", // - help = @HelpInfo(anchor = "colors") // + name = OPTION_NAME_TARGET_FOREGROUND_COLOR, // + description = "The foreground color for target object items in the objects tree", // + help = @HelpInfo(anchor = "colors") // ) Color targetForegroundColor = Color.MAGENTA; @AutoOptionDefined( // - name = OPTION_NAME_ACCESSOR_FOREGROUND_COLOR, // - description = "The foreground color for property accessor items in the objects tree", // - help = @HelpInfo(anchor = "colors") // + name = OPTION_NAME_ACCESSOR_FOREGROUND_COLOR, // + description = "The foreground color for property accessor items in the objects tree", // + help = @HelpInfo(anchor = "colors") // ) Color accessorForegroundColor = Color.LIGHT_GRAY; @AutoOptionDefined( // - name = OPTION_NAME_LINK_FOREGROUND_COLOR, // - description = "The foreground color for links to items in the objects tree", // - help = @HelpInfo(anchor = "colors") // + name = OPTION_NAME_LINK_FOREGROUND_COLOR, // + description = "The foreground color for links to items in the objects tree", // + help = @HelpInfo(anchor = "colors") // ) Color linkForegroundColor = Color.GREEN; @AutoOptionDefined( // - name = "Default Extended Step", // - description = "The default string for the extended step command" // + name = "Default Extended Step", // + description = "The default string for the extended step command" // //help = @HelpInfo(anchor = "colors") // ) String extendedStep = ""; @@ -191,7 +189,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements private ObjectPane pane; protected ObjectContainer root; private Map targetMap; - private Set refSet; + private Set refSet; public Program currentProgram; // For quick launch protected Map traces = new HashMap<>(); @@ -253,7 +251,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements setIcon(asTree ? ObjectTree.ICON_TREE : ObjectTable.ICON_TABLE); targetMap = new LinkedMap(); - refSet = new HashSet(); + refSet = new HashSet<>(); getRoot().propagateProvider(this); this.autoServiceWiring = AutoService.wireServicesConsumed(plugin, this); @@ -606,8 +604,8 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements Map map = container.getAttributeMap(); List list = new ArrayList<>(); for (Object val : map.values()) { - if (val instanceof TargetObjectRef) { - TargetObjectRef ref = (TargetObjectRef) val; + if (val instanceof TargetObject) { + TargetObject ref = (TargetObject) val; list.add(new ObjectAttributeRow(ref, container.getProvider())); } } @@ -618,11 +616,11 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements private ObjectTable buildTableFromElements(ObjectContainer container) { TargetObject targetObject = container.getTargetObject(); String name = targetObject.getName(); - Map map = container.getElementMap(); + Map map = container.getElementMap(); List list = new ArrayList<>(); for (Object obj : map.values()) { - if (obj instanceof TargetObjectRef) { - TargetObjectRef ref = (TargetObjectRef) obj; + if (obj instanceof TargetObject) { + TargetObject ref = (TargetObject) obj; list.add(new ObjectElementRow(ref, container.getProvider())); } } @@ -634,17 +632,15 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements ObjectTable table = new ObjectTable(container, ObjectElementRow.class, model); for (Object obj : map.values()) { - if (obj instanceof TargetObjectRef) { - TargetObjectRef ref = (TargetObjectRef) obj; - AtomicReference to = new AtomicReference<>(); - AtomicReference> attrs = new AtomicReference<>(); - AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { - ref.fetch().handle(seq::next); - }, to).then(seq -> { - to.get().fetchAttributes(true).handle(seq::next); - }, attrs).then(seq -> { + if (obj instanceof TargetObject) { + TargetObject ref = (TargetObject) obj; + ref.fetchAttributes(true).thenAccept(attrs -> { table.setColumns(); - }).finish(); + // TODO: What with attrs? + }).exceptionally(ex -> { + Msg.error(this, "Failed to fetch attributes", ex); + return null; + }); } } return table; @@ -666,7 +662,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements targetMap.put(key, container); refSet.add(targetObject); if (targetObject instanceof TargetInterpreter) { - TargetInterpreter interpreter = (TargetInterpreter) targetObject; + TargetInterpreter interpreter = (TargetInterpreter) targetObject; getPlugin().showConsole(interpreter); DebugModelConventions.findSuitable(TargetFocusScope.class, targetObject) .thenAccept(f -> { @@ -727,13 +723,13 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements static ObjectContainer buildContainerFromObject(TargetObject parent, String key, Object val, boolean usingAttributes) { String xkey = usingAttributes ? key : "[" + key + "]"; - if (val instanceof TargetObjectRef) { - TargetObjectRef ref = (TargetObjectRef) val; + if (val instanceof TargetObject) { + TargetObject ref = (TargetObject) val; List path = ref.getPath(); boolean isLink = PathUtils.isLink(parent.getPath(), xkey, path); boolean isMethod = false; if (ref instanceof TargetObject) { - TargetObject to = (TargetObject) ref; + TargetObject to = ref; isMethod = to instanceof TargetMethod; } if (!(val instanceof DummyTargetObject) && !isMethod) { @@ -833,9 +829,9 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements return result != null; } - public TargetObjectRef getAncestor(ActionContext context, Class clazz) { + public TargetObject getAncestor(ActionContext context, Class clazz) { TargetObject object = this.getObjectFromContext(context); - TargetObjectRef ref = object; + TargetObject ref = object; while (ref != null) { if (clazz.isInstance(ref)) { return ref; @@ -846,7 +842,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements } public boolean descendsFrom(ActionContext context, Class clazz) { - TargetObjectRef ref = getAncestor(context, clazz); + TargetObject ref = getAncestor(context, clazz); return ref != null; } @@ -939,8 +935,8 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .popupMenuGroup(DebuggerResources.GROUP_TARGET, "T" + groupTargetIndex) .popupMenuIcon(AbstractLaunchAction.ICON) .helpLocation(AbstractLaunchAction.help(plugin)) - .enabledWhen(ctx -> isInstance(ctx, TargetLauncher.tclass)) - .popupWhen(ctx -> isInstance(ctx, TargetLauncher.tclass)) + .enabledWhen(ctx -> isInstance(ctx, TargetLauncher.class)) + .popupWhen(ctx -> isInstance(ctx, TargetLauncher.class)) .onAction(ctx -> performLaunch(ctx)) .enabled(false) .buildAndInstallLocal(this); @@ -955,7 +951,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .popupMenuGroup(DebuggerResources.GROUP_TARGET, "T" + groupTargetIndex) .popupMenuIcon(AbstractAttachAction.ICON) .helpLocation(AbstractAttachAction.help(plugin)) - .enabledWhen(ctx -> isInstance(ctx, TargetAttachable.tclass)) + .enabledWhen(ctx -> isInstance(ctx, TargetAttachable.class)) .onAction(ctx -> performAttach(ctx)) .enabled(true) .buildAndInstallLocal(this); @@ -968,7 +964,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .menuGroup(DebuggerResources.GROUP_TARGET, "T" + groupTargetIndex) .menuIcon(AbstractDetachAction.ICON) .helpLocation(AbstractAttachAction.help(plugin)) - .enabledWhen(ctx -> isInstance(ctx, TargetAttachable.tclass) && isStopped(ctx)) + .enabledWhen(ctx -> isInstance(ctx, TargetAttachable.class) && isStopped(ctx)) .onAction(ctx -> performReattach(ctx)) .enabled(true) .buildAndInstallLocal(this); @@ -983,8 +979,8 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .popupMenuPath("&Attach") .popupMenuGroup(DebuggerResources.GROUP_TARGET, "T" + groupTargetIndex) .popupMenuIcon(AbstractAttachAction.ICON) - .enabledWhen(ctx -> isInstance(ctx, TargetAttachable.tclass) || isInstance(ctx, TargetAttacher.tclass)) - .popupWhen(ctx -> isInstance(ctx, TargetAttachable.tclass) || isInstance(ctx, TargetAttacher.tclass)) + .enabledWhen(ctx -> isInstance(ctx, TargetAttachable.class) || isInstance(ctx, TargetAttacher.class)) + .popupWhen(ctx -> isInstance(ctx, TargetAttachable.class) || isInstance(ctx, TargetAttacher.class)) .onAction(ctx -> performAttach(ctx)) .enabled(false) .buildAndInstallLocal(this); @@ -1001,8 +997,8 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .popupMenuGroup(DebuggerResources.GROUP_TARGET, "T" + groupTargetIndex) .popupMenuIcon(AbstractDetachAction.ICON) .helpLocation(AbstractDetachAction.help(plugin)) - .popupWhen(ctx -> isInstance(ctx, TargetDetachable.tclass) && isStopped(ctx)) - .enabledWhen(ctx -> isInstance(ctx, TargetDetachable.tclass) && isStopped(ctx)) + .popupWhen(ctx -> isInstance(ctx, TargetDetachable.class) && isStopped(ctx)) + .enabledWhen(ctx -> isInstance(ctx, TargetDetachable.class) && isStopped(ctx)) .onAction(ctx -> performDetach(ctx)) .enabled(false) .buildAndInstallLocal(this); @@ -1018,8 +1014,8 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .popupMenuGroup(DebuggerResources.GROUP_TARGET, "T" + groupTargetIndex) .popupMenuIcon(AbstractKillAction.ICON) .helpLocation(AbstractKillAction.help(plugin)) - .enabledWhen(ctx -> isInstance(ctx, TargetKillable.tclass) && isStopped(ctx)) - .popupWhen(ctx -> isInstance(ctx, TargetKillable.tclass) && isStopped(ctx)) + .enabledWhen(ctx -> isInstance(ctx, TargetKillable.class) && isStopped(ctx)) + .popupWhen(ctx -> isInstance(ctx, TargetKillable.class) && isStopped(ctx)) .onAction(ctx -> performKill(ctx)) .enabled(false) .buildAndInstallLocal(this); @@ -1035,8 +1031,8 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .popupMenuGroup(DebuggerResources.GROUP_TARGET, "T" + groupTargetIndex) .popupMenuIcon(AbstractRecordAction.ICON) .helpLocation(new HelpLocation(plugin.getName(), "record")) - .enabledWhen(ctx -> isInstance(ctx, TargetProcess.tclass)) - .popupWhen(ctx -> isInstance(ctx, TargetProcess.tclass)) + .enabledWhen(ctx -> isInstance(ctx, TargetProcess.class)) + .popupWhen(ctx -> isInstance(ctx, TargetProcess.class)) .onAction(ctx -> performStartRecording(ctx)) .enabled(true) .buildAndInstallLocal(this); @@ -1052,9 +1048,9 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .popupMenuIcon(AbstractResumeAction.ICON) .helpLocation(AbstractResumeAction.help(plugin)) .enabledWhen(ctx -> - isInstance(ctx, TargetResumable.tclass) && isStopped(ctx)) + isInstance(ctx, TargetResumable.class) && isStopped(ctx)) .popupWhen(ctx -> - isInstance(ctx, TargetResumable.tclass) && isStopped(ctx)) + isInstance(ctx, TargetResumable.class) && isStopped(ctx)) .onAction(ctx -> performResume(ctx)) .enabled(false) .buildAndInstallLocal(this); @@ -1070,9 +1066,9 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .popupMenuIcon(AbstractInterruptAction.ICON) .helpLocation(AbstractInterruptAction.help(plugin)) .enabledWhen(ctx -> - isInstance(ctx, TargetInterruptible.tclass) && (!isStopped(ctx) || ignoreState)) + isInstance(ctx, TargetInterruptible.class) && (!isStopped(ctx) || ignoreState)) .popupWhen(ctx -> - isInstance(ctx, TargetInterruptible.tclass) && (!isStopped(ctx) || ignoreState)) + isInstance(ctx, TargetInterruptible.class) && (!isStopped(ctx) || ignoreState)) .onAction(ctx -> performInterrupt(ctx)) .enabled(false) .buildAndInstallLocal(this); @@ -1088,9 +1084,9 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .popupMenuIcon(AbstractStepIntoAction.ICON) .helpLocation(AbstractStepIntoAction.help(plugin)) .enabledWhen(ctx -> - isInstance(ctx, TargetSteppable.tclass) && isStopped(ctx)) + isInstance(ctx, TargetSteppable.class) && isStopped(ctx)) .popupWhen(ctx -> - isInstance(ctx, TargetSteppable.tclass) && isStopped(ctx)) + isInstance(ctx, TargetSteppable.class) && isStopped(ctx)) .onAction(ctx -> performStepInto(ctx)) .enabled(false) .buildAndInstallLocal(this); @@ -1107,9 +1103,9 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .helpLocation(AbstractStepOverAction.help(plugin)) //.withContext(ObjectActionContext.class) .enabledWhen(ctx -> - isInstance(ctx, TargetSteppable.tclass) && isStopped(ctx)) + isInstance(ctx, TargetSteppable.class) && isStopped(ctx)) .popupWhen(ctx -> - isInstance(ctx, TargetSteppable.tclass) && isStopped(ctx)) + isInstance(ctx, TargetSteppable.class) && isStopped(ctx)) .onAction(ctx -> performStepOver(ctx)) .enabled(false) .buildAndInstallLocal(this); @@ -1126,9 +1122,9 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .helpLocation(AbstractStepFinishAction.help(plugin)) //.withContext(ObjectActionContext.class) .enabledWhen(ctx -> - isInstance(ctx, TargetSteppable.tclass) && isStopped(ctx)) + isInstance(ctx, TargetSteppable.class) && isStopped(ctx)) .popupWhen(ctx -> - isInstance(ctx, TargetSteppable.tclass) && isStopped(ctx)) + isInstance(ctx, TargetSteppable.class) && isStopped(ctx)) .onAction(ctx -> performStepFinish(ctx)) .enabled(false) .buildAndInstallLocal(this); @@ -1145,9 +1141,9 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .helpLocation(AbstractStepFinishAction.help(plugin)) //.withContext(ObjectActionContext.class) .enabledWhen(ctx -> - isInstance(ctx, TargetSteppable.tclass) && isStopped(ctx)) + isInstance(ctx, TargetSteppable.class) && isStopped(ctx)) .popupWhen(ctx -> - isInstance(ctx, TargetSteppable.tclass) && isStopped(ctx)) + isInstance(ctx, TargetSteppable.class) && isStopped(ctx)) .onAction(ctx -> performStepLast(ctx)) .enabled(false) .buildAndInstallLocal(this); @@ -1164,9 +1160,9 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .helpLocation(AbstractSetBreakpointAction.help(plugin)) //.withContext(ObjectActionContext.class) .enabledWhen(ctx -> - isInstance(ctx, TargetBreakpointContainer.tclass) && isStopped(ctx)) + isInstance(ctx, TargetBreakpointContainer.class) && isStopped(ctx)) .popupWhen(ctx -> - isInstance(ctx, TargetBreakpointContainer.tclass) && isStopped(ctx)) + isInstance(ctx, TargetBreakpointContainer.class) && isStopped(ctx)) .onAction(ctx -> performSetBreakpoint(ctx)) .enabled(false) .buildAndInstallLocal(this); @@ -1182,8 +1178,8 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .popupMenuIcon(AbstractConsoleAction.ICON) .helpLocation(AbstractConsoleAction.help(plugin)) //.withContext(ObjectActionContext.class) - .enabledWhen(ctx -> isInstance(ctx, TargetInterpreter.tclass)) - .popupWhen(ctx -> isInstance(ctx, TargetInterpreter.tclass)) + .enabledWhen(ctx -> isInstance(ctx, TargetInterpreter.class)) + .popupWhen(ctx -> isInstance(ctx, TargetInterpreter.class)) .onAction(ctx -> initiateConsole(ctx)) .enabled(false) .buildAndInstallLocal(this); @@ -1283,8 +1279,8 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements obj = root.getTargetObject(); } // TODO: A generic or pluggable way of deriving the launch arguments - CompletableFuture> fl = - DebugModelConventions.findSuitable(TargetLauncher.tclass, obj); + CompletableFuture fl = + DebugModelConventions.findSuitable(TargetLauncher.class, obj); fl.thenCompose(launcher -> { return launcher.launch(Map.of(TargetCmdLineLauncher.CMDLINE_ARGS_NAME, currentProgram.getExecutablePath())); @@ -1299,8 +1295,8 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements if (obj == null) { obj = root.getTargetObject(); } - CompletableFuture> fl = - DebugModelConventions.findSuitable(TargetLauncher.tclass, obj); + CompletableFuture fl = + DebugModelConventions.findSuitable(TargetLauncher.class, obj); fl.thenCompose(launcher -> { if (currentProgram != null) { // TODO: A generic or pluggable way of deriving the default arguments @@ -1327,14 +1323,14 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements public void performAttach(ActionContext context) { TargetObject obj = getObjectFromContext(context); - AtomicReference> attacher = new AtomicReference<>(); + AtomicReference attacher = new AtomicReference<>(); AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { DebugModelConventions.findSuitable(TargetAttacher.class, obj).handle(seq::next); }, attacher).then(seq -> { - TargetAttacher a = attacher.get(); + TargetAttacher a = attacher.get(); attachDialog.setAttacher(a); if (obj instanceof TargetAttachable) { - TargetAttachable attachable = (TargetAttachable) obj; + TargetAttachable attachable = (TargetAttachable) obj; long pid = attachDialog.getPid(attachable); a.attach(pid); } @@ -1347,19 +1343,19 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements public void performReattach(ActionContext context) { TargetObject obj = getObjectFromContext(context); - if (!(obj instanceof TargetAttachable)) { + if (!(obj instanceof TargetAttachable)) { return; } AtomicReference parent = new AtomicReference<>(); AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { DebugModelConventions.findSuitable(TargetAttacher.class, obj).handle(seq::next); }, parent).then(seq -> { - TargetAttacher attacher = parent.get().as(TargetAttacher.tclass); - attacher.attach((TargetAttachable) obj).handle(seq::nextIgnore); + TargetAttacher attacher = parent.get().as(TargetAttacher.class); + attacher.attach((TargetAttachable) obj).handle(seq::nextIgnore); }).finish(); } - public CompletableFuture startRecording(TargetProcess targetObject, boolean prompt) { + public CompletableFuture startRecording(TargetProcess targetObject, boolean prompt) { CompletableFuture future; if (prompt) { future = modelService.recordTargetPromptOffers(targetObject); @@ -1396,7 +1392,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements .exceptionally(DebuggerResources.showError(getComponent(), "Couldn't detach")); } else { - TargetDetachable detachable = (TargetDetachable) obj; + TargetDetachable detachable = (TargetDetachable) obj; detachable.detach(); } } @@ -1409,7 +1405,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements }).exceptionally(DebuggerResources.showError(getComponent(), "Couldn't kill")); } else { - TargetKillable killable = (TargetKillable) obj; + TargetKillable killable = (TargetKillable) obj; killable.kill(); } } @@ -1418,7 +1414,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements TargetObject obj = getObjectFromContext(context); if (!isLocalOnly()) { DebugModelConventions.findSuitable(TargetProcess.class, obj).thenAccept(process -> { - TargetProcess valid = DebugModelConventions.liveProcessOrNull(process); + TargetProcess valid = DebugModelConventions.liveProcessOrNull(process); if (valid != null) { startRecording(valid, true).exceptionally(ex -> { Msg.showError(this, null, "Record", @@ -1429,7 +1425,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements }).exceptionally(DebuggerResources.showError(getComponent(), "Couldn't record")); } else { - TargetProcess valid = DebugModelConventions.liveProcessOrNull(obj); + TargetProcess valid = DebugModelConventions.liveProcessOrNull(obj); if (valid != null) { startRecording(valid, true).exceptionally(ex -> { Msg.showError(this, null, "Record", @@ -1448,7 +1444,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements }).exceptionally(DebuggerResources.showError(getComponent(), "Couldn't resume")); } else { - TargetResumable resumable = (TargetResumable) obj; + TargetResumable resumable = (TargetResumable) obj; resumable.resume(); } } @@ -1464,7 +1460,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements DebuggerResources.showError(getComponent(), "Couldn't interrupt")); } else { - TargetInterruptible interruptible = (TargetInterruptible) obj; + TargetInterruptible interruptible = (TargetInterruptible) obj; interruptible.interrupt(); } } @@ -1477,7 +1473,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements }).exceptionally(DebuggerResources.showError(getComponent(), "Couldn't step")); } else { - TargetSteppable steppable = (TargetSteppable) obj; + TargetSteppable steppable = (TargetSteppable) obj; steppable.step(); } } @@ -1490,7 +1486,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements }).exceptionally(DebuggerResources.showError(getComponent(), "Couldn't step")); } else { - TargetSteppable steppable = (TargetSteppable) obj; + TargetSteppable steppable = (TargetSteppable) obj; steppable.step(TargetStepKind.OVER); } } @@ -1503,7 +1499,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements }).exceptionally(DebuggerResources.showError(getComponent(), "Couldn't step")); } else { - TargetSteppable steppable = (TargetSteppable) obj; + TargetSteppable steppable = (TargetSteppable) obj; steppable.step(TargetStepKind.FINISH); } } @@ -1516,7 +1512,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements }).exceptionally(DebuggerResources.showError(getComponent(), "Couldn't step")); } else { - TargetSteppable steppable = (TargetSteppable) obj; + TargetSteppable steppable = (TargetSteppable) obj; if (extendedStep.equals("")) { steppable.step(TargetStepKind.EXTENDED); } @@ -1540,7 +1536,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements DebuggerResources.showError(getComponent(), "Couldn't set breakpoint")); } else { - TargetBreakpointContainer container = (TargetBreakpointContainer) obj; + TargetBreakpointContainer container = (TargetBreakpointContainer) obj; breakpointDialog.setContainer(container); tool.showDialog(breakpointDialog); } @@ -1557,7 +1553,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements DebuggerResources.showError(getComponent(), "Couldn't launch interpreter")); } else { - TargetInterpreter interpreter = (TargetInterpreter) obj; + TargetInterpreter interpreter = (TargetInterpreter) obj; getPlugin().showConsole(interpreter); } } @@ -1571,8 +1567,8 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements return true; } if (isLocalOnly()) { - if (object instanceof TargetExecutionStateful) { - TargetExecutionStateful stateful = (TargetExecutionStateful) object; + if (object instanceof TargetExecutionStateful) { + TargetExecutionStateful stateful = (TargetExecutionStateful) object; TargetExecutionState executionState = stateful.getExecutionState(); //System.err.println(stateful + ":" + executionState); return !executionState.equals(TargetExecutionState.RUNNING); @@ -1588,7 +1584,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements // IGNORE } if (result != null) { - TargetExecutionStateful stateful = (TargetExecutionStateful) result; + TargetExecutionStateful stateful = (TargetExecutionStateful) result; TargetExecutionState executionState = stateful.getExecutionState(); return !executionState.equals(TargetExecutionState.RUNNING); } @@ -1596,15 +1592,15 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements } @Override - public void accessibilityChanged(TargetAccessConditioned object, - TargetAccessibility accessibility) { + public void accessibilityChanged(TargetAccessConditioned object, + boolean accessible) { //this.access = accessibility.equals(TargetAccessibility.ACCESSIBLE); plugin.getTool().contextChanged(this); } @Override public void consoleOutput(TargetObject console, Channel channel, String out) { - //getPlugin().showConsole((TargetInterpreter) console); + //getPlugin().showConsole((TargetInterpreter) console); System.err.println("consoleOutput: " + out); } @@ -1617,19 +1613,19 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements } @Override - public void executionStateChanged(TargetExecutionStateful object, + public void executionStateChanged(TargetExecutionStateful object, TargetExecutionState state) { //this.state = state; plugin.getTool().contextChanged(this); } @Override - public void focusChanged(TargetFocusScope object, TargetObjectRef focused) { + public void focusChanged(TargetFocusScope object, TargetObject focused) { plugin.setFocus(object, focused); plugin.getTool().contextChanged(this); } - public void setFocus(TargetFocusScope object, TargetObjectRef focused) { + public void setFocus(TargetFocusScope object, TargetObject focused) { if (focused.getModel() != currentModel) { return; } @@ -1637,34 +1633,34 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements } @Override - public void memoryUpdated(TargetMemory memory, Address address, byte[] data) { + public void memoryUpdated(TargetMemory memory, Address address, byte[] data) { //System.err.println("memoryUpdated"); } @Override - public void memoryReadError(TargetMemory memory, AddressRange range, + public void memoryReadError(TargetMemory memory, AddressRange range, DebuggerMemoryAccessException e) { System.err.println("memoryReadError"); } @Override - public void promptChanged(TargetInterpreter interpreter, String prompt) { + public void promptChanged(TargetInterpreter interpreter, String prompt) { System.err.println("promptChanged: " + prompt); } @Override - public void registersUpdated(TargetRegisterBank bank, Map updates) { - Map cachedElements = bank.getCachedElements(); + public void registersUpdated(TargetRegisterBank bank, Map updates) { + Map cachedElements = bank.getCachedElements(); for (String key : cachedElements.keySet()) { - TargetObjectRef ref = cachedElements.get(key); + TargetObject ref = cachedElements.get(key); if (ref instanceof TargetObject) { - displayChanged((TargetObject) ref, "registersUpdated"); + displayChanged(ref, "registersUpdated"); } } } @Override - public void elementsChangedObjects(TargetObject parent, Collection removed, + public void elementsChanged(TargetObject parent, Collection removed, Map added) { //System.err.println("local EC: " + parent); ObjectContainer container = parent == null ? null : getContainerByPath(parent.getPath()); @@ -1685,7 +1681,7 @@ public class DebuggerObjectsProvider extends ComponentProviderAdapter implements } @Override - public void attributesChangedObjects(TargetObject parent, Collection removed, + public void attributesChanged(TargetObject parent, Collection removed, Map added) { //System.err.println("local AC: " + parent + ":" + removed + ":" + added); ObjectContainer container = parent == null ? null : getContainerByPath(parent.getPath()); diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/ObjectContainer.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/ObjectContainer.java index 2ae657dfc7..b3651b13c3 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/ObjectContainer.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/ObjectContainer.java @@ -21,19 +21,17 @@ import java.util.concurrent.CompletableFuture; import org.jdom.Element; import ghidra.dbg.DebugModelConventions; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.TargetProcess; import ghidra.dbg.util.PathUtils; import ghidra.util.Msg; import ghidra.util.xml.XmlUtilities; -public class ObjectContainer implements Comparable { +public class ObjectContainer implements Comparable { private DebuggerObjectsProvider provider; protected TargetObject targetObject; - protected TargetObjectRef targetObjectRef; - private final Map elementMap = new LinkedHashMap<>(); + private final Map elementMap = new LinkedHashMap<>(); private final Map attributeMap = new LinkedHashMap<>(); private Set currentChildren = new TreeSet<>(); @@ -45,27 +43,14 @@ public class ObjectContainer implements Comparable { private String treePath; public String linkKey; - public ObjectContainer(TargetObjectRef ref, String linkKey) { + public ObjectContainer(TargetObject to, String linkKey) { this.linkKey = linkKey; this.isLink = linkKey != null; - if (ref != null) { - this.targetObjectRef = ref; - if (targetObjectRef instanceof TargetObject) { - targetObject = (TargetObject) targetObjectRef; - if (!isLink) { - rebuildContainers(targetObject.getCachedElements(), - targetObject.getCachedAttributes()); - } - } - else { - targetObject = null; - targetObjectRef.fetch().thenAccept(obj -> { - targetObject = obj; - if (obj != null && !isLink) { - rebuildContainers(targetObject.getCachedElements(), - targetObject.getCachedAttributes()); - } - }); + if (to != null) { + targetObject = to; + if (!isLink) { + rebuildContainers(targetObject.getCachedElements(), + targetObject.getCachedAttributes()); } visible = visibleByDefault(getName()); } @@ -87,14 +72,14 @@ public class ObjectContainer implements Comparable { } public String getName() { - if (targetObjectRef == null) { + if (targetObject == null) { return "Objects"; } if (isLink) { return linkKey; } boolean noTarget = targetObject == null; - String name = noTarget ? targetObjectRef.getName() : targetObject.getName(); + String name = noTarget ? targetObject.getName() : targetObject.getName(); String hint = noTarget ? null : targetObject.getTypeHint(); if (name == null) { return hint; @@ -103,11 +88,11 @@ public class ObjectContainer implements Comparable { } public String getDecoratedName() { - if (targetObjectRef == null) { + if (targetObject == null) { return "Objects"; } if (isLink) { - String refname = targetObjectRef.getName(); + String refname = targetObject.getName(); if (linkKey.equals(refname)) { return "->" + linkKey; } @@ -124,10 +109,10 @@ public class ObjectContainer implements Comparable { } public String getPrefixedName() { - if (targetObjectRef == null) { + if (targetObject == null) { return "Objects"; } - List path = targetObjectRef.getPath(); + List path = targetObject.getPath(); int index = path.size() - 1; if (index < 0) { return targetObject.getName(); @@ -144,10 +129,10 @@ public class ObjectContainer implements Comparable { } public String getShortName() { - if (targetObjectRef == null) { + if (targetObject == null) { return "Objects"; } - return targetObject == null ? targetObjectRef.getName() : targetObject.getName(); + return targetObject == null ? targetObject.getName() : targetObject.getName(); } public ObjectContainer getParent() { @@ -174,7 +159,7 @@ public class ObjectContainer implements Comparable { protected void checkAutoRecord() { if (targetObject != null && provider.isAutorecord()) { - TargetProcess proc = DebugModelConventions.liveProcessOrNull(targetObject); + TargetProcess proc = DebugModelConventions.liveProcessOrNull(targetObject); if (proc != null) { provider.startRecording(proc, false).exceptionally(ex -> { Msg.error("Could not record and/or open target: " + targetObject, ex); @@ -262,7 +247,7 @@ public class ObjectContainer implements Comparable { //provider.update(this); } - public void rebuildContainers(Map elements, + public void rebuildContainers(Map elements, Map attributes) { synchronized (elementMap) { elementMap.clear(); @@ -317,7 +302,7 @@ public class ObjectContainer implements Comparable { return attributeMap; } - public Map getElementMap() { + public Map getElementMap() { return elementMap; } @@ -361,7 +346,6 @@ public class ObjectContainer implements Comparable { // This should only be called once when the connection is activated public void setTargetObject(TargetObject rootObject) { this.targetObject = rootObject; - this.targetObjectRef = rootObject; rebuildContainers(rootObject.getCachedElements(), rootObject.getCachedAttributes()); if (provider != null) { provider.addTargetToMap(this); @@ -566,8 +550,7 @@ public class ObjectContainer implements Comparable { } @Override - public int compareTo(Object obj) { - ObjectContainer that = (ObjectContainer) obj; + public int compareTo(ObjectContainer that) { String thisTreePath = this.toString(); String thatTreePath = that.toString(); if (thisTreePath != null && thatTreePath != null) { diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/actions/DisplayAsAction.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/actions/DisplayAsAction.java index b01a68efc2..94e2b28b47 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/actions/DisplayAsAction.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/actions/DisplayAsAction.java @@ -29,7 +29,6 @@ import ghidra.app.plugin.core.debug.gui.objects.DebuggerObjectsProvider; import ghidra.app.plugin.core.debug.gui.objects.ObjectContainer; import ghidra.async.AsyncFence; import ghidra.async.TypeSpec; -import ghidra.dbg.DebugModelConventions; import ghidra.dbg.target.TargetObject; import ghidra.framework.plugintool.PluginTool; @@ -71,10 +70,8 @@ public abstract class DisplayAsAction extends DockingAction { AsyncFence fence = new AsyncFence(); TargetObject to = container.getTargetObject(); fence.include(to.fetchElements() - .thenCompose(DebugModelConventions::fetchAll) .thenAccept(elements::set)); fence.include(to.fetchAttributes() - .thenCompose(attrs -> DebugModelConventions.fetchObjAttrs(to, attrs)) .thenAccept(attributes::set)); fence.ready().handle(seq::next); }).then(seq -> { diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/actions/ImportFromFactsAction.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/actions/ImportFromFactsAction.java index 9e4dd56e8e..0515bce7af 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/actions/ImportFromFactsAction.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/actions/ImportFromFactsAction.java @@ -119,7 +119,7 @@ public class ImportFromFactsAction extends ImportExportAsAction { } DummyTargetObject root = null; for (DummyTargetObject to : objMap.values()) { - if (to.fetchParent().get() == null) { + if (to.getParent() == null) { root = to; break; } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/actions/OpenWinDbgTraceAction.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/actions/OpenWinDbgTraceAction.java index 92a5ab7c0b..1b80c5877d 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/actions/OpenWinDbgTraceAction.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/actions/OpenWinDbgTraceAction.java @@ -58,7 +58,7 @@ public class OpenWinDbgTraceAction extends ImportExportAsAction { @Override public boolean isEnabledForContext(ActionContext context) { this.context = context; - return provider.isInstance(context, TargetLauncher.tclass); + return provider.isInstance(context, TargetLauncher.class); } @Override @@ -72,7 +72,7 @@ public class OpenWinDbgTraceAction extends ImportExportAsAction { String[] args = new String[2]; args[0] = ".opendump"; args[1] = f.getAbsolutePath(); - AtomicReference> launcher = new AtomicReference<>(); + AtomicReference launcher = new AtomicReference<>(); AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { TargetObject obj = provider.getObjectFromContext(context); DebugModelConventions.findSuitable(TargetLauncher.class, obj).handle(seq::next); diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/AttachableProcessesTableColumns.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/AttachableProcessesTableColumns.java index c0f8028634..d53a0f6f19 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/AttachableProcessesTableColumns.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/AttachableProcessesTableColumns.java @@ -21,16 +21,16 @@ import docking.widgets.table.DefaultEnumeratedColumnTableModel.EnumeratedTableCo import ghidra.dbg.target.TargetAttachable; public enum AttachableProcessesTableColumns - implements EnumeratedTableColumn> { + implements EnumeratedTableColumn { ID("ID", String.class, TargetAttachable::getName), NAME("Name", String.class, TargetAttachable::getTypeHint); private final String header; - private final Function, ?> func; + private final Function func; private Class cls; AttachableProcessesTableColumns(String header, Class cls, - Function, T> func) { + Function func) { this.header = header; this.cls = cls; this.func = func; @@ -42,7 +42,7 @@ public enum AttachableProcessesTableColumns } @Override - public Object getValueOf(TargetAttachable proc) { + public Object getValueOf(TargetAttachable proc) { return func.apply(proc); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerAttachDialog.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerAttachDialog.java index fbaa976162..e67aae6492 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerAttachDialog.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerAttachDialog.java @@ -15,7 +15,8 @@ */ package ghidra.app.plugin.core.debug.gui.objects.components; -import static ghidra.app.plugin.core.debug.gui.DebuggerResources.*; +import static ghidra.app.plugin.core.debug.gui.DebuggerResources.GROUP_GENERAL; +import static ghidra.app.plugin.core.debug.gui.DebuggerResources.tableRowActivationAction; import java.awt.BorderLayout; import java.util.List; @@ -34,7 +35,6 @@ import ghidra.app.plugin.core.debug.gui.objects.DebuggerObjectsPlugin; import ghidra.app.plugin.core.debug.gui.objects.DebuggerObjectsProvider; import ghidra.async.AsyncUtils; import ghidra.async.TypeSpec; -import ghidra.dbg.DebugModelConventions; import ghidra.dbg.target.*; import ghidra.util.MessageType; import ghidra.util.Msg; @@ -64,10 +64,10 @@ public class DebuggerAttachDialog extends DialogComponentProvider { protected RefreshAction actionRefresh; protected JButton attachButton; - private final RowObjectTableModel> processes = + private final RowObjectTableModel processes = new DefaultEnumeratedColumnTableModel<>("Attachables", AttachableProcessesTableColumns.class); - protected TargetAttacher attacher; + protected TargetAttacher attacher; private GTable processTable; public DebuggerAttachDialog(DebuggerObjectsProvider provider) { @@ -90,7 +90,7 @@ public class DebuggerAttachDialog extends DialogComponentProvider { panel.add(new JScrollPane(processTable)); processTable.setAutoLookupColumn(AttachableProcessesTableColumns.NAME.ordinal()); - GhidraTableFilterPanel> filterPanel = + GhidraTableFilterPanel filterPanel = new GhidraTableFilterPanel<>(processTable, processes); panel.add(filterPanel, BorderLayout.SOUTH); @@ -115,8 +115,7 @@ public class DebuggerAttachDialog extends DialogComponentProvider { } protected void attach() { - TargetAttachable proc = - processes.getRowObject(processTable.getSelectedRow()); + TargetAttachable proc = processes.getRowObject(processTable.getSelectedRow()); if (proc == null) { return; } @@ -131,7 +130,7 @@ public class DebuggerAttachDialog extends DialogComponentProvider { }); } - public long getPid(TargetAttachable proc) { + public long getPid(TargetAttachable proc) { String name = proc.getName(); name = name.substring(1, name.length() - 1); long pid = Long.parseLong(name, 16); @@ -148,14 +147,13 @@ public class DebuggerAttachDialog extends DialogComponentProvider { }, available).then(seq -> { available.get() .fetchElements() - .thenCompose(DebugModelConventions::fetchAll) .handle(seq::next); }, procs).then(seq -> { - List> modelData = processes.getModelData(); + List modelData = processes.getModelData(); modelData.clear(); for (Object p : procs.get().values()) { if (p instanceof TargetAttachable) { - modelData.add((TargetAttachable) p); + modelData.add((TargetAttachable) p); } } processes.fireTableDataChanged(); // This may not be most efficient. @@ -168,7 +166,7 @@ public class DebuggerAttachDialog extends DialogComponentProvider { }); } - public void setAttacher(TargetAttacher attacher) { + public void setAttacher(TargetAttacher attacher) { this.attacher = attacher; } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerAttachDialogOld.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerAttachDialogOld.java index 5bbb7fe68e..b62e5975a7 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerAttachDialogOld.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerAttachDialogOld.java @@ -34,7 +34,7 @@ import ghidra.util.Msg; public class DebuggerAttachDialogOld extends DialogComponentProvider { protected DebuggerObjectsProvider provider; - protected TargetAttacher attacher; + protected TargetAttacher attacher; protected JTextField pidField; @@ -89,7 +89,7 @@ public class DebuggerAttachDialogOld extends DialogComponentProvider { }); } - public void setLauncher(TargetAttacher attacher) { + public void setLauncher(TargetAttacher attacher) { this.attacher = attacher; } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerBreakpointDialog.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerBreakpointDialog.java index f55f4be92e..806a0cbe6f 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerBreakpointDialog.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DebuggerBreakpointDialog.java @@ -26,8 +26,6 @@ import javax.swing.*; import docking.DialogComponentProvider; import ghidra.app.plugin.core.debug.gui.DebuggerResources.AbstractSetBreakpointAction; import ghidra.app.plugin.core.debug.gui.objects.DebuggerObjectsProvider; -import ghidra.async.AsyncUtils; -import ghidra.async.TypeSpec; import ghidra.dbg.target.TargetBreakpointContainer; import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind; import ghidra.util.MessageType; @@ -36,7 +34,7 @@ import ghidra.util.layout.PairLayout; public class DebuggerBreakpointDialog extends DialogComponentProvider { protected DebuggerObjectsProvider provider; - protected TargetBreakpointContainer container; + protected TargetBreakpointContainer container; protected JTextField expressionField; @@ -78,20 +76,18 @@ public class DebuggerBreakpointDialog extends DialogComponentProvider { protected void addBreakpoint(ActionEvent evt) { String expression = expressionField.getText(); - AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { - setStatusText("Adding"); - Set kinds = new HashSet<>(); - kinds.add(TargetBreakpointKind.SOFTWARE); - container.placeBreakpoint(expression, kinds); - close(); - }).finish().exceptionally(e -> { + setStatusText("Adding"); + Set kinds = new HashSet<>(); + kinds.add(TargetBreakpointKind.SOFTWARE); + container.placeBreakpoint(expression, kinds).exceptionally(e -> { Msg.showError(this, getComponent(), "Could not set breakpoint", e); setStatusText("Could not set breakpoint: " + e.getMessage(), MessageType.ERROR); return null; }); + close(); } - public void setContainer(TargetBreakpointContainer container) { + public void setContainer(TargetBreakpointContainer container) { this.container = container; } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DummyTargetObject.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DummyTargetObject.java index 9171560529..33ec97c9f7 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DummyTargetObject.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/DummyTargetObject.java @@ -22,7 +22,6 @@ import org.apache.commons.lang3.StringUtils; import ghidra.async.AsyncUtils; import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.TargetObject; public class DummyTargetObject implements TargetObject { @@ -102,6 +101,11 @@ public class DummyTargetObject implements TargetObject { return hash; } + @Override + public TargetObject getParent() { + return parent; + } + public void addObject(TargetObject obj) { String name = obj.getName(); if (name.contains("[")) { @@ -137,11 +141,6 @@ public class DummyTargetObject implements TargetObject { return ret; } - @Override - public CompletableFuture fetchParent() { - return CompletableFuture.completedFuture(parent); - } - @Override public Object getProtocolID() { return path; @@ -169,7 +168,7 @@ public class DummyTargetObject implements TargetObject { } @Override - public Map getCachedElements() { + public Map getCachedElements() { return elements; } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectAttributeRow.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectAttributeRow.java index 514872723b..52de258909 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectAttributeRow.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectAttributeRow.java @@ -16,25 +16,16 @@ package ghidra.app.plugin.core.debug.gui.objects.components; import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; import ghidra.app.plugin.core.debug.gui.objects.DebuggerObjectsProvider; -import ghidra.async.AsyncUtils; -import ghidra.async.TypeSpec; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.TargetObject; public class ObjectAttributeRow { - private TargetObject to; + private final TargetObject to; - public ObjectAttributeRow(TargetObjectRef ref, DebuggerObjectsProvider provider) { - AtomicReference targetObject = new AtomicReference<>(); - AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { - ref.fetch().handle(seq::next); - }, targetObject).then(seq -> { - to = targetObject.get(); - }).finish(); + public ObjectAttributeRow(TargetObject to, DebuggerObjectsProvider provider) { + this.to = to; } public TargetObject getTargetObject() { diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectElementRow.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectElementRow.java index 7592437881..7301cf014a 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectElementRow.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectElementRow.java @@ -16,14 +16,11 @@ package ghidra.app.plugin.core.debug.gui.objects.components; import java.util.*; -import java.util.concurrent.atomic.AtomicReference; import ghidra.app.plugin.core.debug.gui.objects.DebuggerObjectsProvider; -import ghidra.async.AsyncUtils; -import ghidra.async.TypeSpec; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.TargetMethod; import ghidra.dbg.target.TargetObject; +import ghidra.util.Msg; public class ObjectElementRow { @@ -31,18 +28,14 @@ public class ObjectElementRow { private TargetObject to; private String currentKey; - public ObjectElementRow(TargetObjectRef ref, DebuggerObjectsProvider provider) { - AtomicReference targetObject = new AtomicReference<>(); - AtomicReference> attributes = new AtomicReference<>(); - AsyncUtils.sequence(TypeSpec.VOID).then(seq -> { - ref.fetch().handle(seq::next); - }, targetObject).then(seq -> { - to = targetObject.get(); - to.fetchAttributes(true).handle(seq::next); - //to.getAttributes().thenAccept(v -> map = v); - }, attributes).then(seq -> { - map = attributes.get(); - }).finish(); + public ObjectElementRow(TargetObject ref, DebuggerObjectsProvider provider) { + this.to = ref; + to.fetchAttributes(true).thenAccept(attributes -> { + map = attributes; + }).exceptionally(ex -> { + Msg.error(this, "Failed to fetch attributes"); + return null; + }); } public void setAttributes(Map attributes) { diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectNode.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectNode.java index e4f5878990..5e66054698 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectNode.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectNode.java @@ -136,7 +136,7 @@ public class ObjectNode extends GTreeSlowLoadingNode { //extends GTreeNode public Icon getIcon(boolean expanded) { TargetObject targetObject = container.getTargetObject(); if (targetObject instanceof TargetExecutionStateful) { - TargetExecutionStateful stateful = (TargetExecutionStateful) targetObject; + TargetExecutionStateful stateful = (TargetExecutionStateful) targetObject; if (stateful.getExecutionState().equals(TargetExecutionState.RUNNING)) { return ICON_RUNNING; } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectPane.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectPane.java index 9ee2ef355b..42d641700c 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectPane.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectPane.java @@ -20,7 +20,6 @@ import java.util.List; import javax.swing.JComponent; import ghidra.app.plugin.core.debug.gui.objects.ObjectContainer; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.TargetFocusScope; import ghidra.dbg.target.TargetObject; @@ -46,7 +45,7 @@ public interface ObjectPane { public String getName(); - public void setFocus(TargetFocusScope object, TargetObjectRef focused); + public void setFocus(TargetFocusScope object, TargetObject focused); public void setRoot(ObjectContainer root, TargetObject targetObject); diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTable.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTable.java index 6db1f5b3b5..56ab9df549 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTable.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTable.java @@ -29,7 +29,6 @@ import ghidra.app.plugin.core.debug.gui.objects.DebuggerObjectsProvider; import ghidra.app.plugin.core.debug.gui.objects.ObjectContainer; import ghidra.app.plugin.core.debug.mapping.DebuggerMemoryMapper; import ghidra.app.services.*; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.TargetFocusScope; import ghidra.dbg.target.TargetObject; import ghidra.program.model.address.Address; @@ -149,12 +148,12 @@ public class ObjectTable implements ObjectPane { List list = new ArrayList<>(); for (ObjectContainer child : changed.getCurrentChildren()) { if (child.isVisible() || !getContainer().getProvider().isHideIntrinsics()) { - TargetObjectRef ref = child.getTargetObject(); + TargetObject to = child.getTargetObject(); try { R r = clazz - .getDeclaredConstructor(TargetObjectRef.class, + .getDeclaredConstructor(TargetObject.class, DebuggerObjectsProvider.class) - .newInstance(ref, container.getProvider()); + .newInstance(to, container.getProvider()); list.add(r); } catch (Exception e) { @@ -249,7 +248,7 @@ public class ObjectTable implements ObjectPane { return null; } - public void setSelectedObject(TargetObjectRef selection) { + public void setSelectedObject(TargetObject selection) { for (int i = 0; i < model.getRowCount(); i++) { R r = model.getRowObject(i); if (r instanceof ObjectAttributeRow) { @@ -270,7 +269,7 @@ public class ObjectTable implements ObjectPane { } @Override - public void setFocus(TargetFocusScope object, TargetObjectRef focused) { + public void setFocus(TargetFocusScope object, TargetObject focused) { Swing.runIfSwingOrRunLater(() -> { setSelectedObject(focused); }); diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTree.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTree.java index 4c79c6bc40..5079f56834 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTree.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/objects/components/ObjectTree.java @@ -40,9 +40,7 @@ import ghidra.app.services.*; import ghidra.async.AsyncUtils; import ghidra.async.TypeSpec; import ghidra.dbg.DebugModelConventions; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.*; -import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility; import ghidra.program.model.address.Address; import ghidra.program.model.address.AddressRangeImpl; import ghidra.util.*; @@ -250,7 +248,7 @@ public class ObjectTree implements ObjectPane { @Override public void signalUpdate(ObjectContainer container) { - AtomicReference> access = new AtomicReference<>(); + AtomicReference access = new AtomicReference<>(); TargetObject targetObject = container.getTargetObject(); if (targetObject == null) { return; @@ -260,10 +258,9 @@ public class ObjectTree implements ObjectPane { .handle(seq::next); }, access).then(seq -> { boolean accessible = true; - TargetAccessConditioned conditioned = access.get(); + TargetAccessConditioned conditioned = access.get(); if (conditioned != null) { - TargetAccessibility accessibility = conditioned.getAccessibility(); - accessible = accessibility.equals(TargetAccessibility.ACCESSIBLE); + accessible = conditioned.isAccessible(); } if (accessible) { Swing.runIfSwingOrRunLater(() -> { @@ -355,7 +352,7 @@ public class ObjectTree implements ObjectPane { } @Override - public void setFocus(TargetFocusScope object, TargetObjectRef focused) { + public void setFocus(TargetFocusScope object, TargetObject focused) { Swing.runIfSwingOrRunLater(() -> { List path = focused.getPath(); tree.setSelectedNodeByNamePath(addRootNameToPath(path)); diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/register/DebuggerRegistersProvider.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/register/DebuggerRegistersProvider.java index d4a65de9fe..a48af6bf43 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/register/DebuggerRegistersProvider.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/register/DebuggerRegistersProvider.java @@ -737,7 +737,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter if (recorder.getSnap() != current.getSnap()) { return false; } - TargetRegisterBank targetRegs = + TargetRegisterBank targetRegs = recorder.getTargetRegisterBank(current.getThread(), current.getFrame()); if (targetRegs == null) { return false; @@ -941,7 +941,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter viewKnown.addAll(collectCommonRegisters(trace.getBaseCompilerSpec())); return viewKnown; } - TargetThread targetThread = recorder.getTargetThread(thread); + TargetThread targetThread = recorder.getTargetThread(thread); if (targetThread == null || !recorder.isRegisterBankAccessible(thread, 0)) { return viewKnown; } @@ -1114,7 +1114,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter return AsyncUtils.NIL; } TraceThread traceThread = current.getThread(); - TargetThread targetThread = recorder.getTargetThread(traceThread); + TargetThread targetThread = recorder.getTargetThread(traceThread); if (targetThread == null || !recorder.isRegisterBankAccessible(traceThread, current.getFrame())) { return AsyncUtils.NIL; @@ -1126,7 +1126,7 @@ public class DebuggerRegistersProvider extends ComponentProviderAdapter return AsyncUtils.NIL; } toRead.retainAll(regMapper.getRegistersOnTarget()); - TargetRegisterBank bank = + TargetRegisterBank bank = recorder.getTargetRegisterBank(traceThread, current.getFrame()); if (!bank.isValid()) { return AsyncUtils.NIL; diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/AbstractDebuggerTargetTraceMapper.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/AbstractDebuggerTargetTraceMapper.java index e14fea0f0b..402177a269 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/AbstractDebuggerTargetTraceMapper.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/AbstractDebuggerTargetTraceMapper.java @@ -55,20 +55,20 @@ public abstract class AbstractDebuggerTargetTraceMapper implements DebuggerTarge * @param memory the target memory * @return the mapper */ - protected abstract DebuggerMemoryMapper createMemoryMapper(TargetMemory memory); + protected abstract DebuggerMemoryMapper createMemoryMapper(TargetMemory memory); protected abstract DebuggerRegisterMapper createRegisterMapper( - TargetRegisterContainer registers); + TargetRegisterContainer registers); // TODO: Make this synchronous, or remove it - public CompletableFuture offerMemory(TargetMemory memory) { + public CompletableFuture offerMemory(TargetMemory memory) { DebuggerMemoryMapper mm = createMemoryMapper(memory); return CompletableFuture.completedFuture(mm); } // TODO: Make this synchronous, or remove it public CompletableFuture offerRegisters( - TargetRegisterContainer registers) { + TargetRegisterContainer registers) { DebuggerRegisterMapper rm = createRegisterMapper(registers); return CompletableFuture.completedFuture(rm); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/DebuggerRegisterMapper.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/DebuggerRegisterMapper.java index 19da6739d0..7cbf54d66f 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/DebuggerRegisterMapper.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/DebuggerRegisterMapper.java @@ -44,7 +44,7 @@ public interface DebuggerRegisterMapper { * @param name the name of the register as a string * @return the register description (name) on target */ - TargetRegister getTargetRegister(String name); + TargetRegister getTargetRegister(String name); /** * Get a trace register (name) by string @@ -68,7 +68,7 @@ public interface DebuggerRegisterMapper { if (!lReg.isBaseRegister()) { throw new IllegalArgumentException(); } - TargetRegister tReg = traceToTarget(lReg); + TargetRegister tReg = traceToTarget(lReg); if (tReg == null) { return null; } @@ -82,7 +82,7 @@ public interface DebuggerRegisterMapper { * @param register the trace register * @return the target register */ - TargetRegister traceToTarget(Register register); + TargetRegister traceToTarget(Register register); /** * Convert a target register name and byte array value into a trace register value @@ -92,7 +92,7 @@ public interface DebuggerRegisterMapper { * @return the converted register value suitable for trace storage */ default RegisterValue targetToTrace(String tRegName, byte[] value) { - TargetRegister tReg = getTargetRegister(tRegName); + TargetRegister tReg = getTargetRegister(tRegName); if (tReg == null) { return null; } @@ -106,7 +106,7 @@ public interface DebuggerRegisterMapper { * @param value the value of the target register * @return the converted register value suitable for trace storage */ - default RegisterValue targetToTrace(TargetRegister tReg, byte[] value) { + default RegisterValue targetToTrace(TargetRegister tReg, byte[] value) { if (value == null) { return null; } @@ -124,7 +124,7 @@ public interface DebuggerRegisterMapper { * @param tReg the target register name * @return the trace register name (as defined by the Ghidra language) */ - Register targetToTrace(TargetRegister tReg); + Register targetToTrace(TargetRegister tReg); /** * Get suggested type information for a given trace register @@ -152,7 +152,7 @@ public interface DebuggerRegisterMapper { * * @param register the new register */ - void targetRegisterAdded(TargetRegister register); + void targetRegisterAdded(TargetRegister register); /** * The recorder is informing this mapper of a removed target register @@ -168,5 +168,5 @@ public interface DebuggerRegisterMapper { * * @param register the old register */ - void targetRegisterRemoved(TargetRegister register); + void targetRegisterRemoved(TargetRegister register); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/DefaultDebuggerRegisterMapper.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/DefaultDebuggerRegisterMapper.java index 003bdc3594..0ea973b08d 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/DefaultDebuggerRegisterMapper.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/DefaultDebuggerRegisterMapper.java @@ -27,18 +27,18 @@ import ghidra.program.model.lang.*; public class DefaultDebuggerRegisterMapper implements DebuggerRegisterMapper { protected final Language language; protected final CompilerSpec cspec; - protected final TargetRegisterContainer targetRegContainer; + protected final TargetRegisterContainer targetRegContainer; protected final boolean caseSensitive; protected final Map languageRegs = new LinkedHashMap<>(); protected final Map filtLanguageRegs = new LinkedHashMap<>(); - protected final Map> targetRegs = new HashMap<>(); + protected final Map targetRegs = new HashMap<>(); protected final RegisterTypeInfo instrCtrTypeInfo; protected final RegisterTypeInfo stackPtrTypeInfo; public DefaultDebuggerRegisterMapper(CompilerSpec cSpec, - TargetRegisterContainer targetRegContainer, boolean caseSensitive) { + TargetRegisterContainer targetRegContainer, boolean caseSensitive) { this.language = cSpec.getLanguage(); this.cspec = cSpec; this.targetRegContainer = targetRegContainer; @@ -65,7 +65,7 @@ public class DefaultDebuggerRegisterMapper implements DebuggerRegisterMapper { } } - protected synchronized Register considerRegister(TargetRegister tReg) { + protected synchronized Register considerRegister(TargetRegister tReg) { String name = normalizeName(tReg.getIndex()); Register lReg = filtLanguageRegs.get(name); if (lReg == null) { @@ -76,7 +76,7 @@ public class DefaultDebuggerRegisterMapper implements DebuggerRegisterMapper { return lReg; } - protected synchronized Register removeRegister(TargetRegister tReg) { + protected synchronized Register removeRegister(TargetRegister tReg) { String name = normalizeName(tReg.getIndex()); Register lReg = filtLanguageRegs.get(name); if (lReg == null) { @@ -95,7 +95,7 @@ public class DefaultDebuggerRegisterMapper implements DebuggerRegisterMapper { } @Override - public synchronized TargetRegister getTargetRegister(String name) { + public synchronized TargetRegister getTargetRegister(String name) { return targetRegs.get(normalizeName(name)); } @@ -105,12 +105,12 @@ public class DefaultDebuggerRegisterMapper implements DebuggerRegisterMapper { } @Override - public synchronized TargetRegister traceToTarget(Register lReg) { + public synchronized TargetRegister traceToTarget(Register lReg) { return targetRegs.get(normalizeName(lReg.getName())); } @Override - public synchronized Register targetToTrace(TargetRegister tReg) { + public synchronized Register targetToTrace(TargetRegister tReg) { return languageRegs.get(normalizeName(tReg.getIndex())); } @@ -131,7 +131,7 @@ public class DefaultDebuggerRegisterMapper implements DebuggerRegisterMapper { } @Override - public synchronized void targetRegisterAdded(TargetRegister register) { + public synchronized void targetRegisterAdded(TargetRegister register) { if (!PathUtils.isAncestor(targetRegContainer.getPath(), register.getPath())) { return; } @@ -139,7 +139,7 @@ public class DefaultDebuggerRegisterMapper implements DebuggerRegisterMapper { } @Override - public synchronized void targetRegisterRemoved(TargetRegister register) { + public synchronized void targetRegisterRemoved(TargetRegister register) { if (!PathUtils.isAncestor(targetRegContainer.getPath(), register.getPath())) { return; } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/LargestSubDebuggerRegisterMapper.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/LargestSubDebuggerRegisterMapper.java index d84d9ed673..42a9b51799 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/LargestSubDebuggerRegisterMapper.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/mapping/LargestSubDebuggerRegisterMapper.java @@ -31,7 +31,7 @@ public class LargestSubDebuggerRegisterMapper extends DefaultDebuggerRegisterMap protected Map> present = new HashMap<>(); public LargestSubDebuggerRegisterMapper(CompilerSpec cSpec, - TargetRegisterContainer targetRegContainer, boolean caseSensitive) { + TargetRegisterContainer targetRegContainer, boolean caseSensitive) { super(cSpec, targetRegContainer, caseSensitive); for (Register lReg : cSpec.getLanguage().getRegisters()) { @@ -45,7 +45,7 @@ public class LargestSubDebuggerRegisterMapper extends DefaultDebuggerRegisterMap } @Override - protected synchronized Register considerRegister(TargetRegister tReg) { + protected synchronized Register considerRegister(TargetRegister tReg) { Register lReg = super.considerRegister(tReg); if (lReg == null) { return null; @@ -58,7 +58,7 @@ public class LargestSubDebuggerRegisterMapper extends DefaultDebuggerRegisterMap } @Override - protected synchronized Register removeRegister(TargetRegister tReg) { + protected synchronized Register removeRegister(TargetRegister tReg) { Register lReg = super.removeRegister(tReg); //synchronized (present) { if (lReg == null) { @@ -95,7 +95,7 @@ public class LargestSubDebuggerRegisterMapper extends DefaultDebuggerRegisterMap } Register lReg = subs.last(); // largest RegisterValue subValue = registerValue.getRegisterValue(lReg); - TargetRegister tReg = targetRegs.get(normalizeName(lReg.getName())); + TargetRegister tReg = targetRegs.get(normalizeName(lReg.getName())); if (tReg == null) { return null; } @@ -104,7 +104,7 @@ public class LargestSubDebuggerRegisterMapper extends DefaultDebuggerRegisterMap } @Override - public synchronized TargetRegister traceToTarget(Register lbReg) { + public synchronized TargetRegister traceToTarget(Register lbReg) { TreeSet subs = present.get(lbReg); if (subs == null) { // Not a base reg, or not known return null; @@ -158,12 +158,12 @@ public class LargestSubDebuggerRegisterMapper extends DefaultDebuggerRegisterMap } @Override - public RegisterValue targetToTrace(TargetRegister tReg, byte[] value) { + public RegisterValue targetToTrace(TargetRegister tReg, byte[] value) { return targetToTrace(tReg.getIndex(), value); } @Override - public synchronized Register targetToTrace(TargetRegister tReg) { + public synchronized Register targetToTrace(TargetRegister tReg) { Register lReg = languageRegs.get(normalizeName(tReg.getIndex())); if (lReg == null) { return null; diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/DbgengX64DebuggerMappingOpinion.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/DbgengX64DebuggerMappingOpinion.java index 422ec8f6b8..89cf7b31bf 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/DbgengX64DebuggerMappingOpinion.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/DbgengX64DebuggerMappingOpinion.java @@ -30,7 +30,7 @@ public class DbgengX64DebuggerMappingOpinion implements DebuggerMappingOpinion { protected static class DbgI386X86_64RegisterMapper extends LargestSubDebuggerRegisterMapper { public DbgI386X86_64RegisterMapper(CompilerSpec cSpec, - TargetRegisterContainer targetRegContainer) { + TargetRegisterContainer targetRegContainer) { super(cSpec, targetRegContainer, false); } @@ -52,19 +52,19 @@ public class DbgengX64DebuggerMappingOpinion implements DebuggerMappingOpinion { } @Override - protected DebuggerMemoryMapper createMemoryMapper(TargetMemory memory) { + protected DebuggerMemoryMapper createMemoryMapper(TargetMemory memory) { return new DefaultDebuggerMemoryMapper(language, memory.getModel()); } @Override protected DebuggerRegisterMapper createRegisterMapper( - TargetRegisterContainer registers) { + TargetRegisterContainer registers) { return new DefaultDebuggerRegisterMapper(cSpec, registers, false); } } protected static class DbgI386X86_64WindowsOffer extends AbstractDebuggerMappingOffer { - public DbgI386X86_64WindowsOffer(TargetProcess process) { + public DbgI386X86_64WindowsOffer(TargetProcess process) { super(process, 100, "Dbgeng on Windows x64", LANG_ID_X86_64, COMP_ID_VS, Set.of()); } @@ -74,7 +74,7 @@ public class DbgengX64DebuggerMappingOpinion implements DebuggerMappingOpinion { return new DbgTargetTraceMapper(target, langID, csID, extraRegNames) { @Override protected DebuggerRegisterMapper createRegisterMapper( - TargetRegisterContainer registers) { + TargetRegisterContainer registers) { return new DbgI386X86_64RegisterMapper(cSpec, registers); } }; @@ -90,14 +90,14 @@ public class DbgengX64DebuggerMappingOpinion implements DebuggerMappingOpinion { if (!(target instanceof TargetProcess)) { return CompletableFuture.completedFuture(Set.of()); } - TargetProcess process = (TargetProcess) target; - CompletableFuture> futureEnv = - DebugModelConventions.findSuitable(TargetEnvironment.tclass, target); + TargetProcess process = (TargetProcess) target; + CompletableFuture futureEnv = + DebugModelConventions.findSuitable(TargetEnvironment.class, target); return futureEnv.thenApply(env -> offersForEnv(env, process)); } - protected Set offersForEnv(TargetEnvironment env, - TargetProcess process) { + protected Set offersForEnv(TargetEnvironment env, + TargetProcess process) { if (env == null || !env.getDebugger().toLowerCase().contains("dbg")) { return Set.of(); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbArmDebuggerMappingOpinion.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbArmDebuggerMappingOpinion.java index 7e68ed96cc..79616370b7 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbArmDebuggerMappingOpinion.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbArmDebuggerMappingOpinion.java @@ -35,14 +35,14 @@ public class GdbArmDebuggerMappingOpinion implements DebuggerMappingOpinion { protected static final CompilerSpecID COMP_ID_DEFAULT = new CompilerSpecID("default"); protected static class GdbArmLELinuxOffer extends AbstractGdbDebuggerMappingOffer { - public GdbArmLELinuxOffer(TargetProcess process) { + public GdbArmLELinuxOffer(TargetProcess process) { super(process, 100, "GDB on Linux arm", LANG_ID_ARM_LE_V8, COMP_ID_DEFAULT, Set.of("cpsr")); } } protected static class GdbAArch64LELinuxOffer extends AbstractGdbDebuggerMappingOffer { - public GdbAArch64LELinuxOffer(TargetProcess process) { + public GdbAArch64LELinuxOffer(TargetProcess process) { super(process, 100, "GDB on Linux aarch64", LANG_ID_AARCH64_LE_V8A, COMP_ID_DEFAULT, Set.of("cpsr")); } @@ -50,17 +50,17 @@ public class GdbArmDebuggerMappingOpinion implements DebuggerMappingOpinion { @Override public CompletableFuture> getOffers(TargetObject target) { - if (!(target instanceof TargetProcess)) { + if (!(target instanceof TargetProcess)) { return CompletableFuture.completedFuture(Set.of()); } - TargetProcess process = (TargetProcess) target; - CompletableFuture> futureEnv = - DebugModelConventions.findSuitable(TargetEnvironment.tclass, target); + TargetProcess process = (TargetProcess) target; + CompletableFuture futureEnv = + DebugModelConventions.findSuitable(TargetEnvironment.class, target); return futureEnv.thenApply(env -> offersForEnv(env, process)); } - protected Set offersForEnv(TargetEnvironment env, - TargetProcess process) { + protected Set offersForEnv(TargetEnvironment env, + TargetProcess process) { if (!env.getDebugger().toLowerCase().contains("gdb")) { return Set.of(); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbTargetTraceMapper.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbTargetTraceMapper.java index e83dac5b2d..d4b6222190 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbTargetTraceMapper.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbTargetTraceMapper.java @@ -29,13 +29,13 @@ public class GdbTargetTraceMapper extends AbstractDebuggerTargetTraceMapper { } @Override - protected DebuggerMemoryMapper createMemoryMapper(TargetMemory memory) { + protected DebuggerMemoryMapper createMemoryMapper(TargetMemory memory) { return new DefaultDebuggerMemoryMapper(language, memory.getModel()); } @Override protected DebuggerRegisterMapper createRegisterMapper( - TargetRegisterContainer registers) { + TargetRegisterContainer registers) { return new DefaultDebuggerRegisterMapper(cSpec, registers, false); } } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbX86DebuggerMappingOpinion.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbX86DebuggerMappingOpinion.java index 5f972fde08..170f604caf 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbX86DebuggerMappingOpinion.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/GdbX86DebuggerMappingOpinion.java @@ -32,7 +32,7 @@ public class GdbX86DebuggerMappingOpinion implements DebuggerMappingOpinion { protected static class GdbI386X86_64RegisterMapper extends DefaultDebuggerRegisterMapper { public GdbI386X86_64RegisterMapper(CompilerSpec cSpec, - TargetRegisterContainer targetRegContainer) { + TargetRegisterContainer targetRegContainer) { super(cSpec, targetRegContainer, false); } @@ -47,7 +47,7 @@ public class GdbX86DebuggerMappingOpinion implements DebuggerMappingOpinion { } protected static class GdbI386LinuxOffer extends AbstractDebuggerMappingOffer { - public GdbI386LinuxOffer(TargetProcess process) { + public GdbI386LinuxOffer(TargetProcess process) { super(process, 100, "GDB on Linux i386", LANG_ID_X86, COMP_ID_GCC, Set.of()); } @@ -63,14 +63,14 @@ public class GdbX86DebuggerMappingOpinion implements DebuggerMappingOpinion { } protected static class GdbI386WindowsOffer extends AbstractGdbDebuggerMappingOffer { - public GdbI386WindowsOffer(TargetProcess process) { + public GdbI386WindowsOffer(TargetProcess process) { super(process, 100, "GDB on Cygwin/MSYS (Windows) i386", LANG_ID_X86, COMP_ID_VS, Set.of()); } } protected static class GdbI386X86_64LinuxOffer extends AbstractGdbDebuggerMappingOffer { - public GdbI386X86_64LinuxOffer(TargetProcess process) { + public GdbI386X86_64LinuxOffer(TargetProcess process) { super(process, 100, "GDB on Linux x86_64", LANG_ID_X86_64, COMP_ID_GCC, Set.of()); } @@ -80,7 +80,7 @@ public class GdbX86DebuggerMappingOpinion implements DebuggerMappingOpinion { return new GdbTargetTraceMapper(target, langID, csID, extraRegNames) { @Override protected DebuggerRegisterMapper createRegisterMapper( - TargetRegisterContainer registers) { + TargetRegisterContainer registers) { return new GdbI386X86_64RegisterMapper(cSpec, registers); } }; @@ -92,7 +92,7 @@ public class GdbX86DebuggerMappingOpinion implements DebuggerMappingOpinion { } protected static class GdbI386X86_64WindowsOffer extends AbstractGdbDebuggerMappingOffer { - public GdbI386X86_64WindowsOffer(TargetProcess process) { + public GdbI386X86_64WindowsOffer(TargetProcess process) { super(process, 100, "GDB on Cygwin/MSYS2 (Windows) x64", LANG_ID_X86_64, COMP_ID_VS, Set.of()); } @@ -103,7 +103,7 @@ public class GdbX86DebuggerMappingOpinion implements DebuggerMappingOpinion { return new GdbTargetTraceMapper(target, langID, csID, extraRegNames) { @Override protected DebuggerRegisterMapper createRegisterMapper( - TargetRegisterContainer registers) { + TargetRegisterContainer registers) { return new GdbI386X86_64RegisterMapper(cSpec, registers); } }; @@ -116,17 +116,17 @@ public class GdbX86DebuggerMappingOpinion implements DebuggerMappingOpinion { @Override public CompletableFuture> getOffers(TargetObject target) { - if (!(target instanceof TargetProcess)) { + if (!(target instanceof TargetProcess)) { return CompletableFuture.completedFuture(Set.of()); } - TargetProcess process = (TargetProcess) target; - CompletableFuture> futureEnv = - DebugModelConventions.findSuitable(TargetEnvironment.tclass, target); + TargetProcess process = (TargetProcess) target; + CompletableFuture futureEnv = + DebugModelConventions.findSuitable(TargetEnvironment.class, target); return futureEnv.thenApply(env -> offersForEnv(env, process)); } - protected Set offersForEnv(TargetEnvironment env, - TargetProcess process) { + protected Set offersForEnv(TargetEnvironment env, + TargetProcess process) { if (!env.getDebugger().toLowerCase().contains("gdb")) { return Set.of(); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/JdiDalvikDebuggerMappingOpinion.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/JdiDalvikDebuggerMappingOpinion.java index b4f3109251..3a9e9583ca 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/JdiDalvikDebuggerMappingOpinion.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/JdiDalvikDebuggerMappingOpinion.java @@ -39,19 +39,19 @@ public class JdiDalvikDebuggerMappingOpinion implements DebuggerMappingOpinion { } @Override - protected DebuggerMemoryMapper createMemoryMapper(TargetMemory memory) { + protected DebuggerMemoryMapper createMemoryMapper(TargetMemory memory) { return new DefaultDebuggerMemoryMapper(language, memory.getModel()); } @Override protected DebuggerRegisterMapper createRegisterMapper( - TargetRegisterContainer registers) { + TargetRegisterContainer registers) { return new DefaultDebuggerRegisterMapper(cSpec, registers, false); } } protected static class DalvikDebuggerMappingOffer extends AbstractDebuggerMappingOffer { - public DalvikDebuggerMappingOffer(TargetProcess process) { + public DalvikDebuggerMappingOffer(TargetProcess process) { super(process, 100, "Dalvik Virtual Machine", LANG_ID_DALVIK, COMP_ID_VS, Set.of()); } @@ -71,9 +71,9 @@ public class JdiDalvikDebuggerMappingOpinion implements DebuggerMappingOpinion { if (!(target instanceof TargetProcess)) { return CompletableFuture.completedFuture(Set.of()); } - TargetProcess process = (TargetProcess) target; - CompletableFuture> futureEnv = - DebugModelConventions.findSuitable(TargetEnvironment.tclass, target); + TargetProcess process = (TargetProcess) target; + CompletableFuture futureEnv = + DebugModelConventions.findSuitable(TargetEnvironment.class, target); return futureEnv.thenApply(env -> offersForEnv(env, process)); } @@ -81,8 +81,8 @@ public class JdiDalvikDebuggerMappingOpinion implements DebuggerMappingOpinion { return DALVIK_VM_NAMES.stream().anyMatch(name::contains); } - protected Set offersForEnv(TargetEnvironment env, - TargetProcess process) { + protected Set offersForEnv(TargetEnvironment env, + TargetProcess process) { if (!env.getDebugger().contains("Java Debug Interface")) { return Set.of(); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/JdiJavaDebuggerMappingOpinion.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/JdiJavaDebuggerMappingOpinion.java index 639678555b..dcd98a14a9 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/JdiJavaDebuggerMappingOpinion.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/platform/JdiJavaDebuggerMappingOpinion.java @@ -39,19 +39,19 @@ public class JdiJavaDebuggerMappingOpinion implements DebuggerMappingOpinion { } @Override - protected DebuggerMemoryMapper createMemoryMapper(TargetMemory memory) { + protected DebuggerMemoryMapper createMemoryMapper(TargetMemory memory) { return new DefaultDebuggerMemoryMapper(language, memory.getModel()); } @Override protected DebuggerRegisterMapper createRegisterMapper( - TargetRegisterContainer registers) { + TargetRegisterContainer registers) { return new DefaultDebuggerRegisterMapper(cSpec, registers, false); } } protected static class JavaDebuggerMappingOffer extends AbstractDebuggerMappingOffer { - public JavaDebuggerMappingOffer(TargetProcess process) { + public JavaDebuggerMappingOffer(TargetProcess process) { super(process, 100, "Java Virtual Machine", LANG_ID_JAVA, COMP_ID_VS, Set.of()); } @@ -71,9 +71,9 @@ public class JdiJavaDebuggerMappingOpinion implements DebuggerMappingOpinion { if (!(target instanceof TargetProcess)) { return CompletableFuture.completedFuture(Set.of()); } - TargetProcess process = (TargetProcess) target; - CompletableFuture> futureEnv = - DebugModelConventions.findSuitable(TargetEnvironment.tclass, target); + TargetProcess process = (TargetProcess) target; + CompletableFuture futureEnv = + DebugModelConventions.findSuitable(TargetEnvironment.class, target); return futureEnv.thenApply(env -> offersForEnv(env, process)); } @@ -81,8 +81,8 @@ public class JdiJavaDebuggerMappingOpinion implements DebuggerMappingOpinion { return JVM_NAMES.stream().anyMatch(name::contains); } - protected Set offersForEnv(TargetEnvironment env, - TargetProcess process) { + protected Set offersForEnv(TargetEnvironment env, + TargetProcess process) { if (!env.getDebugger().contains("Java Debug Interface")) { return Set.of(); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/DebuggerLogicalBreakpointServicePlugin.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/DebuggerLogicalBreakpointServicePlugin.java index b3e52bc8e1..bb352b9257 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/DebuggerLogicalBreakpointServicePlugin.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/DebuggerLogicalBreakpointServicePlugin.java @@ -32,7 +32,6 @@ import ghidra.app.plugin.core.debug.event.TraceClosedPluginEvent; import ghidra.app.plugin.core.debug.event.TraceOpenedPluginEvent; import ghidra.app.plugin.core.debug.service.breakpoint.LogicalBreakpointInternal.ProgramBreakpoint; import ghidra.app.services.*; -import ghidra.async.AsyncFence; import ghidra.framework.model.DomainObject; import ghidra.framework.model.DomainObjectChangeRecord; import ghidra.framework.plugintool.*; @@ -54,25 +53,25 @@ import ghidra.util.datastruct.CollectionChangeListener; 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, // - TraceClosedPluginEvent.class, // - }, // - servicesRequired = { // - DebuggerTraceManagerService.class, // - DebuggerModelService.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, // + TraceClosedPluginEvent.class, // + }, // + servicesRequired = { // + DebuggerTraceManagerService.class, // + DebuggerModelService.class, // + DebuggerStaticMappingService.class, // + }, // + servicesProvided = { // + DebuggerLogicalBreakpointService.class, // + } // ) public class DebuggerLogicalBreakpointServicePlugin extends Plugin implements DebuggerLogicalBreakpointService { @@ -1022,7 +1021,6 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin @Override public CompletableFuture enableAll(Collection col, Trace trace) { BreakpointActionSet actions = new BreakpointActionSet(); - AsyncFence fence = new AsyncFence(); for (LogicalBreakpoint lb : col) { if (trace == null) { lb.enableForProgram(); @@ -1031,15 +1029,14 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin continue; } LogicalBreakpointInternal lbi = (LogicalBreakpointInternal) lb; - fence.include(lbi.planEnable(actions, trace)); + lbi.planEnable(actions, trace); } - return fence.ready().thenCompose(__ -> actions.execute()); + return actions.execute(); } @Override public CompletableFuture disableAll(Collection col, Trace trace) { BreakpointActionSet actions = new BreakpointActionSet(); - AsyncFence fence = new AsyncFence(); for (LogicalBreakpoint lb : col) { if (trace == null) { lb.disableForProgram(); @@ -1048,15 +1045,14 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin continue; } LogicalBreakpointInternal lbi = (LogicalBreakpointInternal) lb; - fence.include(lbi.planDisable(actions, trace)); + lbi.planDisable(actions, trace); } - return fence.ready().thenCompose(__ -> actions.execute()); + return actions.execute(); } @Override public CompletableFuture deleteAll(Collection col, Trace trace) { BreakpointActionSet actions = new BreakpointActionSet(); - AsyncFence fence = new AsyncFence(); for (LogicalBreakpoint lb : col) { if (trace == null) { lb.deleteForProgram(); @@ -1065,9 +1061,9 @@ public class DebuggerLogicalBreakpointServicePlugin extends Plugin continue; } LogicalBreakpointInternal lbi = (LogicalBreakpointInternal) lb; - fence.include(lbi.planDelete(actions, trace)); + lbi.planDelete(actions, trace); } - return fence.ready().thenCompose(__ -> actions.execute()); + return actions.execute(); } @Override diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/DeleteBreakpointActionItem.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/DeleteBreakpointActionItem.java index 1cde230bd0..1d37920345 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/DeleteBreakpointActionItem.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/DeleteBreakpointActionItem.java @@ -22,9 +22,9 @@ import ghidra.dbg.target.TargetBreakpointSpec; import ghidra.dbg.target.TargetDeletable; public class DeleteBreakpointActionItem implements BreakpointActionItem { - private final TargetBreakpointSpec spec; + private final TargetBreakpointSpec spec; - public DeleteBreakpointActionItem(TargetBreakpointSpec spec) { + public DeleteBreakpointActionItem(TargetBreakpointSpec spec) { this.spec = spec; } @@ -47,11 +47,11 @@ public class DeleteBreakpointActionItem implements BreakpointActionItem { @Override public CompletableFuture execute() { - if (!(spec instanceof TargetDeletable)) { + if (!(spec instanceof TargetDeletable)) { return CompletableFuture .failedFuture(new IllegalArgumentException("spec is not Deletable")); } - TargetDeletable del = (TargetDeletable) spec; + TargetDeletable del = (TargetDeletable) spec; return del.delete(); } } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/DisableBreakpointActionItem.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/DisableBreakpointActionItem.java index 57edc62f19..20d8155d34 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/DisableBreakpointActionItem.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/DisableBreakpointActionItem.java @@ -21,9 +21,9 @@ import java.util.concurrent.CompletableFuture; import ghidra.dbg.target.TargetBreakpointSpec; public class DisableBreakpointActionItem implements BreakpointActionItem { - private final TargetBreakpointSpec spec; + private final TargetBreakpointSpec spec; - public DisableBreakpointActionItem(TargetBreakpointSpec spec) { + public DisableBreakpointActionItem(TargetBreakpointSpec spec) { this.spec = spec; } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/EnableBreakpointActionItem.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/EnableBreakpointActionItem.java index 81bc5836fd..6f1ccb3007 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/EnableBreakpointActionItem.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/EnableBreakpointActionItem.java @@ -21,9 +21,9 @@ import java.util.concurrent.CompletableFuture; import ghidra.dbg.target.TargetBreakpointSpec; public class EnableBreakpointActionItem implements BreakpointActionItem { - private final TargetBreakpointSpec spec; + private final TargetBreakpointSpec spec; - public EnableBreakpointActionItem(TargetBreakpointSpec spec) { + public EnableBreakpointActionItem(TargetBreakpointSpec spec) { this.spec = spec; } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/LogicalBreakpointInternal.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/LogicalBreakpointInternal.java index b677eff224..911d2cdfc0 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/LogicalBreakpointInternal.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/LogicalBreakpointInternal.java @@ -16,14 +16,11 @@ package ghidra.app.plugin.core.debug.service.breakpoint; import java.util.*; -import java.util.concurrent.CompletableFuture; import com.google.common.collect.Collections2; import ghidra.app.services.LogicalBreakpoint; import ghidra.app.services.TraceRecorder; -import ghidra.async.AsyncFence; -import ghidra.async.AsyncUtils; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind; import ghidra.program.model.address.Address; @@ -348,6 +345,7 @@ interface LogicalBreakpointInternal extends LogicalBreakpoint { /** * Plan to enable a logical breakpoint within the trace. * + *

* This method prefers to use the existing breakpoint specifications which result in * breakpoints at this address. In other words, it favors what the user has already done to * effect a breakpoint at this logical breakpoint's address. If there is no such existing @@ -355,6 +353,7 @@ interface LogicalBreakpointInternal extends LogicalBreakpoint { * container, usually resulting in a new spec, which should effect exactly the one specified * address. * + *

* This method must convert applicable addresses to the target space. If the address cannot * be mapped, it's usually because this logical breakpoint does not apply to the given * trace's target. E.g., the trace may not have a live target, or the logical breakpoint may @@ -364,85 +363,69 @@ interface LogicalBreakpointInternal extends LogicalBreakpoint { * @param kind the kind of breakpoint * @return a future which completes when the plan is ready */ - public CompletableFuture planEnable(BreakpointActionSet actions, long length, + public void planEnable(BreakpointActionSet actions, long length, Collection kinds) { if (breakpoints.isEmpty()) { Set tKinds = TraceRecorder.traceToTargetBreakpointKinds(kinds); - for (TargetBreakpointContainer cont : recorder + for (TargetBreakpointContainer cont : recorder .collectBreakpointContainers(null)) { LinkedHashSet supKinds = new LinkedHashSet<>(tKinds); supKinds.retainAll(cont.getSupportedBreakpointKinds()); actions.add(new PlaceBreakpointActionItem(cont, computeTargetAddress(), length, supKinds)); } - return AsyncUtils.NIL; + return; } - AsyncFence fence = new AsyncFence(); for (IDHashed bpt : breakpoints) { - TargetBreakpointLocation eb = recorder.getTargetBreakpoint(bpt.obj); - if (eb == null) { + TargetBreakpointLocation loc = recorder.getTargetBreakpoint(bpt.obj); + if (loc == null) { continue; } - fence.include(eb.getSpecification().fetch().thenAccept(spec -> { - synchronized (actions) { - actions.add(new EnableBreakpointActionItem(spec)); - } - })); + actions.add(new EnableBreakpointActionItem(loc.getSpecification())); } - return fence.ready(); } - public CompletableFuture planDisable(BreakpointActionSet actions, long length, + public void planDisable(BreakpointActionSet actions, long length, Collection kinds) { Set tKinds = TraceRecorder.traceToTargetBreakpointKinds(kinds); - AsyncFence fence = new AsyncFence(); Address targetAddr = computeTargetAddress(); - for (TargetBreakpointLocation eb : recorder.collectBreakpoints(null)) { - if (!targetAddr.equals(eb.getAddress())) { + for (TargetBreakpointLocation loc : recorder.collectBreakpoints(null)) { + if (!targetAddr.equals(loc.getAddress())) { continue; } - if (length != eb.getLength().longValue()) { + if (length != loc.getLength().longValue()) { continue; } - fence.include(eb.getSpecification().fetch().thenAccept(spec -> { - if (!Objects.equals(spec.getKinds(), tKinds)) { - return; - } - synchronized (actions) { - actions.add(new DisableBreakpointActionItem(spec)); - } - })); + TargetBreakpointSpec spec = loc.getSpecification(); + if (!Objects.equals(spec.getKinds(), tKinds)) { + continue; + } + actions.add(new DisableBreakpointActionItem(spec)); } - return fence.ready(); } - public CompletableFuture planDelete(BreakpointActionSet actions, long length, + public void planDelete(BreakpointActionSet actions, long length, Set kinds) { Set tKinds = TraceRecorder.traceToTargetBreakpointKinds(kinds); - AsyncFence fence = new AsyncFence(); Address targetAddr = computeTargetAddress(); - for (TargetBreakpointLocation eb : recorder.collectBreakpoints(null)) { - if (!targetAddr.equals(eb.getAddress())) { + for (TargetBreakpointLocation loc : recorder.collectBreakpoints(null)) { + if (!targetAddr.equals(loc.getAddress())) { continue; } - if (length != eb.getLength().longValue()) { + if (length != loc.getLength().longValue()) { continue; } - fence.include(eb.getSpecification().fetch().thenAccept(spec -> { - if (!Objects.equals(spec.getKinds(), tKinds)) { - return; - } - if (!(spec instanceof TargetDeletable)) { - return; - } - synchronized (actions) { - actions.add(new DeleteBreakpointActionItem(spec)); - } - })); + TargetBreakpointSpec spec = loc.getSpecification(); + if (!Objects.equals(spec.getKinds(), tKinds)) { + continue; + } + if (!(spec instanceof TargetDeletable)) { + continue; + } + actions.add(new DeleteBreakpointActionItem(spec)); } - return fence.ready(); } } @@ -484,7 +467,7 @@ interface LogicalBreakpointInternal extends LogicalBreakpoint { * @param trace a trace, if actions should be limited to the given trace * @return a future which completes when the actions are populated */ - CompletableFuture planEnable(BreakpointActionSet actions, Trace trace); + void planEnable(BreakpointActionSet actions, Trace trace); /** * Collect actions to disable a logical breakpoint. @@ -493,7 +476,7 @@ interface LogicalBreakpointInternal extends LogicalBreakpoint { * @param trace a trace, if actions should be limited to the given trace * @return a future which completes when the actions are populated */ - CompletableFuture planDisable(BreakpointActionSet actions, Trace trace); + void planDisable(BreakpointActionSet actions, Trace trace); /** * Collect actions to delete a logical breakpoint. @@ -502,5 +485,5 @@ interface LogicalBreakpointInternal extends LogicalBreakpoint { * @param trace a trace, if actions should be limited to the given trace * @return a future which completes when the actions are populated */ - CompletableFuture planDelete(BreakpointActionSet actions, Trace trace); + void planDelete(BreakpointActionSet actions, Trace trace); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/LoneLogicalBreakpoint.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/LoneLogicalBreakpoint.java index b524b72e3a..f1ac6bc4f7 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/LoneLogicalBreakpoint.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/LoneLogicalBreakpoint.java @@ -176,45 +176,48 @@ public class LoneLogicalBreakpoint implements LogicalBreakpointInternal { } @Override - public CompletableFuture planEnable(BreakpointActionSet actions, Trace trace) { + public void planEnable(BreakpointActionSet actions, Trace trace) { if (trace != null && trace != breaks.getTrace()) { - return AsyncUtils.NIL; + return; } - return breaks.planEnable(actions, length, kinds); + breaks.planEnable(actions, length, kinds); } @Override public CompletableFuture enable() { BreakpointActionSet actions = new BreakpointActionSet(); - return planEnable(actions, null).thenCompose(__ -> actions.execute()); + planEnable(actions, null); + return actions.execute(); } @Override - public CompletableFuture planDisable(BreakpointActionSet actions, Trace trace) { + public void planDisable(BreakpointActionSet actions, Trace trace) { if (trace != null && trace != breaks.getTrace()) { - return AsyncUtils.NIL; + return; } - return breaks.planDisable(actions, length, kinds); + breaks.planDisable(actions, length, kinds); } @Override public CompletableFuture disable() { BreakpointActionSet actions = new BreakpointActionSet(); - return planDisable(actions, null).thenCompose(__ -> actions.execute()); + planDisable(actions, null); + return actions.execute(); } @Override - public CompletableFuture planDelete(BreakpointActionSet actions, Trace trace) { + public void planDelete(BreakpointActionSet actions, Trace trace) { if (trace != null && trace != breaks.getTrace()) { - return AsyncUtils.NIL; + return; } - return breaks.planDelete(actions, length, kinds); + breaks.planDelete(actions, length, kinds); } @Override public CompletableFuture delete() { BreakpointActionSet actions = new BreakpointActionSet(); - return planDelete(actions, null).thenCompose(__ -> actions.execute()); + planDelete(actions, null); + return actions.execute(); } @Override diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/MappedLogicalBreakpoint.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/MappedLogicalBreakpoint.java index 35a9760ec5..5d0d412c96 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/MappedLogicalBreakpoint.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/MappedLogicalBreakpoint.java @@ -20,7 +20,6 @@ import java.util.concurrent.CompletableFuture; import ghidra.app.services.DebuggerModelService; import ghidra.app.services.TraceRecorder; -import ghidra.async.AsyncFence; import ghidra.async.AsyncUtils; import ghidra.framework.model.DomainObject; import ghidra.program.model.address.Address; @@ -118,7 +117,8 @@ public class MappedLogicalBreakpoint implements LogicalBreakpointInternal { if (breaks == null) { return AsyncUtils.NIL; } - return breaks.planEnable(actions, length, kinds).thenCompose(__ -> actions.execute()); + breaks.planEnable(actions, length, kinds); + return actions.execute(); } @Override @@ -128,7 +128,8 @@ public class MappedLogicalBreakpoint implements LogicalBreakpointInternal { if (breaks == null) { return AsyncUtils.NIL; } - return breaks.planDisable(actions, length, kinds).thenCompose(__ -> actions.execute()); + breaks.planDisable(actions, length, kinds); + return actions.execute(); } @Override @@ -138,78 +139,79 @@ public class MappedLogicalBreakpoint implements LogicalBreakpointInternal { if (breaks == null) { return AsyncUtils.NIL; } - return breaks.planDelete(actions, length, kinds).thenCompose(__ -> actions.execute()); + breaks.planDelete(actions, length, kinds); + return actions.execute(); } @Override - public CompletableFuture planEnable(BreakpointActionSet actions, Trace trace) { + public void planEnable(BreakpointActionSet actions, Trace trace) { if (trace != null) { TraceBreakpointSet breaks = traceBreaks.get(trace); if (breaks == null) { - return AsyncUtils.NIL; + return; } - return breaks.planEnable(actions, length, kinds); + breaks.planEnable(actions, length, kinds); + return; } - AsyncFence fence = new AsyncFence(); for (TraceBreakpointSet breaks : traceBreaks.values()) { - fence.include(breaks.planEnable(actions, length, kinds)); + breaks.planEnable(actions, length, kinds); } - return fence.ready(); } @Override public CompletableFuture enable() { progBreak.enable(); BreakpointActionSet actions = new BreakpointActionSet(); - return planEnable(actions, null).thenCompose(__ -> actions.execute()); + planEnable(actions, null); + return actions.execute(); // NOTE: Recorder will cause appropriate updates } @Override - public CompletableFuture planDisable(BreakpointActionSet actions, Trace trace) { + public void planDisable(BreakpointActionSet actions, Trace trace) { if (trace != null) { TraceBreakpointSet breaks = traceBreaks.get(trace); if (breaks == null) { - return AsyncUtils.NIL; + return; } - return breaks.planDisable(actions, length, kinds); + breaks.planDisable(actions, length, kinds); + return; } - AsyncFence fence = new AsyncFence(); for (TraceBreakpointSet breaks : traceBreaks.values()) { - fence.include(breaks.planDisable(actions, length, kinds)); + breaks.planDisable(actions, length, kinds); } - return fence.ready(); } @Override public CompletableFuture disable() { progBreak.disable(); // Will generate disabled breakpoint if absent BreakpointActionSet actions = new BreakpointActionSet(); - return planDisable(actions, null).thenCompose(__ -> actions.execute()); + planDisable(actions, null); + return actions.execute(); // NOTE: Recorder will cause appropriate updates } @Override - public CompletableFuture planDelete(BreakpointActionSet actions, Trace trace) { + public void planDelete(BreakpointActionSet actions, Trace trace) { if (trace != null) { TraceBreakpointSet breaks = traceBreaks.get(trace); if (breaks == null) { - return AsyncUtils.NIL; + return; } - return breaks.planDelete(actions, length, kinds); + breaks.planDelete(actions, length, kinds); + return; } - AsyncFence fence = new AsyncFence(); for (TraceBreakpointSet breaks : traceBreaks.values()) { - fence.include(breaks.planDelete(actions, length, kinds)); + breaks.planDelete(actions, length, kinds); } - return fence.ready(); } @Override public CompletableFuture delete() { progBreak.deleteFromProgram(); BreakpointActionSet actions = new BreakpointActionSet(); - return planDelete(actions, null).thenCompose(__ -> actions.execute()); + planDelete(actions, null); + return actions.execute(); // NOTE: Recorder will cause appropriate updates } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/PlaceBreakpointActionItem.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/PlaceBreakpointActionItem.java index ac2570b2d6..b315b0e5a1 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/PlaceBreakpointActionItem.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/breakpoint/PlaceBreakpointActionItem.java @@ -23,12 +23,12 @@ import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind; import ghidra.program.model.address.*; public class PlaceBreakpointActionItem implements BreakpointActionItem { - private final TargetBreakpointContainer container; + private final TargetBreakpointContainer container; private final Address address; private final long length; private final Set kinds; - public PlaceBreakpointActionItem(TargetBreakpointContainer container, Address address, + public PlaceBreakpointActionItem(TargetBreakpointContainer container, Address address, long length, Collection kinds) { this.container = Objects.requireNonNull(container); this.address = Objects.requireNonNull(address); diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServiceInternal.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServiceInternal.java index ad49f5a8b1..75b62c9293 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServiceInternal.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServiceInternal.java @@ -24,7 +24,6 @@ import ghidra.app.plugin.core.debug.mapping.DebuggerTargetTraceMapper; import ghidra.app.services.*; import ghidra.dbg.DebuggerModelFactory; import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.TargetObject; import ghidra.framework.plugintool.PluginEvent; import ghidra.framework.plugintool.PluginTool; @@ -96,7 +95,7 @@ public interface DebuggerModelServiceInternal extends DebuggerModelService { * * @param focused the focused object */ - default void fireFocusEvent(TargetObjectRef focused) { + default void fireFocusEvent(TargetObject focused) { Swing.runIfSwingOrRunLater( () -> firePluginEvent(new ModelObjectFocusedPluginEvent(getName(), focused))); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServicePlugin.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServicePlugin.java index d6999f0007..c9e42d1c90 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServicePlugin.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServicePlugin.java @@ -39,7 +39,6 @@ import ghidra.app.plugin.core.debug.mapping.*; import ghidra.app.services.*; import ghidra.async.AsyncFence; import ghidra.dbg.*; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetFocusScope.TargetFocusScopeListener; import ghidra.dbg.target.TargetObject.TargetObjectListener; @@ -82,7 +81,7 @@ public class DebuggerModelServicePlugin extends Plugin protected class ListenersForRemovalAndFocus { protected final DebuggerObjectModel model; protected TargetObject root; - protected TargetFocusScope focusScope; + protected TargetFocusScope focusScope; protected TargetObjectListener forRemoval = new TargetObjectListener() { @Override @@ -102,7 +101,7 @@ public class DebuggerModelServicePlugin extends Plugin protected TargetFocusScopeListener forFocus = new TargetFocusScopeListener() { @Override - public void focusChanged(TargetFocusScope object, TargetObjectRef focused) { + public void focusChanged(TargetFocusScope object, TargetObject focused) { fireFocusEvent(focused); List copy; synchronized (proxies) { @@ -127,8 +126,8 @@ public class DebuggerModelServicePlugin extends Plugin if (!r.isValid()) { forRemoval.invalidated(root, root, "Who knows?"); } - CompletableFuture> findSuitable = - DebugModelConventions.findSuitable(TargetFocusScope.tclass, r); + CompletableFuture findSuitable = + DebugModelConventions.findSuitable(TargetFocusScope.class, r); return findSuitable; }).thenAccept(fs -> { synchronized (this) { @@ -142,7 +141,7 @@ public class DebuggerModelServicePlugin extends Plugin public void dispose() { TargetObject savedRoot; - TargetFocusScope savedFocusScope; + TargetFocusScope savedFocusScope; synchronized (this) { savedRoot = root; savedFocusScope = focusScope; @@ -591,22 +590,14 @@ public class DebuggerModelServicePlugin extends Plugin } @Override - public TraceRecorder getRecorderForSuccessor(TargetObjectRef successor) { + public TraceRecorder getRecorderForSuccessor(TargetObject successor) { synchronized (recordersByTarget) { - NavigableSet observedPathLengths = new TreeSet<>(); - for (TargetObject obj : recordersByTarget.keySet()) { - observedPathLengths.add(obj.getPath().size()); - } - List path = successor.getPath(); - for (int l : observedPathLengths.descendingSet()) { - if (l > path.size()) { - continue; - } - List sub = path.subList(0, l); - TraceRecorder recorder = recordersByTarget.get(successor.getModel().createRef(sub)); + while (successor != null) { + TraceRecorder recorder = recordersByTarget.get(successor); if (recorder != null) { return recorder; } + successor = successor.getParent(); } return null; } @@ -627,7 +618,7 @@ public class DebuggerModelServicePlugin extends Plugin } @Override - public TargetThread getTargetThread(TraceThread thread) { + public TargetThread getTargetThread(TraceThread thread) { TraceRecorder recorder = getRecorder(thread.getTrace()); if (recorder == null) { return null; @@ -654,7 +645,7 @@ public class DebuggerModelServicePlugin extends Plugin } @Override - public TraceThread getTraceThread(TargetThread thread) { + public TraceThread getTraceThread(TargetThread thread) { synchronized (recordersByTarget) { for (TraceRecorder recorder : recordersByTarget.values()) { // TODO: Consider sorting schemes to find this faster @@ -668,7 +659,7 @@ public class DebuggerModelServicePlugin extends Plugin } @Override - public TraceThread getTraceThread(TargetObject target, TargetThread thread) { + public TraceThread getTraceThread(TargetObject target, TargetThread thread) { TraceRecorder recorder = getRecorder(target); if (recorder == null) { return null; @@ -677,7 +668,7 @@ public class DebuggerModelServicePlugin extends Plugin } @Override - public TargetObjectRef getTargetFocus(TargetObject target) { + public TargetObject getTargetFocus(TargetObject target) { TraceRecorder recorder = getRecorder(target); if (recorder == null) { return null; diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServiceProxyPlugin.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServiceProxyPlugin.java index 3ae77cbe5a..a587b51861 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServiceProxyPlugin.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServiceProxyPlugin.java @@ -33,7 +33,6 @@ import ghidra.app.plugin.core.debug.utils.BackgroundUtils; import ghidra.app.services.*; import ghidra.async.SwingExecutorService; import ghidra.dbg.*; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetLauncher.TargetCmdLineLauncher; import ghidra.framework.main.AppInfo; @@ -49,21 +48,21 @@ import ghidra.util.datastruct.ListenerSet; import ghidra.util.task.TaskMonitor; @PluginInfo( // - shortDescription = "Debugger models manager service (proxy to front-end)", // - description = "Manage debug sessions, connections, and trace recording", // - category = PluginCategoryNames.DEBUGGER, // - packageName = DebuggerPluginPackage.NAME, // - status = PluginStatus.RELEASED, // - eventsConsumed = { - ProgramActivatedPluginEvent.class, // - ProgramClosedPluginEvent.class, // - }, // - servicesRequired = { // - DebuggerTraceManagerService.class, // - }, // - servicesProvided = { // - DebuggerModelService.class, // - } // + shortDescription = "Debugger models manager service (proxy to front-end)", // + description = "Manage debug sessions, connections, and trace recording", // + category = PluginCategoryNames.DEBUGGER, // + packageName = DebuggerPluginPackage.NAME, // + status = PluginStatus.RELEASED, // + eventsConsumed = { + ProgramActivatedPluginEvent.class, // + ProgramClosedPluginEvent.class, // + }, // + servicesRequired = { // + DebuggerTraceManagerService.class, // + }, // + servicesProvided = { // + DebuggerModelService.class, // + } // ) public class DebuggerModelServiceProxyPlugin extends Plugin implements DebuggerModelServiceInternal { @@ -147,7 +146,7 @@ public class DebuggerModelServiceProxyPlugin extends Plugin /*@AutoServiceConsumed private ProgramManager programManager; - @SuppressWarnings("unused") // need strong ref + @SuppressWarnings("unused") // need strong obj private AutoService.Wiring autoServiceWiring;*/ // This is not delegated. Each tool can have its own active model. @@ -231,8 +230,8 @@ public class DebuggerModelServiceProxyPlugin extends Plugin }).thenCompose(root -> { monitor.incrementProgress(1); monitor.setMessage("Finding launcher"); - CompletableFuture> futureLauncher = - DebugModelConventions.findSuitable(TargetLauncher.tclass, root); + CompletableFuture futureLauncher = + DebugModelConventions.findSuitable(TargetLauncher.class, root); return futureLauncher; }).thenCompose(launcher -> { monitor.incrementProgress(1); @@ -447,8 +446,8 @@ public class DebuggerModelServiceProxyPlugin extends Plugin } @Override - public TraceRecorder getRecorderForSuccessor(TargetObjectRef ref) { - return delegate.getRecorderForSuccessor(ref); + public TraceRecorder getRecorderForSuccessor(TargetObject obj) { + return delegate.getRecorderForSuccessor(obj); } @Override @@ -457,7 +456,7 @@ public class DebuggerModelServiceProxyPlugin extends Plugin } @Override - public TargetThread getTargetThread(TraceThread thread) { + public TargetThread getTargetThread(TraceThread thread) { return delegate.getTargetThread(thread); } @@ -472,17 +471,17 @@ public class DebuggerModelServiceProxyPlugin extends Plugin } @Override - public TraceThread getTraceThread(TargetThread thread) { + public TraceThread getTraceThread(TargetThread thread) { return delegate.getTraceThread(thread); } @Override - public TraceThread getTraceThread(TargetObject target, TargetThread thread) { + public TraceThread getTraceThread(TargetObject target, TargetThread thread) { return delegate.getTraceThread(target, thread); } @Override - public TargetObjectRef getTargetFocus(TargetObject target) { + public TargetObject getTargetFocus(TargetObject target) { return delegate.getTargetFocus(target); } } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultTraceRecorder.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultTraceRecorder.java index b75f3cd477..8d116b7094 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultTraceRecorder.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/model/DefaultTraceRecorder.java @@ -35,11 +35,10 @@ import ghidra.async.AsyncLazyMap.KeyedFuture; import ghidra.dbg.DebugModelConventions; import ghidra.dbg.DebugModelConventions.AllRequiredAccess; import ghidra.dbg.DebugModelConventions.SubTreeListenerAdapter; -import ghidra.dbg.attributes.*; +import ghidra.dbg.attributes.TargetObjectList; import ghidra.dbg.error.DebuggerMemoryAccessException; import ghidra.dbg.error.DebuggerModelAccessException; import ghidra.dbg.target.*; -import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility; import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind; import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointSpecListener; import ghidra.dbg.target.TargetEventScope.TargetEventScopeListener; @@ -146,9 +145,9 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - protected final AsyncLazyMap, AllRequiredAccess> accessibilityByRegBank = + protected final AsyncLazyMap accessibilityByRegBank = new AsyncLazyMap<>(new HashMap<>(), this::fetchRegAccessibility) { - public AllRequiredAccess remove(TargetRegisterBank key) { + public AllRequiredAccess remove(TargetRegisterBank key) { AllRequiredAccess acc = super.remove(key); if (acc != null) { acc.removeChangeListener(listenerRegAccChanged); @@ -156,10 +155,10 @@ public class DefaultTraceRecorder implements TraceRecorder { return acc; } }; - protected final Map, TargetMemory> byRegion = new HashMap<>(); - protected final AsyncLazyMap, AllRequiredAccess> accessibilityByMemory = + protected final Map byRegion = new HashMap<>(); + protected final AsyncLazyMap accessibilityByMemory = new AsyncLazyMap<>(new HashMap<>(), this::fetchMemAccessibility) { - public AllRequiredAccess remove(TargetMemory key) { + public AllRequiredAccess remove(TargetMemory key) { AllRequiredAccess acc = super.remove(key); if (acc != null) { acc.removeChangeListener(processMemory.memAccListeners.fire); @@ -169,14 +168,14 @@ public class DefaultTraceRecorder implements TraceRecorder { }; protected CompletableFuture fetchRegAccessibility( - TargetRegisterBank bank) { + TargetRegisterBank bank) { return DebugModelConventions.trackAccessibility(bank).thenApply(acc -> { acc.addChangeListener(listenerRegAccChanged); return acc; }); } - protected CompletableFuture fetchMemAccessibility(TargetMemory mem) { + protected CompletableFuture fetchMemAccessibility(TargetMemory mem) { return DebugModelConventions.trackAccessibility(mem).thenApply(acc -> { acc.addChangeListener(processMemory.memAccListeners.fire); return acc; @@ -189,17 +188,17 @@ public class DefaultTraceRecorder implements TraceRecorder { * @param pred an additional predicate applied via "AND" with accessibility * @return the computed set */ - protected AddressSet getAccessibleMemory(Predicate> pred) { + protected AddressSet getAccessibleMemory(Predicate pred) { synchronized (accessibilityByMemory) { // TODO: Might accomplish by using listeners and tracking the accessible set AddressSet accessible = new AddressSet(); - for (Entry, TargetMemory> ent : byRegion.entrySet()) { - TargetMemory mem = ent.getValue(); + for (Entry ent : byRegion.entrySet()) { + TargetMemory mem = ent.getValue(); if (!pred.test(mem)) { continue; } AllRequiredAccess acc = accessibilityByMemory.getCompletedMap().get(mem); - if (acc == null || acc.getAllAccessibility() != TargetAccessibility.ACCESSIBLE) { + if (acc == null || !acc.getAllAccessibility()) { continue; } accessible.add(memMapper.targetToTrace(ent.getKey().getRange())); @@ -211,10 +210,10 @@ public class DefaultTraceRecorder implements TraceRecorder { protected class ComposedMemory { protected final ComposedMemory chain; - protected final NavigableMap> byMin = new TreeMap<>(); + protected final NavigableMap byMin = new TreeMap<>(); @SuppressWarnings({ "rawtypes", "unchecked" }) - protected final ListenerSet> memAccListeners = + protected final ListenerSet> memAccListeners = new ListenerSet(TriConsumer.class); public ComposedMemory() { @@ -225,9 +224,9 @@ public class DefaultTraceRecorder implements TraceRecorder { this.chain = chain; } - protected void addRegion(TargetMemoryRegion region, TargetMemory memory) { + protected void addRegion(TargetMemoryRegion region, TargetMemory memory) { synchronized (accessibilityByMemory) { - TargetMemory old = byRegion.put(region, memory); + TargetMemory old = byRegion.put(region, memory); assert old == null; byMin.put(region.getRange().getMinAddress(), region); accessibilityByMemory.get(memory).exceptionally(e -> { @@ -239,12 +238,12 @@ public class DefaultTraceRecorder implements TraceRecorder { } protected boolean removeRegion(TargetObject invalid) { - if (!(invalid instanceof TargetMemoryRegion)) { + if (!(invalid instanceof TargetMemoryRegion)) { return false; } synchronized (accessibilityByMemory) { - TargetMemoryRegion invRegion = (TargetMemoryRegion) invalid; - TargetMemory old = byRegion.remove(invRegion); + TargetMemoryRegion invRegion = (TargetMemoryRegion) invalid; + TargetMemory old = byRegion.remove(invRegion); assert old != null; byMin.remove(invRegion.getRange().getMinAddress()); if (!old.isValid() || !byRegion.containsValue(old)) { @@ -254,9 +253,9 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - protected AllRequiredAccess findChainedMemoryAccess(TargetMemoryRegion region) { + protected AllRequiredAccess findChainedMemoryAccess(TargetMemoryRegion region) { synchronized (accessibilityByMemory) { - TargetMemory mem = byRegion.get(region); + TargetMemory mem = byRegion.get(region); if (mem != null) { return accessibilityByMemory.getCompletedMap().get(mem); } @@ -264,10 +263,10 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - protected Entry> findChainedFloor(Address address) { + protected Entry findChainedFloor(Address address) { synchronized (accessibilityByMemory) { - Entry> myFloor = byMin.floorEntry(address); - Entry> byChain = + Entry myFloor = byMin.floorEntry(address); + Entry byChain = chain == null ? null : chain.findChainedFloor(address); if (byChain == null) { return myFloor; @@ -292,12 +291,12 @@ public class DefaultTraceRecorder implements TraceRecorder { } protected AddressRange alignWithLimit(Address address, int length, - TargetMemoryRegion limit) { + TargetMemoryRegion limit) { return align(address, length).intersect(limit.getRange()); } protected AddressRange alignAndLimitToFloor(Address address, int length) { - Entry> floor = findChainedFloor(address); + Entry floor = findChainedFloor(address); if (floor == null) { return null; } @@ -305,7 +304,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } protected AddressRange alignWithOptionalLimit(Address address, int length, - TargetMemoryRegion limit) { + TargetMemoryRegion limit) { if (limit == null) { return alignAndLimitToFloor(address, length); } @@ -314,7 +313,7 @@ public class DefaultTraceRecorder implements TraceRecorder { protected CompletableFuture readMemory(Address address, int length) { synchronized (accessibilityByMemory) { - Entry> floor = findChainedFloor(address); + Entry floor = findChainedFloor(address); if (floor == null) { throw new IllegalArgumentException( "address " + address + " is not in any known region"); @@ -329,7 +328,7 @@ public class DefaultTraceRecorder implements TraceRecorder { if (!floor.getValue().getRange().contains(max)) { throw new IllegalArgumentException("read extends beyond a single region"); } - TargetMemory mem = byRegion.get(floor.getValue()); + TargetMemory mem = byRegion.get(floor.getValue()); if (mem != null) { return mem.readMemory(address, length); } @@ -339,7 +338,7 @@ public class DefaultTraceRecorder implements TraceRecorder { protected CompletableFuture writeMemory(Address address, byte[] data) { synchronized (accessibilityByMemory) { - Entry> floor = findChainedFloor(address); + Entry floor = findChainedFloor(address); if (floor == null) { throw new IllegalArgumentException( "address " + address + " is not in any known region"); @@ -354,7 +353,7 @@ public class DefaultTraceRecorder implements TraceRecorder { if (!floor.getValue().getRange().contains(max)) { throw new IllegalArgumentException("read extends beyond a single region"); } - TargetMemory mem = byRegion.get(floor.getValue()); + TargetMemory mem = byRegion.get(floor.getValue()); if (mem != null) { return mem.writeMemory(address, data); } @@ -364,37 +363,30 @@ public class DefaultTraceRecorder implements TraceRecorder { } protected static class ThreadMap { - protected final NavigableSet observedThreadPathLengths = new TreeSet<>(); - protected final Map, ThreadRecorder> byTargetThread = new HashMap<>(); + protected final Map byTargetThread = new HashMap<>(); protected final Map byTraceThread = new HashMap<>(); public void put(ThreadRecorder rec) { - observedThreadPathLengths.add(rec.targetThread.getPath().size()); byTargetThread.put(rec.targetThread, rec); byTraceThread.put(rec.traceThread, rec); } - public ThreadRecorder getForSuccessor(TargetObjectRef successor) { - List path = successor.getPath(); - for (int l : observedThreadPathLengths.descendingSet()) { - if (l > path.size()) { - continue; - } - path = List.copyOf(path.subList(0, l)); - TargetObjectRef maybeThread = successor.getModel().createRef(path); - ThreadRecorder rec = byTargetThread.get(maybeThread); + public ThreadRecorder getForSuccessor(TargetObject successor) { + while (successor != null) { + ThreadRecorder rec = byTargetThread.get(successor); if (rec != null) { return rec; } + successor = successor.getParent(); } return null; } - public ThreadRecorder get(TargetThread thread) { + public ThreadRecorder get(TargetThread thread) { return byTargetThread.get(thread); } - public ThreadRecorder get(TargetObjectRef maybeThread) { + public ThreadRecorder get(TargetObject maybeThread) { return byTargetThread.get(maybeThread); } @@ -438,43 +430,43 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - protected static String nameBreakpoint(TargetBreakpointLocation bpt) { + protected static String nameBreakpoint(TargetBreakpointLocation bpt) { if (bpt instanceof TargetBreakpointSpec) { return bpt.getIndex(); } return bpt.getSpecification().getIndex() + "." + bpt.getIndex(); } - protected static int getFrameLevel(TargetStackFrame frame) { + protected static int getFrameLevel(TargetStackFrame frame) { // TODO: A fair assumption? frames are elements with numeric base-10 indices return Integer.decode(frame.getIndex()); } protected class ThreadRecorder { - protected final TargetThread targetThread; + protected final TargetThread targetThread; protected final TraceThread traceThread; protected DebuggerRegisterMapper regMapper; - protected TargetRegister pcReg; - protected TargetRegister spReg; - protected Map> regs = new HashMap<>(); - protected NavigableMap> stack = + protected TargetRegister pcReg; + protected TargetRegister spReg; + protected Map regs = new HashMap<>(); + protected NavigableMap stack = Collections.synchronizedNavigableMap(new TreeMap<>()); protected final ComposedMemory threadMemory = new ComposedMemory(processMemory); - protected TargetBreakpointContainer threadBreakpointContainer; + protected TargetBreakpointContainer threadBreakpointContainer; protected TargetExecutionState state = TargetExecutionState.ALIVE; - protected ThreadRecorder(TargetThread targetThread, TraceThread traceThread) { + protected ThreadRecorder(TargetThread targetThread, TraceThread traceThread) { this.targetThread = targetThread; this.traceThread = traceThread; - if (targetThread instanceof TargetExecutionStateful) { - TargetExecutionStateful stateful = (TargetExecutionStateful) targetThread; + if (targetThread instanceof TargetExecutionStateful) { + TargetExecutionStateful stateful = (TargetExecutionStateful) targetThread; state = stateful.getExecutionState(); } } protected synchronized CompletableFuture initRegMapper( - TargetRegisterContainer registers) { + TargetRegisterContainer registers) { /** * TODO: At the moment, this assumes the recorded thread has one register container, or * at least that all register banks in the thread use the same register container @@ -510,7 +502,7 @@ public class DefaultTraceRecorder implements TraceRecorder { "Mapper's extra register '" + rn + "' is not in the language!"); continue; } - TargetRegister targetReg = regMapper.traceToTarget(traceReg); + TargetRegister targetReg = regMapper.traceToTarget(traceReg); if (targetReg == null) { Msg.error(this, "Mapper's extra register '" + traceReg + "' is not mappable!"); @@ -526,7 +518,7 @@ public class DefaultTraceRecorder implements TraceRecorder { }); } - protected void regMapperAmended(DebuggerRegisterMapper rm, TargetRegister reg, + protected void regMapperAmended(DebuggerRegisterMapper rm, TargetRegister reg, boolean removed) { boolean doUpdateRegs = false; String name = reg.getIndex(); @@ -534,13 +526,13 @@ public class DefaultTraceRecorder implements TraceRecorder { if (regMapper != rm) { return; } - TargetRegister newPcReg = + TargetRegister newPcReg = regMapper.traceToTarget(trace.getBaseLanguage().getProgramCounter()); if (pcReg != newPcReg) { pcReg = newPcReg; doUpdateRegs |= pcReg != null; } - TargetRegister newSpReg = + TargetRegister newSpReg = regMapper.traceToTarget(trace.getBaseCompilerSpec().getStackPointer()); if (spReg != newSpReg) { spReg = newSpReg; @@ -559,7 +551,7 @@ public class DefaultTraceRecorder implements TraceRecorder { if (removed) { return; } - TargetRegisterBank bank = regs.get(0); + TargetRegisterBank bank = regs.get(0); if (bank != null) { byte[] cachedVal = bank.getCachedRegisters().get(name); if (cachedVal != null) { @@ -573,9 +565,9 @@ public class DefaultTraceRecorder implements TraceRecorder { // listenerForRecord.retroOfferRegMapperDependents(); } - protected int getSuccessorFrameLevel(TargetObjectRef successor) { + protected int getSuccessorFrameLevel(TargetObject successor) { NavigableSet observedPathLengths = new TreeSet<>(); - for (TargetStackFrame frame : stack.values()) { + for (TargetStackFrame frame : stack.values()) { observedPathLengths.add(frame.getPath().size()); } List path = successor.getPath(); @@ -588,7 +580,7 @@ public class DefaultTraceRecorder implements TraceRecorder { continue; } int index = Integer.decode(PathUtils.getIndex(sub)); - TargetStackFrame frame = stack.get(index); + TargetStackFrame frame = stack.get(index); if (frame == null || !Objects.equals(sub, frame.getPath())) { continue; } @@ -597,17 +589,14 @@ public class DefaultTraceRecorder implements TraceRecorder { return 0; } - CompletableFuture doFetchAndInitRegMapper(TargetRegisterBank bank) { + CompletableFuture doFetchAndInitRegMapper(TargetRegisterBank bank) { int frameLevel = getSuccessorFrameLevel(bank); - TypedTargetObjectRef> descsRef = - bank.getDescriptions(); - if (descsRef == null) { + TargetRegisterContainer descs = bank.getDescriptions(); + if (descs == null) { Msg.error(this, "Cannot create mapper, yet: Descriptions is null."); return AsyncUtils.NIL; } - return descsRef.fetch().thenCompose(descs -> { - return initRegMapper(descs); - }).thenAccept(__ -> { + return initRegMapper(descs).thenAccept(__ -> { if (frameLevel == 0) { recordRegisterValues(bank, bank.getCachedRegisters()); updateRegsMem(null); @@ -619,14 +608,14 @@ public class DefaultTraceRecorder implements TraceRecorder { }); } - protected void offerRegisters(TargetRegisterBank newRegs) { + protected void offerRegisters(TargetRegisterBank newRegs) { int frameLevel = getSuccessorFrameLevel(newRegs); if (regs.isEmpty()) { // TODO: Technically, each frame may need its own mapper.... doFetchAndInitRegMapper(newRegs); } - TargetRegisterBank oldRegs = regs.put(frameLevel, newRegs); + TargetRegisterBank oldRegs = regs.put(frameLevel, newRegs); if (oldRegs == newRegs) { return; } @@ -643,24 +632,23 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - protected void offerStackFrame(TargetStackFrame frame) { + protected void offerStackFrame(TargetStackFrame frame) { stack.put(getFrameLevel(frame), frame); recordFrame(frame); } - protected void offerThreadRegion(TargetMemoryRegion region) { - region.getMemory().fetch().thenCompose(mem -> { - threadMemory.addRegion(region, mem); - initMemMapper(mem); - // TODO: Add region to trace memory manager (when allowed for threads) - return updateRegsMem(region); - }).exceptionally(ex -> { + protected void offerThreadRegion(TargetMemoryRegion region) { + TargetMemory mem = region.getMemory(); + threadMemory.addRegion(region, mem); + initMemMapper(mem); + // TODO: Add region to trace memory manager (when allowed for threads) + updateRegsMem(region).exceptionally(ex -> { Msg.error(this, "Could not add thread memory region", ex); return null; }); } - protected void offerThreadBreakpointContainer(TargetBreakpointContainer bc) { + protected void offerThreadBreakpointContainer(TargetBreakpointContainer bc) { if (threadBreakpointContainer != null) { Msg.warn(this, "Thread already has a breakpoint container"); } @@ -702,7 +690,7 @@ public class DefaultTraceRecorder implements TraceRecorder { protected boolean checkRegistersRemoved(TargetObject invalid) { synchronized (accessibilityByRegBank) { if (regs.values().remove(invalid)) { - accessibilityByRegBank.remove((TargetRegisterBank) invalid); + accessibilityByRegBank.remove((TargetRegisterBank) invalid); return true; } return false; @@ -718,7 +706,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } protected Address pcFromStack() { - TargetStackFrame frame = stack.get(0); + TargetStackFrame frame = stack.get(0); if (frame == null) { return null; } @@ -750,8 +738,8 @@ public class DefaultTraceRecorder implements TraceRecorder { return true; } - protected CompletableFuture readAlignedConditionally(String name, Address targetAddress, - TargetMemoryRegion limit) { + protected CompletableFuture readAlignedConditionally(String name, Address targetAddress, + TargetMemoryRegion limit) { if (targetAddress == null) { return AsyncUtils.NIL; } @@ -778,7 +766,7 @@ public class DefaultTraceRecorder implements TraceRecorder { }); } - Address registerValueToTargetAddress(TargetRegister reg, byte[] value) { + Address registerValueToTargetAddress(TargetRegister reg, byte[] value) { /** * TODO: This goes around the horn and back just to select a default address space. We * should really just go directly to target address space. @@ -793,11 +781,11 @@ public class DefaultTraceRecorder implements TraceRecorder { return memMapper.traceToTarget(traceAddress); } - protected CompletableFuture updateRegsMem(TargetMemoryRegion limit) { - TargetRegisterBank bank; - TargetRegister pc; - TargetRegister sp; - Set> toRead = new LinkedHashSet<>(); + protected CompletableFuture updateRegsMem(TargetMemoryRegion limit) { + TargetRegisterBank bank; + TargetRegister pc; + TargetRegister sp; + Set toRead = new LinkedHashSet<>(); synchronized (DefaultTraceRecorder.this) { if (regMapper == null) { return AsyncUtils.NIL; @@ -867,7 +855,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - public void recordRegisterValues(TargetRegisterBank bank, Map updates) { + public void recordRegisterValues(TargetRegisterBank bank, Map updates) { synchronized (DefaultTraceRecorder.this) { if (regMapper == null) { return; @@ -898,7 +886,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - public void recordFrame(TargetStackFrame frame) { + public void recordFrame(TargetStackFrame frame) { recordFrame(frame, frame.getProgramCounter()); } @@ -907,7 +895,7 @@ public class DefaultTraceRecorder implements TraceRecorder { traceFrame.setProgramCounter(pc); } - public void recordFrame(TargetStackFrame frame, Address pc) { + public void recordFrame(TargetStackFrame frame, Address pc) { synchronized (DefaultTraceRecorder.this) { if (memMapper == null) { return; @@ -936,7 +924,7 @@ public class DefaultTraceRecorder implements TraceRecorder { TraceStack traceStack = stackManager.getStack(traceThread, snapshot.getKey(), true); traceStack.setDepth(stackDepth(), false); - for (Map.Entry> ent : stack.entrySet()) { + for (Map.Entry ent : stack.entrySet()) { Address tracePc = memMapper.targetToTrace(ent.getValue().getProgramCounter()); doRecordFrame(traceStack, ent.getKey(), tracePc); @@ -956,7 +944,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } public void onThreadBreakpointContainers( - Consumer> action) { + Consumer action) { if (threadBreakpointContainer == null) { return; } @@ -965,20 +953,20 @@ public class DefaultTraceRecorder implements TraceRecorder { } protected class EffectiveBreakpointResolver { - private final TargetBreakpointLocation bpt; - private TargetBreakpointSpec spec; + private final TargetBreakpointLocation bpt; + private TargetBreakpointSpec spec; private boolean affectsProcess = false; private final Set threadsAffected = new LinkedHashSet<>(); - public EffectiveBreakpointResolver(TargetBreakpointLocation bpt) { + public EffectiveBreakpointResolver(TargetBreakpointLocation bpt) { this.bpt = bpt; } public CompletableFuture resolve() { AsyncFence fence = new AsyncFence(); - fence.include(bpt.getSpecification().fetch().thenAccept(s -> this.spec = s)); + this.spec = bpt.getSpecification(); - for (TargetObjectRef ref : bpt.getAffects()) { + for (TargetObject ref : bpt.getAffects()) { if (ref.equals(target)) { affectsProcess = true; } @@ -990,7 +978,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } // TODO: If affects is empty/null, also try to default to the containing process - private CompletableFuture resolveThread(TargetObjectRef ref) { + private CompletableFuture resolveThread(TargetObject ref) { return DebugModelConventions.findThread(ref).thenAccept(thread -> { if (thread == null) { Msg.error(this, @@ -1045,11 +1033,11 @@ public class DefaultTraceRecorder implements TraceRecorder { TargetBreakpointSpecListener, TargetEventScopeListener, TargetExecutionStateListener, TargetFocusScopeListener, TargetRegisterBankListener, TargetMemoryListener { - //protected final Map> modulesByName = new HashMap<>(); - protected final Set> breakpoints = new HashSet<>(); + //protected final Map modulesByName = new HashMap<>(); + protected final Set breakpoints = new HashSet<>(); @Override - protected boolean checkDescend(TargetObjectRef ref) { + protected boolean checkDescend(TargetObject ref) { // NOTE, cannot return false on match, since it could be a prefix of another if (HARDCODED_MATCHER.successorCouldMatch(ref.getPath())) { return true; @@ -1065,10 +1053,10 @@ public class DefaultTraceRecorder implements TraceRecorder { if (obj.isRoot()) { return Result.FOUND; } - if (obj instanceof TargetThread) { + if (obj instanceof TargetThread) { return Result.FOUND; } - if (obj instanceof TargetProcess) { + if (obj instanceof TargetProcess) { return Result.FOUND; } return Result.CONTINUE; @@ -1086,37 +1074,37 @@ public class DefaultTraceRecorder implements TraceRecorder { if (!valid) { return; } - if (added instanceof TargetThread) { - getOrCreateThreadRecorder((TargetThread) added); + if (added instanceof TargetThread) { + getOrCreateThreadRecorder((TargetThread) added); } - if (added instanceof TargetStack) { + if (added instanceof TargetStack) { // Actually, this may not matter } // Do stack frame first, since bank would be it or child. // Need frames indexed first to determine level of bank - if (added instanceof TargetStackFrame) { + if (added instanceof TargetStackFrame) { ThreadRecorder rec = threadMap.getForSuccessor(added); if (rec == null) { Msg.error(this, "Frame without thread?: " + added); } else { - rec.offerStackFrame((TargetStackFrame) added); + rec.offerStackFrame((TargetStackFrame) added); } } - if (added instanceof TargetRegisterBank) { + if (added instanceof TargetRegisterBank) { ThreadRecorder rec = threadMap.getForSuccessor(added); if (rec == null) { Msg.error(this, "Bank without thread?: " + added); } else { - rec.offerRegisters((TargetRegisterBank) added); + rec.offerRegisters((TargetRegisterBank) added); } } - if (added instanceof TargetRegisterContainer) { + if (added instanceof TargetRegisterContainer) { // These are picked up when a bank is added with these descriptions } - if (added instanceof TargetRegister) { - TargetRegister reg = (TargetRegister) added; + if (added instanceof TargetRegister) { + TargetRegister reg = (TargetRegister) added; regMappers.get(reg.getContainer()).thenAccept(rm -> { rm.targetRegisterAdded(reg); for (ThreadRecorder rec : threadMap.byTargetThread.values()) { @@ -1124,18 +1112,18 @@ public class DefaultTraceRecorder implements TraceRecorder { } }); } - if (added instanceof TargetMemory) { - initMemMapper((TargetMemory) added); + if (added instanceof TargetMemory) { + initMemMapper((TargetMemory) added); } - if (added instanceof TargetMemoryRegion) { - TargetMemoryRegion region = (TargetMemoryRegion) added; + if (added instanceof TargetMemoryRegion) { + TargetMemoryRegion region = (TargetMemoryRegion) added; findThreadOrProcess(added).thenAccept(obj -> { if (obj == target) { offerProcessRegion(region); return; } if (obj instanceof TargetThread) { - ThreadRecorder rec = getOrCreateThreadRecorder((TargetThread) obj); + ThreadRecorder rec = getOrCreateThreadRecorder((TargetThread) obj); rec.offerThreadRegion(region); } }).exceptionally(ex -> { @@ -1143,22 +1131,16 @@ public class DefaultTraceRecorder implements TraceRecorder { return null; }); } - if (added instanceof TargetModule) { - TargetModule module = (TargetModule) added; + if (added instanceof TargetModule) { + TargetModule module = (TargetModule) added; offerProcessModule(module); } - if (added instanceof TargetSection) { - TargetSection section = (TargetSection) added; - section.getModule().fetch().thenAccept(module -> { - offerProcessModuleSection(module, section); - // I hope this should never be a per-thread thing - }).exceptionally(ex -> { - Msg.error(this, "Error recording module section", ex); - return null; - }); + if (added instanceof TargetSection) { + TargetSection section = (TargetSection) added; + offerProcessModuleSection(section.getModule(), section); } - if (added instanceof TargetBreakpointContainer) { - TargetBreakpointContainer breaks = (TargetBreakpointContainer) added; + if (added instanceof TargetBreakpointContainer) { + TargetBreakpointContainer breaks = (TargetBreakpointContainer) added; findThreadOrProcess(added).thenAccept(obj -> { if (obj == target) { offerProcessBreakpointContainer(breaks); @@ -1167,18 +1149,18 @@ public class DefaultTraceRecorder implements TraceRecorder { if (obj.isRoot()) { return; } - ThreadRecorder rec = getOrCreateThreadRecorder((TargetThread) obj); + ThreadRecorder rec = getOrCreateThreadRecorder((TargetThread) obj); rec.offerThreadBreakpointContainer(breaks); }).exceptionally(ex -> { Msg.error(this, "Error recording breakpoint container", ex); return null; }); } - if (added instanceof TargetBreakpointSpec) { + if (added instanceof TargetBreakpointSpec) { // I don't think this matters. UI for live recording only. } - if (added instanceof TargetBreakpointLocation) { - TargetBreakpointLocation bpt = (TargetBreakpointLocation) added; + if (added instanceof TargetBreakpointLocation) { + TargetBreakpointLocation bpt = (TargetBreakpointLocation) added; breakpoints.add(bpt); offerEffectiveBreakpoint(bpt); } @@ -1193,37 +1175,35 @@ public class DefaultTraceRecorder implements TraceRecorder { stopRecording(); return; } - if (removed instanceof TargetRegisterContainer) { - regMappers.remove((TargetRegisterContainer) removed); + if (removed instanceof TargetRegisterContainer) { + regMappers.remove((TargetRegisterContainer) removed); } - if (removed instanceof TargetRegister) { - TargetRegister reg = (TargetRegister) removed; - reg.getContainer().fetch().thenAccept(cont -> { - DebuggerRegisterMapper rm = regMappers.getCompletedMap().get(cont); - if (rm == null) { - return; - } - rm.targetRegisterRemoved(reg); - for (ThreadRecorder rec : threadMap.byTargetThread.values()) { - rec.regMapperAmended(rm, reg, true); - } - }); + if (removed instanceof TargetRegister) { + TargetRegister reg = (TargetRegister) removed; + DebuggerRegisterMapper rm = regMappers.getCompletedMap().get(reg.getContainer()); + if (rm == null) { + return; + } + rm.targetRegisterRemoved(reg); + for (ThreadRecorder rec : threadMap.byTargetThread.values()) { + rec.regMapperAmended(rm, reg, true); + } } - if (removed instanceof TargetMemoryRegion) { - TargetMemoryRegion region = (TargetMemoryRegion) removed; + if (removed instanceof TargetMemoryRegion) { + TargetMemoryRegion region = (TargetMemoryRegion) removed; if (processMemory.removeRegion(region)) { removeProcessRegion(region); return; } // Allow removal notice to fall through to thread recorders } - if (removed instanceof TargetModule) { - TargetModule module = (TargetModule) removed; + if (removed instanceof TargetModule) { + TargetModule module = (TargetModule) removed; removeProcessModule(module); return; } - if (removed instanceof TargetBreakpointLocation) { - TargetBreakpointLocation bpt = (TargetBreakpointLocation) removed; + if (removed instanceof TargetBreakpointLocation) { + TargetBreakpointLocation bpt = (TargetBreakpointLocation) removed; breakpoints.remove(bpt); removeEffectiveBreakpoint(bpt); return; @@ -1239,13 +1219,13 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - protected boolean successor(TargetObjectRef ref) { + protected boolean successor(TargetObject ref) { return PathUtils.isAncestor(target.getPath(), ref.getPath()); } protected boolean anyRef(Collection parameters) { for (Object p : parameters) { - if (!(p instanceof TargetObjectRef)) { + if (!(p instanceof TargetObject)) { continue; } return true; @@ -1255,10 +1235,10 @@ public class DefaultTraceRecorder implements TraceRecorder { protected boolean anySuccessor(Collection parameters) { for (Object p : parameters) { - if (!(p instanceof TargetObjectRef)) { + if (!(p instanceof TargetObject)) { continue; } - TargetObjectRef ref = (TargetObjectRef) p; + TargetObject ref = (TargetObject) p; if (!successor(ref)) { continue; } @@ -1267,7 +1247,7 @@ public class DefaultTraceRecorder implements TraceRecorder { return false; } - protected boolean eventApplies(TargetObjectRef eventThread, TargetEventType type, + protected boolean eventApplies(TargetObject eventThread, TargetEventType type, List parameters) { if (type == TargetEventType.RUNNING) { return false; @@ -1287,8 +1267,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public void event(TargetEventScope object, - TypedTargetObjectRef> eventThread, TargetEventType type, + public void event(TargetEventScope object, TargetThread eventThread, TargetEventType type, String description, List parameters) { if (!valid) { return; @@ -1316,27 +1295,25 @@ public class DefaultTraceRecorder implements TraceRecorder { } else if (type == TargetEventType.MODULE_LOADED) { Object p0 = parameters.get(0); - if (!(p0 instanceof TargetObjectRef)) { + if (!(p0 instanceof TargetObject)) { return; } - TargetObjectRef ref = (TargetObjectRef) p0; - ref.fetch().thenAccept(obj -> { - if (!(obj instanceof TargetModule)) { - return; - } - TargetModule mod = (TargetModule) obj; - TraceModule traceModule = getTraceModule(mod); - if (traceModule == null) { - return; - } - try (UndoableTransaction tid = - UndoableTransaction.start(trace, "Adjust module load", true)) { - traceModule.setLoadedSnap(snapshot.getKey()); - } - catch (DuplicateNameException e) { - Msg.error(this, "Could not set module loaded snap", e); - } - }); + TargetObject obj = (TargetObject) p0; + if (!(obj instanceof TargetModule)) { + return; + } + TargetModule mod = (TargetModule) obj; + TraceModule traceModule = getTraceModule(mod); + if (traceModule == null) { + return; + } + try (UndoableTransaction tid = + UndoableTransaction.start(trace, "Adjust module load", true)) { + traceModule.setLoadedSnap(snapshot.getKey()); + } + catch (DuplicateNameException e) { + Msg.error(this, "Could not set module loaded snap", e); + } } } @@ -1348,36 +1325,36 @@ public class DefaultTraceRecorder implements TraceRecorder { return; } // Dispatch attribute changes which don't have "built-in" events. - if (parent instanceof TargetBreakpointLocation) { + if (parent instanceof TargetBreakpointLocation) { if (added.containsKey(TargetBreakpointLocation.LENGTH_ATTRIBUTE_NAME)) { - breakpointLengthChanged((TargetBreakpointLocation) parent, + breakpointLengthChanged((TargetBreakpointLocation) parent, (Integer) added.get(TargetBreakpointLocation.LENGTH_ATTRIBUTE_NAME)); } } - if (parent instanceof TargetStackFrame) { + if (parent instanceof TargetStackFrame) { if (added.containsKey(TargetStackFrame.PC_ATTRIBUTE_NAME)) { - framePcUpdated((TargetStackFrame) parent); + framePcUpdated((TargetStackFrame) parent); } } - if (parent instanceof TargetRegisterBank) { + if (parent instanceof TargetRegisterBank) { if (added.containsKey(TargetRegisterBank.DESCRIPTIONS_ATTRIBUTE_NAME)) { ThreadRecorder rec = threadMap.getForSuccessor(parent); if (rec != null) { - rec.doFetchAndInitRegMapper((TargetRegisterBank) parent); + rec.doFetchAndInitRegMapper((TargetRegisterBank) parent); } } } // This should be fixed at construction. - /*if (parent instanceof TargetModule) { + /*if (parent instanceof TargetModule) { if (added.containsKey(TargetModule.BASE_ATTRIBUTE_NAME)) { - moduleBaseUpdated((TargetModule) parent, + moduleBaseUpdated((TargetModule) parent, (Address) added.get(TargetModule.BASE_ATTRIBUTE_NAME)); } }*/ } @Override - public void executionStateChanged(TargetExecutionStateful stateful, + public void executionStateChanged(TargetExecutionStateful stateful, TargetExecutionState state) { if (!valid) { return; @@ -1391,7 +1368,7 @@ public class DefaultTraceRecorder implements TraceRecorder { ThreadRecorder rec = null; synchronized (threadMap) { if (threadOrProcess instanceof TargetThread) { - rec = threadMap.get((TargetThread) threadOrProcess); + rec = threadMap.get((TargetThread) threadOrProcess); } } if (rec != null) { @@ -1401,7 +1378,7 @@ public class DefaultTraceRecorder implements TraceRecorder { }); } - protected ThreadRecorder getOrCreateThreadRecorder(TargetThread thread) { + protected ThreadRecorder getOrCreateThreadRecorder(TargetThread thread) { synchronized (threadMap) { ThreadRecorder rec = threadMap.get(thread); if (rec != null) { @@ -1425,7 +1402,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public void registersUpdated(TargetRegisterBank bank, Map updates) { + public void registersUpdated(TargetRegisterBank bank, Map updates) { if (!valid) { return; } @@ -1437,7 +1414,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public void memoryUpdated(TargetMemory memory, Address address, byte[] data) { + public void memoryUpdated(TargetMemory memory, Address address, byte[] data) { if (!valid) { return; } @@ -1457,7 +1434,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public void memoryReadError(TargetMemory memory, AddressRange range, + public void memoryReadError(TargetMemory memory, AddressRange range, DebuggerMemoryAccessException e) { if (!valid) { return; @@ -1472,14 +1449,14 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public void breakpointToggled(TargetBreakpointSpec spec, boolean enabled) { + public void breakpointToggled(TargetBreakpointSpec spec, boolean enabled) { if (!valid) { return; } spec.getLocations().thenAccept(bpts -> { try (PermanentTransaction tid = PermanentTransaction.start(trace, "Breakpoint toggled")) { - for (TargetBreakpointLocation eb : bpts) { + for (TargetBreakpointLocation eb : bpts) { TraceBreakpoint traceBpt = getTraceBreakpoint(eb); if (traceBpt == null) { String path = PathUtils.toString(eb.getPath()); @@ -1496,7 +1473,7 @@ public class DefaultTraceRecorder implements TraceRecorder { }); } - protected void breakpointLengthChanged(TargetBreakpointLocation bpt, int length) { + protected void breakpointLengthChanged(TargetBreakpointLocation bpt, int length) { Address traceAddr = memMapper.targetToTrace(bpt.getAddress()); String path = PathUtils.toString(bpt.getPath()); for (TraceBreakpoint traceBpt : breakpointManager.getBreakpointsByPath(path)) { @@ -1524,19 +1501,19 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - protected void framePcUpdated(TargetStackFrame frame) { + protected void framePcUpdated(TargetStackFrame frame) { ThreadRecorder rec = threadMap.getForSuccessor(frame); // Yes, entire stack, otherwise, the stack seems to be just one deep. rec.recordStack(); } - protected void stackUpdated(TargetStack stack) { + protected void stackUpdated(TargetStack stack) { ThreadRecorder rec = threadMap.getForSuccessor(stack); rec.recordStack(); } @Override - public void focusChanged(TargetFocusScope object, TargetObjectRef focused) { + public void focusChanged(TargetFocusScope object, TargetObject focused) { if (!valid) { return; } @@ -1551,7 +1528,7 @@ public class DefaultTraceRecorder implements TraceRecorder { copy = List.copyOf(threadMap.byTargetThread.values()); } for (ThreadRecorder rec : copy) { - TargetRegisterBank bank = rec.regs.get(0); + TargetRegisterBank bank = rec.regs.get(0); if (bank != null) { rec.recordRegisterValues(bank, bank.getCachedRegisters()); rec.updateRegsMem(null); @@ -1566,53 +1543,51 @@ public class DefaultTraceRecorder implements TraceRecorder { } synchronized (DefaultTraceRecorder.this) { for (TargetObject obj : copy) { - if (obj instanceof TargetModule) { - offerProcessModule((TargetModule) obj); + if (obj instanceof TargetModule) { + offerProcessModule((TargetModule) obj); } - if (obj instanceof TargetSection) { - TargetSection section = (TargetSection) obj; - section.getModule().fetch().thenAccept(module -> { - offerProcessModuleSection(module, section); - }); + if (obj instanceof TargetSection) { + TargetSection section = (TargetSection) obj; + offerProcessModuleSection(section.getModule(), section); } - if (obj instanceof TargetBreakpointLocation) { - offerEffectiveBreakpoint((TargetBreakpointLocation) obj); + if (obj instanceof TargetBreakpointLocation) { + offerEffectiveBreakpoint((TargetBreakpointLocation) obj); } - if (obj instanceof TargetStack) { - stackUpdated((TargetStack) obj); + if (obj instanceof TargetStack) { + stackUpdated((TargetStack) obj); } } } } - public TargetMemoryRegion getTargetMemoryRegion(TraceMemoryRegion region) { + public TargetMemoryRegion getTargetMemoryRegion(TraceMemoryRegion region) { synchronized (objects) { - return (TargetMemoryRegion) objects.get(PathUtils.parse(region.getPath())); + return (TargetMemoryRegion) objects.get(PathUtils.parse(region.getPath())); } } - public TargetModule getTargetModule(TraceModule module) { + public TargetModule getTargetModule(TraceModule module) { synchronized (objects) { - return (TargetModule) objects.get(PathUtils.parse(module.getPath())); + return (TargetModule) objects.get(PathUtils.parse(module.getPath())); } } - public TargetSection getTargetSection(TraceSection section) { + public TargetSection getTargetSection(TraceSection section) { synchronized (objects) { - return (TargetSection) objects.get(PathUtils.parse(section.getPath())); + return (TargetSection) objects.get(PathUtils.parse(section.getPath())); } } - public TargetBreakpointLocation getTargetBreakpoint(TraceBreakpoint bpt) { + public TargetBreakpointLocation getTargetBreakpoint(TraceBreakpoint bpt) { synchronized (objects) { - return (TargetBreakpointLocation) objects.get(PathUtils.parse(bpt.getPath())); + return (TargetBreakpointLocation) objects.get(PathUtils.parse(bpt.getPath())); } } - public List> collectBreakpoints(TargetThread thread) { + public List collectBreakpoints(TargetThread thread) { synchronized (objects) { return breakpoints.stream().filter(bpt -> { - TargetObjectRefList affects = bpt.getAffects(); + TargetObjectList affects = bpt.getAffects(); // N.B. in case thread is null (process), affects.contains(thread) is always false return affects.isEmpty() || affects.contains(thread) || affects.contains(target); @@ -1621,10 +1596,10 @@ public class DefaultTraceRecorder implements TraceRecorder { } protected void onProcessBreakpointContainers( - Consumer> action) { + Consumer action) { synchronized (objects) { if (processBreakpointContainer == null) { - for (TargetThread thread : threadsView) { + for (TargetThread thread : threadsView) { onThreadBreakpointContainers(thread, action); } } @@ -1634,15 +1609,15 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - protected void onThreadBreakpointContainers(TargetThread thread, - Consumer> action) { + protected void onThreadBreakpointContainers(TargetThread thread, + Consumer action) { synchronized (objects) { getOrCreateThreadRecorder(thread).onThreadBreakpointContainers(action); } } - protected void onBreakpointContainers(TargetThread thread, - Consumer> action) { + protected void onBreakpointContainers(TargetThread thread, + Consumer action) { if (thread == null) { onProcessBreakpointContainers(action); } @@ -1657,7 +1632,7 @@ public class DefaultTraceRecorder implements TraceRecorder { protected final Trace trace; protected final TargetObject target; protected final ComposedMemory processMemory = new ComposedMemory(); - protected TargetBreakpointContainer processBreakpointContainer; + protected TargetBreakpointContainer processBreakpointContainer; protected final TraceBreakpointManager breakpointManager; protected final TraceCodeManager codeManager; @@ -1672,26 +1647,26 @@ public class DefaultTraceRecorder implements TraceRecorder { protected final AbstractDebuggerTargetTraceMapper mapper; protected DebuggerMemoryMapper memMapper; - protected AsyncLazyMap>, DebuggerRegisterMapper> regMappers; + protected AsyncLazyMap regMappers; protected final TargetDataTypeConverter typeConverter; - protected Collection> extraRegs; + protected Collection extraRegs; // TODO: Support automatic recording of user-specified extra registers... // NOTE: Probably via watches, once we have those // TODO: Probably move all the auto-reads into watches protected final ListenerSet listeners = new ListenerSet<>(TraceRecorderListener.class); - protected final TriConsumer listenerRegAccChanged = + protected final TriConsumer listenerRegAccChanged = this::registerAccessibilityChanged; - protected final TriConsumer listenerProcMemAccChanged = + protected final TriConsumer listenerProcMemAccChanged = this::processMemoryAccessibilityChanged; private final ListenerForRecord listenerForRecord; protected final ThreadMap threadMap = new ThreadMap(); - protected final Set> threadsView = + protected final Set threadsView = Collections.unmodifiableSet(threadMap.byTargetThread.keySet()); - protected final BiMap, TraceBreakpoint> processBreakpointsMap = + protected final BiMap processBreakpointsMap = HashBiMap.create(); protected final AsyncLazyValue lazyInit = new AsyncLazyValue<>(this::doInit); @@ -1699,8 +1674,8 @@ public class DefaultTraceRecorder implements TraceRecorder { protected TraceSnapshot snapshot = null; private boolean valid = true; - protected TargetFocusScope focusScope; - protected TargetObjectRef curFocus; + protected TargetFocusScope focusScope; + protected TargetObject curFocus; public DefaultTraceRecorder(DebuggerModelServicePlugin plugin, Trace trace, TargetObject target, AbstractDebuggerTargetTraceMapper mapper) { @@ -1721,8 +1696,8 @@ public class DefaultTraceRecorder implements TraceRecorder { this.timeManager = trace.getTimeManager(); this.mapper = mapper; - this.regMappers = new AsyncLazyMap<>(new HashMap<>(), - ref -> ref.fetch().thenCompose(mapper::offerRegisters)); + this.regMappers = + new AsyncLazyMap<>(new HashMap<>(), descs -> mapper.offerRegisters(descs)); this.typeConverter = new TargetDataTypeConverter(trace.getDataTypeManager()); this.listenerForRecord = new ListenerForRecord(); @@ -1732,13 +1707,11 @@ public class DefaultTraceRecorder implements TraceRecorder { trace.addConsumer(this); } - protected void registerAccessibilityChanged(TargetAccessibility old, TargetAccessibility acc, - Void __) { + protected void registerAccessibilityChanged(boolean old, boolean acc, Void __) { listeners.fire.registerAccessibilityChanged(this); } - protected void processMemoryAccessibilityChanged(TargetAccessibility old, - TargetAccessibility acc, Void __) { + protected void processMemoryAccessibilityChanged(boolean old, boolean acc, Void __) { listeners.fire.processMemoryAccessibilityChanged(this); } @@ -1751,8 +1724,8 @@ public class DefaultTraceRecorder implements TraceRecorder { createSnapshot("Started recording " + PathUtils.toString(target.getPath()) + " in " + target.getModel(), null, null); AsyncFence fence = new AsyncFence(); - CompletableFuture> futureBreaks = - DebugModelConventions.findSuitable(TargetBreakpointContainer.tclass, target); + CompletableFuture futureBreaks = + DebugModelConventions.findSuitable(TargetBreakpointContainer.class, target); fence.include(futureBreaks.thenAccept(breaks -> { if (breaks != null && !PathUtils.isAncestor(target.getPath(), breaks.getPath())) { offerProcessBreakpointContainer(breaks); // instead of objectAdded @@ -1763,8 +1736,8 @@ public class DefaultTraceRecorder implements TraceRecorder { return null; })); - CompletableFuture> futureEvents = - DebugModelConventions.findSuitable(TargetEventScope.tclass, target); + CompletableFuture futureEvents = + DebugModelConventions.findSuitable(TargetEventScope.class, target); fence.include(futureEvents.thenAccept(events -> { if (events != null && !PathUtils.isAncestor(target.getPath(), events.getPath())) { // Don't descend. Scope may be the entire session. @@ -1775,8 +1748,8 @@ public class DefaultTraceRecorder implements TraceRecorder { return null; })); - CompletableFuture> futureFocus = - DebugModelConventions.findSuitable(TargetFocusScope.tclass, target); + CompletableFuture futureFocus = + DebugModelConventions.findSuitable(TargetFocusScope.class, target); fence.include(futureFocus.thenAccept(focus -> { if (focus != null && !PathUtils.isAncestor(target.getPath(), focus.getPath())) { // Don't descend. Scope may be the entire session. @@ -1818,7 +1791,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } // TODO: This could probably be discovered by the offer and passed in at construction - protected synchronized CompletableFuture initMemMapper(TargetMemory memory) { + protected synchronized CompletableFuture initMemMapper(TargetMemory memory) { /** * TODO: At the moment, there's no real dependency on the memory. When there is, see that * additional memories can be incorporated into the mapper, and stale ones removed. @@ -1838,7 +1811,7 @@ public class DefaultTraceRecorder implements TraceRecorder { }); } - protected Collection getTraceFlags(TargetMemoryRegion region) { + protected Collection getTraceFlags(TargetMemoryRegion region) { Collection flags = new HashSet<>(); if (region.isReadable()) { flags.add(TraceMemoryFlag.READ); @@ -1853,39 +1826,38 @@ public class DefaultTraceRecorder implements TraceRecorder { return flags; } - protected void offerProcessRegion(TargetMemoryRegion region) { - region.getMemory().fetch().thenCompose(mem -> { - processMemory.addRegion(region, mem); - initMemMapper(mem); - synchronized (this) { - try (PermanentTransaction tid = - PermanentTransaction.start(trace, "Memory region added")) { - String path = PathUtils.toString(region.getPath()); - TraceMemoryRegion traceRegion = - memoryManager.getLiveRegionByPath(snapshot.getKey(), path); - if (traceRegion != null) { - Msg.warn(this, "Region " + path + " already recorded"); - return AsyncUtils.NIL; - } - traceRegion = memoryManager.addRegion(path, Range.atLeast(snapshot.getKey()), - memMapper.targetToTrace(region.getRange()), getTraceFlags(region)); - traceRegion.setName(region.getName()); - } - catch (TraceOverlappedRegionException e) { - Msg.error(this, "Failed to create region due to overlap", e); - } - catch (DuplicateNameException e) { - throw new AssertionError(e); // Just checked for existing + protected void offerProcessRegion(TargetMemoryRegion region) { + TargetMemory mem = region.getMemory(); + processMemory.addRegion(region, mem); + initMemMapper(mem); + synchronized (this) { + try (PermanentTransaction tid = + PermanentTransaction.start(trace, "Memory region added")) { + String path = PathUtils.toString(region.getPath()); + TraceMemoryRegion traceRegion = + memoryManager.getLiveRegionByPath(snapshot.getKey(), path); + if (traceRegion != null) { + Msg.warn(this, "Region " + path + " already recorded"); + return; } + traceRegion = memoryManager.addRegion(path, Range.atLeast(snapshot.getKey()), + memMapper.targetToTrace(region.getRange()), getTraceFlags(region)); + traceRegion.setName(region.getName()); } - return updateAllThreadsRegsMem(region); - }).exceptionally(ex -> { + catch (TraceOverlappedRegionException e) { + Msg.error(this, "Failed to create region due to overlap", e); + } + catch (DuplicateNameException e) { + throw new AssertionError(e); // Just checked for existing + } + } + updateAllThreadsRegsMem(region).exceptionally(ex -> { Msg.error(this, "Could not add process memory region", ex); return null; }); } - protected synchronized void removeProcessRegion(TargetMemoryRegion region) { + protected synchronized void removeProcessRegion(TargetMemoryRegion region) { // Already removed from processMemory. That's how we knew to go here. try (PermanentTransaction tid = PermanentTransaction.start(trace, "Memory region removed")) { @@ -1903,7 +1875,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - protected void recordBreakpoint(TargetBreakpointSpec spec, TargetBreakpointLocation bpt, + protected void recordBreakpoint(TargetBreakpointSpec spec, TargetBreakpointLocation bpt, Set traceThreads) { synchronized (this) { if (memMapper == null) { @@ -1928,21 +1900,21 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - protected void offerProcessBreakpointContainer(TargetBreakpointContainer bc) { + protected void offerProcessBreakpointContainer(TargetBreakpointContainer bc) { if (processBreakpointContainer != null) { Msg.warn(this, "Already have a breakpoint container for this process"); } processBreakpointContainer = bc; } - protected void offerFocusScope(TargetFocusScope scope) { + protected void offerFocusScope(TargetFocusScope scope) { if (this.focusScope != null) { Msg.warn(this, "Already have a focus scope: " + this.focusScope); } this.focusScope = scope; } - protected synchronized TraceModule offerProcessModule(TargetModule module) { + protected synchronized TraceModule offerProcessModule(TargetModule module) { if (memMapper == null) { return null; } @@ -1966,8 +1938,8 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - protected synchronized TraceSection offerProcessModuleSection(TargetModule module, - TargetSection section) { + protected synchronized TraceSection offerProcessModuleSection(TargetModule module, + TargetSection section) { if (memMapper == null) { return null; } @@ -1990,7 +1962,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - protected synchronized void removeProcessModule(TargetModule module) { + protected synchronized void removeProcessModule(TargetModule module) { String path = PathUtils.toString(module.getPath()); long snap = snapshot.getKey(); TraceThread eventThread = snapshot.getEventThread(); @@ -2016,7 +1988,7 @@ public class DefaultTraceRecorder implements TraceRecorder { // NB: No removeProcessModuleSection, because sections should be immutable // They are removed when the module is removed - protected void offerEffectiveBreakpoint(TargetBreakpointLocation bpt) { + protected void offerEffectiveBreakpoint(TargetBreakpointLocation bpt) { synchronized (this) { if (memMapper == null) { return; @@ -2033,7 +2005,7 @@ public class DefaultTraceRecorder implements TraceRecorder { }); } - protected void removeEffectiveBreakpoint(TargetBreakpointLocation bpt) { + protected void removeEffectiveBreakpoint(TargetBreakpointLocation bpt) { String path = PathUtils.toString(bpt.getPath()); long snap = snapshot.getKey(); try (PermanentTransaction tid = PermanentTransaction.start(trace, "Breakpoint deleted")) { @@ -2056,7 +2028,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } } - protected CompletableFuture updateAllThreadsRegsMem(TargetMemoryRegion limit) { + protected CompletableFuture updateAllThreadsRegsMem(TargetMemoryRegion limit) { AsyncFence fence = new AsyncFence(); for (ThreadRecorder rec : threadMap.recorders()) { fence.include(rec.updateRegsMem(limit)); @@ -2115,25 +2087,25 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public TargetBreakpointLocation getTargetBreakpoint(TraceBreakpoint bpt) { + public TargetBreakpointLocation getTargetBreakpoint(TraceBreakpoint bpt) { return listenerForRecord.getTargetBreakpoint(bpt); } @Override - public TraceBreakpoint getTraceBreakpoint(TargetBreakpointLocation bpt) { + public TraceBreakpoint getTraceBreakpoint(TargetBreakpointLocation bpt) { String path = PathUtils.toString(bpt.getPath()); return breakpointManager.getPlacedBreakpointByPath(snapshot.getKey(), path); } @Override - public List> collectBreakpointContainers(TargetThread thread) { - List> result = new ArrayList<>(); + public List collectBreakpointContainers(TargetThread thread) { + List result = new ArrayList<>(); listenerForRecord.onBreakpointContainers(thread, result::add); return result; } @Override - public List> collectBreakpoints(TargetThread thread) { + public List collectBreakpoints(TargetThread thread) { return listenerForRecord.collectBreakpoints(thread); } @@ -2147,46 +2119,46 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public TargetMemoryRegion getTargetMemoryRegion(TraceMemoryRegion region) { + public TargetMemoryRegion getTargetMemoryRegion(TraceMemoryRegion region) { return listenerForRecord.getTargetMemoryRegion(region); } @Override - public TraceMemoryRegion getTraceMemoryRegion(TargetMemoryRegion region) { + public TraceMemoryRegion getTraceMemoryRegion(TargetMemoryRegion region) { String path = PathUtils.toString(region.getPath()); return memoryManager.getLiveRegionByPath(snapshot.getKey(), path); } @Override - public TargetModule getTargetModule(TraceModule module) { + public TargetModule getTargetModule(TraceModule module) { return listenerForRecord.getTargetModule(module); } @Override - public TraceModule getTraceModule(TargetModule module) { + public TraceModule getTraceModule(TargetModule module) { String path = PathUtils.toString(module.getPath()); return moduleManager.getLoadedModuleByPath(snapshot.getKey(), path); } @Override - public TargetSection getTargetSection(TraceSection section) { + public TargetSection getTargetSection(TraceSection section) { return listenerForRecord.getTargetSection(section); } @Override - public TraceSection getTraceSection(TargetSection section) { + public TraceSection getTraceSection(TargetSection section) { String path = PathUtils.toString(section.getPath()); return moduleManager.getLoadedSectionByPath(snapshot.getKey(), path); } @Override - public TargetThread getTargetThread(TraceThread thread) { + public TargetThread getTargetThread(TraceThread thread) { ThreadRecorder rec = threadMap.get(thread); return rec == null ? null : rec.targetThread; } @Override - public TargetExecutionState getTargetThreadState(TargetThread thread) { + public TargetExecutionState getTargetThreadState(TargetThread thread) { ThreadRecorder rec = threadMap.get(thread); return rec == null ? null : rec.state; } @@ -2198,7 +2170,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public boolean isRegisterBankAccessible(TargetRegisterBank bank) { + public boolean isRegisterBankAccessible(TargetRegisterBank bank) { if (bank == null) { return false; } @@ -2211,7 +2183,7 @@ public class DefaultTraceRecorder implements TraceRecorder { if (acc == null) { return false; } - return acc.get() == TargetAccessibility.ACCESSIBLE; + return acc.get(); } } @@ -2221,24 +2193,24 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public TargetRegisterBank getTargetRegisterBank(TraceThread thread, int frameLevel) { + public TargetRegisterBank getTargetRegisterBank(TraceThread thread, int frameLevel) { ThreadRecorder rec = threadMap.get(thread); return rec == null ? null : rec.regs.get(frameLevel); } @Override - public Set> getLiveTargetThreads() { + public Set getLiveTargetThreads() { return threadsView; } @Override - public TraceThread getTraceThread(TargetThread thread) { + public TraceThread getTraceThread(TargetThread thread) { ThreadRecorder rec = threadMap.byTargetThread.get(thread); return rec == null ? null : rec.traceThread; } @Override - public TraceThread getTraceThreadForSuccessor(TargetObjectRef successor) { + public TraceThread getTraceThreadForSuccessor(TargetObject successor) { ThreadRecorder rec = threadMap.getForSuccessor(successor); return rec == null ? null : rec.traceThread; } @@ -2252,7 +2224,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public TraceStackFrame getTraceStackFrame(TargetStackFrame frame) { + public TraceStackFrame getTraceStackFrame(TargetStackFrame frame) { ThreadRecorder rec = threadMap.getForSuccessor(frame); if (rec == null) { return null; @@ -2265,7 +2237,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public TraceStackFrame getTraceStackFrameForSuccessor(TargetObjectRef successor) { + public TraceStackFrame getTraceStackFrameForSuccessor(TargetObject successor) { ThreadRecorder rec = threadMap.getForSuccessor(successor); if (rec == null) { return null; @@ -2275,7 +2247,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public TargetStackFrame getTargetStackFrame(TraceThread thread, int frameLevel) { + public TargetStackFrame getTargetStackFrame(TraceThread thread, int frameLevel) { ThreadRecorder rec = threadMap.get(thread); if (rec == null) { return null; @@ -2332,10 +2304,10 @@ public class DefaultTraceRecorder implements TraceRecorder { if (registers.isEmpty()) { return AsyncUtils.NIL; } - List> tRegs = + List tRegs = registers.stream().map(regMapper::traceToTarget).collect(Collectors.toList()); - TargetRegisterBank bank = getTargetRegisterBank(thread, frameLevel); + TargetRegisterBank bank = getTargetRegisterBank(thread, frameLevel); if (bank == null) { throw new IllegalArgumentException( "Given thread and frame level does not have a live register bank"); @@ -2365,7 +2337,7 @@ public class DefaultTraceRecorder implements TraceRecorder { return regMapper.traceToTarget(ent.getValue()); }).collect(Collectors.toMap(Entry::getKey, Entry::getValue)); - TargetRegisterBank bank = getTargetRegisterBank(thread, frameLevel); + TargetRegisterBank bank = getTargetRegisterBank(thread, frameLevel); if (bank == null) { throw new IllegalArgumentException( "Given thread and frame level does not have a live register bank"); @@ -2422,7 +2394,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public CompletableFuture captureDataTypes(TargetDataTypeNamespace namespace, + public CompletableFuture captureDataTypes(TargetDataTypeNamespace namespace, TaskMonitor monitor) { if (!valid) { return AsyncUtils.NIL; @@ -2433,7 +2405,7 @@ public class DefaultTraceRecorder implements TraceRecorder { monitor.initialize(types.size()); AsyncFence fence = new AsyncFence(); List converted = new ArrayList<>(); - for (TargetNamedDataType type : types) { + for (TargetNamedDataType type : types) { if (monitor.isCancelled()) { fence.ready().cancel(false); return AsyncUtils.nil(); @@ -2459,17 +2431,17 @@ public class DefaultTraceRecorder implements TraceRecorder { @Override public CompletableFuture captureDataTypes(TraceModule module, TaskMonitor monitor) { - TargetModule targetModule = getTargetModule(module); + TargetModule targetModule = getTargetModule(module); if (targetModule == null) { Msg.error(this, "Module " + module + " is not loaded"); return AsyncUtils.NIL; } - CompletableFuture>> future = - targetModule.fetchChildrenSupporting(TargetDataTypeNamespace.tclass); + CompletableFuture> future = + targetModule.fetchChildrenSupporting(TargetDataTypeNamespace.class); // NOTE: I should expect exactly one namespace... return future.thenCompose(namespaces -> { AsyncFence fence = new AsyncFence(); - for (TargetDataTypeNamespace ns : namespaces.values()) { + for (TargetDataTypeNamespace ns : namespaces.values()) { fence.include(captureDataTypes(ns, monitor)); } return fence.ready(); @@ -2502,7 +2474,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public CompletableFuture captureSymbols(TargetSymbolNamespace namespace, + public CompletableFuture captureSymbols(TargetSymbolNamespace namespace, TaskMonitor monitor) { if (!valid) { return AsyncUtils.NIL; @@ -2515,7 +2487,7 @@ public class DefaultTraceRecorder implements TraceRecorder { TraceNamespaceSymbol ns = createNamespaceIfAbsent(path); monitor.setMessage("Capturing symbols for " + path); monitor.initialize(symbols.size()); - for (TargetSymbol sym : symbols) { + for (TargetSymbol sym : symbols) { if (monitor.isCancelled()) { return; } @@ -2559,17 +2531,17 @@ public class DefaultTraceRecorder implements TraceRecorder { @Override public CompletableFuture captureSymbols(TraceModule module, TaskMonitor monitor) { - TargetModule targetModule = getTargetModule(module); + TargetModule targetModule = getTargetModule(module); if (targetModule == null) { Msg.error(this, "Module " + module + " is not loaded"); return AsyncUtils.NIL; } - CompletableFuture>> future = - targetModule.fetchChildrenSupporting(TargetSymbolNamespace.tclass); + CompletableFuture> future = + targetModule.fetchChildrenSupporting(TargetSymbolNamespace.class); // NOTE: I should expect exactly one namespace... return future.thenCompose(namespaces -> { AsyncFence fence = new AsyncFence(); - for (TargetSymbolNamespace ns : namespaces.values()) { + for (TargetSymbolNamespace ns : namespaces.values()) { fence.include(captureSymbols(ns, monitor)); } return fence.ready(); @@ -2582,12 +2554,12 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public TargetObjectRef getFocus() { + public TargetObject getFocus() { if (curFocus == null) { if (focusScope == null) { return null; } - TargetObjectRef focus = focusScope.getFocus(); + TargetObject focus = focusScope.getFocus(); if (focus == null || !PathUtils.isAncestor(target.getPath(), focus.getPath())) { return null; } @@ -2597,7 +2569,7 @@ public class DefaultTraceRecorder implements TraceRecorder { } @Override - public CompletableFuture requestFocus(TargetObjectRef focus) { + public CompletableFuture requestFocus(TargetObject focus) { if (!isSupportsFocus()) { return CompletableFuture .failedFuture(new IllegalArgumentException("Target does not support focus")); diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java index 56f12b49aa..64b3b5a2b3 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/tracemgr/DebuggerTraceManagerServicePlugin.java @@ -36,9 +36,7 @@ import ghidra.app.services.*; import ghidra.async.AsyncConfigFieldCodec.BooleanAsyncConfigFieldCodec; import ghidra.async.AsyncReference; import ghidra.async.AsyncUtils; -import ghidra.dbg.attributes.TargetObjectRef; -import ghidra.dbg.target.TargetStackFrame; -import ghidra.dbg.target.TargetThread; +import ghidra.dbg.target.*; import ghidra.framework.client.ClientUtil; import ghidra.framework.client.NotConnectedException; import ghidra.framework.main.DataTreeDialog; @@ -63,27 +61,26 @@ import ghidra.util.datastruct.CollectionChangeListener; import ghidra.util.exception.*; import ghidra.util.task.*; -@PluginInfo( // - shortDescription = "Debugger Trace View Management Plugin", // - description = "Manages UI Components, Wrappers, Focus, etc.", // - category = PluginCategoryNames.DEBUGGER, // - packageName = DebuggerPluginPackage.NAME, // - status = PluginStatus.RELEASED, // - eventsProduced = { // - TraceActivatedPluginEvent.class, // - }, // - eventsConsumed = { // - TraceActivatedPluginEvent.class, // - TraceClosedPluginEvent.class, // - ModelObjectFocusedPluginEvent.class, // - TraceRecorderAdvancedPluginEvent.class, // - }, // - servicesRequired = { // - }, // - servicesProvided = { // - DebuggerTraceManagerService.class, // - } // -) +@PluginInfo( + shortDescription = "Debugger Trace View Management Plugin", + description = "Manages UI Components, Wrappers, Focus, etc.", + category = PluginCategoryNames.DEBUGGER, + packageName = DebuggerPluginPackage.NAME, + status = PluginStatus.RELEASED, + eventsProduced = { + TraceActivatedPluginEvent.class, + }, + eventsConsumed = { + TraceActivatedPluginEvent.class, + TraceClosedPluginEvent.class, + ModelObjectFocusedPluginEvent.class, + TraceRecorderAdvancedPluginEvent.class, + }, + servicesRequired = { + }, + servicesProvided = { + DebuggerTraceManagerService.class, + }) public class DebuggerTraceManagerServicePlugin extends Plugin implements DebuggerTraceManagerService { private static final AutoConfigState.ClassHandler CONFIG_STATE_HANDLER = @@ -163,7 +160,7 @@ public class DebuggerTraceManagerServicePlugin extends Plugin private final ForRecordersListener forRecordersListener = new ForRecordersListener(); protected DebuggerCoordinates current = DebuggerCoordinates.NOWHERE; - protected TargetObjectRef curRef; + protected TargetObject curObj; @AutoConfigStateField(codec = BooleanAsyncConfigFieldCodec.class) protected final AsyncReference autoActivatePresent = new AsyncReference<>(true); @AutoConfigStateField(codec = BooleanAsyncConfigFieldCodec.class) @@ -396,11 +393,11 @@ public class DebuggerTraceManagerServicePlugin extends Plugin return false; } - protected TraceThread threadFromTargetFocus(TraceRecorder recorder, TargetObjectRef focus) { + protected TraceThread threadFromTargetFocus(TraceRecorder recorder, TargetObject focus) { return focus == null ? null : recorder.getTraceThreadForSuccessor(focus); } - protected TraceStackFrame frameFromTargetFocus(TraceRecorder recorder, TargetObjectRef focus) { + protected TraceStackFrame frameFromTargetFocus(TraceRecorder recorder, TargetObject focus) { return focus == null ? null : recorder.getTraceStackFrameForSuccessor(focus); } @@ -422,7 +419,7 @@ public class DebuggerTraceManagerServicePlugin extends Plugin } // Note: override recorder with that known to service TraceRecorder recorder = computeRecorder(trace); - TargetObjectRef focus = recorder == null ? null : recorder.getFocus(); + TargetObject focus = recorder == null ? null : recorder.getFocus(); TraceThread thread = coordinates.getThread(); if (thread == null) { if (supportsFocus(recorder)) { @@ -528,8 +525,8 @@ public class DebuggerTraceManagerServicePlugin extends Plugin tool.contextChanged(null); } - protected boolean doModelObjectFocused(TargetObjectRef ref, boolean requirePresent) { - curRef = ref; + protected boolean doModelObjectFocused(TargetObject obj, boolean requirePresent) { + curObj = obj; if (!synchronizeFocus.get()) { return false; } @@ -547,7 +544,7 @@ public class DebuggerTraceManagerServicePlugin extends Plugin * switch. */ - TraceRecorder recorder = modelService.getRecorderForSuccessor(ref); + TraceRecorder recorder = modelService.getRecorderForSuccessor(obj); if (recorder == null) { return false; } @@ -557,10 +554,10 @@ public class DebuggerTraceManagerServicePlugin extends Plugin return false; } } - TraceThread thread = threadFromTargetFocus(recorder, ref); + TraceThread thread = threadFromTargetFocus(recorder, obj); long snap = recorder.getSnap(); String ticks = ""; - TraceStackFrame traceFrame = frameFromTargetFocus(recorder, ref); + TraceStackFrame traceFrame = frameFromTargetFocus(recorder, obj); Integer frame = traceFrame == null ? null : traceFrame.getLevel(); activateNoFocus(DebuggerCoordinates.all(trace, recorder, thread, null, snap, ticks, frame)); return true; @@ -613,7 +610,7 @@ public class DebuggerTraceManagerServicePlugin extends Plugin } else if (event instanceof ModelObjectFocusedPluginEvent) { ModelObjectFocusedPluginEvent ev = (ModelObjectFocusedPluginEvent) event; - doModelObjectFocused(ev.getFocusRef(), true); + doModelObjectFocused(ev.getFocus(), true); } else if (event instanceof TraceRecorderAdvancedPluginEvent) { TraceRecorderAdvancedPluginEvent ev = (TraceRecorderAdvancedPluginEvent) event; @@ -930,21 +927,21 @@ public class DebuggerTraceManagerServicePlugin extends Plugin fireLocationEvent(resolved); } - protected static TargetObjectRef translateToFocus(DebuggerCoordinates prev, + protected static TargetObject translateToFocus(DebuggerCoordinates prev, DebuggerCoordinates resolved) { if (!resolved.isAliveAndPresent()) { return null; } TraceRecorder recorder = resolved.getRecorder(); if (!Objects.equals(prev.getFrame(), resolved.getFrame())) { - TargetStackFrame frame = + TargetStackFrame frame = recorder.getTargetStackFrame(resolved.getThread(), resolved.getFrame()); if (frame != null) { return frame; } } if (!Objects.equals(prev.getThread(), resolved.getThread())) { - TargetThread thread = recorder.getTargetThread(resolved.getThread()); + TargetThread thread = recorder.getTargetThread(resolved.getThread()); if (thread != null) { return thread; } @@ -971,7 +968,7 @@ public class DebuggerTraceManagerServicePlugin extends Plugin return; } TraceRecorder recorder = resolved.getRecorder(); - TargetObjectRef focus = translateToFocus(prev, resolved); + TargetObject focus = translateToFocus(prev, resolved); if (focus == null) { return; } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/workflow/ShowInterpreterDebuggerBot.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/workflow/ShowInterpreterDebuggerBot.java index 7b1ace9479..ff04d78513 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/workflow/ShowInterpreterDebuggerBot.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/workflow/ShowInterpreterDebuggerBot.java @@ -28,11 +28,11 @@ import ghidra.util.Msg; import ghidra.util.Swing; @DebuggerBotInfo( // - description = "Show debugger interpreters", // - details = "Listens for new debuggers supporting the interpreter interface," + - " and when found, displays that interpeter.", // - help = @HelpInfo(anchor = "show_interpreter"), // - enabledByDefault = true // + description = "Show debugger interpreters", // + details = "Listens for new debuggers supporting the interpreter interface," + + " and when found, displays that interpeter.", // + help = @HelpInfo(anchor = "show_interpreter"), // + enabledByDefault = true // ) public class ShowInterpreterDebuggerBot implements DebuggerBot { private DebuggerWorkflowServicePlugin plugin; @@ -57,8 +57,8 @@ public class ShowInterpreterDebuggerBot implements DebuggerBot { @Override public void modelAdded(DebuggerObjectModel model) { model.fetchModelRoot().thenCompose(root -> { - CompletableFuture> fi = - DebugModelConventions.findSuitable(TargetInterpreter.tclass, root); + CompletableFuture fi = + DebugModelConventions.findSuitable(TargetInterpreter.class, root); return fi; }).thenAccept(interpreter -> { if (interpreter == null) { diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/services/DebuggerInterpreterService.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/services/DebuggerInterpreterService.java index 7f8df36f62..eb4e7bfd19 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/services/DebuggerInterpreterService.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/services/DebuggerInterpreterService.java @@ -22,11 +22,11 @@ import ghidra.dbg.target.TargetInterpreter; import ghidra.framework.plugintool.ServiceInfo; @ServiceInfo( // - defaultProvider = DebuggerInterpreterPlugin.class, // - description = "Service for managing debugger interpreter panels" // + defaultProvider = DebuggerInterpreterPlugin.class, // + description = "Service for managing debugger interpreter panels" // ) public interface DebuggerInterpreterService { - DebuggerInterpreterConnection showConsole(TargetConsole console); + DebuggerInterpreterConnection showConsole(TargetConsole console); - DebuggerInterpreterConnection showConsole(TargetInterpreter interpreter); + DebuggerInterpreterConnection showConsole(TargetInterpreter interpreter); } diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/services/DebuggerModelService.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/services/DebuggerModelService.java index 9c2373bfe8..fedf64ae35 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/services/DebuggerModelService.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/services/DebuggerModelService.java @@ -25,7 +25,6 @@ import ghidra.app.plugin.core.debug.mapping.DebuggerTargetTraceMapper; import ghidra.app.plugin.core.debug.service.model.DebuggerModelServiceProxyPlugin; import ghidra.dbg.DebuggerModelFactory; import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.*; import ghidra.framework.plugintool.PluginEvent; import ghidra.framework.plugintool.ServiceInfo; @@ -33,10 +32,9 @@ import ghidra.trace.model.Trace; import ghidra.trace.model.thread.TraceThread; import ghidra.util.datastruct.CollectionChangeListener; -@ServiceInfo( // - defaultProvider = DebuggerModelServiceProxyPlugin.class, // - description = "Service for managing debug sessions and connections" // -) +@ServiceInfo( + defaultProvider = DebuggerModelServiceProxyPlugin.class, + description = "Service for managing debug sessions and connections") public interface DebuggerModelService { /** * Get the set of model factories found on the classpath @@ -166,12 +164,12 @@ public interface DebuggerModelService { TraceRecorder getRecorder(TargetObject target); /** - * Get the recorder which is recording the nearest ancestor for the given object ref + * Get the recorder which is recording the nearest ancestor for the given object * - * @param ref the object ref + * @param obj the object * @return the recorder, or null */ - TraceRecorder getRecorderForSuccessor(TargetObjectRef ref); + TraceRecorder getRecorderForSuccessor(TargetObject obj); /** * Get the recorder whose destination is the given trace @@ -215,7 +213,7 @@ public interface DebuggerModelService { * @param thread the destination trace thread * @return the source model "thread" */ - TargetThread getTargetThread(TraceThread thread); + TargetThread getTargetThread(TraceThread thread); /** * Get the destination trace thread, if applicable, for a given source thread @@ -226,7 +224,7 @@ public interface DebuggerModelService { * @param thread the source model "thread" * @return the destination trace thread */ - TraceThread getTraceThread(TargetThread thread); + TraceThread getTraceThread(TargetThread thread); /** * Get the destination trace thread, if applicable, for a given source thread @@ -239,7 +237,7 @@ public interface DebuggerModelService { * @param thread the source model thread * @return the destination trace thread */ - TraceThread getTraceThread(TargetObject target, TargetThread thread); + TraceThread getTraceThread(TargetObject target, TargetThread thread); /** * Signal to plugins that the user's focus has changed to another model @@ -267,7 +265,7 @@ public interface DebuggerModelService { * @param target a source model object being actively traced * @return the last focused object being traced by the same recorder */ - TargetObjectRef getTargetFocus(TargetObject target); + TargetObject getTargetFocus(TargetObject target); /** * Listen for changes in available model factories diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/services/TraceRecorder.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/services/TraceRecorder.java index ad3bd60063..5a44fbb07a 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/services/TraceRecorder.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/services/TraceRecorder.java @@ -22,7 +22,6 @@ import java.util.stream.Collectors; import ghidra.app.plugin.core.debug.mapping.DebuggerMemoryMapper; import ghidra.app.plugin.core.debug.mapping.DebuggerRegisterMapper; import ghidra.app.plugin.core.debug.service.model.DefaultTraceRecorder.ListenerForRecord; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.*; import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind; import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState; @@ -207,47 +206,47 @@ public interface TraceRecorder { boolean isViewAtPresent(TraceProgramView view); - TargetBreakpointLocation getTargetBreakpoint(TraceBreakpoint bpt); + TargetBreakpointLocation getTargetBreakpoint(TraceBreakpoint bpt); - TraceBreakpoint getTraceBreakpoint(TargetBreakpointLocation bpt); + TraceBreakpoint getTraceBreakpoint(TargetBreakpointLocation bpt); - TargetMemoryRegion getTargetMemoryRegion(TraceMemoryRegion region); + TargetMemoryRegion getTargetMemoryRegion(TraceMemoryRegion region); - TraceMemoryRegion getTraceMemoryRegion(TargetMemoryRegion region); + TraceMemoryRegion getTraceMemoryRegion(TargetMemoryRegion region); - TargetModule getTargetModule(TraceModule module); + TargetModule getTargetModule(TraceModule module); - TraceModule getTraceModule(TargetModule module); + TraceModule getTraceModule(TargetModule module); - TargetSection getTargetSection(TraceSection section); + TargetSection getTargetSection(TraceSection section); - TraceSection getTraceSection(TargetSection section); + TraceSection getTraceSection(TargetSection section); - TargetThread getTargetThread(TraceThread thread); + TargetThread getTargetThread(TraceThread thread); - TargetExecutionState getTargetThreadState(TargetThread thread); + TargetExecutionState getTargetThreadState(TargetThread thread); TargetExecutionState getTargetThreadState(TraceThread thread); - TargetRegisterBank getTargetRegisterBank(TraceThread thread, int frameLevel); + TargetRegisterBank getTargetRegisterBank(TraceThread thread, int frameLevel); - TraceThread getTraceThread(TargetThread thread); + TraceThread getTraceThread(TargetThread thread); - TraceThread getTraceThreadForSuccessor(TargetObjectRef successor); + TraceThread getTraceThreadForSuccessor(TargetObject successor); - TraceStackFrame getTraceStackFrame(TargetStackFrame frame); + TraceStackFrame getTraceStackFrame(TargetStackFrame frame); - TraceStackFrame getTraceStackFrameForSuccessor(TargetObjectRef successor); + TraceStackFrame getTraceStackFrameForSuccessor(TargetObject successor); - TargetStackFrame getTargetStackFrame(TraceThread thread, int frameLevel); + TargetStackFrame getTargetStackFrame(TraceThread thread, int frameLevel); - Set> getLiveTargetThreads(); + Set getLiveTargetThreads(); DebuggerRegisterMapper getRegisterMapper(TraceThread thread); DebuggerMemoryMapper getMemoryMapper(); - boolean isRegisterBankAccessible(TargetRegisterBank bank); + boolean isRegisterBankAccessible(TargetRegisterBank bank); boolean isRegisterBankAccessible(TraceThread thread, int frameLevel); @@ -359,7 +358,7 @@ public interface TraceRecorder { * @param monitor a monitor for displaying task steps * @return a future which completes when the types have been captured. */ - CompletableFuture captureDataTypes(TargetDataTypeNamespace namespace, + CompletableFuture captureDataTypes(TargetDataTypeNamespace namespace, TaskMonitor monitor); /** @@ -388,7 +387,7 @@ public interface TraceRecorder { * @param monitor a monitor for displaying task steps * @return a future which completes when the symbols have been captured. */ - CompletableFuture captureSymbols(TargetSymbolNamespace namespace, TaskMonitor monitor); + CompletableFuture captureSymbols(TargetSymbolNamespace namespace, TaskMonitor monitor); /** * Collect breakpoint containers pertinent to the target or a given thread @@ -408,7 +407,7 @@ public interface TraceRecorder { * @param thread an optional thread, or {@code null} for the process * @return the list of collected containers, possibly empty */ - List> collectBreakpointContainers(TargetThread thread); + List collectBreakpointContainers(TargetThread thread); /** * Collect effective breakpoint pertinent to the target or a given thread @@ -420,7 +419,7 @@ public interface TraceRecorder { * @param thread an optional thread, or {@code null} for the process * @return the list of collected breakpoints, possibly empty */ - List> collectBreakpoints(TargetThread thread); + List collectBreakpoints(TargetThread thread); /** * Get the kinds of breakpoints supported by any of the recorded breakpoint containers. @@ -448,7 +447,7 @@ public interface TraceRecorder { * has the appropriate listener installed on the container sub-tree. * @return the object which last had focus within this container, if applicable */ - TargetObjectRef getFocus(); + TargetObject getFocus(); /** * Request focus on a successor of the target @@ -460,10 +459,10 @@ public interface TraceRecorder { * callers do not need to worry that it returns a future, unless they'd like to check for * success. * - * @param focus the object ref on which to focus + * @param focus the object on which to focus * @return a future which completes with true if the operation was successful, false otherwise. */ - CompletableFuture requestFocus(TargetObjectRef focus); + CompletableFuture requestFocus(TargetObject focus); /** * Get the internal listener on the model used by the recorder diff --git a/Ghidra/Debug/Debugger/src/screen/java/ghidra/app/plugin/core/debug/gui/breakpoint/DebuggerBreakpointsPluginScreenShots.java b/Ghidra/Debug/Debugger/src/screen/java/ghidra/app/plugin/core/debug/gui/breakpoint/DebuggerBreakpointsPluginScreenShots.java index 2773d48145..d939613ccd 100644 --- a/Ghidra/Debug/Debugger/src/screen/java/ghidra/app/plugin/core/debug/gui/breakpoint/DebuggerBreakpointsPluginScreenShots.java +++ b/Ghidra/Debug/Debugger/src/screen/java/ghidra/app/plugin/core/debug/gui/breakpoint/DebuggerBreakpointsPluginScreenShots.java @@ -131,13 +131,13 @@ public class DebuggerBreakpointsPluginScreenShots extends GhidraScreenShotGenera new ProgramLocation(program, addr(program, 0x00400000)), 0x00010000, false); } - TargetBreakpointContainer bc1 = + TargetBreakpointContainer bc1 = waitFor(() -> Unique.assertAtMostOne(recorder1.collectBreakpointContainers(null)), "No container"); waitOn(bc1.placeBreakpoint(mb.addr(0x00401234), Set.of(TargetBreakpointKind.SOFTWARE))); waitOn(bc1.placeBreakpoint(mb.rng(0x00604321, 0x00604324), Set.of(TargetBreakpointKind.WRITE))); - TargetBreakpointContainer bc3 = + TargetBreakpointContainer bc3 = waitFor(() -> Unique.assertAtMostOne(recorder3.collectBreakpointContainers(null)), "No container"); waitOn(bc3.placeBreakpoint(mb.addr(0x7fac1234), Set.of(TargetBreakpointKind.SOFTWARE))); diff --git a/Ghidra/Debug/Debugger/src/screen/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsPluginScreenShots.java b/Ghidra/Debug/Debugger/src/screen/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsPluginScreenShots.java index 99633bc7cf..08b778f930 100644 --- a/Ghidra/Debug/Debugger/src/screen/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsPluginScreenShots.java +++ b/Ghidra/Debug/Debugger/src/screen/java/ghidra/app/plugin/core/debug/gui/objects/DebuggerObjectsPluginScreenShots.java @@ -26,7 +26,6 @@ import org.junit.Test; import ghidra.app.plugin.core.debug.gui.objects.components.*; import ghidra.app.plugin.core.debug.service.model.DebuggerModelServiceProxyPlugin; -import ghidra.dbg.attributes.TypedTargetObjectRef; import ghidra.dbg.model.*; import ghidra.dbg.target.*; import ghidra.dbg.util.DebuggerModelTestUtils; @@ -51,12 +50,8 @@ public class DebuggerObjectsPluginScreenShots extends GhidraScreenShotGenerator // A cheap way to control what buttons are enabled static class ActionyTestTargetObject extends DefaultTestTargetObject - implements TargetInterpreter, - TargetResumable, - TargetSteppable, - TargetLauncher, - TargetAttacher, - TargetAttachable { + implements TargetInterpreter, TargetResumable, TargetSteppable, TargetLauncher, + TargetAttacher, TargetAttachable { public ActionyTestTargetObject(TestTargetObject parent, String name, String typeHint) { super(parent, name, typeHint); @@ -68,8 +63,7 @@ public class DebuggerObjectsPluginScreenShots extends GhidraScreenShotGenerator } @Override - public CompletableFuture attach( - TypedTargetObjectRef> ref) { + public CompletableFuture attach(TargetAttachable attachable) { return TODO(); } diff --git a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/AbstractGhidraHeadedDebuggerGUITest.java b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/AbstractGhidraHeadedDebuggerGUITest.java index 01905146ee..ac8b4c7de2 100644 --- a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/AbstractGhidraHeadedDebuggerGUITest.java +++ b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/AbstractGhidraHeadedDebuggerGUITest.java @@ -84,13 +84,13 @@ public abstract class AbstractGhidraHeadedDebuggerGUITest } @Override - protected DebuggerMemoryMapper createMemoryMapper(TargetMemory memory) { + protected DebuggerMemoryMapper createMemoryMapper(TargetMemory memory) { return new DefaultDebuggerMemoryMapper(language, memory.getModel()); } @Override protected DebuggerRegisterMapper createRegisterMapper( - TargetRegisterContainer registers) { + TargetRegisterContainer registers) { return new DefaultDebuggerRegisterMapper(cSpec, registers, true); } } @@ -208,7 +208,7 @@ public abstract class AbstractGhidraHeadedDebuggerGUITest } } - protected static TargetBreakpointContainer getBreakpointContainer(TraceRecorder r) { + protected static TargetBreakpointContainer getBreakpointContainer(TraceRecorder r) { return waitFor(() -> Unique.assertAtMostOne(r.collectBreakpointContainers(null)), "No container"); } @@ -537,7 +537,7 @@ public abstract class AbstractGhidraHeadedDebuggerGUITest programManager.openProgram(program); } - protected void setRegistersAndWaitForRecord(AbstractTestTargetRegisterBank bank, + protected void setRegistersAndWaitForRecord(AbstractTestTargetRegisterBank bank, Map values, long timeoutMillis) throws Exception { TraceThread traceThread = modelService.getTraceThread(bank.getThread()); assertNotNull(traceThread); diff --git a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/breakpoint/DebuggerBreakpointMarkerPluginTest.java b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/breakpoint/DebuggerBreakpointMarkerPluginTest.java index c8856b54aa..86d435e591 100644 --- a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/breakpoint/DebuggerBreakpointMarkerPluginTest.java +++ b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/breakpoint/DebuggerBreakpointMarkerPluginTest.java @@ -100,7 +100,7 @@ public class DebuggerBreakpointMarkerPluginTest extends AbstractGhidraHeadedDebu protected void addLiveMemoryAndBreakpoint(TraceRecorder recorder) throws InterruptedException, ExecutionException, TimeoutException { mb.testProcess1.addRegion("bin:.text", mb.rng(0x55550000, 0x55550fff), "rx"); - TargetBreakpointContainer cont = getBreakpointContainer(recorder); + TargetBreakpointContainer cont = getBreakpointContainer(recorder); cont.placeBreakpoint(mb.addr(0x55550123), Set.of(TargetBreakpointKind.SOFTWARE)) .get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); } diff --git a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/breakpoint/DebuggerBreakpointsProviderTest.java b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/breakpoint/DebuggerBreakpointsProviderTest.java index 7f5f758788..3132bc4189 100644 --- a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/breakpoint/DebuggerBreakpointsProviderTest.java +++ b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/breakpoint/DebuggerBreakpointsProviderTest.java @@ -84,7 +84,7 @@ public class DebuggerBreakpointsProviderTest extends AbstractGhidraHeadedDebugge } protected void addLiveBreakpoint(TraceRecorder recorder, long offset) throws Exception { - TargetBreakpointContainer cont = getBreakpointContainer(recorder); + TargetBreakpointContainer cont = getBreakpointContainer(recorder); cont.placeBreakpoint(mb.addr(offset), Set.of(TargetBreakpointKind.SOFTWARE)) .get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); } diff --git a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/listing/DebuggerListingProviderTest.java b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/listing/DebuggerListingProviderTest.java index ac05114e00..a455f2d532 100644 --- a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/listing/DebuggerListingProviderTest.java +++ b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/gui/listing/DebuggerListingProviderTest.java @@ -41,7 +41,6 @@ import ghidra.app.plugin.core.debug.service.model.DebuggerModelServiceTest; import ghidra.app.services.*; import ghidra.app.util.viewer.listingpanel.ListingPanel; import ghidra.async.SwingExecutorService; -import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility; import ghidra.plugin.importer.ImporterPlugin; import ghidra.program.model.address.*; import ghidra.program.model.lang.Register; @@ -1015,11 +1014,11 @@ public class DebuggerListingProviderTest extends AbstractGhidraHeadedDebuggerGUI }); // Verify that setting the memory inaccessible disables the action - mb.testProcess1.memory.setAccessibility(TargetAccessibility.INACCESSIBLE); + mb.testProcess1.memory.setAccessible(false); waitForPass(() -> assertFalse(listingProvider.actionCaptureSelectedMemory.isEnabled())); // Verify that setting it accessible re-enables it (assuming we still have selection) - mb.testProcess1.memory.setAccessibility(TargetAccessibility.ACCESSIBLE); + mb.testProcess1.memory.setAccessible(true); waitForPass(() -> assertTrue(listingProvider.actionCaptureSelectedMemory.isEnabled())); // Verify that moving into the past disables the action diff --git a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/mapping/LargestSubDebuggerRegisterMapperTest.java b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/mapping/LargestSubDebuggerRegisterMapperTest.java index e61791c689..0c9bfa855c 100644 --- a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/mapping/LargestSubDebuggerRegisterMapperTest.java +++ b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/mapping/LargestSubDebuggerRegisterMapperTest.java @@ -47,12 +47,12 @@ public class LargestSubDebuggerRegisterMapperTest extends AbstractGhidraHeadedDe @Override protected DebuggerRegisterMapper createRegisterMapper( - TargetRegisterContainer registers) { + TargetRegisterContainer registers) { return new LargestSubDebuggerRegisterMapper(cSpec, registers, false); } @Override - protected DebuggerMemoryMapper createMemoryMapper(TargetMemory memory) { + protected DebuggerMemoryMapper createMemoryMapper(TargetMemory memory) { return new DefaultDebuggerMemoryMapper(language, memory.getModel()); } } @@ -132,7 +132,7 @@ public class LargestSubDebuggerRegisterMapperTest extends AbstractGhidraHeadedDe Objects.requireNonNull(mb.testProcess1.regs.getCachedElements().get("RAX")); Register lRAX = Objects.requireNonNull(getSLEIGH_X86_64_LANGUAGE().getRegister("RAX")); - TargetRegister tReg = waitForValue(() -> rm.traceToTarget(lRAX)); + TargetRegister tReg = waitForValue(() -> rm.traceToTarget(lRAX)); assertEquals(tRAX, tReg); } @@ -213,7 +213,7 @@ public class LargestSubDebuggerRegisterMapperTest extends AbstractGhidraHeadedDe Objects.requireNonNull(mb.testProcess1.regs.getCachedElements().get("EAX")); Register lRAX = Objects.requireNonNull(getSLEIGH_X86_64_LANGUAGE().getRegister("RAX")); - TargetRegister tReg = waitForValue(() -> rm.traceToTarget(lRAX)); + TargetRegister tReg = waitForValue(() -> rm.traceToTarget(lRAX)); assertEquals(tEAX, tReg); } diff --git a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/service/breakpoint/DebuggerLogicalBreakpointServiceTest.java b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/service/breakpoint/DebuggerLogicalBreakpointServiceTest.java index d0ccff05d5..7a554ce436 100644 --- a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/service/breakpoint/DebuggerLogicalBreakpointServiceTest.java +++ b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/service/breakpoint/DebuggerLogicalBreakpointServiceTest.java @@ -30,7 +30,6 @@ import ghidra.app.plugin.core.debug.service.model.DebuggerModelServiceTest; import ghidra.app.services.*; import ghidra.app.services.LogicalBreakpoint.Enablement; import ghidra.async.AsyncReference; -import ghidra.dbg.DebugModelConventions; import ghidra.dbg.model.TestTargetMemoryRegion; import ghidra.dbg.model.TestTargetProcess; import ghidra.dbg.target.*; @@ -291,7 +290,7 @@ public class DebuggerLogicalBreakpointServiceTest extends AbstractGhidraHeadedDe } protected void addTargetAccessBreakpoint(TraceRecorder r) throws Exception { - TargetBreakpointContainer cont = getBreakpointContainer(r); + TargetBreakpointContainer cont = getBreakpointContainer(r); cont.placeBreakpoint(mb.testModel.getAddress("ram", 0x56550123), Set.of(TargetBreakpointKind.READ, TargetBreakpointKind.WRITE)) .get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); @@ -302,24 +301,24 @@ public class DebuggerLogicalBreakpointServiceTest extends AbstractGhidraHeadedDe TraceMemoryRegion textRegion = waitFor(() -> r.getTraceMemoryRegion(region), "Recorder missed region: " + region); long offset = textRegion.getMinAddress().getOffset() + 0x0123; - TargetBreakpointContainer cont = getBreakpointContainer(r); + TargetBreakpointContainer cont = getBreakpointContainer(r); cont.placeBreakpoint(mb.addr(offset), Set.of(TargetBreakpointKind.SOFTWARE)) .get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); } protected void removeTargetSoftwareBreakpoint(TraceRecorder r) throws Exception { - TargetBreakpointContainer cont = getBreakpointContainer(r); - cont.fetchElements().thenCompose(DebugModelConventions::fetchAll).thenAccept(elements -> { + TargetBreakpointContainer cont = getBreakpointContainer(r); + cont.fetchElements().thenAccept(elements -> { for (TargetObject obj : elements.values()) { - if (!(obj instanceof TargetBreakpointSpec) || - !(obj instanceof TargetDeletable)) { + if (!(obj instanceof TargetBreakpointSpec) || + !(obj instanceof TargetDeletable)) { continue; } - TargetBreakpointSpec spec = (TargetBreakpointSpec) obj; + TargetBreakpointSpec spec = (TargetBreakpointSpec) obj; if (!spec.getKinds().contains(TargetBreakpointKind.SOFTWARE)) { continue; } - TargetDeletable del = (TargetDeletable) obj; + TargetDeletable del = (TargetDeletable) obj; del.delete(); return; } diff --git a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServiceTest.java b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServiceTest.java index 038f079ef9..187b4a76e6 100644 --- a/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServiceTest.java +++ b/Ghidra/Debug/Debugger/src/test/java/ghidra/app/plugin/core/debug/service/model/DebuggerModelServiceTest.java @@ -489,8 +489,8 @@ public class DebuggerModelServiceTest extends AbstractGhidraHeadedDebuggerGUITes focusEvents.take().get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); ModelObjectFocusedPluginEvent evt2 = focusEvents.take().get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); - assertEquals(mb.testThread1, evt1.getFocusRef()); - assertEquals(mb.testThread2, evt2.getFocusRef()); + assertEquals(mb.testThread1, evt1.getFocus()); + assertEquals(mb.testThread2, evt2.getFocus()); } @Test diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/DebugModelConventions.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/DebugModelConventions.java index 7962720918..697651b9ea 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/DebugModelConventions.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/DebugModelConventions.java @@ -21,9 +21,7 @@ import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import ghidra.async.*; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.*; -import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility; import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibilityListener; import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState; import ghidra.dbg.target.TargetObject.TargetObjectListener; @@ -52,90 +50,6 @@ public enum DebugModelConventions { return AsyncUtils.NIL; } - /** - * Fetch everything in a particular collection of refs - * - *

- * This was added as part of GP-251. Where there are uses of this method, devs should consider - * opportunities to be more selective in what they fetch. - * - * @param the type of keys - * @param refs the collection of refs - * @return the collection of objects - * @deprecated Just to draw attention to it - */ - @Deprecated(forRemoval = false) - public static CompletableFuture> fetchAll( - Map refs) { - if (refs == null) { - return AsyncUtils.nil(); - } - Map result = new HashMap<>(); - AsyncFence fence = new AsyncFence(); - for (Map.Entry ent : refs.entrySet()) { - fence.include(ent.getValue().fetch().thenAccept(obj -> { - synchronized (result) { - result.put(ent.getKey(), obj); - } - })); - } - return fence.ready().thenApply(__ -> result); - } - - /** - * Fetch all non-link refs in an attribute map - * - *

- * This was added as part of GP-251. Where there are uses of this method, devs should consider - * opportunities to be more selective in what they fetch. - * - * @param refs the attribute map - * @return the attribute map, but with non-link refs fetched as objects - * @deprecated Just to draw attention to it - */ - @Deprecated(forRemoval = false) - public static CompletableFuture> fetchObjAttrs(TargetObjectRef parent, - Map attrs) { - if (attrs == null) { - return AsyncUtils.nil(); - } - Map result = new HashMap<>(); - AsyncFence fence = new AsyncFence(); - for (Map.Entry ent : attrs.entrySet()) { - String name = ent.getKey(); - Object a = ent.getValue(); - if (!(a instanceof TargetObjectRef)) { - synchronized (result) { - result.put(name, a); - } - continue; - } - TargetObjectRef ref = (TargetObjectRef) a; - if (PathUtils.isLink(parent.getPath(), ent.getKey(), ref.getPath())) { - synchronized (result) { - result.put(name, a); - } - continue; - } - fence.include(ref.fetch().thenAccept(obj -> { - synchronized (result) { - result.put(name, obj); - } - })); - } - return fence.ready().thenApply(__ -> result); - } - - /** - * Search for a suitable object implementing the given interface, starting at a given seed. - * - * @see #findSuitable(Class, TargetObject) - */ - public static CompletableFuture findSuitable(Class iface, - TargetObjectRef seed) { - return seed.fetch().thenCompose(obj -> findSuitable(iface, obj)); - } - /** * Search for a suitable object implementing the given interface, starting at a given seed. * @@ -185,12 +99,11 @@ public enum DebugModelConventions { private static CompletableFuture findParentSuitable(Class iface, TargetObject obj) { - return obj.fetchParent().thenCompose(parent -> { - if (parent == null) { - return AsyncUtils.nil(); - } - return findSuitable(iface, parent); - }); + TargetObject parent = obj.getParent(); + if (parent == null) { + return AsyncUtils.nil(); + } + return findSuitable(iface, parent); } /** @@ -239,25 +152,21 @@ public enum DebugModelConventions { if (!(seed instanceof TargetAggregate)) { continue; } - fence.include(seed.fetchAttributes().thenCompose(attributes -> { - AsyncFence f2 = new AsyncFence(); - for (Map.Entry ent : attributes.entrySet()) { - Object val = ent.getValue(); - if (!(val instanceof TargetObjectRef)) { - continue; - } - TargetObjectRef ref = (TargetObjectRef) val; - if (PathUtils.isLink(seed.getPath(), ent.getKey(), ref.getPath())) { - // TODO: Resolve refs? Must ensure I don't re-visit anyone - continue; - } - f2.include(ref.fetch().thenAccept(obj -> { - synchronized (nextLevel) { - nextLevel.add(obj); + fence.include(seed.fetchAttributes().thenAccept(attributes -> { + synchronized (nextLevel) { + for (Map.Entry ent : attributes.entrySet()) { + Object val = ent.getValue(); + if (!(val instanceof TargetObject)) { + continue; } - })); + TargetObject obj = (TargetObject) val; + if (PathUtils.isLink(seed.getPath(), ent.getKey(), obj.getPath())) { + // TODO: Resolve links? Must ensure I don't re-visit anyone + continue; + } + nextLevel.add(obj); + } } - return f2.ready(); })); } return fence.ready().thenCompose(__ -> findInAggregate(iface, nextLevel)); @@ -299,7 +208,7 @@ public enum DebugModelConventions { complete(finish(cur)); return; case CONTINUE: - cur.fetchParent().thenAccept(this::next).exceptionally(this::exc); + next(cur.getParent()); return; case TERMINATE: complete(null); @@ -385,47 +294,43 @@ public enum DebugModelConventions { AsyncFence fence = new AsyncFence(); fence.include(seed.fetchElements().thenCompose(elements -> { AsyncFence elemFence = new AsyncFence(); - for (TargetObjectRef r : elements.values()) { - elemFence.include(r.fetch().thenCompose(e -> { + synchronized (result) { + for (TargetObject e : elements.values()) { if (iface.isInstance(e)) { - synchronized (result) { - result.add(iface.cast(e)); - } - return AsyncUtils.NIL; + result.add(iface.cast(e)); + continue; } - return collectSuccessors(e, iface).thenAccept(sub -> { + elemFence.include(collectSuccessors(e, iface).thenAccept(sub -> { synchronized (result) { result.addAll(sub); } - }); - })); + })); + } } return elemFence.ready(); })); fence.include(seed.fetchAttributes().thenCompose(attributes -> { AsyncFence attrFence = new AsyncFence(); - for (Map.Entry ent : attributes.entrySet()) { - Object obj = ent.getValue(); - if (!(obj instanceof TargetObjectRef)) { - continue; - } - TargetObjectRef r = (TargetObjectRef) obj; - if (PathUtils.isLink(seed.getPath(), ent.getKey(), r.getPath())) { - continue; - } - attrFence.include(r.fetch().thenCompose(a -> { - if (iface.isInstance(a)) { - synchronized (result) { - result.add(iface.cast(a)); - } - return AsyncUtils.NIL; + synchronized (result) { + for (Map.Entry ent : attributes.entrySet()) { + Object val = ent.getValue(); + if (!(val instanceof TargetObject)) { + continue; } - return collectSuccessors(a, iface).thenAccept(sub -> { + TargetObject a = (TargetObject) val; + if (PathUtils.isLink(seed.getPath(), ent.getKey(), a.getPath())) { + continue; + } + if (iface.isInstance(a)) { + result.add(iface.cast(a)); + continue; + } + attrFence.include(collectSuccessors(a, iface).thenAccept(sub -> { synchronized (result) { result.addAll(sub); } - }); - })); + })); + } } return attrFence.ready(); })); @@ -440,8 +345,8 @@ public enum DebugModelConventions { * @param successor the seed object * @return a future which completes with the found thread or completes with {@code null}. */ - public static CompletableFuture> findThread(TargetObject successor) { - return new AncestorTraversal>(successor) { + public static CompletableFuture findThread(TargetObject successor) { + return new AncestorTraversal(successor) { @Override protected Result check(TargetObject obj) { if (obj.isRoot()) { @@ -454,42 +359,33 @@ public enum DebugModelConventions { } @Override - protected TargetThread finish(TargetObject obj) { - return (TargetThread) obj; + protected TargetThread finish(TargetObject obj) { + return (TargetThread) obj; } }.start(); } - /** - * Find the nearest ancestor thread - * - * @see #findThread(TargetObject) - */ - public static CompletableFuture> findThread(TargetObjectRef successorRef) { - return successorRef.fetch().thenCompose(DebugModelConventions::findThread); - } - /** * Check if a target is a live process * * @param target the potential process * @return the process if live, or null */ - public static TargetProcess liveProcessOrNull(TargetObject target) { - if (!(target instanceof TargetProcess)) { + public static TargetProcess liveProcessOrNull(TargetObject target) { + if (!(target instanceof TargetProcess)) { return null; } // TODO: When schemas are introduced, we'll better handle "associated" // For now, require "implements" - if (!(target instanceof TargetExecutionStateful)) { - return (TargetProcess) target; + if (!(target instanceof TargetExecutionStateful)) { + return (TargetProcess) target; } - TargetExecutionStateful exe = (TargetExecutionStateful) target; + TargetExecutionStateful exe = (TargetExecutionStateful) target; TargetExecutionState state = exe.getExecutionState(); if (!state.isAlive()) { return null; } - return (TargetProcess) target; + return (TargetProcess) target; } /** @@ -517,10 +413,10 @@ public enum DebugModelConventions { /** * Decide whether a sub-tree (of the sub-tree) should be tracked * - * @param ref the root of the sub-tree to consider + * @param obj the root of the sub-tree to consider * @return false to ignore, true to track */ - protected abstract boolean checkDescend(TargetObjectRef ref); + protected abstract boolean checkDescend(TargetObject obj); @Override public void invalidated(TargetObject object, TargetObject branch, String reason) { @@ -572,20 +468,19 @@ public enum DebugModelConventions { } } - private void considerRef(TargetObjectRef ref) { - if (!checkDescend(ref)) { + private void considerObj(TargetObject obj) { + if (!checkDescend(obj)) { return; } - ref.fetch() - .thenAcceptAsync(this::addListenerAndConsiderSuccessors) + CompletableFuture.runAsync(() -> addListenerAndConsiderSuccessors(obj)) .exceptionally(ex -> { - Msg.error(this, "Could not fetch a ref: " + ref, ex); + Msg.error(this, "Could add to object: " + obj, ex); return null; }); } private void considerElements(TargetObject parent, - Map elements) { + Map elements) { synchronized (objects) { if (disposed) { return; @@ -594,8 +489,8 @@ public enum DebugModelConventions { return; } } - for (TargetObjectRef e : elements.values()) { - considerRef(e); + for (TargetObject e : elements.values()) { + considerObj(e); } } @@ -610,15 +505,15 @@ public enum DebugModelConventions { } for (Map.Entry ent : attributes.entrySet()) { String name = ent.getKey(); - Object a = ent.getValue(); - if (!(a instanceof TargetObjectRef)) { + Object val = ent.getValue(); + if (!(val instanceof TargetObject)) { continue; } - TargetObjectRef r = (TargetObjectRef) a; - if (PathUtils.isLink(obj.getPath(), name, r.getPath())) { + TargetObject a = (TargetObject) val; + if (PathUtils.isLink(obj.getPath(), name, a.getPath())) { continue; } - considerRef(r); + considerObj(a); } } @@ -673,12 +568,12 @@ public enum DebugModelConventions { @Override public void elementsChanged(TargetObject parent, Collection removed, - Map added) { + Map added) { runNotInSwing(this, () -> doElementsChanged(parent, removed, added), "elementsChanged"); } private void doElementsChanged(TargetObject parent, Collection removed, - Map added) { + Map added) { if (checkDescend(parent)) { considerElements(parent, added); } @@ -717,23 +612,23 @@ public enum DebugModelConventions { } } - public static class AllRequiredAccess extends AsyncReference { + public static class AllRequiredAccess extends AsyncReference { protected class ListenerForAccess implements TargetAccessibilityListener { - protected final TargetAccessConditioned access; + protected final TargetAccessConditioned access; private boolean accessible; - public ListenerForAccess(TargetAccessConditioned access) { + public ListenerForAccess(TargetAccessConditioned access) { this.access = access; this.access.addListener(this); - this.accessible = access.getAccessibility() == TargetAccessibility.ACCESSIBLE; + this.accessible = access.isAccessible(); } @Override - public void accessibilityChanged(TargetAccessConditioned object, - TargetAccessibility accessibility) { + public void accessibilityChanged(TargetAccessConditioned object, + boolean accessibility) { //Msg.debug(this, "Obj " + object + " has become " + accessibility); synchronized (AllRequiredAccess.this) { - this.accessible = accessibility == TargetAccessibility.ACCESSIBLE; + this.accessible = accessibility; // Check that all requests have been issued (fence is ready) if (listeners != null) { set(getAllAccessibility(), null); @@ -745,14 +640,14 @@ public enum DebugModelConventions { protected final List listeners; protected final AsyncFence initFence = new AsyncFence(); - public AllRequiredAccess(Collection> allReq) { + public AllRequiredAccess(Collection allReq) { Msg.debug(this, "Listening for access on: " + allReq); listeners = allReq.stream().map(ListenerForAccess::new).collect(Collectors.toList()); set(getAllAccessibility(), null); } - public TargetAccessibility getAllAccessibility() { - return TargetAccessibility.fromBool(listeners.stream().allMatch(l -> l.accessible)); + public boolean getAllAccessibility() { + return listeners.stream().allMatch(l -> l.accessible); } } @@ -776,8 +671,8 @@ public enum DebugModelConventions { * accessibility. */ public static CompletableFuture trackAccessibility(TargetObject obj) { - CompletableFuture>> collectAncestors = - collectAncestors(obj, TargetAccessConditioned.tclass); + CompletableFuture> collectAncestors = + collectAncestors(obj, TargetAccessConditioned.class); return collectAncestors.thenApply(AllRequiredAccess::new); } @@ -790,9 +685,9 @@ public enum DebugModelConventions { * @param obj the object on which to request focus * @return a future which completes when focus is granted, or exceptionally */ - public static CompletableFuture requestFocus(TargetObjectRef obj) { - CompletableFuture> futureScope = - DebugModelConventions.findSuitable(TargetFocusScope.tclass, obj); + public static CompletableFuture requestFocus(TargetObject obj) { + CompletableFuture futureScope = + DebugModelConventions.findSuitable(TargetFocusScope.class, obj); return futureScope.thenCompose(scope -> { if (scope == null) { return AsyncUtils.NIL; diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/DebuggerObjectModel.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/DebuggerObjectModel.java index 76b2aaa0bb..8cc528e159 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/DebuggerObjectModel.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/DebuggerObjectModel.java @@ -22,7 +22,6 @@ import java.util.concurrent.RejectedExecutionException; import ghidra.async.AsyncUtils; import ghidra.async.TypeSpec; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.error.*; import ghidra.dbg.target.TargetMemory; import ghidra.dbg.target.TargetObject; @@ -228,7 +227,7 @@ public interface DebuggerObjectModel { * @return the object, cast to the desired typed * @throws IllegalArgumentException if -ref- does not belong to this model */ - default T assertMine(Class cls, TargetObjectRef ref) { + default T assertMine(Class cls, TargetObject ref) { if (ref.getModel() != this) { throw new IllegalArgumentException( "TargetObject (or ref)" + ref + " does not belong to this model"); @@ -236,25 +235,6 @@ public interface DebuggerObjectModel { return cls.cast(ref); } - /** - * Create a reference to the given path in this model - * - *

- * Note that the path is not checked until the object is fetched. Thus, it is possible for a - * reference to refer to a non-existent object. - * - * @param path the path of the object - * @return a reference to the object - */ - public TargetObjectRef createRef(List path); - - /** - * @see #createRef(List) - */ - public default TargetObjectRef createRef(String... path) { - return createRef(List.of(path)); - } - /** * Fetch the attributes of a given model path * @@ -298,7 +278,7 @@ public interface DebuggerObjectModel { * @param refresh true to invalidate caches involved in handling this request * @return a future map of elements */ - public CompletableFuture> fetchObjectElements( + public CompletableFuture> fetchObjectElements( List path, boolean refresh); /** @@ -306,7 +286,7 @@ public interface DebuggerObjectModel { * * @see #fetchObjectElements(List, boolean) */ - public default CompletableFuture> fetchObjectElements( + public default CompletableFuture> fetchObjectElements( List path) { return fetchObjectElements(path, false); } @@ -314,7 +294,7 @@ public interface DebuggerObjectModel { /** * @see #fetchObjectElements(List) */ - public default CompletableFuture> fetchObjectElements( + public default CompletableFuture> fetchObjectElements( String... path) { return fetchObjectElements(List.of(path)); } @@ -434,18 +414,14 @@ public interface DebuggerObjectModel { */ public default CompletableFuture fetchModelObject(List path, boolean refresh) { - return fetchModelValue(path, refresh).thenCompose(v -> { + return fetchModelValue(path, refresh).thenApply(v -> { if (v == null) { - return AsyncUtils.nil(); + return null; } - if (!(v instanceof TargetObjectRef)) { - throw DebuggerModelTypeException.typeRequired(v, path, TargetObjectRef.class); - } - TargetObjectRef ref = (TargetObjectRef) v; - if (path.equals(ref.getPath()) && !(v instanceof TargetObject)) { + if (!(v instanceof TargetObject)) { throw DebuggerModelTypeException.typeRequired(v, path, TargetObject.class); } - return ref.fetch(); + return (TargetObject) v; }); } @@ -479,6 +455,10 @@ public interface DebuggerObjectModel { return fetchModelObject(List.of(path)); } + public default TargetObject getModelObject(String... path) { + return getModelObject(List.of(path)); + } + /** * Fetch the attribute with the given path * diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/AbstractDebuggerObjectModel.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/AbstractDebuggerObjectModel.java index 520ea90be8..ef30c9dc7e 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/AbstractDebuggerObjectModel.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/AbstractDebuggerObjectModel.java @@ -20,7 +20,6 @@ import java.util.concurrent.*; import ghidra.async.AsyncUtils; import ghidra.dbg.DebuggerModelListener; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.TargetObject; import ghidra.dbg.util.PathUtils; import ghidra.util.datastruct.ListenerSet; @@ -101,14 +100,14 @@ public abstract class AbstractDebuggerObjectModel implements SpiDebuggerObjectMo return; } for (Object val : object.getCachedAttributes().values()) { - if (!(val instanceof TargetObjectRef)) { + if (!(val instanceof TargetObject)) { continue; } assert val instanceof SpiTargetObject; replayAddEvents(listener, (SpiTargetObject) val, visited); } listener.attributesChanged(object, List.of(), object.getCachedAttributes()); - for (TargetObjectRef elem : object.getCachedElements().values()) { + for (TargetObject elem : object.getCachedElements().values()) { assert elem instanceof SpiTargetObject; replayAddEvents(listener, (SpiTargetObject) elem, visited); } @@ -175,7 +174,7 @@ public abstract class AbstractDebuggerObjectModel implements SpiDebuggerObjectMo if (existing == null) { return; } - TargetObjectRef parent = existing.getParent(); + TargetObject parent = existing.getParent(); if (parent == null) { assert existing == root; throw new IllegalStateException("Cannot replace the root"); diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/AbstractTargetObject.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/AbstractTargetObject.java index 2559b4f3ca..f14a2dbe75 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/AbstractTargetObject.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/AbstractTargetObject.java @@ -20,8 +20,9 @@ import java.util.*; import java.util.concurrent.CompletableFuture; import ghidra.dbg.DebuggerObjectModel; +import ghidra.dbg.agent.AbstractTargetObject.ProxyFactory; import ghidra.dbg.target.TargetObject; -import ghidra.dbg.target.TypedTargetObject; +import ghidra.dbg.target.TargetObject.TargetObjectListener; import ghidra.dbg.target.schema.EnumerableTargetObjectSchema; import ghidra.dbg.target.schema.TargetObjectSchema; import ghidra.dbg.util.PathUtils; @@ -55,7 +56,6 @@ public abstract class AbstractTargetObject

protected final AbstractDebuggerObjectModel model; protected final SpiTargetObject proxy; protected final P parent; - protected final CompletableFuture

completedParent; protected final List path; protected final int hash; protected final String typeHint; @@ -63,7 +63,7 @@ public abstract class AbstractTargetObject

protected boolean valid = true; - // TODO: Remove both of these, and just do invocations on model's listeners + // TODO: Remove these, and just do invocations on model's listeners? protected final ListenerSet listeners; public AbstractTargetObject(ProxyFactory proxyFactory, I proxyInfo, @@ -73,7 +73,6 @@ public abstract class AbstractTargetObject

this.model = model; listeners.addChained(model.listeners); this.parent = parent; - this.completedParent = CompletableFuture.completedFuture(parent); if (parent == null) { this.path = key == null ? List.of() : List.of(key); } @@ -126,7 +125,7 @@ public abstract class AbstractTargetObject

} @Override - public > T as(Class iface) { + public T as(Class iface) { return DebuggerObjectModel.requireIface(iface, getProxy(), path); } @@ -238,22 +237,6 @@ public abstract class AbstractTargetObject

return path; } - @Override - public CompletableFuture fetchParent() { - return completedParent; - } - - /** - * Get the parent immediately - * - * Since the parent is fixed and known to the implementation, it can be retrieved immediately. - * - * @return the parent - */ - public P getImplParent() { - return parent; - } - protected void doInvalidate(TargetObject branch, String reason) { valid = false; model.objectInvalidated(getProxy()); diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/DefaultTargetObject.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/DefaultTargetObject.java index 5fc660f4de..c60763959d 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/DefaultTargetObject.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/DefaultTargetObject.java @@ -20,7 +20,6 @@ import java.util.concurrent.CompletableFuture; import ghidra.async.AsyncUtils; import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.TargetObject; import ghidra.dbg.target.schema.TargetObjectSchema; import ghidra.dbg.util.CollectionUtils.Delta; @@ -403,9 +402,9 @@ public class DefaultTargetObject } protected Map combineAttributes( - Collection canonicalObjects, Map linksAndValues) { + Collection canonicalObjects, Map linksAndValues) { Map asMap = new LinkedHashMap<>(); - for (TargetObjectRef ca : canonicalObjects) { + for (TargetObject ca : canonicalObjects) { if (!PathUtils.parent(ca.getPath()).equals(getPath())) { Msg.error(this, "Link found in canonical attributes: " + ca); } @@ -413,13 +412,13 @@ public class DefaultTargetObject } for (Map.Entry ent : linksAndValues.entrySet()) { Object av = ent.getValue(); - if (av instanceof TargetObjectRef) { - TargetObjectRef link = (TargetObjectRef) av; + /*if (av instanceof TargetObject) { + TargetObject link = (TargetObject) av; if (!PathUtils.isLink(getPath(), ent.getKey(), link.getPath())) { //Msg.error(this, "Canonical attribute found in links: " + ent); } - } - asMap.put(ent.getKey(), ent.getValue()); + }*/ + asMap.put(ent.getKey(), av); } return asMap; } diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/DefaultTargetObjectRef.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/DefaultTargetObjectRef.java deleted file mode 100644 index 818222ca64..0000000000 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/DefaultTargetObjectRef.java +++ /dev/null @@ -1,58 +0,0 @@ -/* ### - * 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.dbg.agent; - -import java.util.List; - -import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.attributes.TargetObjectRef; - -public class DefaultTargetObjectRef implements TargetObjectRef { - private final DebuggerObjectModel model; - private final List path; - private final int hash; - - public DefaultTargetObjectRef(DebuggerObjectModel model, List path) { - this.model = model; - this.path = path; - this.hash = computeHashCode(); - } - - @Override - public boolean equals(Object obj) { - return doEquals(obj); - } - - @Override - public int hashCode() { - return hash; - } - - @Override - public DebuggerObjectModel getModel() { - return model; - } - - @Override - public List getPath() { - return path; - } - - @Override - public String toString() { - return ""; - } -} diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/InvalidatableTargetObjectIf.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/InvalidatableTargetObjectIf.java index 2509722c60..cf36a939fc 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/InvalidatableTargetObjectIf.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/InvalidatableTargetObjectIf.java @@ -17,7 +17,6 @@ package ghidra.dbg.agent; import java.util.*; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.target.TargetObject; /** @@ -42,7 +41,7 @@ import ghidra.dbg.target.TargetObject; * delegate derives from {@link AbstractTargetObject}, the proxy must include this interface, and * the call need only be forwarded to the delegate. */ -public interface InvalidatableTargetObjectIf extends TargetObjectRef { +public interface InvalidatableTargetObjectIf extends TargetObject { /** * Invalidate this subtree diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/SpiDebuggerObjectModel.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/SpiDebuggerObjectModel.java index 7f0ef5114a..44ed7b105b 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/SpiDebuggerObjectModel.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/agent/SpiDebuggerObjectModel.java @@ -21,7 +21,6 @@ import java.util.concurrent.CompletableFuture; import ghidra.async.AsyncUtils; import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.attributes.TargetObjectRef; import ghidra.dbg.error.DebuggerModelTypeException; import ghidra.dbg.target.TargetObject; import ghidra.dbg.util.PathUtils; @@ -38,11 +37,6 @@ public interface SpiDebuggerObjectModel extends DebuggerObjectModel { return AsyncUtils.NIL; } - @Override - default TargetObjectRef createRef(List path) { - return new DefaultTargetObjectRef(this, path); - } - public static CompletableFuture fetchFreshChild(TargetObject obj, String key) { if (PathUtils.isIndex(key)) { return obj.fetchElements(true).thenApply(elements -> { @@ -71,29 +65,27 @@ public interface SpiDebuggerObjectModel extends DebuggerObjectModel { if (c == null) { return AsyncUtils.nil(); } - if (!(c instanceof TargetObjectRef)) { + if (!(c instanceof TargetObject)) { if (path.size() == 1) { return CompletableFuture.completedFuture(c); } else { List p = PathUtils.extend(obj.getPath(), key); - throw DebuggerModelTypeException.typeRequired(c, p, TargetObjectRef.class); + throw DebuggerModelTypeException.typeRequired(c, p, TargetObject.class); } } - TargetObjectRef childRef = (TargetObjectRef) c; - if (PathUtils.isLink(obj.getPath(), key, childRef.getPath()) && !followLinks) { + TargetObject child = (TargetObject) c; + if (PathUtils.isLink(obj.getPath(), key, child.getPath()) && !followLinks) { if (path.size() == 1) { return CompletableFuture.completedFuture(c); } else { List p = PathUtils.extend(obj.getPath(), key); - throw DebuggerModelTypeException.linkForbidden(childRef, p); + throw DebuggerModelTypeException.linkForbidden(child, p); } } - return childRef.fetch().thenCompose(childObj -> { - List remains = path.subList(1, path.size()); - return fetchSuccessorValue(childObj, remains, refresh, followLinks); - }); + List remains = path.subList(1, path.size()); + return fetchSuccessorValue(child, remains, refresh, followLinks); }); } @@ -110,7 +102,7 @@ public interface SpiDebuggerObjectModel extends DebuggerObjectModel { } @Override - public default CompletableFuture> fetchObjectElements( + public default CompletableFuture> fetchObjectElements( List path, boolean refresh) { return fetchModelObject(path).thenCompose(obj -> { if (obj == null) { diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TargetNamedDataTypeRef.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TargetNamedDataTypeRef.java deleted file mode 100644 index 020a89a87e..0000000000 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TargetNamedDataTypeRef.java +++ /dev/null @@ -1,22 +0,0 @@ -/* ### - * 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.dbg.attributes; - -import ghidra.dbg.target.TargetNamedDataType; - -public interface TargetNamedDataTypeRef> - extends TypedTargetObjectRef, TargetDataType { -} diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TargetObjectList.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TargetObjectList.java new file mode 100644 index 0000000000..512a807b0e --- /dev/null +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TargetObjectList.java @@ -0,0 +1,54 @@ +/* ### + * 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.dbg.attributes; + +import java.util.*; + +import ghidra.dbg.target.TargetObject; + +public interface TargetObjectList extends List { + public static class EmptyTargetObjectRefList extends AbstractList + implements TargetObjectList { + @Override + public T get(int index) { + return null; + } + + @Override + public int size() { + return 0; + } + } + + public static class DefaultTargetObjectList extends ArrayList + implements TargetObjectList { + // Nothing to add + } + + public static final TargetObjectList EMPTY = new EmptyTargetObjectRefList<>(); + + @SuppressWarnings("unchecked") + public static TargetObjectList of() { + return (TargetObjectList) EMPTY; + } + + @SuppressWarnings("unchecked") + public static TargetObjectList of(T... e) { + DefaultTargetObjectList list = new DefaultTargetObjectList<>(); + list.addAll(List.of(e)); + return list; + } +} diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TargetObjectRef.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TargetObjectRef.java deleted file mode 100644 index 882b66f2ba..0000000000 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TargetObjectRef.java +++ /dev/null @@ -1,561 +0,0 @@ -/* ### - * 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.dbg.attributes; - -import java.util.*; -import java.util.Map.Entry; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.StringUtils; - -import ghidra.async.AsyncFence; -import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.error.DebuggerModelTypeException; -import ghidra.dbg.target.*; -import ghidra.dbg.util.PathUtils; -import ghidra.dbg.util.PathUtils.PathComparator; -import ghidra.dbg.util.PathUtils.TargetObjectKeyComparator; - -/** - * A reference (or stub) to a target object - * - *

- * These can be constructed and manipulated client-side, without querying the agent. However, a - * reference is not guaranteed to refer to a valid object. - * - *

- * Note that it is OK for more than one {@link TargetObjectRef} to refer to the same path. These - * objects must override {@link #equals(Object)} and {@link #hashCode()}. - * - * @deprecated Use {@link TargetObjectPath} for model-bound path manipulation instead. Models should - * not longer return nor push stubs, but actual objects. - */ -@Deprecated -public interface TargetObjectRef extends Comparable { - - /** - * Check for target object equality - * - *

- * Because interfaces cannot provide default implementations of {@link #equals(Object)}, this - * methods provides a means of quickly implementing it within a class. Because everything that - * constitutes target object equality is contained in the reference (model, path), there should - * never be a need to perform more comparison than is provided here. - * - * @param obj the other object - * @return true if they are equal - */ - default boolean doEquals(Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof TargetObjectRef)) { - return false; - } - TargetObjectRef that = (TargetObjectRef) obj; - return this.getModel() == that.getModel() && - Objects.equals(this.getPath(), that.getPath()); - } - - /** - * Pre-compute this object's hash code - * - *

- * Because interfaces cannot provide default implementations of {@link #hashCode()}, this method - * provides a means of quickly implementing it within a class. Because everything that - * constitutes target object equality is immutable and contained in the reference - * (model, path), this hash should be pre-computed a construction. There should never be a need - * to incorporate more fields into the hash than is incorporated here. - * - * @return the hash - */ - default int computeHashCode() { - return System.identityHashCode(getModel()) * 31 + Objects.hash(getPath().toArray()); - } - - /** - * {@inheritDoc} - * - *

- * A friendly reminder to override - * - * @see #doEquals(Object) - */ - @Override - boolean equals(Object obj); - - /** - * {@inheritDoc} - * - *

- * A friendly reminder to override - * - * @see #computeHashCode() - */ - @Override - int hashCode(); - - /** - * {@inheritDoc} - * - *

- * Along with {@link #doEquals(Object)} and {@link #computeHashCode()}, these obey the Rule of - * Three, comparing first the objects' models (by name, then identity), then their paths. Like - * the other methods, this incorporates everything that constitutes a unique target object. - * There should never be a need to override or otherwise extend this. - */ - @Override - default int compareTo(TargetObjectRef that) { - if (this == that) { - return 0; - } - DebuggerObjectModel thisModel = this.getModel(); - DebuggerObjectModel thatModel = that.getModel(); - if (thisModel != thatModel) { - if (thisModel == null) { - return -1; - } - if (thatModel == null) { - return 1; - } - int result = thisModel.toString().compareTo(thatModel.toString()); - if (result == 0) { - return Integer.compare( - System.identityHashCode(thisModel), - System.identityHashCode(thatModel)); - } - return result; - } - return PathComparator.KEYED.compare(this.getPath(), that.getPath()); - } - - /** - * Get the actual object - * - * @return a future which completes with the object - * @deprecated Just cast straight to {@link TargetObject}. There should never exist a - * {@link TargetObjectRef} that is not already a {@link TargetObject}, anymore. - */ - @Deprecated - public default CompletableFuture fetch() { - return getModel().fetchModelObject(getPath()); - } - - /** - * Cast the reference (or object) to the requested interface - * - *

- * Upon retrieval, or if the object is already available locally (by implementation or by - * proxy), the object is checked for the requested interface and cast appropriately. - * - * @param cls the class for the required interface. Use {@code tclass} to satisfy the recursive - * type parameter. - * @return the reference (or object) conforming to the required type - * @throws DebuggerModelTypeException if the object is available locally but does not support - * the desired interface - */ - public default > TypedTargetObjectRef as(Class cls) { - return TypedTargetObjectRef.casting(cls, this); - } - - /** - * Get the model to which this object belongs - * - * @return the model - */ - public DebuggerObjectModel getModel(); - - /** - * Get the path (i.e., list of names from root to this object). - * - *

- * Every object must have a unique path. Parts of the path which are indices, i.e., which - * navigate the elements, are enclosed in brackets @{code []}. Parts which navigate attributes - * are simply the attribute name. - * - *

- * More than just a location, the path provides a hint to the object's scope of applicability. - * For example, a {@link TargetMemory} attribute of a process is assumed accessible to every - * thread of that process, since those threads are descendants. - * - * @implNote it would be wise to cache the result of this computation. If the object has a - * strict location, then the implementation should just return it directly. - * - * @return the canonical path of the object - */ - public List getPath(); - - /** - * Get the path joined by the given separator - * - *

- * Note that no check is applied to guarantee the path separator does not appear in an element - * name. - * - * @see #getPath() - * @param sep the path separator - * @return the joined path - * @deprecated use {@link PathUtils#toString()} instead - */ - @Deprecated - public default String getJoinedPath(String sep) { - return StringUtils.join(getPath(), sep); - } - - /** - * Get the key for this object - * - *

- * The object's key should be that assigned by the actual debugger, if applicable. If this is an - * element, the key should include the brackets {@code []}. If it is an attribute, it should - * simply be the name. - * - * @return the key, or {@code null} if this is the root - */ - public default String getName() { - return PathUtils.getKey(getPath()); - } - - /** - * Get the index for this object - * - * @return they index, or {@code null} if this is the root - * @throws IllegalArgumentException if this object is not an element of its parent - */ - public default String getIndex() { - return PathUtils.getIndex(getPath()); - } - - /** - * Check if this is the root target debug object - * - * @return true if root, false otherwise - */ - public default boolean isRoot() { - return getPath().isEmpty(); - } - - /** - * Get a reference to the parent of this reference - * - * @return the parent reference, or {@code null} if this refers to the root - */ - public default TargetObjectRef getParent() { - List parentPath = PathUtils.parent(getPath()); - if (parentPath == null) { - return null; - } - return getModel().createRef(parentPath); - } - - /** - * Fetch all the attributes of this object - * - *

- * Attributes are usually keyed by a string, and the types are typically not uniform. Some - * attributes are primitives, while others are other target objects. - * - *

- * Note, for objects, {@link TargetObject#getCachedAttributes()} should be sufficient to get an - * up-to-date view of the attributes, since the model should be pushing attribute updates to the - * object automatically. {@code fetchAttributes} should only be invoked on references, or in the - * rare case the client needs to ensure the attributes are fresh. - * - * @param refresh true to invalidate all caches involved in handling this request - * @return a future which completes with a name-value map of attributes - */ - public default CompletableFuture> fetchAttributes(boolean refresh) { - return getModel().fetchObjectAttributes(getPath(), refresh); - } - - /** - * Fetch all attributes of this object, without refreshing - * - * @see #fetchAttributes(boolean) - */ - public default CompletableFuture> fetchAttributes() { - return fetchAttributes(false); - } - - /** - * Fetch an attribute by name - * - * @see #fetchAttributes() - * @see PathUtils#isInvocation(String) - * @implNote for attributes representing method invocations, the name will not likely be in the - * map given by {@link #fetchAttributes()}. It will be generated upon request. The - * implementation should cache the generated attribute until the attribute cache is - * refreshed. TODO: Even if the method is likely to return a different value on its - * next invocation? Yes, I think so. The user should manually refresh in those cases. - * @return a future which completes with the attribute or with {@code null} if the attribute - * does not exist - */ - public default CompletableFuture fetchAttribute(String name) { - if (!PathUtils.isInvocation(name)) { - return fetchAttributes().thenApply(m -> m.get(name)); - } - // TODO: Make a type for the invocation and parse arguments better? - Entry invocation = PathUtils.parseInvocation(name); - return fetchAttribute(invocation.getKey()).thenCompose(obj -> { - if (!(obj instanceof TargetMethod)) { - throw new DebuggerModelTypeException(invocation.getKey() + " is not a method"); - } - TargetMethod method = (TargetMethod) obj; - // Just blindly invoke and let it sort it out - return method.invoke(Map.of("arg", invocation.getValue())); - }); - } - - /** - * Fetch all the elements of this object - * - *

- * Elements are usually keyed numerically, but allows strings for flexibility. They values are - * target objects, uniform in type, and should generally share the same attributes. The keys - * must not contain the brackets {@code []}. Implementations should ensure that the elements are - * presented in order by key -- not necessarily lexicographically. To ensure clients can easily - * maintain correct sorting, the recommendation is to present the keys as follows: Keys should - * be the numeric value encoded as strings in base 10 or base 16 as appropriate, using the least - * number of digits needed. While rarely used, a comma-separated list of indices may be - * presented. Key comparators should separate the indices, attempt to convert each to a number, - * and then sort using the left-most indices first. Indices which cannot be converted to numbers - * should be sorted lexicographically. It is the implementation's responsibility to ensure all - * indices follow a consistent scheme. - * - * @param refresh true to invalidate all caches involved in handling this request - * @return a future which completes with a index-value map of elements - */ - public default CompletableFuture> fetchElements( - boolean refresh) { - return getModel().fetchObjectElements(getPath(), refresh); - } - - /** - * Fetch all elements of this object, without refreshing - * - * @see #fetchElements(boolean) - */ - public default CompletableFuture> fetchElements() { - return fetchElements(false); - } - - /** - * Fetch all children (elements and attributes) of this object - * - *

- * Note that keys for element indices here must contain the brackets {@code []} to distinguish - * them from attribute names. - * - * @see #fetchElements() - * @see #fetchAttributes() - * - * @param refresh true to invalidate all caches involved in handling this request - * @return a future which completes with a name-value map of children - */ - public default CompletableFuture> fetchChildren(boolean refresh) { - AsyncFence fence = new AsyncFence(); - Map children = new TreeMap<>(TargetObjectKeyComparator.CHILD); - fence.include(fetchElements(refresh).thenAccept(elements -> { - for (Map.Entry ent : elements.entrySet()) { - children.put(PathUtils.makeKey(ent.getKey()), ent.getValue()); - } - })); - fence.include(fetchAttributes(refresh).thenAccept(children::putAll)); - return fence.ready().thenApply(__ -> children); - } - - /** - * Fetch all children of this object, without refreshing - * - * @see #fetchChildren(boolean) - */ - public default CompletableFuture> fetchChildren() { - return fetchChildren(false); - } - - /** - * Fetch an element by its index - * - * @return a future which completes with the element or with {@code null} if it does not exist - */ - public default CompletableFuture fetchElement(String index) { - return getModel().fetchModelObject(PathUtils.index(getPath(), index)); - } - - /** - * Fetch a child (element or attribute) by key (index or name, respectively) - * - *

- * Indices are distinguished from names by the presence or absence of brackets {@code []}. If - * the key is a bracket-enclosed index, this will retrieve a child, otherwise, it will retrieve - * an attribute. - * - * @see #fetchAttribute(String) - * @see #fetchElement(String) - * @return a future which completes with the child - */ - public default CompletableFuture fetchChild(String key) { - if (PathUtils.isIndex(key)) { - return fetchElement(PathUtils.parseIndex(key)); - } - return fetchAttribute(key); - } - - /** - * Fetch the children (elements and attributes) of this object which support the requested - * interface - * - *

- * If no children support the given interface, the result is the empty set. - * - * @param the requested interface - * @param iface the class of the requested interface - * @return a future which completes with a name-value map of children supporting the given - * interface - */ - public default // - CompletableFuture> fetchChildrenSupporting( - Class iface) { - return fetchChildren().thenApply(m -> m.entrySet() - .stream() - .filter(e -> iface.isAssignableFrom(e.getValue().getClass())) - .collect(Collectors.toMap(Entry::getKey, e -> iface.cast(e.getValue())))); - } - - /** - * Fetch the value at the given sub-path from this object - * - *

- * Extend this reference's path with the given sub-path and request that value from the same - * model. - * - * @param sub the sub-path to the value - * @return a future which completes with the value or with {@code null} if the path does not - * exist - */ - public default CompletableFuture fetchValue(List sub) { - return getModel().fetchModelObject(PathUtils.extend(getPath(), sub)); - } - - /** - * @see #fetchValue(List) - */ - public default CompletableFuture fetchValue(String... sub) { - return fetchValue(List.of(sub)); - } - - /** - * Fetch the successor object at the given sub-path from this object - * - *

- * Extend this reference's path with the given sub-path and request that object from the same - * model. - * - * @param sub the sub-path to the successor - * @return a future which completes with the object or with {@code null} if it does not exist - */ - public default CompletableFuture fetchSuccessor(List sub) { - return getModel().fetchModelObject(PathUtils.extend(getPath(), sub)); - } - - /** - * @see #fetchSuccessor(List) - */ - public default CompletableFuture fetchSuccessor(String... sub) { - return fetchSuccessor(List.of(sub)); - } - - /** - * Get a reference to a successor of this object - * - *

- * Extend this reference's path with the given sub-path, creating a new reference in the same - * model. This is mere path manipulation. The referenced object may not exist. - * - * @param sub the sub-path to the successor - * @return a reference to the successor - */ - public default TargetObjectRef getSuccessor(List sub) { - return getModel().createRef(PathUtils.extend(getPath(), sub)); - } - - /** - * @see #getSuccessor(List) - */ - public default TargetObjectRef getSuccessor(String... sub) { - return getSuccessor(List.of(sub)); - } - - /** - * Fetch the attributes of the model at the given sub-path from this object - * - * @param sub the sub-path to the successor whose attributes to list - * @return a future map of attributes - */ - public default CompletableFuture> fetchSubAttributes( - List sub) { - return getModel().fetchObjectAttributes(PathUtils.extend(getPath(), sub)); - } - - /** - * @see #fetchSubAttributes(List) - */ - public default CompletableFuture> fetchSubAttributes( - String... sub) { - return fetchSubAttributes(List.of(sub)); - } - - /** - * Fetch the attribute of a successor object, using a sub-path from this object - * - *

- * Extends this object's path with the given sub-path and request that attribute from the same - * model. - * - * @param sub the sub-path to the attribute - * @return a future which completes with the value or with {@code null} if it does not exist - */ - public default CompletableFuture fetchSubAttribute(List sub) { - return getModel().fetchObjectAttribute(PathUtils.extend(getPath(), sub)); - } - - /** - * @see #fetchSubAttribute(List) - */ - public default CompletableFuture fetchSubAttribute(String... sub) { - return fetchSubAttribute(List.of(sub)); - } - - /** - * Fetch the elements of the model at the given sub-path from this object - * - * @param sub the sub-path to the successor whose elements to list - * @return a future map of elements - */ - public default CompletableFuture> fetchSubElements( - List sub) { - return getModel().fetchObjectElements(PathUtils.extend(getPath(), sub)); - } - - /** - * @see #fetchSubElements(List) - */ - public default CompletableFuture> fetchSubElements( - String... sub) { - return fetchSubElements(List.of(sub)); - } -} diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TargetObjectRefList.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TargetObjectRefList.java deleted file mode 100644 index 0c64ed5130..0000000000 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TargetObjectRefList.java +++ /dev/null @@ -1,66 +0,0 @@ -/* ### - * 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.dbg.attributes; - -import java.util.*; -import java.util.concurrent.CompletableFuture; - -import ghidra.async.AsyncFence; -import ghidra.dbg.target.TargetObject; - -public interface TargetObjectRefList extends List { - public static class EmptyTargetObjectRefList extends AbstractList - implements TargetObjectRefList { - @Override - public T get(int index) { - return null; - } - - @Override - public int size() { - return 0; - } - } - - public static class DefaultTargetObjectRefList extends ArrayList - implements TargetObjectRefList { - // Nothing to add - } - - public static final TargetObjectRefList EMPTY = new EmptyTargetObjectRefList<>(); - - @SuppressWarnings("unchecked") - public static TargetObjectRefList of() { - return (TargetObjectRefList) EMPTY; - } - - @SuppressWarnings("unchecked") - public static TargetObjectRefList of(T... e) { - DefaultTargetObjectRefList list = new DefaultTargetObjectRefList<>(); - list.addAll(List.of(e)); - return list; - } - - public default CompletableFuture> fetchAll() { - AsyncFence fence = new AsyncFence(); - TargetObject[] result = new TargetObject[size()]; - for (int i = 0; i < result.length; i++) { - int j = i; - fence.include(get(i).fetch().thenAccept(obj -> result[j] = obj)); - } - return fence.ready().thenApply(__ -> Arrays.asList(result)); - } -} diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TypedTargetObjectRef.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TypedTargetObjectRef.java deleted file mode 100644 index 63ca074c26..0000000000 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TypedTargetObjectRef.java +++ /dev/null @@ -1,81 +0,0 @@ -/* ### - * 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.dbg.attributes; - -import java.util.List; -import java.util.concurrent.CompletableFuture; - -import ghidra.dbg.DebuggerObjectModel; -import ghidra.dbg.target.TargetObject; -import ghidra.dbg.target.TypedTargetObject; - -/** - * A reference having a known or expected type - * - * @param the type - * @deprecated I don't think this adds any real value. - */ -@Deprecated(forRemoval = true) -public interface TypedTargetObjectRef extends TargetObjectRef { - public class CastingTargetObjectRef> - implements TypedTargetObjectRef { - - private final Class cls; - private final TargetObjectRef ref; - - public CastingTargetObjectRef(Class cls, TargetObjectRef ref) { - this.cls = cls; - this.ref = ref; - } - - @Override - public boolean equals(Object obj) { - return ref.equals(obj); - } - - @Override - public int hashCode() { - return ref.hashCode(); - } - - @Override - public DebuggerObjectModel getModel() { - return ref.getModel(); - } - - @Override - public List getPath() { - return ref.getPath(); - } - - @Override - public CompletableFuture fetch() { - return ref.fetch().thenApply(o -> o.as(cls)); - } - } - - public static > TypedTargetObjectRef casting(Class cls, - TargetObjectRef ref) { - if (ref instanceof CastingTargetObjectRef) { - CastingTargetObjectRef casting = (CastingTargetObjectRef) ref; - return new CastingTargetObjectRef<>(cls, casting.ref); - } - return new CastingTargetObjectRef<>(cls, ref); - } - - @Override - CompletableFuture fetch(); -} diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TypedTargetObjectRefList.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TypedTargetObjectRefList.java deleted file mode 100644 index 05f8afd87f..0000000000 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/attributes/TypedTargetObjectRefList.java +++ /dev/null @@ -1,30 +0,0 @@ -/* ### - * 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.dbg.attributes; - -import java.util.List; -import java.util.concurrent.CompletableFuture; - -import ghidra.dbg.target.TypedTargetObject; - -public interface TypedTargetObjectRefList> - extends TargetObjectRefList> { - @Override - @SuppressWarnings("unchecked") - default CompletableFuture> fetchAll() { - return (CompletableFuture>) TargetObjectRefList.super.fetchAll(); - } -} diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/error/DebuggerModelAccessException.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/error/DebuggerModelAccessException.java index 765ec6cfcb..7348a015af 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/error/DebuggerModelAccessException.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/error/DebuggerModelAccessException.java @@ -15,8 +15,7 @@ */ package ghidra.dbg.error; -import ghidra.dbg.attributes.TargetObjectRef; -import ghidra.dbg.target.TargetAccessConditioned.TargetAccessibility; +import ghidra.dbg.target.TargetObject; import ghidra.dbg.util.PathUtils; /** @@ -38,7 +37,7 @@ public class DebuggerModelAccessException extends DebuggerRuntimeException { super(message); } - public DebuggerModelAccessException(TargetObjectRef ref) { - super("Model path " + PathUtils.toString(ref.getPath()) + " is not accessible"); + public DebuggerModelAccessException(TargetObject object) { + super("Model path " + PathUtils.toString(object.getPath()) + " is not accessible"); } } diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/error/DebuggerModelTypeException.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/error/DebuggerModelTypeException.java index f017e963c6..c67581e75f 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/error/DebuggerModelTypeException.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/error/DebuggerModelTypeException.java @@ -17,7 +17,7 @@ package ghidra.dbg.error; import java.util.List; -import ghidra.dbg.attributes.TargetObjectRef; +import ghidra.dbg.target.TargetObject; import ghidra.dbg.util.PathUtils; /** @@ -33,7 +33,7 @@ public class DebuggerModelTypeException extends DebuggerRuntimeException { got.getClass().getSimpleName() + ")"); } - public static DebuggerModelTypeException linkForbidden(TargetObjectRef got, List path) { + public static DebuggerModelTypeException linkForbidden(TargetObject got, List path) { return new DebuggerModelTypeException("Path " + PathUtils.toString(path) + " is a link to " + PathUtils.toString(got.getPath()) + ", but following links was forbidden"); diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetAccessConditioned.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetAccessConditioned.java index 53ac7058b0..2b51020e27 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetAccessConditioned.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetAccessConditioned.java @@ -15,12 +15,8 @@ */ package ghidra.dbg.target; -import org.apache.commons.lang3.reflect.TypeLiteral; - import ghidra.dbg.DebuggerTargetObjectIface; import ghidra.dbg.target.schema.TargetAttributeType; -import ghidra.dbg.util.ValueUtils; -import ghidra.lifecycle.Internal; /** * A target object which may not be accessible @@ -33,53 +29,17 @@ import ghidra.lifecycle.Internal; * two objects. */ @DebuggerTargetObjectIface("Access") -public interface TargetAccessConditioned> - extends TypedTargetObject { - enum Private { - ; - private abstract class Cls implements TargetAccessConditioned { - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - Class tclass = (Class) TargetAccessConditioned.class; - - TypeLiteral> type = new TypeLiteral<>() {}; +public interface TargetAccessConditioned extends TargetObject { String ACCESSIBLE_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "accessible"; - /** - * TODO: I'm seriously considering removing this - */ - public enum TargetAccessibility { - ACCESSIBLE, INACCESSIBLE; - - public static TargetAccessibility fromBool(boolean accessible) { - return accessible ? TargetAccessibility.ACCESSIBLE : TargetAccessibility.INACCESSIBLE; - } - } - - @Internal - default TargetAccessibility fromObj(Object obj) { - if (obj == null) { - return TargetAccessibility.ACCESSIBLE; - } - return TargetAccessibility - .fromBool( - ValueUtils.expectBoolean(obj, this, ACCESSIBLE_ATTRIBUTE_NAME, true, true)); - } - @TargetAttributeType(name = ACCESSIBLE_ATTRIBUTE_NAME, required = true, hidden = true) - public default Boolean isAccessible() { + public default boolean isAccessible() { return getTypedAttributeNowByName(ACCESSIBLE_ATTRIBUTE_NAME, Boolean.class, true); } - public default TargetAccessibility getAccessibility() { - return fromObj(getCachedAttributes().get(ACCESSIBLE_ATTRIBUTE_NAME)); - } - public interface TargetAccessibilityListener extends TargetObjectListener { - default void accessibilityChanged(TargetAccessConditioned object, - TargetAccessibility accessibility) { + default void accessibilityChanged(TargetAccessConditioned object, + boolean accessibe) { } } } diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetAttachable.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetAttachable.java index 235cc87ced..1681590dca 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetAttachable.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetAttachable.java @@ -21,15 +21,6 @@ import ghidra.dbg.DebuggerTargetObjectIface; * An object, usually process, to which the debugger can attach */ @DebuggerTargetObjectIface("Attachable") -public interface TargetAttachable> extends TypedTargetObject { - enum Private { - ; - private abstract class Cls implements TargetAttachable { - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - Class tclass = (Class) TargetAttachable.class; - +public interface TargetAttachable extends TargetObject { // These are fairly opaque } diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetAttacher.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetAttacher.java index 42c27998c3..1f935f97a5 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetAttacher.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetAttacher.java @@ -19,7 +19,6 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import ghidra.dbg.DebuggerTargetObjectIface; -import ghidra.dbg.attributes.TypedTargetObjectRef; import ghidra.dbg.target.schema.TargetAttributeType; import ghidra.dbg.util.CollectionUtils; import ghidra.dbg.util.CollectionUtils.AbstractEmptySet; @@ -28,15 +27,7 @@ import ghidra.dbg.util.CollectionUtils.AbstractEmptySet; * An object which is capable of attaching to a {@link TargetAttachable} */ @DebuggerTargetObjectIface("Attacher") -public interface TargetAttacher> extends TypedTargetObject { - enum Private { - ; - private abstract class Cls implements TargetAttacher { - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - Class tclass = (Class) TargetAttacher.class; +public interface TargetAttacher extends TargetObject { public interface TargetAttachKindSet extends Set { @@ -94,14 +85,17 @@ public interface TargetAttacher> extends TypedTarget * * @return the set of supported attach operations */ - @TargetAttributeType(name = SUPPORTED_ATTACH_KINDS_ATTRIBUTE_NAME, required = true, hidden = true) + @TargetAttributeType( + name = SUPPORTED_ATTACH_KINDS_ATTRIBUTE_NAME, + required = true, + hidden = true) public default TargetAttachKindSet getSupportedAttachKinds() { return getTypedAttributeNowByName(SUPPORTED_ATTACH_KINDS_ATTRIBUTE_NAME, TargetAttachKindSet.class, TargetAttachKindSet.of()); } /** - * Attach to the given {@link TargetAttachable} or reference + * Attach to the given {@link TargetAttachable} * *

* This is mostly applicable to user-space contexts, in which case, this usually means to attach @@ -110,17 +104,17 @@ public interface TargetAttacher> extends TypedTarget * @param attachable the object or reference to attach to * @return a future which completes when the command is confirmed */ - public CompletableFuture attach(TypedTargetObjectRef> ref); + public CompletableFuture attach(TargetAttachable attachable); /** * Attach to the given id * *

* This is mostly applicable to user-space contexts, in which case, this usually means to attach - * to a process using its pid. + * to a process using its OS-assigned process id. * - * @param id the identifier for and object to attach to + * @param pid the identifier for and object to attach to * @return a future which completes when the command is confirmed */ - public CompletableFuture attach(long id); + public CompletableFuture attach(long pid); } diff --git a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetBreakpointContainer.java b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetBreakpointContainer.java index 8b1a968920..5880bba0c6 100644 --- a/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetBreakpointContainer.java +++ b/Ghidra/Debug/Framework-Debugging/src/main/java/ghidra/dbg/target/TargetBreakpointContainer.java @@ -19,8 +19,6 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import ghidra.dbg.DebuggerTargetObjectIface; -import ghidra.dbg.attributes.TargetObjectRef; -import ghidra.dbg.attributes.TypedTargetObjectRef; import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointKind; import ghidra.dbg.target.schema.TargetAttributeType; import ghidra.dbg.util.CollectionUtils.AbstractEmptySet; @@ -31,20 +29,11 @@ import ghidra.program.model.address.*; * A container for breakpoint specifications and/or locations * *

- * This interface provides for the placment (creation) of breakpoints and as a listening point for + * This interface provides for the placement (creation) of breakpoints and as a listening point for * breakpoint events. Typically, it is implemented by an object whose elements are breakpoints. */ @DebuggerTargetObjectIface("BreakpointContainer") -public interface TargetBreakpointContainer> - extends TypedTargetObject { - enum Private { - ; - private abstract class Cls implements TargetBreakpointContainer { - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - Class tclass = (Class) TargetBreakpointContainer.class; +public interface TargetBreakpointContainer extends TargetObject { String SUPPORTED_BREAK_KINDS_ATTRIBUTE_NAME = PREFIX_INVISIBLE + "supported_breakpoint_kinds"; @@ -91,7 +80,10 @@ public interface TargetBreakpointContainer