1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Fix for bug 26595.

This commit is contained in:
Mikhail Khodjaiants 2002-11-20 21:51:43 +00:00
parent 88455f3cd6
commit fdc45b36d4
9 changed files with 107 additions and 19 deletions

View file

@ -1,3 +1,11 @@
2002-11-20 Mikhail Khodjaiants
Fix for bug 26595.
The type of the address expression has been changed from String to ICDIExpression to handle
changes of the start address.
* CDebugModel.java
* CFormattedMemoryBlock.java
* IFormattedMemoryBlock.java: added the 'isStartAddressChanged' method.
2002-11-15 Mikhail Khodjaiants
Partial fix for bug 25956.
* DisassemblyManager.java: Filter out the instructions that do not belong to the function.

View file

@ -367,7 +367,7 @@ public class CDebugModel
}
public static IFormattedMemoryBlock createFormattedMemoryBlock( IDebugTarget target,
String startAddress,
String addressExpression,
int format,
int wordSize,
int numberOfRows,
@ -378,12 +378,15 @@ public class CDebugModel
{
try
{
ICDIExpression expression = ((CDebugTarget)target).getCDISession()
.getExpressionManager()
.createExpression( addressExpression );
ICDIMemoryBlock cdiMemoryBlock = ((CDebugTarget)target).getCDISession()
.getMemoryManager()
.createMemoryBlock( startAddress, wordSize * numberOfRows * numberOfColumns );
.createMemoryBlock( expression.getName(), wordSize * numberOfRows * numberOfColumns );
return new CFormattedMemoryBlock( (CDebugTarget)target,
cdiMemoryBlock,
startAddress,
expression,
format,
wordSize,
numberOfRows,
@ -403,7 +406,7 @@ public class CDebugModel
}
public static IFormattedMemoryBlock createFormattedMemoryBlock( IDebugTarget target,
String startAddress,
String addressExpression,
int format,
int wordSize,
int numberOfRows,
@ -413,12 +416,15 @@ public class CDebugModel
{
try
{
ICDIExpression expression = ((CDebugTarget)target).getCDISession()
.getExpressionManager()
.createExpression( addressExpression );
ICDIMemoryBlock cdiMemoryBlock = ((CDebugTarget)target).getCDISession()
.getMemoryManager()
.createMemoryBlock( startAddress, wordSize * numberOfRows * numberOfColumns );
.createMemoryBlock( expression.getName(), wordSize * numberOfRows * numberOfColumns );
return new CFormattedMemoryBlock( (CDebugTarget)target,
cdiMemoryBlock,
startAddress,
expression,
format,
wordSize,
numberOfRows,

View file

@ -134,4 +134,6 @@ public interface IFormattedMemoryBlock extends IMemoryBlock
boolean canChangeFormat( int format );
boolean isLittleEndian();
boolean isStartAddressChanged();
}

View file

@ -14,10 +14,12 @@ import org.eclipse.cdt.debug.core.IExecFileInfo;
import org.eclipse.cdt.debug.core.IFormattedMemoryBlock;
import org.eclipse.cdt.debug.core.IFormattedMemoryBlockRow;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.event.ICDIChangedEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener;
import org.eclipse.cdt.debug.core.cdi.event.ICDIMemoryChangedEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDIResumedEvent;
import org.eclipse.cdt.debug.core.cdi.model.ICDIExpression;
import org.eclipse.cdt.debug.core.cdi.model.ICDIMemoryBlock;
import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
@ -175,7 +177,8 @@ public class CFormattedMemoryBlock extends CDebugElement
}
}
private String fAddressExpression;
// private String fAddressExpression;
private ICDIExpression fAddressExpression;
private ICDIMemoryBlock fCDIMemoryBlock;
private byte[] fBytes = null;
private int fFormat;
@ -187,6 +190,7 @@ public class CFormattedMemoryBlock extends CDebugElement
private List fRows = null;
private Long[] fChangedAddresses = new Long[0];
private DirtyBytes fDirtyBytes = null;
private boolean fStartAddressChanged = false;
/**
* Constructor for CFormattedMemoryBlock.
@ -194,7 +198,7 @@ public class CFormattedMemoryBlock extends CDebugElement
*/
public CFormattedMemoryBlock( CDebugTarget target,
ICDIMemoryBlock cdiMemoryBlock,
String addressExpression,
ICDIExpression addressExpression,
int format,
int wordSize,
int numberOfRows,
@ -209,7 +213,7 @@ public class CFormattedMemoryBlock extends CDebugElement
*/
public CFormattedMemoryBlock( CDebugTarget target,
ICDIMemoryBlock cdiMemoryBlock,
String addressExpression,
ICDIExpression addressExpression,
int format,
int wordSize,
int numberOfRows,
@ -224,7 +228,7 @@ public class CFormattedMemoryBlock extends CDebugElement
fNumberOfRows = numberOfRows;
fNumberOfColumns = numberOfColumns;
fDisplayAscii = true;
fPaddingChar = paddingChar;
fPaddingChar = paddingChar;
getCDISession().getEventManager().addEventListener( this );
}
@ -473,6 +477,18 @@ public class CFormattedMemoryBlock extends CDebugElement
}
fCDIMemoryBlock = null;
}
if ( fAddressExpression != null )
{
try
{
((CDebugTarget)getDebugTarget()).getCDISession().getExpressionManager().removeExpression( fAddressExpression );
}
catch( CDIException e )
{
CDebugCorePlugin.log( e );
}
fAddressExpression = null;
}
getCDISession().getEventManager().removeEventListener( this );
}
@ -481,7 +497,15 @@ public class CFormattedMemoryBlock extends CDebugElement
*/
public String getAddressExpression()
{
return fAddressExpression;
try
{
return fAddressExpression.getName();
}
catch( CDIException e )
{
// ignore
}
return "";
}
private String[] createData( byte[] bytes, int offset, int length )
@ -539,6 +563,13 @@ public class CFormattedMemoryBlock extends CDebugElement
handleChangedEvent( (ICDIMemoryChangedEvent)event );
}
}
else if ( event instanceof ICDIChangedEvent )
{
if ( source instanceof ICDIExpression && source.equals( fAddressExpression ) )
{
handleAddressChangedEvent( (ICDIChangedEvent)event );
}
}
}
}
@ -555,6 +586,7 @@ public class CFormattedMemoryBlock extends CDebugElement
private void handleResumedEvent( ICDIResumedEvent event )
{
resetChangedAddresses();
fStartAddressChanged = false;
fireChangeEvent( DebugEvent.CONTENT );
}
@ -566,6 +598,14 @@ public class CFormattedMemoryBlock extends CDebugElement
fireChangeEvent( DebugEvent.CONTENT );
}
private void handleAddressChangedEvent( ICDIChangedEvent event )
{
resetBytes();
resetRows();
fStartAddressChanged = true;
fireChangeEvent( DebugEvent.CONTENT );
}
public Long[] getChangedAddresses()
{
return fChangedAddresses;
@ -730,4 +770,12 @@ public class CFormattedMemoryBlock extends CDebugElement
}
return true;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.IFormattedMemoryBlock#isStartAddressChanged()
*/
public boolean isStartAddressChanged()
{
return fStartAddressChanged;
}
}

