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

Bug 331552 - [disassembly] Need a way to insert more than one source line

This commit is contained in:
Anton Leherbauer 2010-12-02 12:04:04 +00:00
parent f8f2a9c9a3
commit 40a4382b3e
4 changed files with 31 additions and 43 deletions

View file

@ -30,6 +30,9 @@ import org.eclipse.ui.IWorkbenchPartSite;
* DisassemblyPart all along. Documentation for those methods were sparse, and * DisassemblyPart all along. Documentation for those methods were sparse, and
* thus this interface is likewise. See the DisassemblyPart for any available * thus this interface is likewise. See the DisassemblyPart for any available
* documentation. * documentation.
*
* @noextend This interface is not intended to be extended by clients.
* @noimplement This interface is not intended to be implemented by clients.
*/ */
public interface IDisassemblyPartCallback { public interface IDisassemblyPartCallback {
void gotoFrame(int frame); void gotoFrame(int frame);
@ -49,6 +52,7 @@ public interface IDisassemblyPartCallback {
void unlockScroller(); void unlockScroller();
void insertSource(AddressRangePosition pos); void insertSource(AddressRangePosition pos);
AddressRangePosition insertSource(AddressRangePosition pos, BigInteger address, final String file, int lineNumber); AddressRangePosition insertSource(AddressRangePosition pos, BigInteger address, final String file, int lineNumber);
AddressRangePosition insertSource(AddressRangePosition pos, BigInteger address, final String file, int firstLine, int lastLine);
void setUpdatePending(boolean pending); void setUpdatePending(boolean pending);
boolean getUpdatePending(); boolean getUpdatePending();
void setGotoAddressPending(BigInteger address); void setGotoAddressPending(BigInteger address);

View file

@ -2665,11 +2665,12 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
if (fi.fSource != null && lineNr >= 0 && lineNr < fi.fSource.getNumberOfLines()) { if (fi.fSource != null && lineNr >= 0 && lineNr < fi.fSource.getNumberOfLines()) {
fi.fStartAddress = fi.fStartAddress.min(pos.fAddressOffset); fi.fStartAddress = fi.fStartAddress.min(pos.fAddressOffset);
fi.fEndAddress = fi.fEndAddress.max(pos.fAddressOffset.add(pos.fAddressLength)); fi.fEndAddress = fi.fEndAddress.max(pos.fAddressOffset.add(pos.fAddressLength));
int last = pos.fLast > lineNr ? pos.fLast : lineNr;
final BigInteger lineAddr = fi.fLine2Addr[lineNr]; final BigInteger lineAddr = fi.fLine2Addr[lineNr];
if (lineAddr == null) { if (lineAddr == null) {
fi.fLine2Addr[lineNr] = pos.fAddressOffset; fi.fLine2Addr[lineNr] = pos.fAddressOffset;
String sourceLine = fi.getLine(lineNr); String source = fi.getLines(lineNr, last);
fDocument.insertSource(pos, sourceLine, lineNr, true); fDocument.insertSource(pos, source, lineNr, true);
} else { } else {
final int comparison = lineAddr.compareTo(pos.fAddressOffset); final int comparison = lineAddr.compareTo(pos.fAddressOffset);
if (comparison > 0) { if (comparison > 0) {
@ -2693,11 +2694,11 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
} }
} }
fi.fLine2Addr[lineNr] = pos.fAddressOffset; fi.fLine2Addr[lineNr] = pos.fAddressOffset;
String sourceLine = fi.getLine(lineNr); String source = fi.getLines(lineNr, last);
fDocument.insertSource(pos, sourceLine, lineNr, true); fDocument.insertSource(pos, source, lineNr, true);
} else if (comparison == 0) { } else if (comparison == 0) {
String sourceLine = fi.getLine(lineNr); String source = fi.getLines(lineNr, last);
fDocument.insertSource(pos, sourceLine, lineNr, true); fDocument.insertSource(pos, source, lineNr, true);
} else { } else {
// new source position is after old position // new source position is after old position
try { try {
@ -2709,12 +2710,12 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
fDocument.insertSource(pos, "", lineNr, true); //$NON-NLS-1$ fDocument.insertSource(pos, "", lineNr, true); //$NON-NLS-1$
fDocument.removeSourcePosition(pos); fDocument.removeSourcePosition(pos);
} else { } else {
String sourceLine = fi.getLine(lineNr); String source = fi.getLines(lineNr, last);
fDocument.insertSource(pos, sourceLine, lineNr, true); fDocument.insertSource(pos, source, lineNr, true);
} }
} else { } else {
String sourceLine = fi.getLine(lineNr); String source = fi.getLines(lineNr, last);
fDocument.insertSource(pos, sourceLine, lineNr, true); fDocument.insertSource(pos, source, lineNr, true);
} }
} catch (BadPositionCategoryException e) { } catch (BadPositionCategoryException e) {
internalError(e); internalError(e);
@ -2846,16 +2847,16 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
} }
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.internal.ui.disassembly.dsf.IDisassemblyPartCallback#insertSource(org.eclipse.cdt.debug.internal.ui.disassembly.dsf.AddressRangePosition, java.math.BigInteger, java.lang.String, int)
*/
public AddressRangePosition insertSource(AddressRangePosition pos, BigInteger address, final String file, int lineNumber) { public AddressRangePosition insertSource(AddressRangePosition pos, BigInteger address, final String file, int lineNumber) {
return insertSource(pos, address, file, lineNumber, lineNumber);
}
public AddressRangePosition insertSource(AddressRangePosition pos, BigInteger address, final String file, int firstLine, int lastLine) {
assert isGuiThread(); assert isGuiThread();
Object sourceElement = null; Object sourceElement = null;
if (fFile2Storage.containsKey(file)) { if (fFile2Storage.containsKey(file)) {
sourceElement = fFile2Storage.get(file); sourceElement = fFile2Storage.get(file);
} else { } else {
sourceElement = fBackend.insertSource(pos, address, file, lineNumber); sourceElement = fBackend.insertSource(pos, address, file, firstLine);
} }
if (sourceElement instanceof File) { if (sourceElement instanceof File) {
sourceElement = new LocalFileStorage((File)sourceElement); sourceElement = new LocalFileStorage((File)sourceElement);
@ -2898,7 +2899,7 @@ public abstract class DisassemblyPart extends WorkbenchPart implements IDisassem
} }
fi.fReadingJob.schedule(); fi.fReadingJob.schedule();
} }
pos = fDocument.insertInvalidSource(pos, address, fi, lineNumber); pos = fDocument.insertInvalidSource(pos, address, fi, firstLine, lastLine);
} }
return pos; return pos;

