diff --git a/debug/org.eclipse.cdt.debug.mi.core/ChangeLog b/debug/org.eclipse.cdt.debug.mi.core/ChangeLog index 4331b7cd0f6..336b813d68b 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/ChangeLog +++ b/debug/org.eclipse.cdt.debug.mi.core/ChangeLog @@ -1,3 +1,9 @@ +2004-11-11 Alain Magloire + Fix for PR 75000, from PalmSource + * cdi/org/eclipse/cdt/debug/core/cdi/model/Variable.java + * cdi/org/eclipse/cdt/debug/core/cdi/model/VariableDescriptor.java + * mi/org/eclipse/cdt/debug/mi/core/command/MIVarInfoType.java + 2004-11-10 Alain Magloire Fix for PR 51113 and PR 66268 It allow more flexibility in the GDB console, for example diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java index 54612b82bba..e7b06cd20f9 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java +++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java @@ -57,6 +57,7 @@ import org.eclipse.cdt.debug.mi.core.cdi.model.type.WCharValue; import org.eclipse.cdt.debug.mi.core.command.CommandFactory; import org.eclipse.cdt.debug.mi.core.command.MIVarAssign; import org.eclipse.cdt.debug.mi.core.command.MIVarInfoExpression; +import org.eclipse.cdt.debug.mi.core.command.MIVarInfoType; import org.eclipse.cdt.debug.mi.core.command.MIVarListChildren; import org.eclipse.cdt.debug.mi.core.command.MIVarSetFormat; import org.eclipse.cdt.debug.mi.core.command.MIVarShowAttributes; @@ -64,6 +65,7 @@ import org.eclipse.cdt.debug.mi.core.event.MIVarChangedEvent; import org.eclipse.cdt.debug.mi.core.output.MIInfo; import org.eclipse.cdt.debug.mi.core.output.MIVar; import org.eclipse.cdt.debug.mi.core.output.MIVarInfoExpressionInfo; +import org.eclipse.cdt.debug.mi.core.output.MIVarInfoTypeInfo; import org.eclipse.cdt.debug.mi.core.output.MIVarListChildrenInfo; import org.eclipse.cdt.debug.mi.core.output.MIVarShowAttributesInfo; @@ -402,4 +404,25 @@ public abstract class Variable extends VariableDescriptor implements ICDIVariabl varMgr.destroyVariable(this); } + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.core.cdi.model.ICDIVariableDescriptor#getTypeName() + */ + public String getTypeName() throws CDIException { + if (fTypename == null) { + MISession mi = ((Target) getTarget()).getMISession(); + CommandFactory factory = mi.getCommandFactory(); + MIVarInfoType infoType = factory.createMIVarInfoType(fMiVar.getVarName()); + try { + mi.postCommand(infoType); + MIVarInfoTypeInfo info = infoType.getMIVarInfoTypeInfo(); + if (info == null) { + throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$ + } + fTypename = info.getType(); + } catch (MIException e) { + throw new MI2CDIException(e); + } + } + return fTypename; + } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/VariableDescriptor.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/VariableDescriptor.java index 21daf73415c..d7ded7a5232 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/VariableDescriptor.java +++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/VariableDescriptor.java @@ -46,7 +46,7 @@ public abstract class VariableDescriptor extends CObject implements ICDIVariable String qualifiedName = null; String fFullName = null; ICDIType fType = null; - String typename = null; + String fTypename = null; String sizeof = null; /** @@ -168,8 +168,8 @@ public abstract class VariableDescriptor extends CObject implements ICDIVariable */ public ICDIType getType() throws CDIException { if (fType == null) { + String nametype = getTypeName(); Target target = (Target)getTarget(); - Session session = (Session) (target.getSession()); StackFrame frame = (StackFrame)getStackFrame(); if (frame == null) { Thread thread = (Thread)getThread(); @@ -179,8 +179,8 @@ public abstract class VariableDescriptor extends CObject implements ICDIVariable frame = ((Thread)target.getCurrentThread()).getCurrentStackFrame(); } } + Session session = (Session) target.getSession(); SourceManager sourceMgr = session.getSourceManager(); - String nametype = sourceMgr.getTypeName(frame, getQualifiedName()); try { fType = sourceMgr.getType(frame, nametype); } catch (CDIException e) { @@ -271,11 +271,22 @@ public abstract class VariableDescriptor extends CObject implements ICDIVariable * @see org.eclipse.cdt.debug.core.cdi.model.ICDIVariableDescriptor#getTypeName() */ public String getTypeName() throws CDIException { - if (typename == null) { - ICDIType theType = getType(); - typename = theType.getTypeName(); + if (fTypename == null) { + Target target = (Target)getTarget(); + StackFrame frame = (StackFrame)getStackFrame(); + if (frame == null) { + Thread thread = (Thread)getThread(); + if (thread != null) { + frame = thread.getCurrentStackFrame(); + } else { + frame = ((Thread)target.getCurrentThread()).getCurrentStackFrame(); + } + } + Session session = (Session) target.getSession(); + SourceManager sourceMgr = session.getSourceManager(); + fTypename = sourceMgr.getTypeName(frame, getQualifiedName()); } - return typename; + return fTypename; } /** diff --git a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/MIVarInfoType.java b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/MIVarInfoType.java index eda50326cc1..5b16a209485 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/MIVarInfoType.java +++ b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/MIVarInfoType.java @@ -11,6 +11,11 @@ package org.eclipse.cdt.debug.mi.core.command; +import org.eclipse.cdt.debug.mi.core.MIException; +import org.eclipse.cdt.debug.mi.core.output.MIInfo; +import org.eclipse.cdt.debug.mi.core.output.MIOutput; +import org.eclipse.cdt.debug.mi.core.output.MIVarInfoTypeInfo; + /** * * -var-info-type NAME @@ -26,4 +31,21 @@ public class MIVarInfoType extends MICommand public MIVarInfoType(String name) { super("-var-info-type", new String[]{name}); //$NON-NLS-1$ } + + public MIVarInfoTypeInfo getMIVarInfoTypeInfo() throws MIException { + return (MIVarInfoTypeInfo)getMIInfo(); + } + + public MIInfo getMIInfo() throws MIException { + MIInfo info = null; + MIOutput out = getMIOutput(); + if (out != null) { + info = new MIVarInfoTypeInfo(out); + if (info.isError()) { + throwMIException(info, out); + } + } + return info; + } + }