mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-29 20:05:35 +02:00
Moved some methods from ICDIVariable to ICDIVariableObject.
Create 'var-objects' only for the requested array partitions.
This commit is contained in:
parent
df11a294b8
commit
0627136ff0
13 changed files with 322 additions and 169 deletions
|
@ -1,3 +1,18 @@
|
|||
2003-08-13 Mikhail Khodjaiants
|
||||
* ICDIVariable.java: removed the 'isEditable' method
|
||||
* ICDIVariableObject.java: added the 'isEditable', 'getQualifiedName' and 'sizeof' methods
|
||||
* ICDIArrayValue.java: added the 'getVariables(int start, int length)' method
|
||||
* ICType.java: added the 'isReference' method
|
||||
* ICValue.java: added the 'dispose' method
|
||||
* CArrayPartition.java
|
||||
* CArrayPartitionValue.java
|
||||
* CGlobalVariable.java
|
||||
* CType.java
|
||||
* CValue.java
|
||||
* CValueFactory.java
|
||||
* CVariable.java
|
||||
Create 'var-objects' only for the requested array partitions.
|
||||
|
||||
2003-08-07 Alain Magloire
|
||||
|
||||
* ICDIVariableManager.java:
|
||||
|
|
|
@ -26,12 +26,6 @@ public interface ICDIVariable extends ICDIVariableObject {
|
|||
*/
|
||||
ICDIValue getValue() throws CDIException;
|
||||
|
||||
/**
|
||||
* Returns true if the value could be changed.
|
||||
* @trhows CDIException if the method fails.
|
||||
*/
|
||||
boolean isEditable() throws CDIException;
|
||||
|
||||
/**
|
||||
* Attempts to set the value of this variable to the value of
|
||||
* the given expression.
|
||||
|
|
|
@ -48,7 +48,26 @@ public interface ICDIVariableObject extends ICDIObject {
|
|||
String getTypeName() throws CDIException;
|
||||
|
||||
/**
|
||||
* @return
|
||||
* Returns the size of this variable.
|
||||
*
|
||||
* @return the size of this variable
|
||||
* @throws CDIException if this method fails. Reasons include:
|
||||
*/
|
||||
int sizeof() throws CDIException;
|
||||
|
||||
/**
|
||||
* Returns true if the value of this variable could be changed.
|
||||
*
|
||||
* @return true if the value of this variable could be changed
|
||||
* @throws CDIException if this method fails. Reasons include:
|
||||
*/
|
||||
boolean isEditable() throws CDIException;
|
||||
|
||||
/**
|
||||
* Returns the qualified name of this variable.
|
||||
*
|
||||
* @return the qualified name of this variable
|
||||
* @throws CDIException if this method fails. Reasons include:
|
||||
*/
|
||||
String getQualifiedName() throws CDIException;
|
||||
}
|
||||
|
|
|
@ -5,6 +5,9 @@
|
|||
*/
|
||||
package org.eclipse.cdt.debug.core.cdi.model.type;
|
||||
|
||||
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -13,4 +16,5 @@ package org.eclipse.cdt.debug.core.cdi.model.type;
|
|||
* @since April 15, 2003
|
||||
*/
|
||||
public interface ICDIArrayValue extends ICDIDerivedValue {
|
||||
ICDIVariable[] getVariables(int index, int length) throws CDIException;
|
||||
}
|
||||
|
|
|
@ -29,5 +29,7 @@ public interface ICType extends IAdaptable
|
|||
|
||||
boolean isPointer();
|
||||
|
||||
boolean isReference();
|
||||
|
||||
void dispose();
|
||||
}
|
||||
|
|
|
@ -17,4 +17,6 @@ import org.eclipse.debug.core.model.IValue;
|
|||
public interface ICValue extends IValue
|
||||
{
|
||||
String evaluateAsExpression();
|
||||
|
||||
void dispose();
|
||||
}
|
||||
|
|
|
@ -13,6 +13,8 @@ import org.eclipse.cdt.debug.core.cdi.CDIException;
|
|||
import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent;
|
||||
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.type.ICDIArrayValue;
|
||||
import org.eclipse.cdt.debug.core.model.ICType;
|
||||
import org.eclipse.debug.core.DebugException;
|
||||
import org.eclipse.debug.core.model.IValue;
|
||||
|
||||
|
@ -28,7 +30,8 @@ public class CArrayPartition extends CVariable
|
|||
|
||||
private int fStart;
|
||||
private int fEnd;
|
||||
private List fCDIVariables;
|
||||
private ICDIVariable fCDIVariable;
|
||||
private ICType fType = null;
|
||||
|
||||
/**
|
||||
* Cache of value.
|
||||
|
@ -39,12 +42,12 @@ public class CArrayPartition extends CVariable
|
|||
* Constructor for CArrayPartition.
|
||||
* @param target
|
||||
*/
|
||||
public CArrayPartition( CDebugElement parent, List cdiVariables, int start, int end )
|
||||
public CArrayPartition( CDebugElement parent, ICDIVariable cdiVariable, int start, int end )
|
||||
{
|
||||
super( parent, null );
|
||||
fStart = start;
|
||||
fEnd = end;
|
||||
fCDIVariables = cdiVariables;
|
||||
fCDIVariable = cdiVariable;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -91,38 +94,49 @@ public class CArrayPartition extends CVariable
|
|||
{
|
||||
if ( fArrayPartitionValue == null )
|
||||
{
|
||||
fArrayPartitionValue = new CArrayPartitionValue( this, fCDIVariables, getStart(), getEnd() );
|
||||
fArrayPartitionValue = new CArrayPartitionValue( this, fCDIVariable, getStart(), getEnd() );
|
||||
}
|
||||
return fArrayPartitionValue;
|
||||
}
|
||||
|
||||
static public List splitArray( CDebugElement parent, List cdiVars, int start, int end )
|
||||
static public List splitArray( CDebugElement parent, ICDIVariable cdiVariable, int start, int end ) throws DebugException
|
||||
{
|
||||
ArrayList children = new ArrayList();
|
||||
int len = end - start + 1;
|
||||
int perSlot = 1;
|
||||
int len = end - start;
|
||||
while( perSlot * SLOT_SIZE < len )
|
||||
while( len > perSlot * SLOT_SIZE )
|
||||
{
|
||||
perSlot = perSlot * SLOT_SIZE;
|
||||
perSlot *= SLOT_SIZE;
|
||||
}
|
||||
|
||||
while( start <= end )
|
||||
if ( perSlot == 1 )
|
||||
{
|
||||
if ( start + perSlot > end )
|
||||
try
|
||||
{
|
||||
perSlot = end - start + 1;
|
||||
ICDIValue value = cdiVariable.getValue();
|
||||
if ( value instanceof ICDIArrayValue )
|
||||
{
|
||||
ICDIVariable[] cdiVars = ((ICDIArrayValue)value).getVariables( start, len );
|
||||
for ( int i = 0; i < cdiVars.length; ++i )
|
||||
children.add( new CModificationVariable( parent, cdiVars[i] ) );
|
||||
}
|
||||
}
|
||||
CVariable var = null;
|
||||
if ( perSlot == 1 )
|
||||
catch( CDIException e )
|
||||
{
|
||||
var = new CModificationVariable( parent, (ICDIVariable)cdiVars.get( start ) );
|
||||
children.add( new CModificationVariable( parent, new CVariable.ErrorVariable( null, e ) ) );
|
||||
}
|
||||
else
|
||||
}
|
||||
else
|
||||
{
|
||||
int pos = start;
|
||||
while( pos <= end )
|
||||
{
|
||||
var = new CArrayPartition( parent, cdiVars.subList( start, start + perSlot ), start, start + perSlot - 1 );
|
||||
if ( pos + perSlot > end )
|
||||
{
|
||||
perSlot = end - pos + 1;
|
||||
}
|
||||
children.add( new CArrayPartition( parent, cdiVariable, pos, pos + perSlot - 1 ) );
|
||||
pos += perSlot;
|
||||
}
|
||||
children.add( var );
|
||||
start += perSlot;
|
||||
}
|
||||
return children;
|
||||
}
|
||||
|
@ -144,4 +158,32 @@ public class CArrayPartition extends CVariable
|
|||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.model.ICVariable#getType()
|
||||
*/
|
||||
public ICType getType() throws DebugException
|
||||
{
|
||||
if ( fType == null )
|
||||
{
|
||||
try
|
||||
{
|
||||
if ( fCDIVariable != null && !(fCDIVariable instanceof ErrorVariable) )
|
||||
fType = new CType( fCDIVariable.getType() );
|
||||
}
|
||||
catch (CDIException e)
|
||||
{
|
||||
requestFailed( "Type is not available.", e );
|
||||
}
|
||||
}
|
||||
return fType;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.model.ICVariable#hasChildren()
|
||||
*/
|
||||
public boolean hasChildren()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,12 +6,12 @@
|
|||
|
||||
package org.eclipse.cdt.debug.internal.core.model;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
|
||||
import org.eclipse.cdt.debug.core.model.ICExpressionEvaluator;
|
||||
import org.eclipse.cdt.debug.core.model.ICValue;
|
||||
import org.eclipse.debug.core.DebugException;
|
||||
import org.eclipse.debug.core.model.IVariable;
|
||||
|
@ -25,9 +25,9 @@ import org.eclipse.debug.core.model.IVariable;
|
|||
public class CArrayPartitionValue extends CDebugElement implements ICValue
|
||||
{
|
||||
/**
|
||||
* The underlying CDI variables.
|
||||
* The underlying CDI variable.
|
||||
*/
|
||||
private List fCDIVariables;
|
||||
private ICDIVariable fCDIVariable;
|
||||
|
||||
/**
|
||||
* Parent variable.
|
||||
|
@ -47,10 +47,10 @@ public class CArrayPartitionValue extends CDebugElement implements ICValue
|
|||
* Constructor for CArrayPartitionValue.
|
||||
* @param target
|
||||
*/
|
||||
public CArrayPartitionValue( CVariable parent, List cdiVariables, int start, int end )
|
||||
public CArrayPartitionValue( CVariable parent, ICDIVariable cdiVariable, int start, int end )
|
||||
{
|
||||
super( (CDebugTarget)parent.getDebugTarget() );
|
||||
fCDIVariables = cdiVariables;
|
||||
fCDIVariable = cdiVariable;
|
||||
fParent = parent;
|
||||
fStart = start;
|
||||
fEnd = end;
|
||||
|
@ -85,15 +85,19 @@ public class CArrayPartitionValue extends CDebugElement implements ICValue
|
|||
*/
|
||||
public IVariable[] getVariables() throws DebugException
|
||||
{
|
||||
if ( fVariables.isEmpty() )
|
||||
List list = getVariables0();
|
||||
return (IVariable[])list.toArray( new IVariable[list.size()] );
|
||||
}
|
||||
|
||||
protected synchronized List getVariables0() throws DebugException
|
||||
{
|
||||
if ( !isAllocated() || !hasVariables() )
|
||||
return Collections.EMPTY_LIST;
|
||||
if ( fVariables.size() == 0 )
|
||||
{
|
||||
fVariables = new ArrayList( getEnd() - getStart() + 1 );
|
||||
for ( int i = getStart(); i <= getEnd(); ++i )
|
||||
{
|
||||
fVariables.add( new CModificationVariable( this, (ICDIVariable)fCDIVariables.get( i - getStart() ) ) );
|
||||
}
|
||||
fVariables = CArrayPartition.splitArray( this, getCDIVariable(), getStart(), getEnd() );
|
||||
}
|
||||
return (IVariable[])fVariables.toArray( new IVariable[fVariables.size()] );
|
||||
return fVariables;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -128,7 +132,21 @@ public class CArrayPartitionValue extends CDebugElement implements ICValue
|
|||
*/
|
||||
public String evaluateAsExpression()
|
||||
{
|
||||
return null;
|
||||
ICExpressionEvaluator ee = (ICExpressionEvaluator)getDebugTarget().getAdapter( ICExpressionEvaluator.class );
|
||||
String valueString = null;
|
||||
if ( ee != null && ee.canEvaluate() )
|
||||
{
|
||||
try
|
||||
{
|
||||
if ( getParentVariable() != null && !getParentVariable().isAccessSpecifier() )
|
||||
valueString = ee.evaluateExpressionToString( getParentVariable().getQualifiedName() );
|
||||
}
|
||||
catch( DebugException e )
|
||||
{
|
||||
valueString = e.getMessage();
|
||||
}
|
||||
}
|
||||
return valueString;
|
||||
}
|
||||
|
||||
public CVariable getParentVariable()
|
||||
|
@ -136,27 +154,17 @@ public class CArrayPartitionValue extends CDebugElement implements ICValue
|
|||
return fParent;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.model.ICValue#isNaN()
|
||||
*/
|
||||
public boolean isNaN()
|
||||
protected ICDIVariable getCDIVariable()
|
||||
{
|
||||
return false;
|
||||
return fCDIVariable;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.model.ICValue#isNegativeInfinity()
|
||||
*/
|
||||
public boolean isNegativeInfinity()
|
||||
public void dispose()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.model.ICValue#isPositiveInfinity()
|
||||
*/
|
||||
public boolean isPositiveInfinity()
|
||||
{
|
||||
return false;
|
||||
Iterator it = fVariables.iterator();
|
||||
while( it.hasNext() )
|
||||
{
|
||||
((CVariable)it.next()).dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,10 +1,13 @@
|
|||
package org.eclipse.cdt.debug.internal.core.model;
|
||||
|
||||
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent;
|
||||
import org.eclipse.cdt.debug.core.cdi.event.ICDIResumedEvent;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
|
||||
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.type.ICDIArrayValue;
|
||||
import org.eclipse.debug.core.DebugException;
|
||||
import org.eclipse.debug.core.model.IValue;
|
||||
|
||||
|
@ -36,7 +39,24 @@ public class CGlobalVariable extends CModificationVariable
|
|||
{
|
||||
if ( fValue == null )
|
||||
{
|
||||
fValue = CValueFactory.createGlobalValue( this, getCurrentValue() );
|
||||
ICDIValue cdiValue = getCurrentValue();
|
||||
if ( cdiValue instanceof ICDIArrayValue )
|
||||
{
|
||||
ICDIVariable var = null;
|
||||
try
|
||||
{
|
||||
var = getCDIVariable();
|
||||
}
|
||||
catch( CDIException e )
|
||||
{
|
||||
requestFailed( "", e );
|
||||
}
|
||||
int[] dims = getType().getArrayDimensions();
|
||||
if ( dims.length > 0 && dims[0] > 0 )
|
||||
fValue = CValueFactory.createArrayValue( this, var, 0, dims.length - 1 );
|
||||
}
|
||||
else
|
||||
fValue = CValueFactory.createGlobalValue( this, getCurrentValue() );
|
||||
}
|
||||
return fValue;
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ import org.eclipse.cdt.debug.core.cdi.model.type.ICDICharType;
|
|||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIDerivedType;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIFloatingPointType;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIPointerType;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIReferenceType;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIStructType;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIType;
|
||||
import org.eclipse.cdt.debug.core.model.ICType;
|
||||
|
@ -109,6 +110,14 @@ public class CType implements ICType
|
|||
return ( getCDIType() instanceof ICDIPointerType );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.model.ICType#isReference()
|
||||
*/
|
||||
public boolean isReference()
|
||||
{
|
||||
return ( getCDIType() instanceof ICDIReferenceType );
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.model.type.ICType#isStructure()
|
||||
*/
|
||||
|
@ -126,4 +135,13 @@ public class CType implements ICType
|
|||
{
|
||||
fCDIType = type;
|
||||
}
|
||||
|
||||
protected boolean hasChildren()
|
||||
{
|
||||
ICDIType type = getCDIType();
|
||||
if ( type instanceof ICDIStructType || type instanceof ICDIArrayType ||
|
||||
type instanceof ICDIPointerType || type instanceof ICDIReferenceType )
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@ import org.eclipse.cdt.debug.core.cdi.model.type.ICDILongValue;
|
|||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIPointerValue;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIReferenceValue;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIShortValue;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.type.ICDIWCharValue;
|
||||
import org.eclipse.cdt.debug.core.model.ICDebugElementErrorStatus;
|
||||
import org.eclipse.cdt.debug.core.model.ICExpressionEvaluator;
|
||||
import org.eclipse.cdt.debug.core.model.ICValue;
|
||||
|
@ -77,19 +78,7 @@ public class CValue extends CDebugElement implements ICValue
|
|||
*/
|
||||
public String getReferenceTypeName() throws DebugException
|
||||
{
|
||||
String typeName = null;
|
||||
try
|
||||
{
|
||||
if ( getUnderlyingValue() != null )
|
||||
{
|
||||
typeName = getUnderlyingValue().getTypeName();
|
||||
}
|
||||
}
|
||||
catch( CDIException e )
|
||||
{
|
||||
logError( e );
|
||||
}
|
||||
return typeName;
|
||||
return ( getParentVariable() != null ) ? getParentVariable().getReferenceTypeName() : null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -136,18 +125,12 @@ public class CValue extends CDebugElement implements ICValue
|
|||
{
|
||||
try
|
||||
{
|
||||
List vars = getCDIVariables();
|
||||
|
||||
if ( vars.size() > 1 )
|
||||
fVariables = CArrayPartition.splitArray( this, vars, 0, vars.size() - 1 );
|
||||
else
|
||||
List vars = getCDIVariables();
|
||||
fVariables = new ArrayList( vars.size() );
|
||||
Iterator it = vars.iterator();
|
||||
while( it.hasNext() )
|
||||
{
|
||||
fVariables = new ArrayList( vars.size() );
|
||||
Iterator it = vars.iterator();
|
||||
while( it.hasNext() )
|
||||
{
|
||||
fVariables.add( new CModificationVariable( this, (ICDIVariable)it.next() ) );
|
||||
}
|
||||
fVariables.add( new CModificationVariable( this, (ICDIVariable)it.next() ) );
|
||||
}
|
||||
}
|
||||
catch( DebugException e )
|
||||
|
@ -208,42 +191,6 @@ public class CValue extends CDebugElement implements ICValue
|
|||
return Arrays.asList( vars );
|
||||
}
|
||||
|
||||
protected String processCDIValue( String cdiValue )
|
||||
{
|
||||
String result = null;
|
||||
if ( cdiValue != null )
|
||||
{
|
||||
result = cdiValue.trim();
|
||||
if ( result.startsWith( "@" ) ) // Reference
|
||||
{
|
||||
int end = result.indexOf( ':' );
|
||||
if ( end == -1 )
|
||||
end = result.length();
|
||||
result = result.substring( 1, end );
|
||||
}
|
||||
else if ( result.startsWith( "0x" ) )
|
||||
{
|
||||
int end = result.indexOf( ' ' );
|
||||
if ( end == -1 )
|
||||
end = result.length();
|
||||
result = result.substring( 0, end );
|
||||
}
|
||||
else if ( result.endsWith( "\'" ) )
|
||||
{
|
||||
int start = result.indexOf( '\'' );
|
||||
if ( start != -1 && result.length() - start == 3 )
|
||||
{
|
||||
result = result.substring( start );
|
||||
}
|
||||
else
|
||||
{
|
||||
result = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public synchronized void setChanged( boolean changed ) throws DebugException
|
||||
{
|
||||
if ( changed )
|
||||
|
@ -257,7 +204,7 @@ public class CValue extends CDebugElement implements ICValue
|
|||
}
|
||||
}
|
||||
|
||||
protected void dispose()
|
||||
public void dispose()
|
||||
{
|
||||
Iterator it = fVariables.iterator();
|
||||
while( it.hasNext() )
|
||||
|
@ -293,6 +240,8 @@ public class CValue extends CDebugElement implements ICValue
|
|||
return getPointerValueString( (ICDIPointerValue)cdiValue );
|
||||
else if ( cdiValue instanceof ICDIReferenceValue )
|
||||
return getReferenceValueString( (ICDIReferenceValue)cdiValue );
|
||||
else if ( cdiValue instanceof ICDIWCharValue )
|
||||
return getWCharValueString( (ICDIWCharValue)cdiValue );
|
||||
else
|
||||
return cdiValue.getValueString();
|
||||
}
|
||||
|
@ -501,6 +450,47 @@ public class CValue extends CDebugElement implements ICValue
|
|||
return null;
|
||||
}
|
||||
|
||||
private String getWCharValueString( ICDIWCharValue value ) throws CDIException
|
||||
{
|
||||
if ( getParentVariable() != null )
|
||||
{
|
||||
int size = getParentVariable().sizeof();
|
||||
if ( size == 16 )
|
||||
{
|
||||
switch( getParentVariable().getFormat() )
|
||||
{
|
||||
case ICDIFormat.NATURAL:
|
||||
case ICDIFormat.DECIMAL:
|
||||
return ( isUnsigned() ) ? Integer.toString( value.intValue() ) : Short.toString( value.shortValue() );
|
||||
case ICDIFormat.HEXADECIMAL:
|
||||
{
|
||||
StringBuffer sb = new StringBuffer( "0x" );
|
||||
String stringValue = Integer.toHexString( ( isUnsigned() ) ? value.intValue() : value.shortValue() );
|
||||
sb.append( ( stringValue.length() > 4 ) ? stringValue.substring( stringValue.length() - 4 ) : stringValue );
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( size == 32 )
|
||||
{
|
||||
switch( getParentVariable().getFormat() )
|
||||
{
|
||||
case ICDIFormat.NATURAL:
|
||||
case ICDIFormat.DECIMAL:
|
||||
return ( isUnsigned() ) ? Long.toString( value.longValue() ) : Integer.toString( value.intValue() );
|
||||
case ICDIFormat.HEXADECIMAL:
|
||||
{
|
||||
StringBuffer sb = new StringBuffer( "0x" );
|
||||
String stringValue = ( isUnsigned() ) ? Long.toHexString( value.longValue() ) : Integer.toHexString( value.intValue() );
|
||||
sb.append( ( stringValue.length() > 8 ) ? stringValue.substring( stringValue.length() - 8 ) : stringValue );
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return value.getValueString();
|
||||
}
|
||||
|
||||
private boolean isUnsigned()
|
||||
{
|
||||
boolean result = false;
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
package org.eclipse.cdt.debug.internal.core.model;
|
||||
|
||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIValue;
|
||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
|
||||
import org.eclipse.debug.core.DebugException;
|
||||
|
||||
/**
|
||||
|
@ -22,6 +23,11 @@ public class CValueFactory
|
|||
return new CValue( parent, cdiValue );
|
||||
}
|
||||
|
||||
static public CArrayPartitionValue createArrayValue( CVariable parent, ICDIVariable cdiVariable, int start, int end ) throws DebugException
|
||||
{
|
||||
return new CArrayPartitionValue( parent, cdiVariable, start, end );
|
||||
}
|
||||
|
||||
static public CValue createGlobalValue( CVariable parent, ICDIValue cdiValue ) throws DebugException
|
||||
{
|
||||
return new CGlobalValue( parent, cdiValue );
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
package org.eclipse.cdt.debug.internal.core.model;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.LinkedList;
|
||||
|
||||
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||
|
@ -157,6 +156,14 @@ public abstract class CVariable extends CDebugElement
|
|||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIVariableObject#getQualifiedName()
|
||||
*/
|
||||
public String getQualifiedName() throws CDIException
|
||||
{
|
||||
return ( fVariableObject != null ) ? fVariableObject.getQualifiedName() : null;
|
||||
}
|
||||
}
|
||||
|
||||
class InternalVariable
|
||||
|
@ -206,7 +213,7 @@ public abstract class CVariable extends CDebugElement
|
|||
if ( fType == null )
|
||||
{
|
||||
ICDIVariable var = getCDIVariable();
|
||||
if ( var != null )
|
||||
if ( var != null && !(var instanceof ErrorVariable) )
|
||||
fType = new CType( var.getType() );
|
||||
}
|
||||
return fType;
|
||||
|
@ -216,13 +223,19 @@ public abstract class CVariable extends CDebugElement
|
|||
{
|
||||
if ( fEditable == null )
|
||||
{
|
||||
ICDIVariable var = getCDIVariable();
|
||||
if ( var != null )
|
||||
fEditable = new Boolean( var.isEditable() );
|
||||
ICDIVariableObject varObject = getCDIVariableObject();
|
||||
if ( varObject != null && !(varObject instanceof ErrorVariable) )
|
||||
fEditable = new Boolean( varObject.isEditable() );
|
||||
}
|
||||
return ( fEditable != null ) ? fEditable.booleanValue() : false;
|
||||
}
|
||||
|
||||
protected boolean hasChildren() throws CDIException
|
||||
{
|
||||
CType type = (CType)getType();
|
||||
return ( type != null ) ? type.hasChildren() : false;
|
||||
}
|
||||
|
||||
private void setCDIVariable( ICDIVariable variable )
|
||||
{
|
||||
fCDIVariable = variable;
|
||||
|
@ -261,6 +274,26 @@ public abstract class CVariable extends CDebugElement
|
|||
{
|
||||
return ( fCDIVariable != null ) ? fCDIVariable.equals( cdiVar ) : false;
|
||||
}
|
||||
|
||||
protected int sizeof()
|
||||
{
|
||||
if ( getCDIVariableObject() != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
return getCDIVariableObject().sizeof();
|
||||
}
|
||||
catch( CDIException e )
|
||||
{
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
protected String getQualifiedName() throws CDIException
|
||||
{
|
||||
return ( fCDIVariableObject != null ) ? fCDIVariableObject.getQualifiedName() : null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -281,7 +314,7 @@ public abstract class CVariable extends CDebugElement
|
|||
/**
|
||||
* Cache of current value - see #getValue().
|
||||
*/
|
||||
protected CValue fValue;
|
||||
protected ICValue fValue;
|
||||
|
||||
/**
|
||||
* The name of this variable.
|
||||
|
@ -368,6 +401,9 @@ public abstract class CVariable extends CDebugElement
|
|||
fIsEnabled = !enableVariableBookkeeping();
|
||||
fOriginal = createOriginal( cdiVariableObject );
|
||||
fShadow = null;
|
||||
if ( cdiVariableObject instanceof ErrorVariable )
|
||||
setStatus( ICDebugElementErrorStatus.ERROR,
|
||||
MessageFormat.format( "not available: {0}", new String[] { ((ErrorVariable)cdiVariableObject).getException().getMessage() } ) );
|
||||
fFormat = CDebugCorePlugin.getDefault().getPluginPreferences().getInt( ICDebugConstants.PREF_DEFAULT_VARIABLE_FORMAT );
|
||||
getCDISession().getEventManager().addEventListener( this );
|
||||
}
|
||||
|
@ -390,9 +426,27 @@ public abstract class CVariable extends CDebugElement
|
|||
return fDisabledValue;
|
||||
if ( fValue == null )
|
||||
{
|
||||
ICDIValue cdiValue = getCurrentValue();
|
||||
if ( cdiValue != null )
|
||||
fValue = CValueFactory.createValue( this, cdiValue );
|
||||
if ( getType() != null && getType().isArray() )
|
||||
{
|
||||
ICDIVariable var = null;
|
||||
try
|
||||
{
|
||||
var = getInternalVariable().getCDIVariable();
|
||||
}
|
||||
catch( CDIException e )
|
||||
{
|
||||
requestFailed( "", e );
|
||||
}
|
||||
int[] dims = getType().getArrayDimensions();
|
||||
if ( dims.length > 0 && dims[0] > 0 )
|
||||
fValue = CValueFactory.createArrayValue( this, var, 0, dims[0] - 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
ICDIValue cdiValue = getCurrentValue();
|
||||
if ( cdiValue != null )
|
||||
fValue = CValueFactory.createValue( this, cdiValue );
|
||||
}
|
||||
}
|
||||
return fValue;
|
||||
}
|
||||
|
@ -485,14 +539,14 @@ public abstract class CVariable extends CDebugElement
|
|||
*/
|
||||
protected ICDIValue getLastKnownValue()
|
||||
{
|
||||
return ( fValue != null ) ? fValue.getUnderlyingValue() : null;
|
||||
return ( fValue instanceof CValue ) ? ((CValue)fValue).getUnderlyingValue() : null;
|
||||
}
|
||||
|
||||
protected void dispose()
|
||||
{
|
||||
if ( fValue != null )
|
||||
{
|
||||
((CValue)fValue).dispose();
|
||||
fValue.dispose();
|
||||
}
|
||||
getCDISession().getEventManager().removeEventListener( this );
|
||||
if ( getShadow() != null )
|
||||
|
@ -822,15 +876,20 @@ public abstract class CVariable extends CDebugElement
|
|||
*/
|
||||
public boolean hasChildren()
|
||||
{
|
||||
if ( !isEnabled() )
|
||||
return false;
|
||||
boolean result = false;
|
||||
try
|
||||
{
|
||||
return ( getValue() != null && getValue().hasVariables() );
|
||||
InternalVariable var = getInternalVariable();
|
||||
if ( var != null )
|
||||
result = var.hasChildren();
|
||||
}
|
||||
catch( DebugException e )
|
||||
catch( CDIException e )
|
||||
{
|
||||
logError( e );
|
||||
}
|
||||
return false;
|
||||
return result;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -858,45 +917,14 @@ public abstract class CVariable extends CDebugElement
|
|||
{
|
||||
if ( fQualifiedName == null )
|
||||
{
|
||||
LinkedList list = new LinkedList();
|
||||
list.add( this );
|
||||
CVariable var = getParentVariable();
|
||||
while( var != null )
|
||||
try
|
||||
{
|
||||
if ( !( var.getType().isArray() ) && !( var instanceof CArrayPartition ) && !var.isAccessSpecifier() )
|
||||
list.addFirst( var );
|
||||
var = var.getParentVariable();
|
||||
fQualifiedName = getInternalVariable().getQualifiedName();
|
||||
}
|
||||
StringBuffer sb = new StringBuffer();
|
||||
CVariable[] vars = (CVariable[])list.toArray( new CVariable[list.size()] );
|
||||
for ( int i = 0; i < vars.length; ++i )
|
||||
catch( CDIException e )
|
||||
{
|
||||
sb.insert( 0, '(' );
|
||||
if ( i > 0 )
|
||||
{
|
||||
if ( vars[i - 1].getType().isPointer() )
|
||||
{
|
||||
if ( vars[i].getName().charAt( 0 ) == '*' && vars[i-1].getName().equals( vars[i].getName().substring( 1 ) ) )
|
||||
{
|
||||
sb.insert( 0, '*' );
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append( "->" );
|
||||
sb.append( vars[i].getName() );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append( '.' );
|
||||
sb.append( vars[i].getName() );
|
||||
}
|
||||
}
|
||||
else
|
||||
sb.append( vars[i].getName() );
|
||||
sb.append( ')' );
|
||||
requestFailed( "Qualified name is not available.", e );
|
||||
}
|
||||
fQualifiedName = sb.toString();
|
||||
}
|
||||
return fQualifiedName;
|
||||
}
|
||||
|
@ -968,7 +996,7 @@ public abstract class CVariable extends CDebugElement
|
|||
{
|
||||
if ( fValue != null )
|
||||
{
|
||||
((CValue)fValue).dispose();
|
||||
fValue.dispose();
|
||||
fValue = null;
|
||||
}
|
||||
}
|
||||
|
@ -1014,4 +1042,9 @@ public abstract class CVariable extends CDebugElement
|
|||
{
|
||||
return ( getShadow() != null ) ? getShadow() : fOriginal;
|
||||
}
|
||||
|
||||
protected int sizeof()
|
||||
{
|
||||
return getInternalVariable().sizeof();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue