mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 09:46:02 +02:00
Applied patch from 116302. Only difference from patch is a comment correction.
This commit is contained in:
parent
4f61ae0217
commit
809ce2a43e
6 changed files with 124 additions and 11 deletions
|
@ -241,9 +241,8 @@ public class CMemoryBlockRetrievalExtension extends PlatformObject implements IM
|
||||||
IValue value = exp.getValue();
|
IValue value = exp.getValue();
|
||||||
if ( value instanceof ICValue ) {
|
if ( value instanceof ICValue ) {
|
||||||
ICType type = ((ICValue)value).getType();
|
ICType type = ((ICValue)value).getType();
|
||||||
if ( type != null && (type.isPointer() || type.isIntegralType()) ) {
|
if ( type != null && (type.isPointer() || type.isIntegralType() || type.isArray()) ) {
|
||||||
address = value.getValueString();
|
address = value.getValueString();
|
||||||
exp.dispose();
|
|
||||||
if ( address != null ) {
|
if ( address != null ) {
|
||||||
// ???
|
// ???
|
||||||
BigInteger a = ( address.startsWith( "0x" ) ) ? new BigInteger( address.substring( 2 ), 16 ) : new BigInteger( address ); //$NON-NLS-1$
|
BigInteger a = ( address.startsWith( "0x" ) ) ? new BigInteger( address.substring( 2 ), 16 ) : new BigInteger( address ); //$NON-NLS-1$
|
||||||
|
@ -266,6 +265,12 @@ public class CMemoryBlockRetrievalExtension extends PlatformObject implements IM
|
||||||
catch( NumberFormatException e ) {
|
catch( NumberFormatException e ) {
|
||||||
msg = MessageFormat.format( InternalDebugCoreMessages.getString( "CMemoryBlockRetrievalExtension.0" ), new String[] { expression, address } ); //$NON-NLS-1$
|
msg = MessageFormat.format( InternalDebugCoreMessages.getString( "CMemoryBlockRetrievalExtension.0" ), new String[] { expression, address } ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
finally {
|
||||||
|
if (exp != null) {
|
||||||
|
exp.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
throw new DebugException( new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), DebugException.REQUEST_FAILED, msg, null ) );
|
throw new DebugException( new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), DebugException.REQUEST_FAILED, msg, null ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,10 +10,16 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.debug.internal.core.model;
|
package org.eclipse.cdt.debug.internal.core.model;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.IAddress;
|
||||||
|
import org.eclipse.cdt.core.IAddressFactory;
|
||||||
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIArrayValue;
|
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIArrayValue;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIPointerValue;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIType;
|
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIType;
|
||||||
|
import org.eclipse.cdt.debug.core.model.CVariableFormat;
|
||||||
import org.eclipse.cdt.debug.core.model.ICType;
|
import org.eclipse.cdt.debug.core.model.ICType;
|
||||||
import org.eclipse.debug.core.DebugException;
|
import org.eclipse.debug.core.DebugException;
|
||||||
import org.eclipse.debug.core.model.IIndexedValue;
|
import org.eclipse.debug.core.model.IIndexedValue;
|
||||||
|
@ -134,10 +140,35 @@ public class CIndexedValue extends AbstractCValue implements IIndexedValue {
|
||||||
return ( type != null ) ? type.getName() : ""; //$NON-NLS-1$
|
return ( type != null ) ? type.getName() : ""; //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/**
|
||||||
|
* Please note that this function returns the address of the array, not the
|
||||||
|
* contents of the array, as long as the underlying ICDIArrayValue is an
|
||||||
|
* instance of ICDIPointerValue. Otherwise, it returns an empty string.
|
||||||
|
*
|
||||||
* @see org.eclipse.debug.core.model.IValue#getValueString()
|
* @see org.eclipse.debug.core.model.IValue#getValueString()
|
||||||
*/
|
*/
|
||||||
public String getValueString() throws DebugException {
|
public String getValueString() throws DebugException {
|
||||||
|
if ( fCDIValue instanceof ICDIPointerValue ) {
|
||||||
|
try {
|
||||||
|
IAddressFactory factory = ((CDebugTarget)getDebugTarget()).getAddressFactory();
|
||||||
|
BigInteger pv = ((ICDIPointerValue)fCDIValue).pointerValue();
|
||||||
|
if ( pv == null )
|
||||||
|
return ""; //$NON-NLS-1$
|
||||||
|
IAddress address = factory.createAddress( pv );
|
||||||
|
if ( address == null )
|
||||||
|
return ""; //$NON-NLS-1$
|
||||||
|
CVariableFormat format = getParentVariable().getFormat();
|
||||||
|
if ( CVariableFormat.NATURAL.equals( format ) || CVariableFormat.HEXADECIMAL.equals( format ) )
|
||||||
|
return address.toHexAddressString();
|
||||||
|
if ( CVariableFormat.DECIMAL.equals( format ) )
|
||||||
|
return address.toString();
|
||||||
|
if ( CVariableFormat.BINARY.equals( format ) )
|
||||||
|
return address.toBinaryAddressString();
|
||||||
|
return null;
|
||||||
|
} catch (CDIException e) {
|
||||||
|
requestFailed( e.getMessage(), null );
|
||||||
|
}
|
||||||
|
}
|
||||||
return ""; //$NON-NLS-1$
|
return ""; //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -595,7 +595,7 @@ public class CValue extends AbstractCValue {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static CVariableFormat getNaturalFormat(ICDIValue value, CVariableFormat defaultFormat) throws CDIException {
|
protected static CVariableFormat getNaturalFormat(ICDIValue value, CVariableFormat defaultFormat) throws CDIException {
|
||||||
if (value instanceof ICDIFormattable) {
|
if (value instanceof ICDIFormattable) {
|
||||||
int naturalFormat = ((ICDIFormattable)value).getNaturalFormat();
|
int naturalFormat = ((ICDIFormattable)value).getNaturalFormat();
|
||||||
switch (naturalFormat) {
|
switch (naturalFormat) {
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
package org.eclipse.cdt.debug.mi.core.cdi.model;
|
package org.eclipse.cdt.debug.mi.core.cdi.model;
|
||||||
|
|
||||||
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.ICDIFormat;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIValue;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIValue;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
|
||||||
|
@ -87,6 +88,7 @@ public abstract class Variable extends VariableDescriptor implements ICDIVariabl
|
||||||
String language;
|
String language;
|
||||||
boolean isFake = false;
|
boolean isFake = false;
|
||||||
boolean isUpdated = true;
|
boolean isUpdated = true;
|
||||||
|
private String hexAddress;
|
||||||
|
|
||||||
public Variable(VariableDescriptor obj, MIVarCreate var) {
|
public Variable(VariableDescriptor obj, MIVarCreate var) {
|
||||||
super(obj);
|
super(obj);
|
||||||
|
@ -150,6 +152,37 @@ public abstract class Variable extends VariableDescriptor implements ICDIVariabl
|
||||||
return fMIVar;
|
return fMIVar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getHexAddress() throws CDIException {
|
||||||
|
|
||||||
|
if (hexAddress != null) {
|
||||||
|
return hexAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
MISession mi = ((Target)getTarget()).getMISession();
|
||||||
|
CommandFactory factory = mi.getCommandFactory();
|
||||||
|
String name = "&(" + getName() + ")";
|
||||||
|
MIVarCreate varCreateCmd = factory.createMIVarCreate(name);
|
||||||
|
try {
|
||||||
|
if (mi.getCommandTimeout() >= 0) {
|
||||||
|
mi.postCommand(varCreateCmd, mi.getCommandTimeout());
|
||||||
|
} else {
|
||||||
|
mi.postCommand(varCreateCmd);
|
||||||
|
}
|
||||||
|
MIVarCreateInfo info = varCreateCmd.getMIVarCreateInfo();
|
||||||
|
if (info == null) {
|
||||||
|
throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
MIVar var = info.getMIVar();
|
||||||
|
Variable v = createVariable((Target)getTarget(), (Thread)getThread(), (StackFrame)getStackFrame(),
|
||||||
|
name, name, getPosition(), getStackDepth(), var);
|
||||||
|
v.setFormat(ICDIFormat.HEXADECIMAL);
|
||||||
|
hexAddress = v.getValue().getValueString();
|
||||||
|
} catch (MIException e) {
|
||||||
|
throw new MI2CDIException(e);
|
||||||
|
}
|
||||||
|
return hexAddress;
|
||||||
|
}
|
||||||
|
|
||||||
public Variable getChild(String name) {
|
public Variable getChild(String name) {
|
||||||
for (int i = 0; i < children.length; i++) {
|
for (int i = 0; i < children.length; i++) {
|
||||||
Variable variable = (Variable) children[i];
|
Variable variable = (Variable) children[i];
|
||||||
|
@ -351,9 +384,9 @@ public abstract class Variable extends VariableDescriptor implements ICDIVariabl
|
||||||
} else if (t instanceof ICDIPointerType) {
|
} else if (t instanceof ICDIPointerType) {
|
||||||
value = new PointerValue(this);
|
value = new PointerValue(this);
|
||||||
} else if (t instanceof ICDIReferenceType) {
|
} else if (t instanceof ICDIReferenceType) {
|
||||||
value = new ReferenceValue(this);
|
value = new ReferenceValue(this, getHexAddress());
|
||||||
} else if (t instanceof ICDIArrayType) {
|
} else if (t instanceof ICDIArrayType) {
|
||||||
value = new ArrayValue(this);
|
value = new ArrayValue(this, getHexAddress());
|
||||||
} else if (t instanceof ICDIStructType) {
|
} else if (t instanceof ICDIStructType) {
|
||||||
value = new StructValue(this);
|
value = new StructValue(this);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -11,11 +11,14 @@
|
||||||
|
|
||||||
package org.eclipse.cdt.debug.mi.core.cdi.model.type;
|
package org.eclipse.cdt.debug.mi.core.cdi.model.type;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariableDescriptor;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariableDescriptor;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIArrayValue;
|
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIArrayValue;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIPointerValue;
|
||||||
import org.eclipse.cdt.debug.mi.core.cdi.Session;
|
import org.eclipse.cdt.debug.mi.core.cdi.Session;
|
||||||
import org.eclipse.cdt.debug.mi.core.cdi.VariableManager;
|
import org.eclipse.cdt.debug.mi.core.cdi.VariableManager;
|
||||||
import org.eclipse.cdt.debug.mi.core.cdi.model.Register;
|
import org.eclipse.cdt.debug.mi.core.cdi.model.Register;
|
||||||
|
@ -27,10 +30,27 @@ import org.eclipse.cdt.debug.mi.core.cdi.model.VariableDescriptor;
|
||||||
*
|
*
|
||||||
* @since Jun 3, 2003
|
* @since Jun 3, 2003
|
||||||
*/
|
*/
|
||||||
public class ArrayValue extends DerivedValue implements ICDIArrayValue {
|
public class ArrayValue extends DerivedValue implements ICDIArrayValue, ICDIPointerValue {
|
||||||
|
|
||||||
public ArrayValue(Variable v) {
|
private String hexAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct the array value object given a variable and the
|
||||||
|
* hexadecimal address of the variable.
|
||||||
|
*
|
||||||
|
* @param v
|
||||||
|
* @param hexAddress
|
||||||
|
*/
|
||||||
|
public ArrayValue(Variable v, String hexAddress) {
|
||||||
super(v);
|
super(v);
|
||||||
|
if (hexAddress == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (hexAddress.startsWith("0x") || hexAddress.startsWith("0X")) {
|
||||||
|
this.hexAddress = hexAddress.substring(2);
|
||||||
|
} else {
|
||||||
|
this.hexAddress = hexAddress;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
@ -78,4 +98,11 @@ public class ArrayValue extends DerivedValue implements ICDIArrayValue {
|
||||||
ICDIVariableDescriptor vo = mgr.getVariableDescriptorAsArray(variable, index, length);
|
ICDIVariableDescriptor vo = mgr.getVariableDescriptorAsArray(variable, index, length);
|
||||||
return mgr.createVariable((VariableDescriptor)vo).getValue().getVariables();
|
return mgr.createVariable((VariableDescriptor)vo).getValue().getVariables();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.core.cdi.model.type.ICDIPointerValue#pointerValue()
|
||||||
|
*/
|
||||||
|
public BigInteger pointerValue() throws CDIException {
|
||||||
|
return new BigInteger(hexAddress, 16);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
|
|
||||||
package org.eclipse.cdt.debug.mi.core.cdi.model.type;
|
package org.eclipse.cdt.debug.mi.core.cdi.model.type;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIValue;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIValue;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIArrayType;
|
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIArrayType;
|
||||||
|
@ -24,6 +26,7 @@ import org.eclipse.cdt.debug.core.cdi.model.type.ICDIIntType;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDILongLongType;
|
import org.eclipse.cdt.debug.core.cdi.model.type.ICDILongLongType;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDILongType;
|
import org.eclipse.cdt.debug.core.cdi.model.type.ICDILongType;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIPointerType;
|
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIPointerType;
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIPointerValue;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIReferenceType;
|
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIReferenceType;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIReferenceValue;
|
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIReferenceValue;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIShortType;
|
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIShortType;
|
||||||
|
@ -38,13 +41,23 @@ import org.eclipse.cdt.debug.mi.core.cdi.model.Variable;
|
||||||
*
|
*
|
||||||
* @since Jun 3, 2003
|
* @since Jun 3, 2003
|
||||||
*/
|
*/
|
||||||
public class ReferenceValue extends DerivedValue implements ICDIReferenceValue {
|
public class ReferenceValue extends DerivedValue implements ICDIReferenceValue, ICDIPointerValue {
|
||||||
|
|
||||||
|
private String hexAddress;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Construct a value object for the referred variable, including the actual
|
||||||
|
* hexadecimal address of the variable.
|
||||||
* @param v
|
* @param v
|
||||||
|
* @param hexAddress
|
||||||
*/
|
*/
|
||||||
public ReferenceValue(Variable v) {
|
public ReferenceValue(Variable v, String hexAddress) {
|
||||||
super(v);
|
super(v);
|
||||||
|
if (hexAddress.startsWith("0x") || hexAddress.startsWith("0X")) {
|
||||||
|
this.hexAddress = hexAddress.substring(2);
|
||||||
|
} else {
|
||||||
|
this.hexAddress = hexAddress;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
@ -81,7 +94,7 @@ public class ReferenceValue extends DerivedValue implements ICDIReferenceValue {
|
||||||
// } else if (t instanceof ICDIReferenceType) {
|
// } else if (t instanceof ICDIReferenceType) {
|
||||||
// value = new ReferenceValue(getVariable());
|
// value = new ReferenceValue(getVariable());
|
||||||
} else if (t instanceof ICDIArrayType) {
|
} else if (t instanceof ICDIArrayType) {
|
||||||
value = new ArrayValue(getVariable());
|
value = new ArrayValue(getVariable(), hexAddress);
|
||||||
} else if (t instanceof ICDIStructType) {
|
} else if (t instanceof ICDIStructType) {
|
||||||
value = new StructValue(getVariable());
|
value = new StructValue(getVariable());
|
||||||
} else {
|
} else {
|
||||||
|
@ -89,4 +102,8 @@ public class ReferenceValue extends DerivedValue implements ICDIReferenceValue {
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BigInteger pointerValue() throws CDIException {
|
||||||
|
return new BigInteger(hexAddress, 16);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue