diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/Register.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/Register.java index 61d12aa6231..9bac57e3c3f 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/Register.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/Register.java @@ -5,18 +5,17 @@ package org.eclipse.cdt.debug.mi.core.cdi.model; import org.eclipse.cdt.debug.core.cdi.CDIException; -import org.eclipse.cdt.debug.core.cdi.ICDIRegisterManager; import org.eclipse.cdt.debug.core.cdi.model.ICDIRegister; -import org.eclipse.cdt.debug.core.cdi.model.ICDIValue; +import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable; import org.eclipse.cdt.debug.mi.core.MIException; import org.eclipse.cdt.debug.mi.core.MISession; import org.eclipse.cdt.debug.mi.core.cdi.MI2CDIException; +import org.eclipse.cdt.debug.mi.core.cdi.RegisterManager; import org.eclipse.cdt.debug.mi.core.cdi.Session; 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.event.MIRegisterChangedEvent; -import org.eclipse.cdt.debug.mi.core.output.MIInfo; +import org.eclipse.cdt.debug.mi.core.command.MIVarListChildren; import org.eclipse.cdt.debug.mi.core.output.MIVar; +import org.eclipse.cdt.debug.mi.core.output.MIVarListChildrenInfo; /** */ @@ -30,42 +29,33 @@ public class Register extends Variable implements ICDIRegister { return (RegisterObject)super.getVariableObject(); } - /** - * @see org.eclipse.cdt.debug.core.cdi.model.ICDIVariable#getValue() + /* (non-Javadoc) + * @see org.eclipse.cdt.debug.mi.core.cdi.model.Variable#getChildren() */ - public ICDIValue getValue() throws CDIException { - if (value == null) { - value = new RegisterValue(this); - } - return value; + public ICDIVariable[] getChildren() throws CDIException { + Session session = (Session)(getTarget().getSession()); + MISession mi = session.getMISession(); + RegisterManager mgr = (RegisterManager)session.getRegisterManager(); + CommandFactory factory = mi.getCommandFactory(); + MIVarListChildren var = + factory.createMIVarListChildren(getMIVar().getVarName()); + try { + mi.postCommand(var); + MIVarListChildrenInfo info = var.getMIVarListChildrenInfo(); + if (info == null) { + throw new CDIException("No answer"); + } + MIVar[] vars = info.getMIVars(); + children = new Register[vars.length]; + for (int i = 0; i < vars.length; i++) { + RegisterObject regObj = new RegisterObject(getTarget(), + vars[i].getExp(), getVariableObject().getPosition()); + children[i] = mgr.createRegister(regObj, vars[i]); + } + } catch (MIException e) { + throw new MI2CDIException(e); + } + return children; } - /** - * @see org.eclipse.cdt.debug.core.cdi.model.ICDIVariable#setValue(String) - */ - public void setValue(String expression) throws CDIException { - Session session = (Session)(getTarget().getSession()); - MISession mi = session.getMISession(); - CommandFactory factory = mi.getCommandFactory(); - MIVarAssign var = factory.createMIVarAssign(getMIVar().getVarName(), expression); - try { - mi.postCommand(var); - MIInfo info = var.getMIInfo(); - if (info == null) { - throw new CDIException("No answer"); - } - } catch (MIException e) { - throw new MI2CDIException(e); - } - // If the assign was succesfull fire a MIVarChangedEvent() - // Note gdb may not fire an event for the change register, do it manually. - MIRegisterChangedEvent change = new MIRegisterChangedEvent(0, getName(), getVariableObject().getPosition()); - mi.fireEvent(change); - // If register was on autoupdate, update all the other registers - // assigning may have side effects i.e. affecting other registers. - ICDIRegisterManager mgr = session.getRegisterManager(); - if (mgr.isAutoUpdate()) { - mgr.update(); - } - } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/RegisterValue.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/RegisterValue.java deleted file mode 100644 index 9abe333951b..00000000000 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/RegisterValue.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * (c) Copyright QNX Software Systems Ltd. 2002. - * All Rights Reserved. - */ -package org.eclipse.cdt.debug.mi.core.cdi.model; - -import org.eclipse.cdt.debug.core.cdi.CDIException; -import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable; -import org.eclipse.cdt.debug.mi.core.MIException; -import org.eclipse.cdt.debug.mi.core.MISession; -import org.eclipse.cdt.debug.mi.core.cdi.MI2CDIException; -import org.eclipse.cdt.debug.mi.core.cdi.RegisterManager; -import org.eclipse.cdt.debug.mi.core.cdi.Session; -import org.eclipse.cdt.debug.mi.core.command.CommandFactory; -import org.eclipse.cdt.debug.mi.core.command.MIVarListChildren; -import org.eclipse.cdt.debug.mi.core.output.MIVar; -import org.eclipse.cdt.debug.mi.core.output.MIVarListChildrenInfo; - -public class RegisterValue extends Value { - - Register reg; - - public RegisterValue(Register r) { - super(r); - reg = r; - } - - /** - * @see org.eclipse.cdt.debug.core.cdi.model.ICDIValue#getVariables() - */ - public ICDIVariable[] getVariables() throws CDIException { - Register[] registers = null; - Session session = (Session)(getTarget().getSession()); - MISession mi = session.getMISession(); - RegisterManager mgr = (RegisterManager)session.getRegisterManager(); - CommandFactory factory = mi.getCommandFactory(); - MIVarListChildren var = - factory.createMIVarListChildren(reg.getMIVar().getVarName()); - try { - mi.postCommand(var); - MIVarListChildrenInfo info = var.getMIVarListChildrenInfo(); - if (info == null) { - throw new CDIException("No answer"); - } - MIVar[] vars = info.getMIVars(); - registers = new Register[vars.length]; - for (int i = 0; i < vars.length; i++) { - RegisterObject regObj = new RegisterObject(getTarget(), - vars[i].getExp(), reg.getVariableObject().getPosition()); - registers[i] = mgr.createRegister(regObj, vars[i]); - } - } catch (MIException e) { - throw new MI2CDIException(e); - } - return registers; - } - -} diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java index f8ba4a026b5..d88ff3eaeeb 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/Variable.java @@ -6,6 +6,8 @@ package org.eclipse.cdt.debug.mi.core.cdi.model; import org.eclipse.cdt.debug.core.cdi.CDIException; +import org.eclipse.cdt.debug.core.cdi.ICDIExpressionManager; +import org.eclipse.cdt.debug.core.cdi.ICDIRegisterManager; import org.eclipse.cdt.debug.core.cdi.ICDIVariableManager; import org.eclipse.cdt.debug.core.cdi.model.ICDIStackFrame; import org.eclipse.cdt.debug.core.cdi.model.ICDITarget; @@ -216,17 +218,35 @@ public class Variable extends CObject implements ICDIVariable { } catch (MIException e) { throw new MI2CDIException(e); } - - ICDIVariableManager mgr = session.getVariableManager(); + // If the assign was succesfull fire a MIVarChangedEvent() for the variable // Note GDB will not fire an event for the changed variable we have to do it manually. MIVarChangedEvent change = new MIVarChangedEvent(var.getToken(), miVar.getVarName()); mi.fireEvent(change); - // Changing values may have side effects i.e. affecting other variable + + // Changing values may have side effects i.e. affecting other variables // if the manager is on autoupdate check all the other variables. // Note: This maybe very costly. - if (mgr.isAutoUpdate()) { - mgr.update(); + if (this instanceof Register) { + // If register was on autoupdate, update all the other registers + // assigning may have side effects i.e. affecting other registers. + ICDIRegisterManager mgr = session.getRegisterManager(); + if (mgr.isAutoUpdate()) { + mgr.update(); + } + } else if (this instanceof Expression) { + // If expression was on autoupdate, update all the other expression + // assigning may have side effects i.e. affecting other expressions. + ICDIExpressionManager mgr = session.getExpressionManager(); + if (mgr.isAutoUpdate()) { + mgr.update(); + } + } else { + // FIXME: Should we always call the Variable Manager ? + ICDIVariableManager mgr = session.getVariableManager(); + if (mgr.isAutoUpdate()) { + mgr.update(); + } } }