diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIExpressions.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIExpressions.java index cf2608bd761..6915fb7806b 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIExpressions.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIExpressions.java @@ -1046,25 +1046,67 @@ public class MIExpressions extends AbstractDsfService implements IExpressions2, varManager.markAllOutOfDate(); } - /** A casted or array-displayed expression. - * @since 3.0 */ - public class CastedExpressionDMC extends MIExpressionDMC implements ICastedExpressionDMContext { + /** + * A casted or array-displayed expression. + * @since 3.0 + */ + protected class CastedExpressionDMC extends MIExpressionDMC implements ICastedExpressionDMContext { - private final CastInfo castInfo; + private final CastInfo fCastInfo; /** if non-null, interpret result as this type rather than the raw expression's type */ - private String expression; + private String fCastExpression; - public CastedExpressionDMC(MIExpressionDMC exprDMC, CastInfo castInfo) { + public CastedExpressionDMC(MIExpressionDMC exprDMC, String castExpression, CastInfo castInfo) { super(getSession().getId(), exprDMC.getExpression(), exprDMC.getRelativeExpression(), exprDMC); - this.castInfo = castInfo; - + fCastInfo = castInfo; + fCastExpression = castExpression; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.dsf.debug.service.IExpressions2.ICastedExpressionDMContext#getCastInfo() + */ + public CastInfo getCastInfo() { + return fCastInfo; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.dsf.mi.service.MIExpressions.java#getExpression() + */ + @Override + public String getExpression() { + return fCastExpression; + } + + /** + * @return True if the two objects are equal, false otherwise. + */ + @Override + public boolean equals(Object other) { + return super.equals(other) + && fCastInfo.equals(((CastedExpressionDMC) other).fCastInfo); + } + + @Override + public String toString() { + return baseToString() + ".expr" + "[" + //$NON-NLS-1$ //$NON-NLS-2$ + getExpression() +", " + getRelativeExpression() + "]"; //$NON-NLS-1$//$NON-NLS-2$ + } + + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.dsf.debug.service.IExpressions2#createCastedExpression(org.eclipse.cdt.dsf.datamodel.IDMContext, java.lang.String, org.eclipse.cdt.dsf.debug.service.IExpressions2.ICastedExpressionDMContext) + */ + /** @since 3.0 */ + public ICastedExpressionDMContext createCastedExpression(IExpressionDMContext exprDMC, CastInfo castInfo) { + if (exprDMC instanceof MIExpressionDMC && castInfo != null) { String castType = castInfo.getTypeString(); String castExpression = exprDMC.getExpression(); int castingLength = castInfo.getArrayCount(); int castingIndex = castInfo.getArrayStartIndex(); // cast to type - if (castType != null) { + if (castType != null && castType.length() > 0) { StringBuffer buffer = new StringBuffer(); buffer.append('(').append(castType).append(')'); buffer.append('(').append(castExpression).append(')'); @@ -1080,44 +1122,8 @@ public class MIExpressions extends AbstractDsfService implements IExpressions2, buffer.append('@').append(castingLength); castExpression = buffer.toString(); } - this.expression = castExpression; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.dsf.debug.service.IExpressions2.ICastedExpressionDMContext#getCastInfo() - */ - public CastInfo getCastInfo() { - return castInfo; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.dsf.mi.service.MIExpressions.java#getExpression() - */ - @Override - public String getExpression() { - return expression; - } - - /** - * @return True if the two objects are equal, false otherwise. - */ - @Override - public boolean equals(Object other) { - return super.equals(other) - && castInfo.equals(((CastedExpressionDMC) other).castInfo); - } - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.dsf.debug.service.IExpressions2#createCastedExpression(org.eclipse.cdt.dsf.datamodel.IDMContext, java.lang.String, org.eclipse.cdt.dsf.debug.service.IExpressions2.ICastedExpressionDMContext) - */ - /** @since 3.0 */ - public ICastedExpressionDMContext createCastedExpression( - IExpressionDMContext exprDMC, CastInfo castInfo) { - if (exprDMC instanceof MIExpressionDMC) { - CastedExpressionDMC castedDMC = new CastedExpressionDMC( - (MIExpressionDMC) exprDMC, castInfo); - return castedDMC; + + return new CastedExpressionDMC((MIExpressionDMC) exprDMC, castExpression, castInfo); } else { assert false; return null; diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIVariableManager.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIVariableManager.java index e526d9f8c61..80a1b250c34 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIVariableManager.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIVariableManager.java @@ -30,6 +30,7 @@ import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.debug.service.IExpressions; import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext; import org.eclipse.cdt.dsf.debug.service.IExpressions2.CastInfo; +import org.eclipse.cdt.dsf.debug.service.IExpressions2.ICastedExpressionDMContext; import org.eclipse.cdt.dsf.debug.service.IFormattedValues; import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext; import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMData; @@ -49,7 +50,6 @@ import org.eclipse.cdt.dsf.gdb.GDBTypeParser; import org.eclipse.cdt.dsf.gdb.GDBTypeParser.GDBType; import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin; import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceRecordSelectedChangedDMEvent; -import org.eclipse.cdt.dsf.mi.service.MIExpressions.CastedExpressionDMC; import org.eclipse.cdt.dsf.mi.service.MIExpressions.ExpressionInfo; import org.eclipse.cdt.dsf.mi.service.MIExpressions.MIExpressionDMC; import org.eclipse.cdt.dsf.mi.service.command.CommandFactory; @@ -653,8 +653,8 @@ public class MIVariableManager implements ICommandControl { int castingLength = 0; int castingIndex = 0; // in case of casts, need to resolve that before dereferencing, to be safe - if ( exprDmc instanceof CastedExpressionDMC ) { - CastInfo castInfo = ((CastedExpressionDMC)exprDmc).getCastInfo(); + if (exprDmc instanceof ICastedExpressionDMContext) { + CastInfo castInfo = ((ICastedExpressionDMContext)exprDmc).getCastInfo(); castingLength = castInfo.getArrayCount(); castingIndex = castInfo.getArrayStartIndex(); if (castingLength > 0)