diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CMemoryBlockRetrievalExtension.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CMemoryBlockRetrievalExtension.java index 3c391a76a35..9b72da9b31d 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CMemoryBlockRetrievalExtension.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CMemoryBlockRetrievalExtension.java @@ -241,9 +241,8 @@ public class CMemoryBlockRetrievalExtension extends PlatformObject implements IM IValue value = exp.getValue(); if ( value instanceof ICValue ) { ICType type = ((ICValue)value).getType(); - if ( type != null && (type.isPointer() || type.isIntegralType()) ) { + if ( type != null && (type.isPointer() || type.isIntegralType() || type.isArray()) ) { address = value.getValueString(); - exp.dispose(); if ( address != null ) { // ??? 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 ) { 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 ) ); } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CIndexedValue.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CIndexedValue.java index bfe47b63e52..3b7b9da1b26 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CIndexedValue.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CIndexedValue.java @@ -10,10 +10,16 @@ *******************************************************************************/ 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.model.ICDIVariable; 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.model.CVariableFormat; import org.eclipse.cdt.debug.core.model.ICType; import org.eclipse.debug.core.DebugException; 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$ } - /* (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() */ 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$ } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CValue.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CValue.java index 8a85adac557..e9c7c8dd7de 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CValue.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CValue.java @@ -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) { int naturalFormat = ((ICDIFormattable)value).getNaturalFormat(); switch (naturalFormat) { diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java index 6365f120375..5182cbeccfa 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java +++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java @@ -11,6 +11,7 @@ package org.eclipse.cdt.debug.mi.core.cdi.model; 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.ICDIValue; import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable; @@ -87,6 +88,7 @@ public abstract class Variable extends VariableDescriptor implements ICDIVariabl String language; boolean isFake = false; boolean isUpdated = true; + private String hexAddress; public Variable(VariableDescriptor obj, MIVarCreate var) { super(obj); @@ -150,6 +152,37 @@ public abstract class Variable extends VariableDescriptor implements ICDIVariabl 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) { for (int i = 0; i < children.length; i++) { Variable variable = (Variable) children[i]; @@ -351,9 +384,9 @@ public abstract class Variable extends VariableDescriptor implements ICDIVariabl } else if (t instanceof ICDIPointerType) { value = new PointerValue(this); } else if (t instanceof ICDIReferenceType) { - value = new ReferenceValue(this); + value = new ReferenceValue(this, getHexAddress()); } else if (t instanceof ICDIArrayType) { - value = new ArrayValue(this); + value = new ArrayValue(this, getHexAddress()); } else if (t instanceof ICDIStructType) { value = new StructValue(this); } else { diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/type/ArrayValue.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/type/ArrayValue.java index 5f1fff58604..9a1037879da 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/type/ArrayValue.java +++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/type/ArrayValue.java @@ -11,11 +11,14 @@ 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.model.ICDITarget; 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.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.VariableManager; 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 */ -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); + if (hexAddress == null) { + return; + } + if (hexAddress.startsWith("0x") || hexAddress.startsWith("0X")) { + this.hexAddress = hexAddress.substring(2); + } else { + this.hexAddress = hexAddress; + } } /* (non-Javadoc) @@ -78,4 +98,11 @@ public class ArrayValue extends DerivedValue implements ICDIArrayValue { ICDIVariableDescriptor vo = mgr.getVariableDescriptorAsArray(variable, index, length); 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); + } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/type/ReferenceValue.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/type/ReferenceValue.java index d35eb26ce51..f31efd1a1ac 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/type/ReferenceValue.java +++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/type/ReferenceValue.java @@ -11,6 +11,8 @@ 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.model.ICDIValue; 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.ICDILongType; 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.ICDIReferenceValue; 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 */ -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 hexAddress */ - public ReferenceValue(Variable v) { + public ReferenceValue(Variable v, String hexAddress) { super(v); + if (hexAddress.startsWith("0x") || hexAddress.startsWith("0X")) { + this.hexAddress = hexAddress.substring(2); + } else { + this.hexAddress = hexAddress; + } } /* (non-Javadoc) @@ -81,7 +94,7 @@ public class ReferenceValue extends DerivedValue implements ICDIReferenceValue { // } else if (t instanceof ICDIReferenceType) { // value = new ReferenceValue(getVariable()); } else if (t instanceof ICDIArrayType) { - value = new ArrayValue(getVariable()); + value = new ArrayValue(getVariable(), hexAddress); } else if (t instanceof ICDIStructType) { value = new StructValue(getVariable()); } else { @@ -89,4 +102,8 @@ public class ReferenceValue extends DerivedValue implements ICDIReferenceValue { } return value; } + + public BigInteger pointerValue() throws CDIException { + return new BigInteger(hexAddress, 16); + } }