1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Fix for PR 39087: Cache the MI answer once we know if the variable is writable.

This commit is contained in:
Mikhail Khodjaiants 2003-06-30 18:00:14 +00:00
parent 269cca164e
commit faf7bd9da2
2 changed files with 55 additions and 28 deletions

View file

@ -1,3 +1,7 @@
2003-06-30 Mikhail Khodjaiants
Fix for PR 39087: Cache the MI answer once we know if the variable is writable.
* CVariable.java
2003-06-24 Mikhail Khodjaiants
All local var_objects are destroyed when a thread other than current is selected.
CVariable has to be invalidated if a "destroyed" event has been received.

View file

@ -53,6 +53,10 @@ public abstract class CVariable extends CDebugElement
private ICDIVariable fCDIVariable;
private Boolean fEditable = null;
private ICType fType = null;
public InternalVariable( ICDIVariableObject varObject )
{
setCDIVariableObject( varObject );
@ -76,6 +80,28 @@ public abstract class CVariable extends CDebugElement
return fCDIVariableObject;
}
protected ICType getType() throws CDIException
{
if ( fType == null )
{
ICDIVariable var = getCDIVariable();
if ( var != null )
fType = new CType( var.getType() );
}
return fType;
}
protected boolean isEditable() throws CDIException
{
if ( fEditable == null )
{
ICDIVariable var = getCDIVariable();
if ( var != null )
fEditable = new Boolean( var.isEditable() );
}
return ( fEditable != null ) ? fEditable.booleanValue() : false;
}
private void setCDIVariable( ICDIVariable variable )
{
fCDIVariable = variable;
@ -98,6 +124,10 @@ public abstract class CVariable extends CDebugElement
logError( e.getMessage() );
}
setCDIVariable( null );
if ( fType != null )
fType.dispose();
fType = null;
fEditable = null;
}
protected void dispose()
@ -142,18 +172,11 @@ public abstract class CVariable extends CDebugElement
*/
private String fQualifiedName = null;
private Boolean fEditable = null;
/**
* Change flag.
*/
protected boolean fChanged = false;
/**
* The type of this variable.
*/
private ICType fType = null;
/**
* The current format of this variable.
*/
@ -674,20 +697,18 @@ public abstract class CVariable extends CDebugElement
{
if ( !isEnabled() )
return false;
if ( fEditable == null )
boolean result = false;
try
{
try
{
ICDIVariable var = getCDIVariable();
if ( var != null )
fEditable = new Boolean( var.isEditable() );
}
catch( CDIException e )
{
logError( e );
}
InternalVariable var = getInternalVariable();
if ( var != null )
result = var.isEditable();
}
return ( fEditable != null ) ? fEditable.booleanValue() : false;
catch( CDIException e )
{
logError( e );
}
return result;
}
/* (non-Javadoc)
@ -759,20 +780,21 @@ public abstract class CVariable extends CDebugElement
*/
public ICType getType() throws DebugException
{
if ( isEnabled() && fType == null )
ICType type = null;
if ( isEnabled() )
{
try
{
ICDIVariable var = getCDIVariable();
if ( var != null )
fType = new CType( var.getType() );
InternalVariable iv = getInternalVariable();
if ( iv != null )
type = iv.getType();
}
catch( CDIException e )
{
requestFailed( "Type is not available.", e );
}
}
return fType;
return type;
}
/* (non-Javadoc)
@ -809,10 +831,6 @@ public abstract class CVariable extends CDebugElement
((CValue)fValue).dispose();
fValue = null;
}
fEditable = null;
if ( fType != null )
fType.dispose();
fType = null;
}
protected boolean isArgument()
@ -851,4 +869,9 @@ public abstract class CVariable extends CDebugElement
return ( ( getShadow() != null && getShadow().isSameVariable( cdiVar ) ) ||
( fOriginal != null && fOriginal.isSameVariable( cdiVar ) ) );
}
private InternalVariable getInternalVariable()
{
return ( getShadow() != null ) ? getShadow() : fOriginal;
}
}