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 ece6842..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,12 +6,10 @@ */ package net.sourceforge.phpeclipse.xdebug.php.model; -import java.net.URI; -import java.net.URISyntaxException; - -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; @@ -22,22 +20,22 @@ 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 { - 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 @@ -47,52 +45,23 @@ public class XDebugStackFrame extends XDebugElement implements IStackFrame { * @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; - 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); + public XDebugStackFrame(XDebugThread thread, int level, String type, int lineNumber, String where, /*URL*/String filename) { + super(thread == null ? null : (XDebugTarget) thread.getDebugTarget()); - fWhere=PHPDebugUtils.getAttributeValue(stackNode,"where"); - - fFileName = (new Path(fileName)).lastSegment(); - int id=-1; + fLevel = level; + fThread = thread; + 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]); -// } + } + + public void incrementStepCounter() { + fStepCount++; } /* (non-Javadoc) @@ -101,143 +70,197 @@ public class XDebugStackFrame extends XDebugElement implements IStackFrame { 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; + } + + 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) * @see org.eclipse.debug.core.model.IStackFrame#getLineNumber() */ public int getLineNumber() throws DebugException { - return fLineNo; + return fLineNumber; } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#getCharStart() */ public int getCharStart() throws DebugException { return -1; } + /* (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) * @see org.eclipse.debug.core.model.IStackFrame#getRegisterGroups() */ public IRegisterGroup[] getRegisterGroups() throws DebugException { return null; } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStackFrame#hasRegisterGroups() */ public boolean hasRegisterGroups() throws DebugException { return false; } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#canStepInto() */ public boolean canStepInto() { - return getThread().canStepInto(); + return fThread.canStepInto(); } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#canStepOver() */ public boolean canStepOver() { - return getThread().canStepOver(); + return fThread.canStepOver(); } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#canStepReturn() */ public boolean canStepReturn() { - return getThread().canStepReturn(); + return fThread.canStepReturn(); } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#isStepping() */ public boolean isStepping() { - return getThread().isStepping(); + return fThread.isStepping(); } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#stepInto() */ public void stepInto() throws DebugException { - getThread().stepInto(); + fThread.stepInto(); } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#stepOver() */ public void stepOver() throws DebugException { - getThread().stepOver(); + fThread.stepOver(); } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#stepReturn() */ public void stepReturn() throws DebugException { - getThread().stepReturn(); + fThread.stepReturn(); } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#canResume() */ public boolean canResume() { - return getThread().canResume(); + return fThread.canResume(); } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend() */ public boolean canSuspend() { - return getThread().canSuspend(); + return fThread.canSuspend(); } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended() */ public boolean isSuspended() { - return getThread().isSuspended(); + return fThread.isSuspended(); } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#resume() */ public void resume() throws DebugException { - getThread().resume(); + fThread.resume(); } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#suspend() */ public void suspend() throws DebugException { - getThread().suspend(); + fThread.suspend(); } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ITerminate#canTerminate() */ public boolean canTerminate() { - return getThread().canTerminate(); + return fThread.canTerminate(); } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ITerminate#isTerminated() */ public boolean isTerminated() { - return getThread().isTerminated(); + return fThread.isTerminated(); } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.ITerminate#terminate() */ public void terminate() throws DebugException { - getThread().terminate(); + fThread.terminate(); } /** @@ -245,11 +268,29 @@ public class XDebugStackFrame extends XDebugElement implements IStackFrame { * with. * * @return the name of the source file this stack frame is associated - * with + * 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(); } + + 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) */ @@ -257,27 +298,42 @@ public class XDebugStackFrame extends XDebugElement implements IStackFrame { if (obj instanceof XDebugStackFrame) { 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) * @see java.lang.Object#hashCode() */ public int hashCode() { - return getSourceName().hashCode() + fId; + return getSourceName().hashCode() + 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 URL getFullName() { + return fName; + } + + public int getLevel() { + return fLevel; + } + + 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