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:
parent
f8f2a9c9a3
commit
40a4382b3e
4 changed files with 31 additions and 43 deletions
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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$
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue