Skip to main content
aboutsummaryrefslogtreecommitdiffstats
path: root/debug
diff options
context:
space:
mode:
authorMikhail Khodjaiants2008-04-22 16:49:52 +0000
committerMikhail Khodjaiants2008-04-22 16:49:52 +0000
commit19c364f5897758eb850a4ed81db8b9f3d42d6c8f (patch)
treec1ba2f044966dfc231ad76b410f42b4f96501149 /debug
parent996ff223bfe0476bf3f558b0e6abf2612df596d9 (diff)
downloadorg.eclipse.cdt-19c364f5897758eb850a4ed81db8b9f3d42d6c8f.tar.gz
org.eclipse.cdt-19c364f5897758eb850a4ed81db8b9f3d42d6c8f.tar.xz
org.eclipse.cdt-19c364f5897758eb850a4ed81db8b9f3d42d6c8f.zip
Contributing new disassembly.
Diffstat (limited to 'debug')
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/DisassemblyRetrieval.java32
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/viewer/DocumentContentProvider.java52
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/DisassemblyElementLabelProvider.java60
3 files changed, 105 insertions, 39 deletions
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/DisassemblyRetrieval.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/DisassemblyRetrieval.java
index dffb34b59ec..f5ddc84ba3a 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/DisassemblyRetrieval.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/DisassemblyRetrieval.java
@@ -128,11 +128,13 @@ public class DisassemblyRetrieval extends CDebugElement implements ICDIEventList
else {
fCurrentOffset += getDistance( fBaseElement, address );
}
+ fFlags = flags;
fBaseElement = address;
}
}
public void retrieveDisassembly( Object input, Object base, int offset, int lineCount, boolean reveal, int flags ) throws DebugException {
+ fFlags = flags;
boolean showInstructions = ( (flags & FLAGS_SHOW_INSTRUCTIONS) != 0 );
boolean showSource = ( (flags & FLAGS_SHOW_SOURCE) != 0 );
List<IDisassemblyLine> lines = new ArrayList<IDisassemblyLine>( lineCount );
@@ -195,24 +197,28 @@ public class DisassemblyRetrieval extends CDebugElement implements ICDIEventList
private IDisassemblyLine[] disassembleDown( BigInteger address, int lineCount, boolean mixed ) throws DebugException {
BigInteger startAddress = address;
- IDisassemblyLine[] lines = new IDisassemblyLine[0];
- while( lines.length < lineCount ) {
- BigInteger endAddress = address.add( BigInteger.valueOf( lineCount * getMaxInstructionSize() ) );
+ IDisassemblyLine[] lines = new IDisassemblyLine[0];
+ BigInteger endAddress = startAddress;
+ if ( lines.length < lineCount && endAddress.compareTo( getGlobalEndAddress() ) < 0 ) {
+ endAddress = address.add( BigInteger.valueOf( lineCount * getMaxInstructionSize() ) );
if ( endAddress.compareTo( getGlobalEndAddress() ) > 0 )
endAddress = getGlobalEndAddress();
lines = disassemble( address, endAddress, mixed );
IDisassemblyInstruction firstInstruction = getFirstInstruction( lines );
- if ( firstInstruction == null )
- break;
IDisassemblyInstruction lastInstruction = getLastInstruction( lines );
- if ( lastInstruction == null )
- break;
- if ( startAddress.compareTo( firstInstruction.getAdress().getValue() ) < 0 ) {
- lines = appendLines( disassemble( startAddress, firstInstruction.getAdress().getValue(), mixed ), lines );
- }
- startAddress = lastInstruction.getAdress().getValue();
- if ( startAddress.compareTo( endAddress ) < 0 ) {
- lines = appendLines( lines, disassemble( startAddress, endAddress, mixed ) );
+ if ( firstInstruction != null && lastInstruction != null ) {
+ if ( startAddress.compareTo( firstInstruction.getAdress().getValue() ) < 0 ) {
+ lines = appendLines( disassemble( startAddress, firstInstruction.getAdress().getValue(), mixed ), lines );
+ }
+ startAddress = lastInstruction.getAdress().getValue();
+ if ( startAddress.compareTo( endAddress ) < 0 ) {
+ IDisassemblyLine[] extraLines = new IDisassemblyLine[0];
+ while( extraLines.length == 0 && endAddress.compareTo( getGlobalEndAddress() ) < 0 ) {
+ endAddress = endAddress.add( BigInteger.valueOf( getMaxInstructionSize() ) );
+ extraLines = disassemble( startAddress, endAddress, mixed );
+ }
+ lines = appendLines( lines, extraLines );
+ }
}
}
int size = Math.min( lineCount, lines.length );
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/viewer/DocumentContentProvider.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/viewer/DocumentContentProvider.java
index 6c7b0ad1c8a..14375fed2db 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/viewer/DocumentContentProvider.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/disassembly/viewer/DocumentContentProvider.java
@@ -150,31 +150,33 @@ public class DocumentContentProvider implements IModelChangedListener {
Object newBase = update.getBaseElement();
int newOffset = update.getOffset();
VirtualDocument document = getDocument();
- boolean needsUpdate = false;
- if ( newBase != getBase() ) {
- fBase = newBase;
- disposeBaseProxy();
- installBaseProxy( fBase );
- needsUpdate = true;
- }
- if ( newOffset != document.getCurrentOffset() ) {
- document.setCurrentOffset( newOffset );
- needsUpdate = true;
- }
- if ( needsUpdate ) {
- WorkbenchJob job = new WorkbenchJob( "refresh content" ) { //$NON-NLS-1$
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
- */
- @Override
- public IStatus runInUIThread( IProgressMonitor monitor ) {
- getViewer().refresh( true );
- return Status.OK_STATUS;
- }
- };
- job.setSystem( true );
- job.schedule();
+ if ( document != null ) {
+ boolean needsUpdate = false;
+ if ( newBase != getBase() ) {
+ fBase = newBase;
+ disposeBaseProxy();
+ installBaseProxy( fBase );
+ needsUpdate = true;
+ }
+ if ( newOffset != document.getCurrentOffset() ) {
+ document.setCurrentOffset( newOffset );
+ needsUpdate = true;
+ }
+ if ( needsUpdate ) {
+ WorkbenchJob job = new WorkbenchJob( "refresh content" ) { //$NON-NLS-1$
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ public IStatus runInUIThread( IProgressMonitor monitor ) {
+ getViewer().refresh( true );
+ return Status.OK_STATUS;
+ }
+ };
+ job.setSystem( true );
+ job.schedule();
+ }
}
}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/DisassemblyElementLabelProvider.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/DisassemblyElementLabelProvider.java
index 88e730b98be..82b11f76e97 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/DisassemblyElementLabelProvider.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/elements/adapters/DisassemblyElementLabelProvider.java
@@ -11,7 +11,12 @@
package org.eclipse.cdt.debug.internal.ui.elements.adapters;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
import java.math.BigInteger;
+import java.text.MessageFormat;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.model.IDisassemblyInstruction;
@@ -19,10 +24,14 @@ import org.eclipse.cdt.debug.core.model.IDisassemblySourceLine;
import org.eclipse.cdt.debug.internal.ui.disassembly.editor.DisassemblyEditorPresentation;
import org.eclipse.cdt.debug.ui.disassembly.IDocumentElementLabelProvider;
import org.eclipse.cdt.debug.ui.disassembly.IDocumentElementLabelUpdate;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.debug.core.model.ISourceLocator;
+import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
/**
@@ -80,9 +89,58 @@ public class DisassemblyElementLabelProvider implements IDocumentElementLabelPro
sb.append( line.getLineNumber() );
sb.append( '\t' );
}
- sb.append( line.getFile().getPath() );
+ sb.append( getSourceLineText( line ) );
update.setLabel( DisassemblyEditorPresentation.ATTR_LINE_LABEL, sb.toString() );
}
}
}
+
+ private String getSourceLineText( IDisassemblySourceLine line ) {
+ File file = line.getFile();
+ String text = MessageFormat.format( "File {0} not found.", file.getPath() );
+ ISourceLocator locator = line.getDebugTarget().getLaunch().getSourceLocator();
+ if ( locator instanceof ISourceLookupDirector ) {
+ ISourceLookupDirector director = (ISourceLookupDirector)locator;
+ Object sourceElement = director.getSourceElement( file.getPath() );
+ if ( sourceElement != null ) {
+ File lookupFile = null;
+ if ( sourceElement instanceof IFile ) {
+ lookupFile = ((IFile)sourceElement).getLocation().toFile();
+ }
+ else if ( sourceElement instanceof IStorage ) {
+ lookupFile = ((IStorage)sourceElement).getFullPath().toFile();
+ }
+ if ( lookupFile != null ) {
+ try {
+ text = readLine( lookupFile, line.getLineNumber() - 1 );
+ }
+ catch( IOException e ) {
+ text = e.getLocalizedMessage();
+ }
+ }
+ }
+ }
+ return text;
+ }
+
+ private String readLine( File file, int lineNumber ) throws IOException {
+ FileReader fr = new FileReader( file );
+ BufferedReader br = new BufferedReader( fr );
+
+ try {
+ int count = 0;
+ String result = null;
+ do {
+ result = br.readLine();
+ if ( count++ == lineNumber )
+ return result;
+ }
+ while( result != null );
+ }
+ finally {
+ br.close();
+ }
+
+ throw new IOException( MessageFormat.format( "Line {0} doesn't exist in {1}.", Integer.valueOf( lineNumber ), file.getPath() ) );
+ }
}

Back to the top