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

Variable bookkeeping (phase 0.1).

This commit is contained in:
Mikhail Khodjaiants 2003-06-20 21:16:16 +00:00
parent bd7e73016d
commit b121523ac4
9 changed files with 360 additions and 166 deletions

View file

@ -1,3 +1,14 @@
2003-06-20 Mikhail Khodjaiants
Variable bookkeeping (phase 0.1).
* ICDTLaunchConfigurationConstants.java: add a new attribute - ATTR_DEBUGGER_ENABLE_VARIABLE_BOOKKEEPING.
* ICVariable.java: added the 'canEnableDisable', 'isEnabled' and 'setEnabled' methods
* CArrayPartition.java
* CExpression.java
* CModificationVariable.java
* CRegister.java
* CStackFrame.java
* CVariable.java
2003-06-18 Mikhail Khodjaiants 2003-06-18 Mikhail Khodjaiants
Incorrect casting in the 'setChanged' method of CVariable. Incorrect casting in the 'setChanged' method of CVariable.
* CVariable.java * CVariable.java

View file

@ -86,12 +86,16 @@ public interface ICDTLaunchConfigurationConstants {
*/ */
public static final String ATTR_ATTACH_PROCESS_ID = CDT_LAUNCH_ID + ".ATTACH_PROCESS_ID"; //$NON-NLS-1$ public static final String ATTR_ATTACH_PROCESS_ID = CDT_LAUNCH_ID + ".ATTACH_PROCESS_ID"; //$NON-NLS-1$
/** /**
* Launch configuration attribute key. The value is the startup mode for the debugger. * Launch configuration attribute key. The value is the startup mode for the debugger.
*/ */
public static final String ATTR_DEBUGGER_START_MODE = CDT_LAUNCH_ID + ".DEBUGGER_START_MODE"; //$NON-NLS-1$ public static final String ATTR_DEBUGGER_START_MODE = CDT_LAUNCH_ID + ".DEBUGGER_START_MODE"; //$NON-NLS-1$
/**
* Launch configuration attribute key. The value is a boolean specifying whether to enable variable bookkeeping.
*/
public static final String ATTR_DEBUGGER_ENABLE_VARIABLE_BOOKKEEPING = CDT_LAUNCH_ID + ".ENABLE_VARIABLE_BOOKKEEPING"; //$NON-NLS-1$
/** /**
* Launch configuration attribute value. The key is ATTR_DEBUGGER_START_MODE. * Launch configuration attribute value. The key is ATTR_DEBUGGER_START_MODE.
* Startup debugger running the program. * Startup debugger running the program.

View file

@ -29,4 +29,10 @@ public interface ICVariable extends IVariable
boolean hasChildren(); boolean hasChildren();
String getQualifiedName() throws DebugException; String getQualifiedName() throws DebugException;
boolean isEnabled();
void setEnabled( boolean enabled ) throws DebugException;
boolean canEnableDisable();
} }

View file

@ -136,4 +136,12 @@ public class CArrayPartition extends CVariable
{ {
return fEnd; return fEnd;
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.model.ICVariable#canEnableDisable()
*/
public boolean canEnableDisable()
{
return false;
}
} }

View file

@ -7,11 +7,12 @@ package org.eclipse.cdt.debug.internal.core.model;
import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.ICDebugConstants; import org.eclipse.cdt.debug.core.ICDebugConstants;
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.ICDIEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDIResumedEvent; import org.eclipse.cdt.debug.core.cdi.event.ICDIResumedEvent;
import org.eclipse.cdt.debug.core.cdi.model.ICDIExpression; import org.eclipse.cdt.debug.core.cdi.model.ICDIExpression;
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget; 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.ICDIVariableObject;
import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IExpression; import org.eclipse.debug.core.model.IExpression;
import org.eclipse.debug.core.model.IValue; import org.eclipse.debug.core.model.IValue;
@ -41,9 +42,9 @@ public class CExpression extends CModificationVariable
* @param target * @param target
* @param cdiExpression * @param cdiExpression
*/ */
public CExpression( CDebugTarget target, ICDIVariable cdiVariable ) public CExpression( CDebugTarget target, ICDIVariableObject cdiVariableObject )
{ {
super( target, cdiVariable ); super( target, cdiVariableObject );
fFormat = CDebugCorePlugin.getDefault().getPluginPreferences().getInt( ICDebugConstants.PREF_DEFAULT_EXPRESSION_FORMAT ); fFormat = CDebugCorePlugin.getDefault().getPluginPreferences().getInt( ICDebugConstants.PREF_DEFAULT_EXPRESSION_FORMAT );
} }
@ -82,7 +83,7 @@ public class CExpression extends CModificationVariable
super.dispose(); super.dispose();
} }
protected ICDIExpression getCDIExpression() protected ICDIExpression getCDIExpression() throws CDIException
{ {
return (ICDIExpression)getCDIVariable(); return (ICDIExpression)getCDIVariable();
} }
@ -108,4 +109,20 @@ public class CExpression extends CModificationVariable
} }
super.handleDebugEvent(event); super.handleDebugEvent(event);
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.model.ICVariable#isEnabled()
*/
public boolean isEnabled()
{
return true;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.model.ICVariable#canEnableDisable()
*/
public boolean canEnableDisable()
{
return false;
}
} }

View file

