mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-09 10:46:02 +02:00
Fixed bugzilla 219798. Reference variables show an address rather than a value.
This commit is contained in:
parent
c2b7d5be40
commit
e848c5f601
3 changed files with 47 additions and 22 deletions
|
@ -27,6 +27,14 @@ public class Value extends CObject implements ICDIValue {
|
||||||
|
|
||||||
protected Variable fVariable;
|
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) {
|
public Value(Variable v) {
|
||||||
super((Target)v.getTarget());
|
super((Target)v.getTarget());
|
||||||
fVariable = v;
|
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$
|
throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
result = info.getValue();
|
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) {
|
} catch (MIException e) {
|
||||||
throw new CDIException(e.getMessage());
|
throw new CDIException(e.getMessage());
|
||||||
}
|
}
|
||||||
|
@ -116,4 +137,17 @@ public class Value extends CObject implements ICDIValue {
|
||||||
return getVariable().getType();
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -348,7 +348,7 @@ 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, getHexAddress());
|
value = new ReferenceValue(this);
|
||||||
} else if (t instanceof ICDIArrayType) {
|
} else if (t instanceof ICDIArrayType) {
|
||||||
value = new ArrayValue(this, getHexAddress());
|
value = new ArrayValue(this, getHexAddress());
|
||||||
} else if (t instanceof ICDIStructType) {
|
} else if (t instanceof ICDIStructType) {
|
||||||
|
|
|
@ -11,11 +11,9 @@
|
||||||
|
|
||||||
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.ICDIBoolType;
|
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.ICDICharType;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIDoubleType;
|
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.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;
|
||||||
|
@ -41,23 +38,14 @@ 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, ICDIPointerValue {
|
public class ReferenceValue extends DerivedValue implements ICDIReferenceValue {
|
||||||
|
|
||||||
private String hexAddress;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a value object for the referred variable, including the actual
|
* Construct a value object for the referred variable
|
||||||
* hexadecimal address of the variable.
|
|
||||||
* @param v
|
* @param v
|
||||||
* @param hexAddress
|
|
||||||
*/
|
*/
|
||||||
public ReferenceValue(Variable v, String hexAddress) {
|
public ReferenceValue(Variable v) {
|
||||||
super(v);
|
super(v);
|
||||||
if (hexAddress.startsWith("0x") || hexAddress.startsWith("0X")) {
|
|
||||||
this.hexAddress = hexAddress.substring(2);
|
|
||||||
} else {
|
|
||||||
this.hexAddress = hexAddress;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
@ -93,17 +81,20 @@ public class ReferenceValue extends DerivedValue implements ICDIReferenceValue,
|
||||||
value = new PointerValue(getVariable());
|
value = new PointerValue(getVariable());
|
||||||
// } else if (t instanceof ICDIReferenceType) {
|
// } else if (t instanceof ICDIReferenceType) {
|
||||||
// value = new ReferenceValue(getVariable());
|
// 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) {
|
} else if (t instanceof ICDIStructType) {
|
||||||
value = new StructValue(getVariable());
|
value = new StructValue(getVariable());
|
||||||
} else {
|
} else {
|
||||||
value = new Value(getVariable());
|
value = new Value(getVariable());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
value.setIsReference(true);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BigInteger pointerValue() throws CDIException {
|
|
||||||
return new BigInteger(hexAddress, 16);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue