1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

Fixed bugzilla 219798. Reference variables show an address rather than a value.

This commit is contained in:
John Cortell 2009-01-06 21:02:28 +00:00
parent c2b7d5be40
commit e848c5f601
3 changed files with 47 additions and 22 deletions

View file

@ -27,6 +27,14 @@ public class Value extends CObject implements ICDIValue {
protected Variable fVariable;
/**
* Indicates whether this Value object is for a C++ reference variable. If
* it is, then some decoding is needed on the value string we get from gdb,
* since it will contain two things: the address of the variable being
* referenced and the value.
*/
protected boolean fIsReference;
public Value(Variable v) {
super((Target)v.getTarget());
fVariable = v;
@ -64,6 +72,19 @@ public class Value extends CObject implements ICDIValue {
throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$
}
result = info.getValue();
// Reference variables get back a string with two things: the address of the
// variable being referenced and the value of the variable. The expected
// format is, by example (for a float&): "@0x22cc98: 3.19616001e-39"
// We need to dig out the latter.
if (fIsReference) {
if (result.startsWith("@0x")) {
int index = result.indexOf(':');
if (index > 0 && ((index + 1) < result.length())) {
result = result.substring(index+1).trim();
}
}
}
} catch (MIException e) {
throw new CDIException(e.getMessage());
}
@ -116,4 +137,17 @@ public class Value extends CObject implements ICDIValue {
return getVariable().getType();
}
/**
* Call this after construction with 'true' if the Value is for a reference
* variable. See {@link #fIsReference}.
*
* Ideally, this property would be passed to the constructor. However
* introducing it that way at this point in time would cause a lot of churn
* in the codebase, since this class is not directly instantiated, and it
* has many subclasses.
*/
public void setIsReference(boolean isReference) {
fIsReference = isReference;
}
}

View file

@ -348,7 +348,7 @@ 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, getHexAddress());
value = new ReferenceValue(this);
} else if (t instanceof ICDIArrayType) {
value = new ArrayValue(this, getHexAddress());
} else if (t instanceof ICDIStructType) {

View file

@ -11,11 +11,9 @@
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;
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIBoolType;
import org.eclipse.cdt.debug.core.cdi.model.type.ICDICharType;
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIDoubleType;
@ -26,7 +24,6 @@ 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;
@ -41,23 +38,14 @@ import org.eclipse.cdt.debug.mi.core.cdi.model.Variable;
*
* @since Jun 3, 2003
*/
public class ReferenceValue extends DerivedValue implements ICDIReferenceValue, ICDIPointerValue {
public class ReferenceValue extends DerivedValue implements ICDIReferenceValue {
private String hexAddress;
/**
* Construct a value object for the referred variable, including the actual
* hexadecimal address of the variable.
* Construct a value object for the referred variable
* @param v
* @param hexAddress
*/
public ReferenceValue(Variable v, String hexAddress) {
public ReferenceValue(Variable v) {
super(v);
if (hexAddress.startsWith("0x") || hexAddress.startsWith("0X")) {
this.hexAddress = hexAddress.substring(2);
} else {
this.hexAddress = hexAddress;
}
}
/* (non-Javadoc)
@ -93,17 +81,20 @@ public class ReferenceValue extends DerivedValue implements ICDIReferenceValue,
value = new PointerValue(getVariable());
// } else if (t instanceof ICDIReferenceType) {
// value = new ReferenceValue(getVariable());
} else if (t instanceof ICDIArrayType) {
value = new ArrayValue(getVariable(), hexAddress);
//
// Don't think you can have a reference to an array variable, making
// the following case pointless. Removing it since it would otherwise
// require us to be constructed with a hexAddress qualifier.
// } else if (t instanceof ICDIArrayType) {
// value = new ArrayValue(getVariable(), hexAddress);
//
} else if (t instanceof ICDIStructType) {
value = new StructValue(getVariable());
} else {
value = new Value(getVariable());
}
value.setIsReference(true);
return value;
}
public BigInteger pointerValue() throws CDIException {
return new BigInteger(hexAddress, 16);
}
}