From a19d23361a119a607fd40ef6fcc7963ce4464c20 Mon Sep 17 00:00:00 2001
From: Mikhail Khodjaiants <mikhailkhod@googlemail.com>
Date: Thu, 6 May 2004 22:03:25 +0000
Subject: [PATCH] Implementation of mixed disassembly mode.

---
 debug/org.eclipse.cdt.debug.core/ChangeLog    |   9 +
 .../cdt/debug/core/model/IAsmSourceLine.java  |  24 ++
 .../cdt/debug/core/model/IDisassembly.java    |  21 +-
 .../debug/core/model/IDisassemblyBlock.java   |  54 +++
 .../internal/core/model/AsmSourceLine.java    |  47 +++
 .../internal/core/model/Disassembly.java      |  83 ++---
 .../internal/core/model/DisassemblyBlock.java | 196 +++++++++++
 debug/org.eclipse.cdt.debug.ui/ChangeLog      |   8 +
 .../ui/actions/ToggleBreakpointAdapter.java   |  33 +-
 .../DisassemblyAnnotationModel.java           |   5 +-
 .../disassembly/DisassemblyEditorInput.java   | 309 +++++++++---------
 .../DisassemblyMessages.properties            |   1 +
 .../ui/views/disassembly/DisassemblyView.java |  23 +-
 13 files changed, 553 insertions(+), 260 deletions(-)
 create mode 100644 debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IAsmSourceLine.java
 create mode 100644 debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IDisassemblyBlock.java
 create mode 100644 debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/AsmSourceLine.java
 create mode 100644 debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/DisassemblyBlock.java

