diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/cdi/ICDIVariableManager.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/cdi/ICDIVariableManager.java index a485a91f03a..449e8f660b1 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/cdi/ICDIVariableManager.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/cdi/ICDIVariableManager.java @@ -42,9 +42,7 @@ public interface ICDIVariableManager extends ICDIManager { ICDIVariableObject getVariableObject(String filename, String function, String name) throws CDIException; /** - * Method createVariable. - * Use the current stackframe to return an ICDIVariable. - * A null stack means to use the current stackframe. + * Use the stackframe to return an ICDIVariableObject for name. * * @param stack * @param name @@ -53,6 +51,24 @@ public interface ICDIVariableManager extends ICDIManager { */ ICDIVariableObject getVariableObject(ICDIStackFrame stack, String name) throws CDIException; + /** + * Consider the variable object as an Array of type and range[start, end] + * @param stack + * @param name + * @return ICDIVariableObject + * @throws CDIException + */ + ICDIVariableObject getVariableObjectAsArray(ICDIVariableObject var, String type, int start, int end) throws CDIException; + + /** + * Consider the variable object as type. + * @param stack + * @param name + * @return ICDIVariableObject + * @throws CDIException + */ + ICDIVariableObject getVariableObjectAsType(ICDIVariableObject var, String type) throws CDIException; + /** * Method getVariableObjects. * Returns all the local variable objects of that stackframe. @@ -74,7 +90,6 @@ public interface ICDIVariableManager extends ICDIManager { */ ICDIVariable createVariable(ICDIVariableObject var) throws CDIException; - /** * Method getArgumentObject. * Returns a argument Object that will hold the name and the stackframe. diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/VariableManager.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/VariableManager.java index 0d49fc037bd..770f414b57f 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/VariableManager.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/VariableManager.java @@ -25,6 +25,7 @@ import org.eclipse.cdt.debug.mi.core.cdi.model.ArgumentObject; import org.eclipse.cdt.debug.mi.core.cdi.model.Variable; import org.eclipse.cdt.debug.mi.core.cdi.model.VariableObject; import org.eclipse.cdt.debug.mi.core.command.CommandFactory; +import org.eclipse.cdt.debug.mi.core.command.MIPType; import org.eclipse.cdt.debug.mi.core.command.MIStackListArguments; import org.eclipse.cdt.debug.mi.core.command.MIStackListLocals; import org.eclipse.cdt.debug.mi.core.command.MIVarCreate; @@ -35,6 +36,7 @@ import org.eclipse.cdt.debug.mi.core.event.MIVarChangedEvent; import org.eclipse.cdt.debug.mi.core.event.MIVarDeletedEvent; import org.eclipse.cdt.debug.mi.core.output.MIArg; import org.eclipse.cdt.debug.mi.core.output.MIFrame; +import org.eclipse.cdt.debug.mi.core.output.MIPTypeInfo; import org.eclipse.cdt.debug.mi.core.output.MIStackListArgumentsInfo; import org.eclipse.cdt.debug.mi.core.output.MIStackListLocalsInfo; import org.eclipse.cdt.debug.mi.core.output.MIVar; @@ -282,15 +284,28 @@ public class VariableManager extends SessionObject implements ICDIVariableManage } /** - * @see org.eclipse.cdt.debug.core.cdi.ICDIVariableManager#getVariableArrayObject(ICDIVariableObject, String, int, int) + * @see org.eclipse.cdt.debug.core.cdi.ICDIVariableManager#getVariableObjectAsArray(ICDIVariableObject, String, int, int) */ - public ICDIVariableObject getVariableArrayObject(ICDIVariableObject object, String type, int start, int end) throws CDIException { + public ICDIVariableObject getVariableObjectAsArray(ICDIVariableObject object, String type, int start, int end) throws CDIException { if (object instanceof VariableObject) { VariableObject obj = (VariableObject)object; StringBuffer buffer = new StringBuffer(); buffer.append("*("); buffer.append('('); if (type != null && type.length() > 0) { + // Check if the type is valid. + try { + MISession mi = ((Session)getSession()).getMISession(); + CommandFactory factory = mi.getCommandFactory(); + MIPType ptype = factory.createMIPType(type); + mi.postCommand(ptype); + MIPTypeInfo info = ptype.getMIPtypeInfo(); + if (info == null) { + throw new CDIException("No answer"); + } + } catch (MIException e) { + throw new MI2CDIException(e); + } buffer.append('(').append(type).append(')'); } buffer.append(obj.getName()); @@ -305,6 +320,37 @@ public class VariableManager extends SessionObject implements ICDIVariableManage throw new CDIException("Unknown variable object"); } + /** + * @see org.eclipse.cdt.debug.core.cdi.ICDIVariableManager#getVariableObjectAsArray(ICDIVariableObject, String, int, int) + */ + public ICDIVariableObject getVariableObjectAsType(ICDIVariableObject object, String type) throws CDIException { + if (object instanceof VariableObject) { + VariableObject obj = (VariableObject)object; + StringBuffer buffer = new StringBuffer(); + if (type != null && type.length() > 0) { + // Check if the type is valid. + try { + MISession mi = ((Session)getSession()).getMISession(); + CommandFactory factory = mi.getCommandFactory(); + MIPType ptype = factory.createMIPType(type); + mi.postCommand(ptype); + MIPTypeInfo info = ptype.getMIPtypeInfo(); + if (info == null) { + throw new CDIException("No answer"); + } + } catch (MIException e) { + throw new MI2CDIException(e); + } + buffer.append('(').append(type).append(')'); + } + buffer.append('('); + buffer.append(obj.getName()); + buffer.append(')'); + return new VariableObject(obj, buffer.toString()); + } + throw new CDIException("Unknown variable object"); + } + /** * @see org.eclipse.cdt.debug.core.cdi.ICDIVariableManager#getVariableObjects(ICDIStackFrame) */