X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugStackFrame.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugStackFrame.java index 575520d..e7b1182 100644 --- a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugStackFrame.java +++ b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugStackFrame.java @@ -6,9 +6,10 @@ */ package net.sourceforge.phpeclipse.xdebug.php.model; -import net.sourceforge.phpeclipse.xdebug.core.PHPDebugUtils; -import net.sourceforge.phpeclipse.xdebug.core.DebugConnection.DebugResponse; +import java.net.MalformedURLException; +import java.net.URL; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IRegisterGroup; @@ -19,348 +20,320 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** + * @author PHPeclipse team * @author Axel - * - * TODO To change the template for this generated type comment go to Window - - * Preferences - Java - Code Style - Code Templates + * */ -public class XDebugStackFrame extends XDebugElement implements IStackFrame { - +public class XDebugStackFrame extends XDebugElement implements IStackFrame { private XDebugThread fThread; - // private String fName; - private int fLineNo; - - private String fFileName; - - private int fId; - - private IVariable[] fVariables; - - private String fLevel; - + private URL fName; + private int fLineNumber; + private int fLevel; private String fType; - private String fWhere; + private IVariable[] fVariables; + + private int fStepCount = 0; + /** - * Constructs a stack frame in the given thread with the given frame data. + * Constructs a stack frame in the given thread with the given + * frame data. * * @param thread - * @param data - * frame data - * @param id - * stack frame id (0 is the bottom of the stack) + * @param data frame data + * @param id stack frame id (0 is the bottom of the stack) */ - public XDebugStackFrame(XDebugThread thread, Node stackNode, int id) { - super((XDebugTarget) thread.getDebugTarget()); - fId = id; + public XDebugStackFrame(XDebugThread thread, int level, String type, int lineNumber, String where, /*URL*/String filename) { + super(thread == null ? null : (XDebugTarget) thread.getDebugTarget()); + + fLevel = level; fThread = thread; - init(stackNode); - } - - /** - * Initializes this frame based on its data - * - * @param data - */ - private void init(Node stackNode) { - - fLevel = PHPDebugUtils.getAttributeValue(stackNode, "level"); - fType = PHPDebugUtils.getAttributeValue(stackNode, "type"); - String fileName = PHPDebugUtils.unescapeString(PHPDebugUtils - .getAttributeValue(stackNode, "filename")); - String lineNo = PHPDebugUtils.getAttributeValue(stackNode, "lineno"); - - if (lineNo != "") - fLineNo = Integer.parseInt(lineNo); - - fWhere = PHPDebugUtils.getAttributeValue(stackNode, "where"); - - fFileName = (new Path(fileName)).lastSegment(); - int id = -1; + fType = type; + fLineNumber = lineNumber; + fWhere = where; try { - id = ((XDebugTarget) getDebugTarget()).sendRequest("context_get", - "-d " + fLevel); - } catch (DebugException e) { - // TODO Auto-generated catch block + fName = new URL(filename); + } catch (MalformedURLException e) { e.printStackTrace(); } - DebugResponse response = ((XDebugTarget) getDebugTarget()) - .getResponse(id); - Node responseNode = response.getParentNode(); - NodeList property = responseNode.getChildNodes(); - fVariables = new IVariable[property.getLength()]; - for (int i = 0; i < property.getLength(); i++) { - Node propertyNode = property.item(i); - fVariables[i] = new XDebugVariable(this, propertyNode); - } - - // int numVars = strings.length - 3; - // fVariables = new IVariable[numVars]; - // for (int i = 0; i < numVars; i++) { - // fVariables[i] = new XDebugVariable(this, strings[i + 3]); - // } } - - /* - * (non-Javadoc) - * + + public void incrementStepCounter() { + fStepCount++; + } + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getThread() */ public IThread getThread() { return fThread; } - - /* - * (non-Javadoc) - * - * @see org.eclipse.debug.core.model.IStackFrame#getVariables() - */ + public IVariable[] getVariables() throws DebugException { + if (fVariables == null) { + Node dfl = ((XDebugTarget) getDebugTarget()).getLocalVariables(fLevel); + Node dfg = ((XDebugTarget) getDebugTarget()).getGlobalVariables(fLevel); + parseVariable(dfl, dfg); + } + return fVariables; } + + private void parseVariable(Node localVariables, Node globalVariables) { + NodeList property = localVariables.getChildNodes(); + + NodeList propertyGlobal = globalVariables.getChildNodes(); + + fVariables = new IVariable[property.getLength() + propertyGlobal.getLength()]; + + int length = property.getLength(); + for (int i = 0; i < length; i++) { + XDebugVariable var = new XDebugVariable(this, property.item(i)); + fVariables[i] = var; + } - /* - * (non-Javadoc) - * + int globalLength = propertyGlobal.getLength(); + for (int k = 0; k < globalLength; k++) { + XDebugVariable var = new XDebugVariable(this, propertyGlobal.item(k)); + fVariables[k + length] = var; + } + } + + /*public void evaluateChange(IStackFrame OldStackFrame) throws DebugException { + IVariable[] OldVariable = ((XDebugStackFrame) OldStackFrame).getVariables(); + for (int i = 0; i < fVariables.length; i++) { + ((XDebugVariable) fVariables[i]).setChange(OldVariable[i]); + } + }*/ + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#hasVariables() */ public boolean hasVariables() throws DebugException { - return fVariables.length > 0; + /*return fVariables.length > 0;*/ + return true; } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getLineNumber() */ public int getLineNumber() throws DebugException { - return fLineNo; + return fLineNumber; } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getCharStart() */ public int getCharStart() throws DebugException { return -1; } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getCharEnd() */ public int getCharEnd() throws DebugException { return -1; } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc)fName * @see org.eclipse.debug.core.model.IStackFrame#getName() */ public String getName() throws DebugException { - return fFileName + "::" + fWhere + " : lineno " + fLineNo; + return fName.toString()+"::"+fWhere+ " line: "+ fLineNumber; } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getRegisterGroups() */ public IRegisterGroup[] getRegisterGroups() throws DebugException { return null; } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#hasRegisterGroups() */ public boolean hasRegisterGroups() throws DebugException { return false; } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#canStepInto() */ public boolean canStepInto() { - return getThread().canStepInto(); + return fThread.canStepInto(); } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#canStepOver() */ public boolean canStepOver() { - return getThread().canStepOver(); + return fThread.canStepOver(); } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#canStepReturn() */ public boolean canStepReturn() { - return getThread().canStepReturn(); + return fThread.canStepReturn(); } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#isStepping() */ public boolean isStepping() { - return getThread().isStepping(); + return fThread.isStepping(); } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#stepInto() */ public void stepInto() throws DebugException { - getThread().stepInto(); + fThread.stepInto(); } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#stepOver() */ public void stepOver() throws DebugException { - getThread().stepOver(); + fThread.stepOver(); } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#stepReturn() */ public void stepReturn() throws DebugException { - getThread().stepReturn(); + fThread.stepReturn(); } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#canResume() */ public boolean canResume() { - return getThread().canResume(); + return fThread.canResume(); } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend() */ public boolean canSuspend() { - return getThread().canSuspend(); + return fThread.canSuspend(); } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended() */ public boolean isSuspended() { - return getThread().isSuspended(); + return fThread.isSuspended(); } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#resume() */ public void resume() throws DebugException { - getThread().resume(); + fThread.resume(); } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#suspend() */ public void suspend() throws DebugException { - getThread().suspend(); + fThread.suspend(); } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ITerminate#canTerminate() */ public boolean canTerminate() { - return getThread().canTerminate(); + return fThread.canTerminate(); } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ITerminate#isTerminated() */ public boolean isTerminated() { - return getThread().isTerminated(); + return fThread.isTerminated(); } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ITerminate#terminate() */ public void terminate() throws DebugException { - getThread().terminate(); + fThread.terminate(); } - + /** - * Returns the name of the source file this stack frame is associated with. + * Returns the name of the source file this stack frame is associated + * with. * - * @return the name of the source file this stack frame is associated with + * @return the name of the source file this stack frame is associated + * with. If the file associated with this frame does not exists, it returns null. */ public String getSourceName() { - return fFileName; + if (fName == null) { + return null; + } + IPath a = new Path(fName.getFile()); + return a.lastSegment(); } - /* - * (non-Javadoc) - * + public boolean isSameStackFrame(Object obj) { + boolean isSameStackFrame = false; + + if (obj instanceof XDebugStackFrame) { + XDebugStackFrame sf = (XDebugStackFrame)obj; + isSameStackFrame = sf.getSourceName().equals(getSourceName()) && + sf.getType().equals(getType()) && + sf.getWhere().equals(getWhere()); //&& + } + + return isSameStackFrame; + } + + /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object obj) { if (obj instanceof XDebugStackFrame) { - XDebugStackFrame sf = (XDebugStackFrame) obj; + XDebugStackFrame sf = (XDebugStackFrame)obj; try { - return sf.getSourceName().equals(getSourceName()) - && sf.getLineNumber() == getLineNumber() - && sf.fId == fId; + return sf.getSourceName().equals(fName) && + sf.getLineNumber() == fLineNumber && + sf.getLevel() == fLevel && + sf.getType().equals(fType) && + sf.getWhere().equals(fWhere); } catch (DebugException e) { } } + return false; } - - /* - * (non-Javadoc) - * + + /* (non-Javadoc) * @see java.lang.Object#hashCode() */ public int hashCode() { - return getSourceName().hashCode() + fId; + return getSourceName().hashCode() + fLevel; + } + + public URL getFullName() { + return fName; + } + + public int getLevel() { + return fLevel; } - /** - * Returns this stack frame's unique identifier within its thread - * - * @return this stack frame's unique identifier within its thread - */ - protected int getIdentifier() { - return fId; + public String getType() { + return fType; + } + + public String getWhere() { + return fWhere; + } + + public boolean setVariableValue(XDebugVariable variable, String expression) throws DebugException { + return ((XDebugTarget) getDebugTarget()).setVarValue("$" + variable.getName(), expression); } -} +} \ No newline at end of file