X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugThread.java b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugThread.java index 366badf..2e00970 100644 --- a/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugThread.java +++ b/net.sourceforge.phpeclipse.xdebug.core/src/net/sourceforge/phpeclipse/xdebug/php/model/XDebugThread.java @@ -6,6 +6,9 @@ */ package net.sourceforge.phpeclipse.xdebug.php.model; +import net.sourceforge.phpeclipse.xdebug.core.PHPDebugUtils; +import net.sourceforge.phpeclipse.xdebug.core.xdebug.XDebugResponse; + import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugPlugin; @@ -13,6 +16,8 @@ import org.eclipse.debug.core.IDebugEventSetListener; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.core.model.IThread; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; /** * @author Axel @@ -21,7 +26,7 @@ import org.eclipse.debug.core.model.IThread; * Window - Preferences - Java - Code Style - Code Templates */ public class XDebugThread extends XDebugElement implements IThread, IDebugEventSetListener { - private IStackFrame[] fStackFrames; + private XDebugStackFrame[] fStackFrames; private IBreakpoint[] fBreakpoints; @@ -46,46 +51,70 @@ public class XDebugThread extends XDebugElement implements IThread, IDebugEventS public void incrementStepCounter() { fStepCount++; } - public IStackFrame[] getStackFrames() throws DebugException { - IStackFrame[] newStackFrames = null; + if (!isSuspended()) { + return new IStackFrame[0]; + } - if (isSuspended()) { - if (fStepCount > fCurrentStepCount) { - newStackFrames = ((XDebugTarget) getDebugTarget()).getStackFrames(); - - for (int i = 0; i < newStackFrames.length; i++) { - ((XDebugStackFrame)newStackFrames[i]).getVariables(); - } - - if (fStackFrames != null) { - if (newStackFrames.length >= fStackFrames.length) { - int delta = newStackFrames.length - fStackFrames.length + 1; - - for (int i = fStackFrames.length - 1; i >= 0; i--) { - if (((XDebugStackFrame) fStackFrames[i]).equals(((XDebugStackFrame) newStackFrames[newStackFrames.length - delta]))) { - int b = 2; b++; - //((XDebugStackFrame) newStackFrames[newStackFrames.length - delta]).evaluateChange((XDebugStackFrame) fStackFrames[i]); - } else if (((XDebugStackFrame) fStackFrames[i]).isSameStackFrame(newStackFrames[newStackFrames.length - delta])) { - //((XDebugStackFrame) newStackFrames[newStackFrames.length - delta]).evaluateChange((XDebugStackFrame) fStackFrames[i]); - } - - delta ++; + if (fStepCount > fCurrentStepCount) { + XDebugResponse dr = ((XDebugTarget) getDebugTarget()).getStackFrames(); + XDebugStackFrame[] newStackFrames = _getStackFrames(dr); + + /*if (fStackFrames != null) { + if (newStackFrames.length >= fStackFrames.length) { + int delta = newStackFrames.length - fStackFrames.length + 1; + + for (int i = fStackFrames.length - 1; i >= 0; i--) { + if (fStackFrames[i].equals(newStackFrames[newStackFrames.length - delta])) { + int b = 2; b++; + //((XDebugStackFrame) newStackFrames[newStackFrames.length - delta]).evaluateChange((XDebugStackFrame) fStackFrames[i]); + } else if (fStackFrames[i].isSameStackFrame(newStackFrames[newStackFrames.length - delta])) { + int b = 2; b++; + //((XDebugStackFrame) newStackFrames[newStackFrames.length - delta]).evaluateChange((XDebugStackFrame) fStackFrames[i]); } - } else { + + delta ++; } + } else { + fStackFrames = newStackFrames; } + } else { + fStackFrames = newStackFrames; + }*/ - fCurrentStepCount++; + fCurrentStepCount++; - fStackFrames = newStackFrames; - } - return fStackFrames; - } else { - return new IStackFrame[0]; + fStackFrames = newStackFrames; } + + return fStackFrames; } + + private XDebugStackFrame[] _getStackFrames(XDebugResponse lastResponse) { + if (lastResponse.isError()) { + return new XDebugStackFrame[0]; + } + + Node response = lastResponse.getParentNode(); + NodeList frames = response.getChildNodes(); + XDebugStackFrame[] theFrames = new XDebugStackFrame[frames.getLength()]; + + for (int i = 0; i < frames.getLength(); i++) { + Node stackNode = frames.item(i); + String fileName=PHPDebugUtils.unescapeString(PHPDebugUtils.getAttributeValue(stackNode,"filename")); + String lineNo = PHPDebugUtils.getAttributeValue(stackNode,"lineno"); + + XDebugStackFrame frame = new XDebugStackFrame(this/*fThread*/, i, /*type*/PHPDebugUtils.getAttributeValue(stackNode,"type"), /*lineno*/Integer.parseInt(lineNo), /*where*/PHPDebugUtils.getAttributeValue(stackNode,"where"), fileName); + + frame.incrementStepCounter(); + + theFrames[i] = frame; + } + + return theFrames; + } + /* (non-Javadoc) * @see org.eclipse.debug.core.model.IThread#hasStackFrames() */ @@ -158,22 +187,22 @@ public class XDebugThread extends XDebugElement implements IThread, IDebugEventS * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended() */ public boolean isSuspended() { - return fTarget.isSuspended(); + return getDebugTarget().isSuspended(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#resume() */ public void resume() throws DebugException { - fBreakpoints=null; - fTarget.resume(); + fBreakpoints = null; + getDebugTarget().resume(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.ISuspendResume#suspend() */ public void suspend() throws DebugException { - fTarget.suspend(); + getDebugTarget().suspend(); } /* (non-Javadoc) @@ -212,24 +241,24 @@ public class XDebugThread extends XDebugElement implements IThread, IDebugEventS * @see org.eclipse.debug.core.model.IStep#stepInto() */ public void stepInto() throws DebugException { - fBreakpoints=null; - fTarget.step_into(); + fBreakpoints = null; + ((XDebugTarget) getDebugTarget()).step_into(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#stepOver() */ public void stepOver() throws DebugException { - fBreakpoints=null; - fTarget.step_over(); + fBreakpoints = null; + ((XDebugTarget) getDebugTarget()).step_over(); } /* (non-Javadoc) * @see org.eclipse.debug.core.model.IStep#stepReturn() */ public void stepReturn() throws DebugException { - fBreakpoints=null; - fTarget.step_out(); + fBreakpoints = null; + ((XDebugTarget) getDebugTarget()).step_out(); } /* (non-Javadoc) @@ -250,7 +279,7 @@ public class XDebugThread extends XDebugElement implements IThread, IDebugEventS * @see org.eclipse.debug.core.model.ITerminate#terminate() */ public void terminate() throws DebugException { - fTarget.getDebugConnection().stop(); + ((XDebugTarget) getDebugTarget()).getDebugConnection().stop(); fTerminated = true; } @@ -275,4 +304,24 @@ public class XDebugThread extends XDebugElement implements IThread, IDebugEventS public void removeEventListeners() { DebugPlugin.getDefault().removeDebugEventListener(this); } + + /** + * Fires a RESUME event for this element with + * the given detail. + * + * @param detail event detail code + */ + public void fireResumeEvent(int detail) { + fireEvent(new DebugEvent(this, DebugEvent.RESUME, detail)); + } + + /** + * Fires a SUSPEND event for this element with + * the given detail. + * + * @param detail event detail code + */ + public void fireSuspendEvent(int detail) { + fireEvent(new DebugEvent(this, DebugEvent.SUSPEND, detail)); + } } \ No newline at end of file