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

Implementation of the 'SaveMemoryChanges' action.

This commit is contained in:
Mikhail Khodjaiants 2002-10-30 21:55:59 +00:00
parent d54c3caff1
commit f5a02f5aab
3 changed files with 65 additions and 6 deletions

View file

@ -1,4 +1,9 @@
2002-10-29 Mikhail Khodjaiants
2002-10-30 Mikhail Khodjaiants
Implementation of the 'SaveMemoryChanges' action.
* IFormattedMemoryBlock.java: added the 'saveChanges' method.
* CFormattedMemoryBlock.java: implementation of the 'saveChanges' method.
2002-10-30 Mikhail Khodjaiants
Fix for bug 25283.
* CDebugTarget.java: in 'setCurrentThread' method set the 'isCurrent' flag to false for the currently current thread.

View file

@ -126,4 +126,6 @@ public interface IFormattedMemoryBlock extends IMemoryBlock
void setFrozen( boolean frozen );
boolean isDirty();
void saveChanges() throws DebugException;
}

View file

@ -6,6 +6,7 @@
package org.eclipse.cdt.debug.internal.core.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
@ -84,8 +85,7 @@ public class CFormattedMemoryBlock extends CDebugElement
private char fPaddingChar = '.';
private List fRows = null;
private Long[] fChangedAddresses = new Long[0];
// temporary
private boolean fIsDirty = false;
private boolean[] fDirtyBytes = null;
/**
* Constructor for CFormattedMemoryBlock.
@ -199,7 +199,7 @@ public class CFormattedMemoryBlock extends CDebugElement
private void resetBytes()
{
fBytes = null;
fIsDirty = false;
fDirtyBytes = null;
}
private void resetRows()
@ -305,6 +305,8 @@ public class CFormattedMemoryBlock extends CDebugElement
try
{
fBytes = fCDIMemoryBlock.getBytes();
fDirtyBytes = new boolean[fBytes.length];
Arrays.fill( fDirtyBytes, false );
}
catch( CDIException e )
{
@ -486,7 +488,7 @@ public class CFormattedMemoryBlock extends CDebugElement
{
byte[] bytes = itemToBytes( newValue.toCharArray() );
setBytes( index * getWordSize(), bytes );
fIsDirty = true;
Arrays.fill( fDirtyBytes, index * getWordSize(), index * getWordSize() + bytes.length, true );
resetRows();
}
@ -530,6 +532,56 @@ public class CFormattedMemoryBlock extends CDebugElement
*/
public boolean isDirty()
{
return fIsDirty;
if ( fDirtyBytes != null )
{
for ( int i = 0; i < fDirtyBytes.length; ++i )
{
if ( fDirtyBytes[i] )
return true;
}
}
return false;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.IFormattedMemoryBlock#saveChanges()
*/
public void saveChanges() throws DebugException
{
if ( getBytes() != null && fDirtyBytes != null && getCDIMemoryBlock() != null )
{
int startIndex = -1;
for ( int i = 0; i < fDirtyBytes.length; ++i )
{
if ( fDirtyBytes[i] )
{
if ( startIndex == -1 )
{
startIndex = i;
}
}
else
{
if ( startIndex != -1 )
{
byte[] bytes = new byte[i - startIndex];
for ( int j = startIndex; j < i; ++j )
{
bytes[j - startIndex] = getBytes()[j];
}
try
{
getCDIMemoryBlock().setValue( startIndex, bytes );
startIndex = -1;
}
catch( CDIException e )
{
targetRequestFailed( e.getMessage(), null );
}
}
}
}
Arrays.fill( fDirtyBytes, false );
}
}
}