View file

@ -20,39 +20,21 @@ import org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.SourceFileInfo;
*/ */
public class SourcePosition extends AddressRangePosition { public class SourcePosition extends AddressRangePosition {
public SourceFileInfo fFileInfo; public final SourceFileInfo fFileInfo;
public int fLine; public int fLine;
public int fLast = -1;
/** public SourcePosition(int offset, int length, BigInteger addressOffset, SourceFileInfo fileInfo, int line, int last) {
* this(offset, length, addressOffset, fileInfo, line, last, true);
* @param offset
* @param length
* @param addressOffset
* @param fileInfo
* @param line
*/
public SourcePosition(int offset, int length, BigInteger addressOffset, SourceFileInfo fileInfo, int line) {
this(offset, length, addressOffset, fileInfo, line, true);
} }
/** public SourcePosition(int offset, int length, BigInteger addressOffset, SourceFileInfo fileInfo, int line, int last, boolean valid) {
*
* @param offset
* @param length
* @param addressOffset
* @param fileInfo
* @param line
* @param valid
*/
public SourcePosition(int offset, int length, BigInteger addressOffset, SourceFileInfo fileInfo, int line, boolean valid) {
super(offset, length, addressOffset, BigInteger.ZERO, valid); super(offset, length, addressOffset, BigInteger.ZERO, valid);
fFileInfo = fileInfo; fFileInfo = fileInfo;
fLine = line; fLine = line;
fLast = last;
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.dsf.debug.internal.ui.disassembly.model.AddressRangePosition#toString()
*/
@Override @Override
public String toString() { public String toString() {
return super.toString() + "->["+fFileInfo.fFileKey + ':' + fLine + ']'; //$NON-NLS-1$ return super.toString() + "->["+fFileInfo.fFileKey + ':' + fLine + ']'; //$NON-NLS-1$

View file

@ -1203,7 +1203,7 @@ public class DisassemblyDocument extends REDDocument implements IDisassemblyDocu
if (pos.length > 0) { if (pos.length > 0) {
SourcePosition oldPos = getSourcePosition(pos.offset+pos.length); SourcePosition oldPos = getSourcePosition(pos.offset+pos.length);
if (oldPos == null || oldPos.fAddressOffset.compareTo(pos.fAddressOffset) != 0) { if (oldPos == null || oldPos.fAddressOffset.compareTo(pos.fAddressOffset) != 0) {
pos = new SourcePosition(pos.offset+pos.length, 0, pos.fAddressOffset, pos.fFileInfo, line, false); pos = new SourcePosition(pos.offset+pos.length, 0, pos.fAddressOffset, pos.fFileInfo, line, pos.fLast, false);
addSourcePosition(pos); addSourcePosition(pos);
addModelPosition(pos); addModelPosition(pos);
addInvalidSourcePositions(pos); addInvalidSourcePositions(pos);
@ -1223,17 +1223,18 @@ public class DisassemblyDocument extends REDDocument implements IDisassemblyDocu
* @param pos * @param pos
* @param address * @param address
* @param fi * @param fi
* @param lineNr * @param firstLine
* @param lastLine
* @return * @return
*/ */
public AddressRangePosition insertInvalidSource(AddressRangePosition pos, BigInteger address, SourceFileInfo fi, int lineNr) { public AddressRangePosition insertInvalidSource(AddressRangePosition pos, BigInteger address, SourceFileInfo fi, int firstLine, int lastLine) {
assert isGuiThread(); assert isGuiThread();
SourcePosition sourcePos = getSourcePosition(address); SourcePosition sourcePos = getSourcePosition(address);
if (sourcePos != null) { if (sourcePos != null) {
return pos; return pos;
} }
String sourceLine = ""; //$NON-NLS-1$ String sourceLine = ""; //$NON-NLS-1$
sourcePos = new SourcePosition(0, sourceLine.length(), address, fi, lineNr, false); sourcePos = new SourcePosition(0, sourceLine.length(), address, fi, firstLine, lastLine, false);
try { try {
pos = insertAddressRange(pos, sourcePos, sourceLine, true); pos = insertAddressRange(pos, sourcePos, sourceLine, true);
addSourcePosition(sourcePos); addSourcePosition(sourcePos);