diff --git a/debug/org.eclipse.cdt.debug.core/ChangeLog b/debug/org.eclipse.cdt.debug.core/ChangeLog index 5e6a983ebe7..0351e891e5d 100644 --- a/debug/org.eclipse.cdt.debug.core/ChangeLog +++ b/debug/org.eclipse.cdt.debug.core/ChangeLog @@ -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. diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugModel.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugModel.java index 7bae974e48a..c1aeed62643 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugModel.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugModel.java @@ -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, diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/IFormattedMemoryBlock.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/IFormattedMemoryBlock.java index 2edab9425e3..33392425918 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/IFormattedMemoryBlock.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/IFormattedMemoryBlock.java @@ -134,4 +134,6 @@ public interface IFormattedMemoryBlock extends IMemoryBlock boolean canChangeFormat( int format ); boolean isLittleEndian(); + + boolean isStartAddressChanged(); } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CFormattedMemoryBlock.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CFormattedMemoryBlock.java index e2df108fe0d..b9013057159 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CFormattedMemoryBlock.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CFormattedMemoryBlock.java @@ -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; + } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/ChangeLog b/debug/org.eclipse.cdt.debug.mi.core/ChangeLog index 2ba6f4440ff..3f115d2e558 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/ChangeLog +++ b/debug/org.eclipse.cdt.debug.mi.core/ChangeLog @@ -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): diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/MemoryManager.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/MemoryManager.java index 192b07f40e5..ab605c4f843 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/MemoryManager.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/MemoryManager.java @@ -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]); diff --git a/debug/org.eclipse.cdt.debug.ui/ChangeLog b/debug/org.eclipse.cdt.debug.ui/ChangeLog index 165ba9e043d..39c7349cd4e 100644 --- a/debug/org.eclipse.cdt.debug.ui/ChangeLog +++ b/debug/org.eclipse.cdt.debug.ui/ChangeLog @@ -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 diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java index ce0c40218ac..78ec0d4e1d1 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryPresentation.java @@ -562,4 +562,13 @@ public class MemoryPresentation } return CDebugUtils.prependString( result, getDataItemLength(), ' ' ); } + + protected boolean isStartAddressChanged() + { + if ( getMemoryBlock() != null ) + { + return getMemoryBlock().isStartAddressChanged(); + } + return false; + } } diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryText.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryText.java index 3cf57220234..caf1aea02a2 100644 --- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryText.java +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/memory/MemoryText.java @@ -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();