From 40b891daa9d325e10ab43c9a8822315a3ac0e5da Mon Sep 17 00:00:00 2001 From: Alain Magloire Date: Mon, 26 Aug 2002 05:23:14 +0000 Subject: [PATCH] Was creating unecessary objects. --- .../debug/mi/core/cdi/VariableManager.java | 106 +++++++++++------- 1 file changed, 66 insertions(+), 40 deletions(-) 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 f2e01327c39..3a54d940569 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 @@ -9,15 +9,9 @@ import java.util.ArrayList; import java.util.List; import org.eclipse.cdt.debug.core.cdi.CDIException; -import org.eclipse.cdt.debug.core.cdi.ICDICondition; -import org.eclipse.cdt.debug.core.cdi.ICDIExpressionManager; -import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent; import org.eclipse.cdt.debug.core.cdi.model.ICDIArgument; import org.eclipse.cdt.debug.core.cdi.model.ICDIExpression; import org.eclipse.cdt.debug.core.cdi.model.ICDIRegister; -import org.eclipse.cdt.debug.core.cdi.model.ICDIStackFrame; -import org.eclipse.cdt.debug.core.cdi.model.ICDITarget; -import org.eclipse.cdt.debug.core.cdi.model.ICDIThread; 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; @@ -25,6 +19,8 @@ import org.eclipse.cdt.debug.mi.core.command.CommandFactory; import org.eclipse.cdt.debug.mi.core.command.MIVarCreate; import org.eclipse.cdt.debug.mi.core.command.MIVarDelete; import org.eclipse.cdt.debug.mi.core.command.MIVarUpdate; +import org.eclipse.cdt.debug.mi.core.event.MIEvent; +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.MIVarChange; @@ -36,6 +32,7 @@ import org.eclipse.cdt.debug.mi.core.output.MIVarUpdateInfo; public class VariableManager extends SessionObject { List elementList; + List oosList; // Out of Scope variable lists; /** * Class container to regroup all info concerning a variable. @@ -50,6 +47,7 @@ public class VariableManager extends SessionObject { public VariableManager(CSession session) { super(session); elementList = new ArrayList(); + oosList = new ArrayList(); } Element getElement(String varName) { @@ -99,23 +97,20 @@ public class VariableManager extends SessionObject { if (info == null) { throw new CDIException("No answer"); } - MIVarChange[]changes = info.getMIVarChanges(); + MIVarChange[] changes = info.getMIVarChanges(); + List eventList = new ArrayList(changes.length); for (int i = 0 ; i < changes.length; i++) { - ICDIEvent cdiEvent = null; - Element element = getElement(changes[i].getVarName()); - if (!changes[i].isInScope()) { - if (element != null) { - cdiEvent = new DestroyedEvent(getCSession(), element.variable); - } - removeVariable(changes[i]); - } else { - if (element != null) { - cdiEvent = new ChangedEvent(getCSession(), element.variable); - } + String varName = changes[i].getVarName(); + Element element = getElement(varName); + if (element != null) { + eventList.add( new MIVarChangedEvent(varName, changes[i].isInScope())); + } + if (! changes[i].isInScope()) { + removeVariable(changes[i]); } - EventManager mgr = (EventManager)getCSession().getEventManager(); - mgr.fireEvent(cdiEvent); } + MIEvent[] events = (MIEvent[])eventList.toArray(new MIEvent[0]); + mi.fireEvents(events); } catch (MIException e) { throw new CDIException(e.toString()); } @@ -124,7 +119,7 @@ public class VariableManager extends SessionObject { Element createElement(StackFrame stack, String name) throws CDIException { Element element = getElement(stack, name); if (element == null) { - stack.getCThread().setCurrentStackFrame(stack); + //stack.getCThread().setCurrentStackFrame(stack); MISession mi = getCSession().getMISession(); CommandFactory factory = mi.getCommandFactory(); MIVarCreate var = factory.createMIVarCreate(name); @@ -157,9 +152,14 @@ public class VariableManager extends SessionObject { } } - void removeVariable(MIVarChange changed) throws CDIException { - String varName = changed.getVarName(); - removeVariable(varName); + Element removeOutOfScope(String varName) { + Element[] oos = (Element[])oosList.toArray(new Element[0]); + for (int i = 0; i < oos.length; i++) { + if (oos[i].miVar.getVarName().equals(varName)) { + return oos[i]; + } + } + return null; } void removeVariable(String varName) throws CDIException { @@ -167,11 +167,17 @@ public class VariableManager extends SessionObject { for (int i = 0; i < elements.length; i++) { if (elements[i].miVar.getVarName().equals(varName)) { elementList.remove(elements[i]); + oosList.add(elements[i]); // Put on the Out Of Scope list removeMIVar(elements[i].miVar); } } } + void removeVariable(MIVarChange changed) throws CDIException { + String varName = changed.getVarName(); + removeVariable(varName); + } + void removeVariable(Variable variable) throws CDIException { String varName = ((Variable)variable).getMIVar().getVarName(); removeVariable(varName); @@ -185,35 +191,55 @@ public class VariableManager extends SessionObject { ICDIVariable createVariable(StackFrame stack, String name) throws CDIException { Element element = createElement(stack, name); - Variable var = new Variable(stack, name, element.miVar); - element.variable = var; - addElement(element); - return (ICDIVariable)var; + Variable var; + if (element.variable != null) { + var = element.variable; + } else { + var = new Variable(stack, name, element.miVar); + element.variable = var; + addElement(element); + } + return var; } ICDIArgument createArgument(StackFrame stack, String name) throws CDIException { Element element = createElement(stack, name); - Variable carg = new Argument(stack, name,element.miVar); - element.variable = carg; - addElement(element); - return (ICDIArgument)carg; + Argument carg; + if (element.variable != null && element.variable instanceof Argument) { + carg = (Argument)element.variable; + } else { + carg = new Argument(stack, name,element.miVar); + element.variable = carg; + addElement(element); + } + return carg; } ICDIExpression createExpression(StackFrame stack, String name) throws CDIException { Element element = createElement(stack, name); - Variable cexp = new Expression(stack, name, element.miVar); - element.variable = cexp; - addElement(element); - return (ICDIExpression)cexp; + Expression cexp; + if (element.variable != null && element.variable instanceof Expression) { + cexp = (Expression)element.variable; + } else { + cexp = new Expression(stack, name, element.miVar); + element.variable = cexp; + addElement(element); + } + return cexp; } ICDIRegister createRegister(StackFrame stack, String name) throws CDIException { Element element = createElement(stack, "$" + name); - Variable reg = new Register(stack, name, element.miVar); - element.variable = reg; - addElement(element); - return (ICDIRegister)reg; + Register reg; + if (element.variable != null && element.variable instanceof Register) { + reg = (Register)element.variable; + } else { + reg = new Register(stack, name, element.miVar); + element.variable = reg; + addElement(element); + } + return reg; } }