@ -9,6 +9,7 @@ package org.eclipse.cdt.debug.internal.core.model;
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.ICDIVariable; import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariableObject;
import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IValue; import org.eclipse.debug.core.model.IValue;
@ -25,9 +26,9 @@ public class CModificationVariable extends CVariable
* @param parent * @param parent
* @param cdiVariable * @param cdiVariable
*/ */
public CModificationVariable( CDebugElement parent, ICDIVariable cdiVariable ) public CModificationVariable( CDebugElement parent, ICDIVariableObject cdiVariableObject )
{ {
super( parent, cdiVariable ); super( parent, cdiVariableObject );
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -61,16 +62,15 @@ public class CModificationVariable extends CVariable
public final void setValue( String expression ) throws DebugException public final void setValue( String expression ) throws DebugException
{ {
String newExpression = processExpression( expression ); String newExpression = processExpression( expression );
ICDIVariable cdiVariable = getCDIVariable(); ICDIVariable cdiVariable = null;
if ( cdiVariable == null )
{
logError( "Error in IValueModification#setValue: no cdi variable." );
requestFailed( "Unable to set value.", null );
return;
}
try try
{ {
cdiVariable = getCDIVariable();
if ( cdiVariable != null )
cdiVariable.setValue( newExpression ); cdiVariable.setValue( newExpression );
else
requestFailed( "Unable to set value.", null );
} }
catch( CDIException e ) catch( CDIException e )
{ {
@ -86,16 +86,14 @@ public class CModificationVariable extends CVariable
*/ */
protected void setValue( ICDIValue value ) throws DebugException protected void setValue( ICDIValue value ) throws DebugException
{ {
ICDIVariable cdiVariable = getCDIVariable(); ICDIVariable cdiVariable = null;
if ( cdiVariable == null )
{
logError( "Error in IValueModification#setValue: no cdi variable." );
requestFailed( "Unable to set value.", null );
return;
}
try try
{ {
cdiVariable = getCDIVariable();
if ( cdiVariable != null )
cdiVariable.setValue( value ); cdiVariable.setValue( value );
else
requestFailed( "Unable to set value.", null );
} }
catch( CDIException e ) catch( CDIException e )
{ {

View file

@ -52,4 +52,20 @@ public class CRegister extends CGlobalVariable implements IRegister
} }
return false; return false;
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.model.ICVariable#isEnabled()
*/
public boolean isEnabled()
{
return true;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.model.ICVariable#canEnableDisable()
*/
public boolean canEnableDisable()
{
return false;
}
} }

View file

@ -16,9 +16,9 @@ import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICDILocation; import org.eclipse.cdt.debug.core.cdi.ICDILocation;
import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent; import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener; import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener;
import org.eclipse.cdt.debug.core.cdi.model.ICDIArgument;
import org.eclipse.cdt.debug.core.cdi.model.ICDIStackFrame; import org.eclipse.cdt.debug.core.cdi.model.ICDIStackFrame;
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable; import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
import org.eclipse.cdt.debug.core.cdi.model.ICDIVariableObject;
import org.eclipse.cdt.debug.core.model.IRestart; import org.eclipse.cdt.debug.core.model.IRestart;
import org.eclipse.cdt.debug.core.model.IResumeWithoutSignal; import org.eclipse.cdt.debug.core.model.IResumeWithoutSignal;
import org.eclipse.cdt.debug.core.model.IStackFrameInfo; import org.eclipse.cdt.debug.core.model.IStackFrameInfo;
@ -102,12 +102,12 @@ public class CStackFrame extends CDebugElement
{ {
if ( fVariables == null ) if ( fVariables == null )
{ {
List vars = getAllCDIVariables(); List vars = getAllCDIVariableObjects();
fVariables = new ArrayList( vars.size() ); fVariables = new ArrayList( vars.size() );
Iterator it = vars.iterator(); Iterator it = vars.iterator();
while( it.hasNext() ) while( it.hasNext() )
{ {
fVariables.add( new CModificationVariable( this, (ICDIVariable)it.next() ) ); fVariables.add( new CModificationVariable( this, (ICDIVariableObject)it.next() ) );
} }
} }
else if ( refreshVariables() ) else if ( refreshVariables() )
@ -124,15 +124,14 @@ public class CStackFrame extends CDebugElement
*/ */
protected void updateVariables() throws DebugException protected void updateVariables() throws DebugException
{ {
List locals = getAllCDIVariables(); List locals = getAllCDIVariableObjects();
int index = 0; int index = 0;
while( index < fVariables.size() ) while( index < fVariables.size() )
{ {
CVariable local = (CVariable)fVariables.get( index ); ICDIVariableObject varObject = findVariable( locals, (CVariable)fVariables.get( index ) );
ICDIVariable var = findVariable( locals, local.getOriginalCDIVariable() ); if ( varObject != null )
if ( var != null )
{ {
locals.remove( var ); locals.remove( varObject );
index++; index++;
} }
else else
@ -570,12 +569,12 @@ public class CStackFrame extends CDebugElement
* list if there are no local variables. * list if there are no local variables.
* *
*/ */
protected List getCDILocalVariables() throws DebugException protected List getCDILocalVariableObjects() throws DebugException
{ {
List list = new ArrayList(); List list = new ArrayList();
try try
{ {
list.addAll( Arrays.asList( getCDIStackFrame().getLocalVariables() ) ); list.addAll( Arrays.asList( getCDISession().getVariableManager().getLocalVariableObjects( getCDIStackFrame() ) ) );
} }
catch( CDIException e ) catch( CDIException e )
{ {
@ -589,12 +588,12 @@ public class CStackFrame extends CDebugElement
* if there are no arguments. * if there are no arguments.
* *
*/ */
protected List getCDIArguments() throws DebugException protected List getCDIArgumentObjects() throws DebugException
{ {
List list = new ArrayList(); List list = new ArrayList();
try try
{ {
list.addAll( Arrays.asList( getCDIStackFrame().getArguments() ) ); list.addAll( Arrays.asList( getCDISession().getVariableManager().getArgumentObjects( getCDIStackFrame() ) ) );
} }
catch( CDIException e ) catch( CDIException e )
{ {
@ -602,7 +601,7 @@ public class CStackFrame extends CDebugElement
} }
return list; return list;
} }
/*
protected List getAllCDIVariables() throws DebugException protected List getAllCDIVariables() throws DebugException
{ {
List list = new ArrayList(); List list = new ArrayList();
@ -610,6 +609,14 @@ public class CStackFrame extends CDebugElement
list.addAll( getCDILocalVariables() ); list.addAll( getCDILocalVariables() );
return list; return list;
} }
*/
protected List getAllCDIVariableObjects() throws DebugException
{
List list = new ArrayList();
list.addAll( getCDIArgumentObjects() );
list.addAll( getCDILocalVariableObjects() );
return list;
}
protected boolean isTopStackFrame() throws DebugException protected boolean isTopStackFrame() throws DebugException
{ {
@ -684,8 +691,7 @@ public class CStackFrame extends CDebugElement
} }
for ( int i = 0; i < vars.length; ++i ) for ( int i = 0; i < vars.length; ++i )
{ {
if ( vars[i] instanceof CVariable && if ( vars[i] instanceof CVariable && ((CVariable)vars[i]).isArgument() )
((CVariable)vars[i]).getOriginalCDIVariable() instanceof ICDIArgument )
{ {
list.add( vars[i] ); list.add( vars[i] );
} }
@ -716,14 +722,14 @@ public class CStackFrame extends CDebugElement
} }
} }
protected ICDIVariable findVariable( List list, ICDIVariable var ) protected ICDIVariableObject findVariable( List list, CVariable var )
{ {
Iterator it = list.iterator(); Iterator it = list.iterator();
while( it.hasNext() ) while( it.hasNext() )
{ {
ICDIVariable newVar = (ICDIVariable)it.next(); ICDIVariableObject newVarObject = (ICDIVariableObject)it.next();
if ( newVar.equals( var ) ) if ( var.sameVariableObject( newVarObject ) )
return newVar; return newVarObject;
} }
return null; return null;
} }

View file

@ -8,12 +8,14 @@ package org.eclipse.cdt.debug.internal.core.model;
import java.util.LinkedList; import java.util.LinkedList;
import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.ICDebugConstants; import org.eclipse.cdt.debug.core.ICDebugConstants;
import org.eclipse.cdt.debug.core.cdi.CDIException; import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICDIFormat; import org.eclipse.cdt.debug.core.cdi.ICDIFormat;
import org.eclipse.cdt.debug.core.cdi.event.ICDIChangedEvent; import org.eclipse.cdt.debug.core.cdi.event.ICDIChangedEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent; import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener; import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener;
import org.eclipse.cdt.debug.core.cdi.model.ICDIArgumentObject;
import org.eclipse.cdt.debug.core.cdi.model.ICDIObject; import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
import org.eclipse.cdt.debug.core.cdi.model.ICDIStackFrame; import org.eclipse.cdt.debug.core.cdi.model.ICDIStackFrame;
import org.eclipse.cdt.debug.core.cdi.model.ICDIValue; import org.eclipse.cdt.debug.core.cdi.model.ICDIValue;
@ -24,8 +26,10 @@ import org.eclipse.cdt.debug.core.model.ICValue;
import org.eclipse.cdt.debug.core.model.ICVariable; import org.eclipse.cdt.debug.core.model.ICVariable;
import org.eclipse.cdt.debug.core.model.ICastToArray; import org.eclipse.cdt.debug.core.model.ICastToArray;
import org.eclipse.cdt.debug.core.model.ICastToType; import org.eclipse.cdt.debug.core.model.ICastToType;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IValue; import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.model.IVariable; import org.eclipse.debug.core.model.IVariable;
@ -42,20 +46,80 @@ public abstract class CVariable extends CDebugElement
ICastToType, ICastToType,
ICastToArray ICastToArray
{ {
class InternalVariable
{
private ICDIVariableObject fCDIVariableObject;
private ICDIVariable fCDIVariable;
public InternalVariable( ICDIVariableObject varObject )
{
setCDIVariableObject( varObject );
setCDIVariable( ( varObject instanceof ICDIVariable ) ? (ICDIVariable)varObject : null );
}
protected synchronized ICDIVariable getCDIVariable() throws CDIException
{
if ( fCDIVariable == null )
{
if ( getCDIVariableObject() instanceof ICDIArgumentObject )
fCDIVariable = getCDISession().getVariableManager().createArgument( (ICDIArgumentObject)getCDIVariableObject() );
else if ( getCDIVariableObject() instanceof ICDIVariableObject )
fCDIVariable = getCDISession().getVariableManager().createVariable( getCDIVariableObject() );
}
return fCDIVariable;
}
protected ICDIVariableObject getCDIVariableObject()
{
return fCDIVariableObject;
}
private void setCDIVariable( ICDIVariable variable )
{
fCDIVariable = variable;
}
private void setCDIVariableObject( ICDIVariableObject object )
{
fCDIVariableObject = object;
}
protected synchronized void invalidate()
{
try
{
if ( fCDIVariable != null )
getCDISession().getVariableManager().destroyVariable( fCDIVariable );
}
catch( CDIException e )
{
logError( e.getMessage() );
}
setCDIVariable( null );
}
protected void dispose()
{
invalidate();
setCDIVariableObject( null );
}
}
/** /**
* The parent object this variable is contained in. * The parent object this variable is contained in.
*/ */
private CDebugElement fParent; private CDebugElement fParent;
/** /**
* The underlying CDI variable. * The original internal variable.
*/ */
private ICDIVariable fCDIVariable; private InternalVariable fOriginal;
/** /**
* The shadow CDI variable used for casting. * The shadow internal variable used for casting.
*/ */
private ICDIVariable fShadow; private InternalVariable fShadow = null;
/** /**
* Cache of current value - see #getValue(). * Cache of current value - see #getValue().
@ -74,15 +138,6 @@ public abstract class CVariable extends CDebugElement
private Boolean fEditable = null; private Boolean fEditable = null;
/**
* Counter corresponding to this variable's debug target
* suspend count indicating the last time this value
* changed. This variable's value has changed on the
* last suspend event if this counter is equal to the
* debug target's suspend count.
*/
private int fLastChangeIndex = -1;
/** /**
* Change flag. * Change flag.
*/ */
@ -98,20 +153,80 @@ public abstract class CVariable extends CDebugElement
*/ */
protected int fFormat = ICDIFormat.NATURAL; protected int fFormat = ICDIFormat.NATURAL;
private boolean fIsEnabled = true;
/*
* Temporary solution to avoid NPE in VariablesView.
* This is fixed in the Eclipse 2.1.1 Maintenance Build.
*/
static private IValue fDisabledValue = new IValue()
{
public String getReferenceTypeName() throws DebugException
{
return null;
}
public String getValueString() throws DebugException
{
return null;
}
public boolean isAllocated() throws DebugException
{
return false;
}
public IVariable[] getVariables() throws DebugException
{
return null;
}
public boolean hasVariables() throws DebugException
{
return false;
}
public String getModelIdentifier()
{
return CDebugCorePlugin.getUniqueIdentifier();
}
public IDebugTarget getDebugTarget()
{
return null;
}
public ILaunch getLaunch()
{
return null;
}
public Object getAdapter( Class adapter )
{
return null;
}
};
/** /**
* Constructor for CVariable. * Constructor for CVariable.
* @param target * @param target
*/ */
public CVariable( CDebugElement parent, ICDIVariable cdiVariable ) public CVariable( CDebugElement parent, ICDIVariableObject cdiVariableObject )
{ {
super( (CDebugTarget)parent.getDebugTarget() ); super( (CDebugTarget)parent.getDebugTarget() );
fParent = parent; fParent = parent;
fCDIVariable = cdiVariable; fIsEnabled = !enableVariableBookkeeping();
fOriginal = createOriginal( cdiVariableObject );
fShadow = null; fShadow = null;
fFormat = CDebugCorePlugin.getDefault().getPluginPreferences().getInt( ICDebugConstants.PREF_DEFAULT_VARIABLE_FORMAT ); fFormat = CDebugCorePlugin.getDefault().getPluginPreferences().getInt( ICDebugConstants.PREF_DEFAULT_VARIABLE_FORMAT );
getCDISession().getEventManager().addEventListener( this ); getCDISession().getEventManager().addEventListener( this );
} }
private InternalVariable createOriginal( ICDIVariableObject varObject )
{
return new InternalVariable( varObject );
}
/** /**
* Returns the current value of this variable. The value * Returns the current value of this variable. The value
* is cached, but on each access we see if the value has changed * is cached, but on each access we see if the value has changed
@ -121,9 +236,13 @@ public abstract class CVariable extends CDebugElement
*/ */
public IValue getValue() throws DebugException public IValue getValue() throws DebugException
{ {
if ( !isEnabled() )
return fDisabledValue;
if ( fValue == null ) if ( fValue == null )
{ {
fValue = CValueFactory.createValue( this, getCurrentValue() ); ICDIValue cdiValue = getCurrentValue();
if ( cdiValue != null )
fValue = CValueFactory.createValue( this, cdiValue );
} }
return fValue; return fValue;
} }
@ -211,40 +330,12 @@ public abstract class CVariable extends CDebugElement
return null; return null;
} }
/**
* Sets this variable's change counter to the specified value
*
* @param count new value
*/
protected void setChangeCount( int count )
{
fLastChangeIndex = count;
}
/**
* Returns this variable's change counter. This corresponds to the
* last time this variable changed.
*
* @return this variable's change counter
*/
protected int getChangeCount()
{
return fLastChangeIndex;
}
/** /**
* Returns the last known value for this variable * Returns the last known value for this variable
*/ */
protected ICDIValue getLastKnownValue() protected ICDIValue getLastKnownValue()
{ {
if ( fValue == null ) return ( fValue != null ) ? fValue.getUnderlyingValue() : null;
{
return null;
}
else
{
return fValue.getUnderlyingValue();
}
} }
protected void dispose() protected void dispose()
@ -254,15 +345,8 @@ public abstract class CVariable extends CDebugElement
((CValue)fValue).dispose(); ((CValue)fValue).dispose();
} }
getCDISession().getEventManager().removeEventListener( this ); getCDISession().getEventManager().removeEventListener( this );
try
{
if ( getShadow() != null ) if ( getShadow() != null )
destroyShadow( getShadow() ); getShadow().dispose();
}
catch( DebugException e )
{
logError( e );
}
} }
protected synchronized void setChanged( boolean changed ) throws DebugException protected synchronized void setChanged( boolean changed ) throws DebugException
@ -286,12 +370,19 @@ public abstract class CVariable extends CDebugElement
if ( source.getTarget().equals( getCDITarget() ) ) if ( source.getTarget().equals( getCDITarget() ) )
{ {
if ( event instanceof ICDIChangedEvent ) if ( event instanceof ICDIChangedEvent )
{
try
{ {
if ( source instanceof ICDIVariable && source.equals( getCDIVariable() ) ) if ( source instanceof ICDIVariable && source.equals( getCDIVariable() ) )
{ {
handleChangedEvent( (ICDIChangedEvent)event ); handleChangedEvent( (ICDIChangedEvent)event );
} }
} }
catch( CDIException e )
{
// do nothing
}
}
} }
} }
@ -323,10 +414,10 @@ public abstract class CVariable extends CDebugElement
* *
* @return the underlying CDI variable * @return the underlying CDI variable
*/ */
protected ICDIVariable getCDIVariable() protected ICDIVariable getCDIVariable() throws CDIException
{ {
if ( fShadow != null ) if ( getShadow() != null )
return fShadow; return getShadow().getCDIVariable();
return getOriginalCDIVariable(); return getOriginalCDIVariable();
} }
@ -346,7 +437,7 @@ public abstract class CVariable extends CDebugElement
{ {
if ( fName == null ) if ( fName == null )
{ {
String cdiName = ( getOriginalCDIVariable() != null ) ? getOriginalCDIVariable().getName() : null; String cdiName = ( fOriginal != null ) ? fOriginal.getCDIVariableObject().getName() : null;
fName = cdiName; fName = cdiName;
if ( cdiName != null && getParent() instanceof ICValue ) if ( cdiName != null && getParent() instanceof ICValue )
{ {
@ -369,7 +460,7 @@ public abstract class CVariable extends CDebugElement
*/ */
public String getReferenceTypeName() throws DebugException public String getReferenceTypeName() throws DebugException
{ {
return getType().getName(); return ( getType() != null ) ? getType().getName() : null;
} }
protected void updateParentVariable( CValue parentValue ) throws DebugException protected void updateParentVariable( CValue parentValue ) throws DebugException
@ -410,11 +501,10 @@ public abstract class CVariable extends CDebugElement
{ {
try try
{ {
ICDIVariable newVar = createShadow( getOriginalCDIVariable().getStackFrame(), type ); InternalVariable newVar = createShadow( getOriginalCDIVariable().getStackFrame(), type );
ICDIVariable oldVar = getShadow(); if ( getShadow() != null )
getShadow().dispose();
setShadow( newVar ); setShadow( newVar );
if ( oldVar != null )
destroyShadow( oldVar );
} }
catch( CDIException e ) catch( CDIException e )
{ {
@ -422,15 +512,7 @@ public abstract class CVariable extends CDebugElement
} }
finally finally
{ {
if ( fValue != null ) invalidateValue();
{
((CValue)fValue).dispose();
fValue = null;
}
fEditable = null;
if ( fType != null )
fType.dispose();
fType = null;
fireChangeEvent( DebugEvent.STATE ); fireChangeEvent( DebugEvent.STATE );
} }
} }
@ -456,19 +538,11 @@ public abstract class CVariable extends CDebugElement
*/ */
public void restoreDefault() throws DebugException public void restoreDefault() throws DebugException
{ {
ICDIVariable oldVar = getShadow(); InternalVariable oldVar = getShadow();
setShadow( null ); setShadow( null );
if ( oldVar != null ) if ( oldVar != null )
destroyShadow( oldVar ); oldVar.dispose();
if ( fValue != null ) invalidateValue();
{
((CValue)fValue).dispose();
fValue = null;
}
fEditable = null;
if ( fType != null )
fType.dispose();
fType = null;
fireChangeEvent( DebugEvent.STATE ); fireChangeEvent( DebugEvent.STATE );
} }
@ -481,27 +555,26 @@ public abstract class CVariable extends CDebugElement
return ( target != null && isEditable() ); return ( target != null && isEditable() );
} }
protected ICDIVariable getOriginalCDIVariable() protected ICDIVariable getOriginalCDIVariable() throws CDIException
{ {
return fCDIVariable; return ( fOriginal != null ) ? fOriginal.getCDIVariable() : null;
} }
private ICDIVariable getShadow() private InternalVariable getShadow()
{ {
return fShadow; return fShadow;
} }
private void setShadow( ICDIVariable shadow ) private void setShadow( InternalVariable shadow )
{ {
fShadow = shadow; fShadow = shadow;
} }
private ICDIVariable createShadow( ICDIStackFrame cdiFrame, String type ) throws DebugException private InternalVariable createShadow( ICDIStackFrame cdiFrame, String type ) throws DebugException
{ {
try try
{ {
ICDIVariableObject varObject = getCDISession().getVariableManager().getVariableObjectAsType( getOriginalCDIVariable(), type ); return new InternalVariable( getCDISession().getVariableManager().getVariableObjectAsType( getOriginalCDIVariable(), type ) );
return getCDISession().getVariableManager().createVariable( varObject );
} }
catch( CDIException e ) catch( CDIException e )
{ {
@ -510,12 +583,11 @@ public abstract class CVariable extends CDebugElement
return null; return null;
} }
private ICDIVariable createShadow( ICDIStackFrame cdiFrame, String type, int start, int length ) throws DebugException private InternalVariable createShadow( ICDIStackFrame cdiFrame, String type, int start, int length ) throws DebugException
{ {
try try
{ {
ICDIVariableObject varObject = getCDISession().getVariableManager().getVariableObjectAsArray( getOriginalCDIVariable(), type, start, length ); return new InternalVariable( getCDISession().getVariableManager().getVariableObjectAsArray( getOriginalCDIVariable(), type, start, length ) );
return getCDISession().getVariableManager().createVariable( varObject );
} }
catch( CDIException e ) catch( CDIException e )
{ {
@ -524,18 +596,6 @@ public abstract class CVariable extends CDebugElement
return null; return null;
} }
private void destroyShadow( ICDIVariable shadow ) throws DebugException
{
try
{
getCDISession().getVariableManager().destroyVariable( shadow );
}
catch( CDIException e )
{
targetRequestFailed( e.getMessage(), null );
}
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.model.ICastToType#isCasted() * @see org.eclipse.cdt.debug.core.model.ICastToType#isCasted()
*/ */
@ -551,11 +611,10 @@ public abstract class CVariable extends CDebugElement
{ {
try try
{ {
ICDIVariable newVar = createShadow( getOriginalCDIVariable().getStackFrame(), type, startIndex, length ); InternalVariable newVar = createShadow( getOriginalCDIVariable().getStackFrame(), type, startIndex, length );
ICDIVariable oldVar = getShadow(); if ( getShadow() != null )
getShadow().dispose();
setShadow( newVar ); setShadow( newVar );
if ( oldVar != null )
destroyShadow( oldVar );
} }
catch( CDIException e ) catch( CDIException e )
{ {
@ -563,15 +622,7 @@ public abstract class CVariable extends CDebugElement
} }
finally finally
{ {
if ( fValue != null ) invalidateValue();
{
((CValue)fValue).dispose();
fValue = null;
}
fEditable = null;
if ( fType != null )
fType.dispose();
fType = null;
fireChangeEvent( DebugEvent.STATE ); fireChangeEvent( DebugEvent.STATE );
} }
} }
@ -606,11 +657,15 @@ public abstract class CVariable extends CDebugElement
*/ */
public boolean isEditable() public boolean isEditable()
{ {
if ( fEditable == null && getCDIVariable() != null ) if ( !isEnabled() )
return false;
if ( fEditable == null )
{ {
try try
{ {
fEditable = new Boolean( getCDIVariable().isEditable() ); ICDIVariable var = getCDIVariable();
if ( var != null )
fEditable = new Boolean( var.isEditable() );
} }
catch( CDIException e ) catch( CDIException e )
{ {
@ -689,11 +744,13 @@ public abstract class CVariable extends CDebugElement
*/ */
public ICType getType() throws DebugException public ICType getType() throws DebugException
{ {
if ( fType == null && getCDIVariable() != null ) if ( isEnabled() && fType == null )
{ {
try try
{ {
fType = new CType( getCDIVariable().getType() ); ICDIVariable var = getCDIVariable();
if ( var != null )
fType = new CType( var.getType() );
} }
catch( CDIException e ) catch( CDIException e )
{ {
@ -702,4 +759,75 @@ public abstract class CVariable extends CDebugElement
} }
return fType; return fType;
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.model.ICVariable#isEnabled()
*/
public boolean isEnabled()
{
return ( canEnableDisable() ) ? fIsEnabled : true;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.model.ICVariable#setEnabled(boolean)
*/
public void setEnabled( boolean enabled ) throws DebugException
{
setEnabled0( enabled );
fireChangeEvent( DebugEvent.STATE );
}
private synchronized void setEnabled0( boolean enabled )
{
if ( fOriginal != null )
fOriginal.invalidate();
if ( getShadow() != null )
getShadow().invalidate();
fIsEnabled = enabled;
invalidateValue();
}
private void invalidateValue()
{
if ( fValue != null )
{
((CValue)fValue).dispose();
fValue = null;
}
fEditable = null;
if ( fType != null )
fType.dispose();
fType = null;
}
protected boolean isArgument()
{
return ( fOriginal != null ) ? ( fOriginal.getCDIVariableObject() instanceof ICDIArgumentObject ) : false;
}
protected boolean sameVariableObject( ICDIVariableObject object )
{
return ( fOriginal != null ) ? ( object.getName().equals( fOriginal.getCDIVariableObject().getName() ) ) : false;
}
private boolean enableVariableBookkeeping()
{
boolean result = false;
try
{
result = getLaunch().getLaunchConfiguration().getAttribute( ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_ENABLE_VARIABLE_BOOKKEEPING, false );
}
catch( CoreException e )
{
}
return result;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.model.ICVariable#canEnableDisable()
*/
public boolean canEnableDisable()
{
return ( getParent() instanceof CStackFrame );
}
} }