diff --git a/debug/org.eclipse.cdt.debug.core/ChangeLog b/debug/org.eclipse.cdt.debug.core/ChangeLog
index ccbe9bab2b4..9c0856e0f8b 100644
--- a/debug/org.eclipse.cdt.debug.core/ChangeLog
+++ b/debug/org.eclipse.cdt.debug.core/ChangeLog
@@ -1,3 +1,12 @@
+2004-05-06 Mikhail Khodjaiants
+	Implementation of mixed disassembly mode.
+	* IAsmSourceLine.java: new
+	* IDisassembly.java
+	* IDisassemblyBlock.java: new
+	* AsmSourceLine.java: new
+	* Disassembly.java
+	* DisassemblyBlock.java: new
+
 2004-04-30 Mikhail Khodjaiants
 	New copyright.
 	* IJumpToAddress.java
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IAsmSourceLine.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IAsmSourceLine.java
new file mode 100644
index 00000000000..cf54e305735
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IAsmSourceLine.java
@@ -0,0 +1,24 @@
+/**********************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors: 
+ * QNX Software Systems - Initial API and implementation
+***********************************************************************/
+package org.eclipse.cdt.debug.core.model;
+
+/**
+ * A source line in disassembly.
+ */
+public interface IAsmSourceLine {
+
+	/**
+	 * Returns the array of the disassembly instructions associated with this source line.
+	 *  
+	 * @return the array of the disassembly instructions associated with this source line
+	 */
+	IAsmInstruction[] getInstructions(); 
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IDisassembly.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IDisassembly.java
index 11e6cd6ea08..b7153cd86ab 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IDisassembly.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IDisassembly.java
@@ -16,26 +16,13 @@ import org.eclipse.debug.core.DebugException;
  * Represents the disassembly of a debug target.
  */
 public interface IDisassembly extends ICDebugElement {
-	
-	/**
-	 * Returns the list of disassembly instructions associated 
-	 * with the given stack frame.
-	 * 
-	 * @param frame the stack frame for which the instructions re required.
-	 * @return the list of disassembly instructions associated with 
-	 * the given stack frame
-	 * @throws DebugException if this method fails.
-	 */
-	public IAsmInstruction[] getInstructions( ICStackFrame frame ) throws DebugException;
 
 	/**
-	 * Returns the list of disassembly instructions that begins at the given address.
-	 * The size of the requested list is specified by <code>length</code>. 
+	 * Returns the disassembly block for given stack frame.
 	 * 
-	 * @param address the start address
-	 * @param length the size of the requested list
-	 * @return the specified list of disassembly instructions
+	 * @param frame the stack frame for which the disassembly is required
+	 * @return the disassembly block for given stack frame
 	 * @throws DebugException if this method fails.
 	 */
-	public IAsmInstruction[] getInstructions( long address, int length ) throws DebugException;
+	IDisassemblyBlock getDisassemblyBlock( ICStackFrame frame ) throws DebugException;
 }
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IDisassemblyBlock.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IDisassemblyBlock.java
new file mode 100644
index 00000000000..28cdb55c42b
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/IDisassemblyBlock.java
@@ -0,0 +1,54 @@
+/**********************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors: 
+ * QNX Software Systems - Initial API and implementation
+***********************************************************************/
+package org.eclipse.cdt.debug.core.model;
+
+/**
+ * Represents a contiguous segment of disassembly in an execution context.
+ */
+public interface IDisassemblyBlock {
+	
+	/**
+	 * Returns the parent disassembly object.
+	 * 
+	 * @return the parent disassembly object
+	 */
+	IDisassembly getDisassembly();
+
+	/**
+	 * Returns the platform-dependent path of the executable associated 
+	 * with this segment.
+	 * 
+	 * @return the platform-dependent path of the executable
+	 */
+	String getModuleFile();
+
+	/**
+	 * Returns whether this block contains given stack frame.
+	 *  
+	 * @param frame the stack frame
+	 * @return whether this block contains given stack frame
+	 */
+	boolean contains( ICStackFrame frame );
+
+	/**
+	 * Return the array of source lines associated with this block.
+	 *  
+	 * @return the array of source lines associated with this block
+	 */
+	IAsmSourceLine[] getSourceLines();
+
+	/**
+	 * Returns whether this block contains mixed source/disassembly information.
+	 *  
+	 * @return whether this block contains mixed source/disassembly information
+	 */
+	boolean isMixedMode();
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/AsmSourceLine.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/AsmSourceLine.java
new file mode 100644
index 00000000000..59df3e81c6f
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/AsmSourceLine.java
@@ -0,0 +1,47 @@
+/**********************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors: 
+ * QNX Software Systems - Initial API and implementation
+***********************************************************************/
+package org.eclipse.cdt.debug.internal.core.model;
+
+import org.eclipse.cdt.debug.core.cdi.model.ICDIInstruction;
+import org.eclipse.cdt.debug.core.model.IAsmInstruction;
+import org.eclipse.cdt.debug.core.model.IAsmSourceLine;
+
+/**
+ * Adapter for ICDIMixedInstruction.
+ */
+public class AsmSourceLine implements IAsmSourceLine {
+
+	private String fText;
+
+	private IAsmInstruction[] fInstructions = null;
+
+	/**
+	 * Constructor for AsmSourceLine.
+	 */
+	public AsmSourceLine( String text, ICDIInstruction[] cdiInstructions ) {
+		fText = text;
+		fInstructions = new IAsmInstruction[cdiInstructions.length];
+		for ( int i = 0; i < fInstructions.length; ++i ) {
+			fInstructions[i] = new AsmInstruction( cdiInstructions[i] );
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.debug.core.model.IAsmSourceLine#getInstructions()
+	 */
+	public IAsmInstruction[] getInstructions() {
+		return fInstructions;
+	}
+
+	public String toString() {
+		return fText;
+	}
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/Disassembly.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/Disassembly.java
index 13a1c5295d9..f9b848cefbb 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/Disassembly.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/Disassembly.java
@@ -18,9 +18,10 @@ import org.eclipse.cdt.debug.core.cdi.CDIException;
 import org.eclipse.cdt.debug.core.cdi.ICDISession;
 import org.eclipse.cdt.debug.core.cdi.ICDISourceManager;
 import org.eclipse.cdt.debug.core.cdi.model.ICDIInstruction;
-import org.eclipse.cdt.debug.core.model.IAsmInstruction;
+import org.eclipse.cdt.debug.core.cdi.model.ICDIMixedInstruction;
 import org.eclipse.cdt.debug.core.model.ICStackFrame;
 import org.eclipse.cdt.debug.core.model.IDisassembly;
+import org.eclipse.cdt.debug.core.model.IDisassemblyBlock;
 import org.eclipse.cdt.debug.core.model.IExecFileInfo;
 import org.eclipse.debug.core.DebugException;
 
@@ -31,7 +32,7 @@ public class Disassembly extends CDebugElement implements IDisassembly {
 
 	final static private int DISASSEMBLY_BLOCK_SIZE = 100;
 
-	private IAsmInstruction[] fInstructions = new IAsmInstruction[0];
+	private DisassemblyBlock[] fBlocks = new DisassemblyBlock[1];
 
 	/**
 	 * Constructor for Disassembly.
@@ -43,85 +44,63 @@ public class Disassembly extends CDebugElement implements IDisassembly {
 	}
 
 	/* (non-Javadoc)
-	 * @see org.eclipse.cdt.debug.core.model.IDisassembly#getInstructions(org.eclipse.cdt.debug.core.model.ICStackFrame)
+	 * @see org.eclipse.cdt.debug.core.model.IDisassembly#getDisassemblyBlock(org.eclipse.cdt.debug.core.model.ICStackFrame)
 	 */
-	public IAsmInstruction[] getInstructions( ICStackFrame frame ) throws DebugException {
-		long address = frame.getAddress();
-		if ( !containsAddress( address ) ) {
-			loadInstructions( frame );
+	public IDisassemblyBlock getDisassemblyBlock( ICStackFrame frame ) throws DebugException {
+		if ( fBlocks[0] == null || !fBlocks[0].contains( frame ) ) {
+			fBlocks[0] = createBlock( frame );
 		}
-		return fInstructions;
+		return fBlocks[0];		
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.cdt.debug.core.model.IDisassembly#getInstructions(long, int)
-	 */
-	public IAsmInstruction[] getInstructions( long address, int length ) throws DebugException {
-		if ( !containsAddress( address ) ) {
-			loadInstructions( address, length );
-		}
-		return fInstructions;
-	}
-
-	private boolean containsAddress( long address ) {
-		for ( int i = 0; i < fInstructions.length; ++i ) {
-			if ( fInstructions[i].getAdress() == address )
-				return true;
-		}
-		return false;
-	}
-
-	private boolean containsAddress( ICDIInstruction[] instructions, long address ) {
-		for( int i = 0; i < instructions.length; ++i ) {
-			if ( instructions[i].getAdress() == address )
-				return true;
-		}
-		return false;
-	}
-
-	private void loadInstructions( ICStackFrame frame ) throws DebugException {
-		fInstructions = new IAsmInstruction[0];
+	private DisassemblyBlock createBlock( ICStackFrame frame ) throws DebugException {
 		ICDISession session = (ICDISession)getDebugTarget().getAdapter( ICDISession.class );
 		if ( session != null ) {
 			ICDISourceManager sm = session.getSourceManager();
 			if ( sm != null ) {
 				String fileName = frame.getFile();
 				int lineNumber = frame.getLineNumber();
-				ICDIInstruction[] instructions = new ICDIInstruction[0];
+				ICDIMixedInstruction[] mixedInstrs = new ICDIMixedInstruction[0];
 				long address = frame.getAddress();				
 				if ( fileName != null && fileName.length() > 0 ) {
 					try {
-						instructions = sm.getInstructions( fileName, 
-														   lineNumber, 
-														   CDebugCorePlugin.getDefault().getPluginPreferences().getInt( ICDebugConstants.PREF_MAX_NUMBER_OF_INSTRUCTIONS ) );
+						mixedInstrs = sm.getMixedInstructions( fileName, 
+															   lineNumber, 
+															   CDebugCorePlugin.getDefault().getPluginPreferences().getInt( ICDebugConstants.PREF_MAX_NUMBER_OF_INSTRUCTIONS ) );
 					}
 					catch( CDIException e ) {
 						targetRequestFailed( CoreModelMessages.getString( "Disassembly.Unable_to_get_disassembly_instructions_1" ), e ); //$NON-NLS-1$
 					}
 				}
-				if ( instructions.length == 0 ||
+				if ( mixedInstrs.length == 0 ||
 				// Double check if debugger returns correct address range.
-						!containsAddress( instructions, address ) ) {
+						!containsAddress( mixedInstrs, address ) ) {
 					if ( address >= 0 ) {
 						try {
-							instructions = getFunctionInstructions( sm.getInstructions( address, address + DISASSEMBLY_BLOCK_SIZE ) );
+							ICDIInstruction[] instructions = getFunctionInstructions( sm.getInstructions( address, address + DISASSEMBLY_BLOCK_SIZE ) );
+							return DisassemblyBlock.create( this, instructions );
 						}
 						catch( CDIException e ) {
 							targetRequestFailed( CoreModelMessages.getString( "Disassembly.Unable_to_get_disassembly_instructions_2" ), e ); //$NON-NLS-1$
 						}
 					}
 				}
-				fInstructions = new IAsmInstruction[instructions.length];
-				for ( int i = 0; i < fInstructions.length; ++i ) {
-					fInstructions[i] = new AsmInstruction( instructions[i] );
+				else {
+					return DisassemblyBlock.create( this, mixedInstrs );
 				}
 			}
 		}
+		return null;
 	}
 
-	private void loadInstructions( long address, int length ) throws DebugException {
-		fInstructions = new IAsmInstruction[0];
-		
+	private boolean containsAddress( ICDIMixedInstruction[] mi, long address ) {
+		for( int i = 0; i < mi.length; ++i ) {
+			ICDIInstruction[] instructions = mi[i].getInstructions();
+			for ( int j = 0; j < instructions.length; ++j )
+				if ( instructions[j].getAdress() == address )
+					return true;
+		}
+		return false;
 	}
 
 	private ICDIInstruction[] getFunctionInstructions( ICDIInstruction[] rawInstructions ) {
@@ -139,7 +118,11 @@ public class Disassembly extends CDebugElement implements IDisassembly {
 	}
 
 	public void dispose() {
-		fInstructions = null;
+		for ( int i = 0; i < fBlocks.length; ++i )
+			if ( fBlocks[i] != null ) {
+				fBlocks[i].dispose();
+				fBlocks[i] = null;
+			}
 	}
 
 	/* (non-Javadoc)
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/DisassemblyBlock.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/DisassemblyBlock.java
new file mode 100644
index 00000000000..4b497790833
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/DisassemblyBlock.java
@@ -0,0 +1,196 @@
+/**********************************************************************
+ * Copyright (c) 2004 QNX Software Systems and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors: 
+ * QNX Software Systems - Initial API and implementation
+***********************************************************************/
+package org.eclipse.cdt.debug.internal.core.model;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.LineNumberReader;
+
+import org.eclipse.cdt.debug.core.cdi.model.ICDIInstruction;
+import org.eclipse.cdt.debug.core.cdi.model.ICDIMixedInstruction;
+import org.eclipse.cdt.debug.core.model.IAsmInstruction;
+import org.eclipse.cdt.debug.core.model.IAsmSourceLine;
+import org.eclipse.cdt.debug.core.model.ICStackFrame;
+import org.eclipse.cdt.debug.core.model.IDisassembly;
+import org.eclipse.cdt.debug.core.model.IDisassemblyBlock;
+import org.eclipse.cdt.debug.core.model.IExecFileInfo;
+import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.debug.core.model.ISourceLocator;
+
+/**
+ * CDI-based implementation of <code>IDisassemblyBlock</code>.
+ */
+public class DisassemblyBlock implements IDisassemblyBlock, IAdaptable {
+
+	private IDisassembly fDisassembly;
+	
+	private IAsmSourceLine[] fSourceLines;
+
+	private long fStartAddress = 0;
+
+	private long fEndAddress = 0;
+	
+	private boolean fMixedMode = false;
+
+	/**
+	 * Constructor for DisassemblyBlock.
+	 */
+	private DisassemblyBlock( IDisassembly disassembly ) {
+		fDisassembly = disassembly;
+	}
+
+	public static DisassemblyBlock create( IDisassembly disassembly, ICDIMixedInstruction[] instructions ) {
+		DisassemblyBlock block = new DisassemblyBlock( disassembly );
+		block.setMixedMode( true );
+		ISourceLocator adapter = disassembly.getDebugTarget().getLaunch().getSourceLocator();
+		ICSourceLocator locator = null;
+		if ( adapter instanceof IAdaptable ) {
+			locator = (ICSourceLocator)((IAdaptable)adapter).getAdapter( ICSourceLocator.class );
+		}
+		block.setSourceLines( createSourceLines( locator, instructions ) );
+		block.initializeAddresses();
+		return block;
+	}
+
+	public static DisassemblyBlock create( IDisassembly disassembly, ICDIInstruction[] instructions ) {
+		DisassemblyBlock block = new DisassemblyBlock( disassembly );
+		block.setMixedMode( false );
+		block.setSourceLines( createSourceLines( instructions ) );
+		block.initializeAddresses();
+		return block;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.debug.core.model.IDisassemblyBlock#getDisassembly()
+	 */
+	public IDisassembly getDisassembly() {
+		return fDisassembly;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.debug.core.model.IDisassemblyBlock#getModuleFile()
+	 */
+	public String getModuleFile() {
+		IDisassembly d = getDisassembly();
+		if ( d != null ) {
+			IExecFileInfo info = (IExecFileInfo)d.getAdapter( IExecFileInfo.class );
+			if ( info != null && info.getExecFile() != null ) {
+				return info.getExecFile().getLocation().toOSString();
+			}
+		}
+		return ""; //$NON-NLS-1$
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.debug.core.model.IDisassemblyBlock#contains(org.eclipse.cdt.debug.core.model.ICStackFrame)
+	 */
+	public boolean contains( ICStackFrame frame ) {
+		if ( !getDisassembly().getDebugTarget().equals( frame.getDebugTarget() ) )
+			return false;
+		long address = frame.getAddress();
+		return (address >= fStartAddress && address <= fEndAddress);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.debug.core.model.IDisassemblyBlock#getSourceLines()
+	 */
+	public IAsmSourceLine[] getSourceLines() {
+		return fSourceLines;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+	 */
+	public Object getAdapter( Class adapter ) {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.debug.core.model.IDisassemblyBlock#isMixedMode()
+	 */
+	public boolean isMixedMode() {
+		return fMixedMode;
+	}
+
+	public void dispose() {
+	}
+
+	private static IAsmSourceLine[] createSourceLines( ICSourceLocator locator, ICDIMixedInstruction[] mi ) {
+		IAsmSourceLine[] result = new IAsmSourceLine[mi.length];
+		LineNumberReader reader = null;
+		if ( result.length > 0 && locator != null ) {
+			String fileName = mi[0].getFileName();
+			Object element = locator.findSourceElement( fileName );
+			File file= null;
+			if ( element instanceof IFile ) {
+				file = ((IFile)element).getLocation().toFile();
+			}
+			else if ( element instanceof IStorage ) {
+				file = ((IStorage)element).getFullPath().toFile();
+			}
+			if ( file != null ) {
+				try {
+					reader = new LineNumberReader( new FileReader( file ) );
+				}
+				catch( FileNotFoundException e ) {
+				}				
+			}
+		}
+		for ( int i = 0; i < result.length; ++i ) {
+			String text = null;
+			if ( reader != null ) {
+				int lineNumber = mi[i].getLineNumber();
+				while( reader.getLineNumber() + 1 < lineNumber ) {
+					try {
+						reader.readLine();
+					}
+					catch( IOException e ) {
+					}
+				}
+				if ( reader.getLineNumber() + 1 == lineNumber ) {
+					try {
+						text = reader.readLine() + '\n';
+					}
+					catch( IOException e ) {
+					}
+				}
+			}
+			result[i] = new AsmSourceLine( text, mi[i].getInstructions() );
+		}
+		return result;
+	}
+
+	private static IAsmSourceLine[] createSourceLines( ICDIInstruction[] instructions ) {
+		return new IAsmSourceLine[] { new AsmSourceLine( "", instructions ) }; //$NON-NLS-1$
+	}
+
+	private void initializeAddresses() {
+		if ( fSourceLines.length > 0 ) {
+			IAsmInstruction[] instr = fSourceLines[0].getInstructions();
+			fStartAddress = instr[0].getAdress();
+			instr = fSourceLines[fSourceLines.length - 1].getInstructions();
+			fEndAddress = instr[instr.length - 1].getAdress();
+		}
+	}
+
+	private void setMixedMode( boolean mixedMode ) {
+		this.fMixedMode = mixedMode;
+	}
+
+	private void setSourceLines( IAsmSourceLine[] sourceLines ) {
+		this.fSourceLines = sourceLines;
+	}
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/ChangeLog b/debug/org.eclipse.cdt.debug.ui/ChangeLog
index ee2f77d4b42..ca876dfbfd3 100644
--- a/debug/org.eclipse.cdt.debug.ui/ChangeLog
+++ b/debug/org.eclipse.cdt.debug.ui/ChangeLog
@@ -1,3 +1,11 @@
+2004-05-06 Mikhail Khodjaiants
+	Implementation of mixed disassembly mode.
+	* ToggleBreakpointAdapter.java
+	* DisassemblyMessages.properties
+	* DisassemblyAnnotationModel.java
+	* DisassemblyEditorInput.java
+	* DisassemblyView.java
+
 2004-05-02 Mikhail Khodjaiants
 	Check if the new stack frame is of the same debug target as the old one.
 	* DisassemblyEditorInput.java
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointAdapter.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointAdapter.java
index 4bb8e7561fd..b5b2f126ab7 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointAdapter.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ToggleBreakpointAdapter.java
@@ -18,7 +18,6 @@ import org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyEditorInpu
 import org.eclipse.cdt.debug.internal.ui.views.disassembly.DisassemblyView;
 import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
 import org.eclipse.cdt.debug.ui.ICDebugUIConstants;
-import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.ResourcesPlugin;
@@ -109,20 +108,25 @@ public class ToggleBreakpointAdapter implements IToggleBreakpointsTarget {
 					IResource resource = ResourcesPlugin.getWorkspace().getRoot();
 					String sourceHandle = getSourceHandle( input );
 					long address = ((DisassemblyEditorInput)input).getAddress( lineNumber );
-					ICAddressBreakpoint breakpoint = CDIDebugModel.addressBreakpointExists( sourceHandle, resource, address );
-					if ( breakpoint != null ) {
-						DebugPlugin.getDefault().getBreakpointManager().removeBreakpoint( breakpoint, true );
+					if ( address != 0 ) {
+						ICAddressBreakpoint breakpoint = CDIDebugModel.addressBreakpointExists( sourceHandle, resource, address );
+						if ( breakpoint != null ) {
+							DebugPlugin.getDefault().getBreakpointManager().removeBreakpoint( breakpoint, true );
+						}
+						else {
+							CDIDebugModel.createAddressBreakpoint( sourceHandle, 
+																   resource, 
+																   address, 
+																   true, 
+																   0, 
+																   "", //$NON-NLS-1$
+																   true );
+						}
+						return;
 					}
 					else {
-						CDIDebugModel.createAddressBreakpoint( sourceHandle, 
-															   resource, 
-															   address, 
-															   true, 
-															   0, 
-															   "", //$NON-NLS-1$
-															   true );
+						errorMessage = ActionMessages.getString( "ToggleBreakpointAdapter.Invalid_line_1" ); //$NON-NLS-1$						
 					}
-					return;
 				}
 			}
 		}
@@ -141,7 +145,7 @@ public class ToggleBreakpointAdapter implements IToggleBreakpointsTarget {
 			if ( !(input instanceof DisassemblyEditorInput) || 
 				 ((DisassemblyEditorInput)input).equals( DisassemblyEditorInput.EMPTY_EDITOR_INPUT ) ) {
 				return false;
-			}
+			}			
 		}
 		return ( selection instanceof ITextSelection );
 	}
@@ -258,8 +262,7 @@ public class ToggleBreakpointAdapter implements IToggleBreakpointsTarget {
 			return ((IStorageEditorInput)input).getStorage().getName();
 		}
 		if ( input instanceof DisassemblyEditorInput ) {
-			IFile file = ((DisassemblyEditorInput)input).getModuleFile();
-			return ( file != null ) ? file.getLocation().toOSString() : ""; //$NON-NLS-1$
+			return ((DisassemblyEditorInput)input).getModuleFile();
 		}
 		return ""; //$NON-NLS-1$
 	}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyAnnotationModel.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyAnnotationModel.java
index 7f044c000ce..85e64a1f9e2 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyAnnotationModel.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyAnnotationModel.java
@@ -137,10 +137,9 @@ public class DisassemblyAnnotationModel extends AnnotationModel {
 		Position position = null;
 		DisassemblyEditorInput input = getInput();
 		if ( input != null ) {
-			long address = input.getBreakpointAddress( breakpoint );
 			int start = -1;
-			if ( address > 0 && document != null ) {
-				int instrNumber = input.getInstructionNumber( address );
+			if ( document != null ) {
+				int instrNumber = input.getInstructionLine( breakpoint );
 				if ( instrNumber > 0 ) {
 					try {
 						start = fDocument.getLineOffset( instrNumber - 1 );
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyEditorInput.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyEditorInput.java
index 7c0af3cbb06..5c268b9d074 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyEditorInput.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyEditorInput.java
@@ -13,13 +13,14 @@ package org.eclipse.cdt.debug.internal.ui.views.disassembly;
 import java.util.Arrays;
 
 import org.eclipse.cdt.debug.core.model.IAsmInstruction;
+import org.eclipse.cdt.debug.core.model.IAsmSourceLine;
 import org.eclipse.cdt.debug.core.model.IBreakpointTarget;
+import org.eclipse.cdt.debug.core.model.ICDebugTarget;
 import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
 import org.eclipse.cdt.debug.core.model.ICStackFrame;
 import org.eclipse.cdt.debug.core.model.IDisassembly;
-import org.eclipse.cdt.debug.core.model.IExecFileInfo;
+import org.eclipse.cdt.debug.core.model.IDisassemblyBlock;
 import org.eclipse.cdt.debug.internal.ui.CDebugUIUtils;
-import org.eclipse.core.resources.IFile;
 import org.eclipse.debug.core.DebugException;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.ui.IEditorInput;
@@ -30,148 +31,6 @@ import org.eclipse.ui.IPersistableElement;
  */
 public class DisassemblyEditorInput implements IEditorInput {
 
-	/**
-	 * A storage object used by Disassembly view.
-	 */
-	private static class DisassemblyStorage {
-
-		private IDisassembly fDisassembly;
-		private IAsmInstruction[] fInstructions;
-		protected String fContents;
-		protected long fStartAddress = 0;
-		protected long fEndAddress = 0;
-
-		/**
-		 * Constructor for DisassemblyStorage.
-		 */
-		public DisassemblyStorage( IDisassembly disassembly, IAsmInstruction[] instructions ) {
-			fDisassembly = disassembly;
-			fInstructions = ( instructions != null ) ? instructions : new IAsmInstruction[0];
-			initializeAddresses();
-			createContent();
-		}
-
-		public String getContents() {
-			return fContents;
-		}
-
-		public IDisassembly getDisassembly() {
-			return this.fDisassembly;
-		}
-
-		public boolean containsFrame( ICStackFrame frame ) {
-			if ( !getDisassembly().getDebugTarget().equals( frame.getDebugTarget() ) )
-				return false;
-			long address = frame.getAddress();
-			return (address >= fStartAddress && address <= fEndAddress);
-		}
-
-		public IFile getModuleFile() {
-			IDisassembly d = getDisassembly();
-			IFile result = null;
-			if ( d != null ) {
-				IExecFileInfo info = (IExecFileInfo)d.getAdapter( IExecFileInfo.class );
-				if ( info != null ) {
-					result = info.getExecFile();
-				}
-			}
-			return result;
-		}
-
-		public long getBreakpointAddress( ICLineBreakpoint breakpoint ) {
-			IDisassembly dis = getDisassembly();
-			if ( dis != null ) {
-				IBreakpointTarget bt = (IBreakpointTarget)dis.getDebugTarget().getAdapter( IBreakpointTarget.class );
-				if ( bt != null ) {
-					try {
-						return bt.getBreakpointAddress( breakpoint );
-					}
-					catch( DebugException e ) {
-					}
-				}
-			}
-			return 0;
-		}
-
-		private void createContent() {
-			StringBuffer lines = new StringBuffer();
-			int maxFunctionName = 0;
-			int maxOpcodeLength = 0;
-			long maxOffset = 0;
-			for( int i = 0; i < fInstructions.length; ++i ) {
-				String functionName = fInstructions[i].getFunctionName();
-				if ( functionName.length() > maxFunctionName ) {
-					maxFunctionName = functionName.length();
-				}
-				String opcode = fInstructions[i].getOpcode();
-				if ( opcode.length() > maxOpcodeLength )
-					maxOpcodeLength = opcode.length();
-				if ( fInstructions[i].getOffset() > maxOffset ) {
-					maxOffset = fInstructions[i].getOffset();
-				}
-			}
-			int instrPos = calculateInstructionPosition( maxFunctionName, maxOffset );
-			int argPosition = instrPos + maxOpcodeLength + 1;
-			for( int i = 0; i < fInstructions.length; ++i ) {
-				lines.append( getInstructionString( fInstructions[i], instrPos, argPosition ) );
-			}
-			fContents = lines.toString();
-		}
-
-		private String getInstructionString( IAsmInstruction instruction, int instrPosition, int argPosition ) {
-			int worstCaseSpace = Math.max( instrPosition, argPosition );
-			char[] spaces = new char[worstCaseSpace];
-			Arrays.fill( spaces, ' ' );
-			StringBuffer sb = new StringBuffer();
-			if ( instruction != null ) {
-				sb.append( CDebugUIUtils.toHexAddressString( instruction.getAdress() ) );
-				sb.append( ' ' );
-				String functionName = instruction.getFunctionName();
-				if ( functionName != null && functionName.length() > 0 ) {
-					sb.append( '<' );
-					sb.append( functionName );
-					if ( instruction.getOffset() != 0 ) {
-						sb.append( '+' );
-						sb.append( instruction.getOffset() );
-					}
-					sb.append( ">:" ); //$NON-NLS-1$
-					sb.append( spaces, 0, instrPosition - sb.length() );
-				}
-				sb.append( instruction.getOpcode() );
-				sb.append( spaces, 0, argPosition - sb.length() );
-				sb.append( instruction.getArguments() );
-				sb.append( '\n' );
-			}
-			return sb.toString();
-		}
-
-		private int calculateInstructionPosition( int maxFunctionName, long maxOffset ) {
-			return (16 + maxFunctionName + Long.toString( maxOffset ).length());
-		}
-
-		private void initializeAddresses() {
-			if ( fInstructions.length > 0 ) {
-				fStartAddress = fInstructions[0].getAdress();
-				fEndAddress = fInstructions[fInstructions.length - 1].getAdress();
-			}
-		}
-
-		public int getLineNumber( long address ) {
-			for( int i = 0; i < fInstructions.length; ++i ) {
-				if ( fInstructions[i].getAdress() == address ) {
-					return i + 1;
-				}
-			}
-			return 0;
-		}
-
-		public long getAddress( int lineNumber ) throws IllegalArgumentException {
-			if ( lineNumber > 0 && lineNumber <= fInstructions.length )
-				return fInstructions[--lineNumber].getAdress();
-			throw new IllegalArgumentException();
-		}
-	}
-
 	public static final IEditorInput EMPTY_EDITOR_INPUT = new DisassemblyEditorInput();
 
 	public static final IEditorInput PENDING_EDITOR_INPUT = 
@@ -182,9 +41,11 @@ public class DisassemblyEditorInput implements IEditorInput {
 			};
 	
 	/**
-	 * Storage associated with this editor input
+	 * Disassembly block associated with this editor input
 	 */
-	private DisassemblyStorage fStorage;
+	private IDisassemblyBlock fBlock;
+
+	private String fContents = ""; //$NON-NLS-1$
 
 	/**
 	 * Constructor for DisassemblyEditorInput.
@@ -198,8 +59,9 @@ public class DisassemblyEditorInput implements IEditorInput {
 	 * @param disassembly
 	 * @param instructions
 	 */
-	public DisassemblyEditorInput( IDisassembly disassembly, IAsmInstruction[] instructions ) {
-		fStorage = new DisassemblyStorage( disassembly, instructions );
+	private DisassemblyEditorInput( IDisassemblyBlock block ) {
+		fBlock = block;
+		createContents();
 	}
 
 	/* (non-Javadoc)
@@ -245,29 +107,158 @@ public class DisassemblyEditorInput implements IEditorInput {
 	}
 
 	public boolean contains( ICStackFrame frame ) {
-		if ( fStorage != null ) {
-			return fStorage.containsFrame( frame );
+		if ( fBlock != null ) {
+			return fBlock.contains( frame );
 		}
 		return false;
 	}
 
 	public String getContents() {
-		return ( fStorage != null ) ? fStorage.getContents() : ""; //$NON-NLS-1$
+		return fContents;
 	}
 
-	public int getInstructionNumber( long address ) {
-		return ( fStorage != null ) ? fStorage.getLineNumber( address ) : 0;
+	public int getInstructionLine( long address ) {
+		if ( fBlock != null ) {
+			IAsmSourceLine[] lines = fBlock.getSourceLines();
+			int result = 0;
+			for ( int i = 0; i < lines.length; ++i ) {
+				IAsmInstruction[] instructions = lines[i].getInstructions();
+				++result;
+				for ( int j = 0; j < instructions.length; ++j ) {
+					++result;
+					if ( instructions[j].getAdress() == address ) {
+						return result;
+					}
+				}
+			}
+		}
+		return 0;
 	}
 
-	public long getAddress( int lineNumber ) throws IllegalArgumentException {
-		return ( fStorage != null ) ? fStorage.getAddress( lineNumber ) : 0;
+	public int getInstructionLine( ICLineBreakpoint breakpoint ) {
+		if ( fBlock != null ) {
+			IDisassembly dis = fBlock.getDisassembly();
+			if ( dis != null ) {
+				IBreakpointTarget bt = (IBreakpointTarget)dis.getDebugTarget().getAdapter( IBreakpointTarget.class );
+				if ( bt != null ) {
+					try {
+						long address = bt.getBreakpointAddress( breakpoint );
+						if ( address != 0 )
+							return getInstructionLine( address );
+					}
+					catch( DebugException e ) {
+					}
+				}
+			}
+		}
+		return 0;
 	}
 
-	public IFile getModuleFile() {
-		return ( fStorage != null ) ? fStorage.getModuleFile() : null;
+	public long getAddress( int lineNumber ) {
+		if ( fBlock != null ) {
+			IAsmSourceLine[] lines = fBlock.getSourceLines();
+			int current = 0;
+			for ( int i = 0; i < lines.length; ++i ) {
+				IAsmInstruction[] instructions = lines[i].getInstructions();
+				++current;
+				if ( lineNumber == current )
+					return instructions[0].getAdress();
+				if ( lineNumber > current && lineNumber <= current + instructions.length )
+					return instructions[lineNumber - current - 1].getAdress();
+				current += instructions.length;
+			}
+		}
+		return 0;
 	}
 
-	public long getBreakpointAddress( ICLineBreakpoint breakpoint ) {
-		return ( fStorage != null ) ? fStorage.getBreakpointAddress( breakpoint ) : 0;
+	public String getModuleFile() {
+		return ( fBlock != null ) ? fBlock.getModuleFile() : null;
+	}
+
+	public static DisassemblyEditorInput create( ICStackFrame frame ) throws DebugException {
+		DisassemblyEditorInput input = null;
+		IDisassembly disassembly = ((ICDebugTarget)frame.getDebugTarget()).getDisassembly();
+		if ( disassembly != null ) {
+			IDisassemblyBlock block = disassembly.getDisassemblyBlock( frame );
+			input = new DisassemblyEditorInput( block );
+		}
+		return input;
+	}
+
+	private void createContents() {
+		StringBuffer lines = new StringBuffer();
+		int maxFunctionName = 0;
+		int maxOpcodeLength = 0;
+		long maxOffset = 0;
+		if ( fBlock != null ) {
+			IAsmSourceLine[] mi = fBlock.getSourceLines();
+			for ( int j = 0; j < mi.length; ++j ) {
+				IAsmInstruction[] instructions = mi[j].getInstructions();
+				for( int i = 0; i < instructions.length; ++i ) {
+					String functionName = instructions[i].getFunctionName();
+					if ( functionName.length() > maxFunctionName ) {
+						maxFunctionName = functionName.length();
+					}
+					String opcode = instructions[i].getOpcode();
+					if ( opcode.length() > maxOpcodeLength )
+						maxOpcodeLength = opcode.length();
+					if ( instructions[i].getOffset() > maxOffset ) {
+						maxOffset = instructions[i].getOffset();
+					}
+				}
+			}
+			int instrPos = calculateInstructionPosition( maxFunctionName, maxOffset );
+			int argPosition = instrPos + maxOpcodeLength + 1;
+			for ( int j = 0; j < mi.length; ++j ) {
+				if ( fBlock.isMixedMode() )
+					lines.append( getSourceLineString( mi[j] ) );
+				IAsmInstruction[] instructions = mi[j].getInstructions();
+				for( int i = 0; i < instructions.length; ++i ) {
+//					if ( fBlock.isMixedMode() )
+//						lines.append( "\t" ); //$NON-NLS-1$
+					lines.append( getInstructionString( instructions[i], instrPos, argPosition ) );
+				}
+			}
+		}
+		fContents = lines.toString();
+	}
+
+	private String getInstructionString( IAsmInstruction instruction, int instrPosition, int argPosition ) {
+		int worstCaseSpace = Math.max( instrPosition, argPosition );
+		char[] spaces = new char[worstCaseSpace];
+		Arrays.fill( spaces, ' ' );
+		StringBuffer sb = new StringBuffer();
+		if ( instruction != null ) {
+			sb.append( CDebugUIUtils.toHexAddressString( instruction.getAdress() ) );
+			sb.append( ' ' );
+			String functionName = instruction.getFunctionName();
+			if ( functionName != null && functionName.length() > 0 ) {
+				sb.append( '<' );
+				sb.append( functionName );
+				if ( instruction.getOffset() != 0 ) {
+					sb.append( '+' );
+					sb.append( instruction.getOffset() );
+				}
+				sb.append( ">:" ); //$NON-NLS-1$
+				sb.append( spaces, 0, instrPosition - sb.length() );
+			}
+			sb.append( instruction.getOpcode() );
+			sb.append( spaces, 0, argPosition - sb.length() );
+			sb.append( instruction.getArguments() );
+			sb.append( '\n' );
+		}
+		return sb.toString();
+	}
+
+	private int calculateInstructionPosition( int maxFunctionName, long maxOffset ) {
+		return (16 + maxFunctionName + Long.toString( maxOffset ).length());
+	}
+
+	private String getSourceLineString( IAsmSourceLine line ) {
+		String text = line.toString();
+		if ( text == null ) {
+			text = DisassemblyMessages.getString( "DisassemblyEditorInput.source_line_is_not_available_1" ) + '\n'; //$NON-NLS-1$
+		}
+		return text;
 	}
 }
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyMessages.properties b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyMessages.properties
index 4e86da8ee13..89bca8d99d3 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyMessages.properties
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyMessages.properties
@@ -4,3 +4,4 @@ DisassemblyInstructionPointerAnnotation.Secondary_Pointer_1=Secondary Disassembl
 DisassemblyAnnotationHover.Multiple_markers_at_this_line_1=Multiple markers at this line
 HTMLTextPresenter.ellipsis=
 HTML2TextReader.dash=-
+DisassemblyEditorInput.source_line_is_not_available_1=<source line is not available>
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyView.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyView.java
index 2ef8f094e77..ec4f8267f66 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyView.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/disassembly/DisassemblyView.java
@@ -10,14 +10,11 @@
 ***********************************************************************/
 package org.eclipse.cdt.debug.internal.ui.views.disassembly;
 
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.HashMap;
 
-import org.eclipse.cdt.debug.core.model.IAsmInstruction;
-import org.eclipse.cdt.debug.core.model.ICDebugTarget;
 import org.eclipse.cdt.debug.core.model.ICStackFrame;
-import org.eclipse.cdt.debug.core.model.IDisassembly;
 import org.eclipse.cdt.debug.internal.ui.ICDebugHelpContextIds;
 import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants;
 import org.eclipse.cdt.debug.internal.ui.actions.CBreakpointPropertiesRulerAction;
@@ -529,13 +526,8 @@ public class DisassemblyView extends AbstractDebugEventHandlerView
 					input = (IEditorInput)current;
 				}
 				else {
-					IAsmInstruction[] instructions = new IAsmInstruction[0];
 					try {
-						IDisassembly disassembly = ((ICDebugTarget)frame.getDebugTarget()).getDisassembly();
-						if ( disassembly != null ) {
-							instructions = disassembly.getInstructions( frame );
-							input = new DisassemblyEditorInput( disassembly, instructions );
-						}
+						input = DisassemblyEditorInput.create( frame );
 					}
 					catch( DebugException e ) {
 						status = new Status( IStatus.ERROR, 
@@ -553,8 +545,7 @@ public class DisassemblyView extends AbstractDebugEventHandlerView
 	}
 
 	protected void selectAndReveal( ICStackFrame frame, IEditorInput input ) {
-		long address = frame.getAddress();
-		IRegion region = getLineInformation( address, input );
+		IRegion region = getLineInformation( frame, input );
 		if ( region != null ) {
 			int start = region.getOffset();
 			int length = region.getLength();			
@@ -572,9 +563,9 @@ public class DisassemblyView extends AbstractDebugEventHandlerView
 	/**
 	 * Returns the line information for the given line in the given editor
 	 */
-	private IRegion getLineInformation( long address, IEditorInput input ) {
+	private IRegion getLineInformation( ICStackFrame frame, IEditorInput input ) {
 		if ( input instanceof DisassemblyEditorInput ) {
-			int line = ((DisassemblyEditorInput)input).getInstructionNumber( address );
+			int line = ((DisassemblyEditorInput)input).getInstructionLine( frame.getAddress() );
 			if ( line > 0 ) {
 				try {
 					return getSourceViewer().getDocument().getLineInformation( --line );
@@ -703,8 +694,8 @@ public class DisassemblyView extends AbstractDebugEventHandlerView
 		Assert.isNotNull( model );
 		DisassemblyInstructionPointerAnnotation instrPointer = getCurrentInstructionPointer();
 		if ( instrPointer != null ) {
-				model.removeAnnotation( instrPointer );
-				setCurrentInstructionPointer( null );
+			model.removeAnnotation( instrPointer );
+			setCurrentInstructionPointer( null );
 		}
 	}