diff options
author | Anton Leherbauer | 2010-09-15 11:05:51 +0000 |
---|---|---|
committer | Anton Leherbauer | 2010-09-15 11:05:51 +0000 |
commit | 588a6efd6780f13fc4fb66727ad3ae3ee0338552 (patch) | |
tree | cbe1ac093163ead94cc3488f499a802e6a719726 /dsf | |
parent | 3a89b51a3780f9595fe8f0b86d150026343124c2 (diff) | |
download | org.eclipse.cdt-588a6efd6780f13fc4fb66727ad3ae3ee0338552.tar.gz org.eclipse.cdt-588a6efd6780f13fc4fb66727ad3ae3ee0338552.tar.xz org.eclipse.cdt-588a6efd6780f13fc4fb66727ad3ae3ee0338552.zip |
Bug 325063 - [disassembly] view occasionally accepts no further scrolling/PC changes with unhandled assert
Diffstat (limited to 'dsf')
2 files changed, 23 insertions, 28 deletions
diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsf.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsf.java index 860216f75a1..c24c8279643 100644 --- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsf.java +++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyBackendDsf.java @@ -32,23 +32,23 @@ import org.eclipse.cdt.dsf.concurrent.Query; import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.datamodel.IDMContext; import org.eclipse.cdt.dsf.debug.service.IDisassembly; -import org.eclipse.cdt.dsf.debug.service.IExpressions; -import org.eclipse.cdt.dsf.debug.service.IFormattedValues; -import org.eclipse.cdt.dsf.debug.service.IInstruction; -import org.eclipse.cdt.dsf.debug.service.IMixedInstruction; -import org.eclipse.cdt.dsf.debug.service.IRunControl; -import org.eclipse.cdt.dsf.debug.service.ISourceLookup; -import org.eclipse.cdt.dsf.debug.service.IStack; import org.eclipse.cdt.dsf.debug.service.IDisassembly.IDisassemblyDMContext; +import org.eclipse.cdt.dsf.debug.service.IExpressions; import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMAddress; import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext; +import org.eclipse.cdt.dsf.debug.service.IFormattedValues; import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext; import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMData; +import org.eclipse.cdt.dsf.debug.service.IInstruction; +import org.eclipse.cdt.dsf.debug.service.IMixedInstruction; +import org.eclipse.cdt.dsf.debug.service.IRunControl; import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.IExitedDMEvent; import org.eclipse.cdt.dsf.debug.service.IRunControl.IResumedDMEvent; import org.eclipse.cdt.dsf.debug.service.IRunControl.ISuspendedDMEvent; +import org.eclipse.cdt.dsf.debug.service.ISourceLookup; import org.eclipse.cdt.dsf.debug.service.ISourceLookup.ISourceLookupDMContext; +import org.eclipse.cdt.dsf.debug.service.IStack; import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext; import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMData; import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin; @@ -244,20 +244,24 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL stack.getTopFrame(fTargetContext, new DataRequestMonitor<IFrameDMContext>(executor, null) { @Override protected void handleCompleted() { - fCallback.setUpdatePending(false); fTargetFrameContext= getData(); if (fTargetFrameContext != null) { retrieveFrameAddressInSessionThread(frame); + } else { + fCallback.setUpdatePending(false); } } }); } else { // TODO retrieve other stack frame + fCallback.setUpdatePending(false); } return; } - else { - assert frame == fTargetFrameContext.getLevel(); + else if (frame != fTargetFrameContext.getLevel()) { + // frame context has changed in the meantime - reinvoke + retrieveFrameAddressInSessionThread(fTargetFrameContext.getLevel()); + return; } stack.getFrameData(fTargetFrameContext, new DataRequestMonitor<IFrameDMData>(executor, null) { @@ -281,7 +285,6 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL fCallback.gotoFrame(frame, addressValue); } } - }); } else { final IStatus status= getStatus(); diff --git a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java index e10f4f341c4..7303cbd4008 100644 --- a/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java +++ b/dsf/org.eclipse.cdt.dsf.ui/src/org/eclipse/cdt/dsf/debug/internal/ui/disassembly/DisassemblyPart.java @@ -1340,19 +1340,10 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem AddressRangePosition pos = getPositionOfAddress(address); if (pos != null) { if (pos.fValid) { - AddressRangePosition previousPos = /* fUpdateBeforeFocus ? getPositionOfAddress(pos.fAddressOffset-1): */ null; - if (previousPos == null || previousPos.fValid) { - if (fGotoAddressPending.equals(address)) { - fGotoAddressPending = PC_UNKNOWN; - } - gotoPosition(pos, false); - } else { - int lines = fBufferZone+3; - BigInteger endAddress = pos.fAddressOffset; - BigInteger startAddress = previousPos.fAddressOffset.max( - endAddress.subtract(BigInteger.valueOf(lines * fDocument.getMeanSizeOfInstructions()))); - retrieveDisassembly(startAddress, endAddress, lines); - } + if (fGotoAddressPending.equals(address)) { + fGotoAddressPending = PC_UNKNOWN; + } + gotoPosition(pos, false); } else { int lines = fBufferZone+3; BigInteger endAddress = pos.fAddressOffset.add(pos.fAddressLength).min( @@ -2032,6 +2023,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem */ public void gotoFrame(int frame) { assert isGuiThread(); + fGotoAddressPending = PC_UNKNOWN; gotoFrame(frame, PC_UNKNOWN); } @@ -2051,6 +2043,10 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem public void gotoFrame(int frame, BigInteger address) { assert isGuiThread(); if (DEBUG) System.out.println("gotoFrame " + frame + " " + getAddressText(address)); //$NON-NLS-1$ //$NON-NLS-2$ + if (fGotoAddressPending == fFrameAddress) { + // cancel goto address from previous goto frame + fGotoAddressPending = PC_UNKNOWN; + } fTargetFrame = frame; fFrameAddress = address; if (fTargetFrame == -1) { @@ -2091,10 +2087,6 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem addToPCHistory(pcPos); } fGotoFramePending = false; - if (fGotoAddressPending == fFrameAddress) { - fGotoAddressPending = PC_UNKNOWN; - } -// if (DEBUG) System.out.println("pc updated "+getAddressText(address)); //$NON-NLS-1$ gotoPosition(pcPos, false); updateVisibleArea(); } else { |