View file

@ -1,3 +1,9 @@
2002-11-20 Mikhail Khodjaiants
Fix for bug 26595.
* src/.../mi/core/cdi/MemoryManager.java (compareBlocks):
If the start address of a memory block has changed fir 'changed' event
only for the corresponding bytes of the overlapping area of new and old blocks.
2002-11-19 Alain Magloire
* src/.../mi/core/cdi/MemoryManager.java (compareBlocks):

View file

@ -58,10 +58,11 @@ public class MemoryManager extends SessionObject implements ICDIMemoryManager {
*/
public Long[] update(MemoryBlock block, List aList) throws CDIException {
MemoryBlock newBlock = cloneBlock(block);
boolean newAddress = ( newBlock.getStartAddress() != block.getStartAddress() );
Long[] array = compareBlocks(block, newBlock);
// Update the block MIDataReadMemoryInfo.
block.setMIDataReadMemoryInfo(newBlock.getMIDataReadMemoryInfo());
if (array.length > 0) {
if (array.length > 0 || newAddress) {
if (aList != null) {
aList.add(new MIMemoryChangedEvent(array));
} else {
@ -90,13 +91,14 @@ public class MemoryManager extends SessionObject implements ICDIMemoryManager {
byte[] oldBytes = oldBlock.getBytes();
byte[] newBytes = newBlock.getBytes();
List aList = new ArrayList(newBytes.length);
for (int i = 0; i < newBytes.length; i++) {
if (i < oldBytes.length) {
if (oldBytes[i] != newBytes[i]) {
aList.add(new Long(newBlock.getStartAddress() + i));
long diff = newBlock.getStartAddress() - oldBlock.getStartAddress();
if ( Math.abs( diff ) < newBytes.length ) {
for (int i = 0; i < newBytes.length; i++) {
if (i + (int)diff < oldBytes.length && i + (int)diff >= 0) {
if (oldBytes[i + (int)diff] != newBytes[i]) {
aList.add(new Long(newBlock.getStartAddress() + i));
}
}
} else {
aList.add(new Long(newBlock.getStartAddress() + i));
}
}
return (Long[])aList.toArray(new Long[0]);

View file

@ -1,3 +1,9 @@
2002-11-20 Mikhail Khodjaiants
Fix for bug 26595.
Highlight the addresses if the start address of a memory expression has changed.
*MemoryPresentation.java
*MemoryText.java
2002-11-19 Mikhail Khodjaiants
Added enablement condition to some actions.
*plugin.xml

View file

@ -562,4 +562,13 @@ public class MemoryPresentation
}
return CDebugUtils.prependString( result, getDataItemLength(), ' ' );
}
protected boolean isStartAddressChanged()
{
if ( getMemoryBlock() != null )
{
return getMemoryBlock().isStartAddressChanged();
}
return false;
}
}

View file

@ -142,11 +142,12 @@ public class MemoryText
}
zones = fPresentation.getAddressZones();
boolean isStartAddressChanged = fPresentation.isStartAddressChanged();
for ( int i = 0; i < zones.length; ++i )
{
fText.setStyleRange( new StyleRange( zones[i].x,
zones[i].y - zones[i].x + 1,
getAddressColor(),
( isStartAddressChanged ) ? getChangedColor() : getAddressColor(),
getBackgroundColor() ) );
}
fText.redraw();