1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 17:56:01 +02:00

Bug 324507 - [disassembly] view sometimes does not scroll further up, sometimes gets into infinite loop

Patch from Kirk Beitz (Nokia)
This commit is contained in:
Anton Leherbauer 2010-09-08 06:29:15 +00:00
parent 1a7e872a93
commit a860620fab

View file

@ -568,8 +568,8 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
// return true to avoid a retry // return true to avoid a retry
return true; return true;
} }
// indicates whether [startAddress] was inserted
boolean insertedStartAddress = startAddress == null; boolean insertedAnyAddress = false;
try { try {
fCallback.lockScroller(); fCallback.lockScroller();
@ -590,7 +590,7 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
fCallback.getDocument().addInvalidAddressRange(p); fCallback.getDocument().addInvalidAddressRange(p);
} else if (p == null || address.compareTo(endAddress) > 0) { } else if (p == null || address.compareTo(endAddress) > 0) {
if (DEBUG) System.out.println("Excess disassembly lines at " + DisassemblyUtils.getAddressText(address)); //$NON-NLS-1$ if (DEBUG) System.out.println("Excess disassembly lines at " + DisassemblyUtils.getAddressText(address)); //$NON-NLS-1$
return insertedStartAddress; return insertedAnyAddress;
} else if (p.fValid) { } else if (p.fValid) {
if (DEBUG) System.out.println("Excess disassembly lines at " + DisassemblyUtils.getAddressText(address)); //$NON-NLS-1$ if (DEBUG) System.out.println("Excess disassembly lines at " + DisassemblyUtils.getAddressText(address)); //$NON-NLS-1$
if (!p.fAddressOffset.equals(address)) { if (!p.fAddressOffset.equals(address)) {
@ -598,7 +598,7 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
p.fValid = false; p.fValid = false;
fCallback.getDocument().addInvalidAddressRange(p); fCallback.getDocument().addInvalidAddressRange(p);
} else { } else {
return insertedStartAddress; continue;
} }
} }
boolean hasSource= false; boolean hasSource= false;
@ -624,18 +624,19 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
} else { } else {
opCode= ""; //$NON-NLS-1$ opCode= ""; //$NON-NLS-1$
} }
insertedStartAddress= insertedStartAddress || address.compareTo(startAddress) == 0;
p = fCallback.getDocument().insertDisassemblyLine(p, address, instrLength.intValue(), opCode, instruction.getInstruction(), compilationPath, -1); p = fCallback.getDocument().insertDisassemblyLine(p, address, instrLength.intValue(), opCode, instruction.getInstruction(), compilationPath, -1);
if (p == null && insertedStartAddress) { if (p == null) {
break; break;
} }
insertedAnyAddress = true;
} }
} catch (BadLocationException e) { } catch (BadLocationException e) {
// should not happen // should not happen
DisassemblyUtils.internalError(e); DisassemblyUtils.internalError(e);
} finally { } finally {
fCallback.setUpdatePending(false); fCallback.setUpdatePending(false);
if (insertedStartAddress) { if (insertedAnyAddress) {
fCallback.updateInvalidSource(); fCallback.updateInvalidSource();
fCallback.unlockScroller(); fCallback.unlockScroller();
fCallback.doPending(); fCallback.doPending();
@ -644,7 +645,7 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
fCallback.unlockScroller(); fCallback.unlockScroller();
} }
} }
return insertedStartAddress; return insertedAnyAddress;
} }
/** /**
@ -663,6 +664,7 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
* @param showDisassembly * @param showDisassembly
* @return whether [startAddress] was inserted * @return whether [startAddress] was inserted
*/ */
private boolean insertDisassembly(BigInteger startAddress, BigInteger endAddress, IMixedInstruction[] mixedInstructions, boolean showSymbols, boolean showDisassembly) { private boolean insertDisassembly(BigInteger startAddress, BigInteger endAddress, IMixedInstruction[] mixedInstructions, boolean showSymbols, boolean showDisassembly) {
if (!fCallback.hasViewer() || fDsfSessionId == null) { if (!fCallback.hasViewer() || fDsfSessionId == null) {
// return true to avoid a retry // return true to avoid a retry
@ -676,8 +678,8 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
// return true to avoid a retry // return true to avoid a retry
return true; return true;
} }
// indicates whether [startAddress] was inserted
boolean insertedStartAddress = startAddress == null; boolean insertedAnyAddress = false;
try { try {
fCallback.lockScroller(); fCallback.lockScroller();
@ -702,7 +704,7 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
fCallback.getDocument().addInvalidAddressRange(p); fCallback.getDocument().addInvalidAddressRange(p);
} else if (p == null || address.compareTo(endAddress) > 0) { } else if (p == null || address.compareTo(endAddress) > 0) {
if (DEBUG) System.out.println("Excess disassembly lines at " + DisassemblyUtils.getAddressText(address)); //$NON-NLS-1$ if (DEBUG) System.out.println("Excess disassembly lines at " + DisassemblyUtils.getAddressText(address)); //$NON-NLS-1$
return insertedStartAddress; return insertedAnyAddress;
} else if (p.fValid) { } else if (p.fValid) {
if (DEBUG) System.out.println("Excess disassembly lines at " + DisassemblyUtils.getAddressText(address)); //$NON-NLS-1$ if (DEBUG) System.out.println("Excess disassembly lines at " + DisassemblyUtils.getAddressText(address)); //$NON-NLS-1$
if (!p.fAddressOffset.equals(address)) { if (!p.fAddressOffset.equals(address)) {
@ -752,11 +754,11 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
} else { } else {
opCode= ""; //$NON-NLS-1$ opCode= ""; //$NON-NLS-1$
} }
insertedStartAddress= insertedStartAddress || address.compareTo(startAddress) == 0;
p = fCallback.getDocument().insertDisassemblyLine(p, address, instrLength.intValue(), opCode, instruction.getInstruction(), file, lineNumber); p = fCallback.getDocument().insertDisassemblyLine(p, address, instrLength.intValue(), opCode, instruction.getInstruction(), file, lineNumber);
if (p == null && insertedStartAddress) { if (p == null) {
break; break;
} }
insertedAnyAddress = true;
} }
} }
@ -765,7 +767,7 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
DisassemblyUtils.internalError(e); DisassemblyUtils.internalError(e);
} finally { } finally {
fCallback.setUpdatePending(false); fCallback.setUpdatePending(false);
if (insertedStartAddress) { if (insertedAnyAddress) {
fCallback.updateInvalidSource(); fCallback.updateInvalidSource();
fCallback.unlockScroller(); fCallback.unlockScroller();
fCallback.doPending(); fCallback.doPending();
@ -774,7 +776,7 @@ public class DisassemblyBackendDsf implements IDisassemblyBackend, SessionEndedL
fCallback.unlockScroller(); fCallback.unlockScroller();
} }
} }
return insertedStartAddress; return insertedAnyAddress;
} }
/* (non-Javadoc) /* (non-Javadoc)