Importing the XDebugProxy code in the HEAD. The repo was tagged with T_BEFORE_XDEBUGP...
[phpeclipse.git] / net.sourceforge.phpeclipse.xdebug.core / src / net / sourceforge / phpeclipse / xdebug / php / model / XDebugThread.java
index 4581ee5..366badf 100644 (file)
@@ -21,20 +21,16 @@ import org.eclipse.debug.core.model.IThread;
  * Window - Preferences - Java - Code Style - Code Templates
  */
 public class XDebugThread extends XDebugElement implements IThread, IDebugEventSetListener {
-       
-       /**
-        * Breakpoints this thread is suspended at or <code>null</code>
-        * if none.
-        */
-       
-       private IStackFrame[] fStackFrames=null;
+       private IStackFrame[]  fStackFrames;
        
        private IBreakpoint[] fBreakpoints;
        
-       /**
-        * Whether this thread is stepping
-        */
+       /* Whether this thread is stepping */
        private boolean fStepping = false;
+       private boolean fTerminated = false;
+       
+       private int fStepCount = 0;
+       private int fCurrentStepCount = 0;
        
        /**
         * Constructs a new thread for the given target
@@ -44,36 +40,66 @@ public class XDebugThread extends XDebugElement implements IThread, IDebugEventS
        public XDebugThread(XDebugTarget target) {
                super(target);
                DebugPlugin.getDefault().addDebugEventListener(this);
+               fStackFrames = null;
+       }
+       
+       public void incrementStepCounter() {
+               fStepCount++;
        }
        
-       /* (non-Javadoc)
-        * @see org.eclipse.debug.core.model.IThread#getStackFrames()
-        */
        public IStackFrame[] getStackFrames() throws DebugException {
-               if (isSuspended()) {
-                       if (fStackFrames==null)
-                       {
-//                             XDebugCorePlugin.log(IStatus.INFO,"vor getStackFrames");
-                               fStackFrames=((XDebugTarget) getDebugTarget()).getStackFrames();
-//                             XDebugCorePlugin.log(IStatus.INFO,"nach getStackFrames");
+               IStackFrame[] newStackFrames = null;
+               
+               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 ++;
+                                               }
+                                       } else {
+                                       }
+                               }
+
+                               fCurrentStepCount++;
+
+                               fStackFrames = newStackFrames;
                        }
                        return fStackFrames;
                } else {
                        return new IStackFrame[0];
                }
        }
+       
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IThread#hasStackFrames()
         */
        public boolean hasStackFrames() throws DebugException {
                return isSuspended();
        }
+       
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IThread#getPriority()
         */
        public int getPriority() throws DebugException {
                return 0;
        }
+       
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IThread#getTopStackFrame()
         */
@@ -82,17 +108,17 @@ public class XDebugThread extends XDebugElement implements IThread, IDebugEventS
                if (frames.length > 0) {
                        return frames[0];
                }
+               
                return null;
        }
+       
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IThread#getName()
         */
        public String getName() throws DebugException {
-//             if (fStackFrames!=null) 
-//                     return fStackFrames[0].getName();
-//             else 
-                       return "Thread[1]";
+               return "Thread[1]";
        }
+
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IThread#getBreakpoints()
         */
@@ -102,6 +128,7 @@ public class XDebugThread extends XDebugElement implements IThread, IDebugEventS
                }
                return fBreakpoints;
        }
+       
        /**
         * Sets the breakpoints this thread is suspended at, or <code>null</code>
         * if none.
@@ -112,109 +139,125 @@ public class XDebugThread extends XDebugElement implements IThread, IDebugEventS
        protected void setBreakpoints(IBreakpoint[] breakpoints) {
                fBreakpoints = breakpoints;
        }
+       
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ISuspendResume#canResume()
         */
        public boolean canResume() {
                return isSuspended();
        }
+       
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
         */
        public boolean canSuspend() {
-               return !isSuspended();
+               return !isTerminated() && !isSuspended();
        }
+       
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
         */
        public boolean isSuspended() {
-               return getDebugTarget().isSuspended();
+               return fTarget.isSuspended();
        }
+       
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ISuspendResume#resume()
         */
        public void resume() throws DebugException {
-               fStackFrames=null;
                fBreakpoints=null;
-               getDebugTarget().resume();
+               fTarget.resume();
        }
+       
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ISuspendResume#suspend()
         */
        public void suspend() throws DebugException {
-               getDebugTarget().suspend();
+               fTarget.suspend();
        }
+       
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IStep#canStepInto()
         */
        public boolean canStepInto() {
                return isSuspended();
        }
+       
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IStep#canStepOver()
         */
        public boolean canStepOver() {
                return isSuspended();
        }
+       
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IStep#canStepReturn()
         */
        public boolean canStepReturn() {
-               if (fStackFrames!=null)
-                       return (fStackFrames.length>1);
-               else
+               if (fStackFrames != null) {
+                       return (fStackFrames.length > 1);
+               } else {
                        return false;
+               }
        }
+
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IStep#isStepping()
         */
        public boolean isStepping() {
                return fStepping;
        }
+
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IStep#stepInto()
         */
        public void stepInto() throws DebugException {
-               fStackFrames=null;
                fBreakpoints=null;
-               ((XDebugTarget)getDebugTarget()).step_into();
+               fTarget.step_into();
        }
+
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IStep#stepOver()
         */
        public void stepOver() throws DebugException {
-               fStackFrames=null;
                fBreakpoints=null;
-               ((XDebugTarget)getDebugTarget()).step_over();
+               fTarget.step_over();
        }
+
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IStep#stepReturn()
         */
        public void stepReturn() throws DebugException {
-               fStackFrames=null;
                fBreakpoints=null;
-               ((XDebugTarget)getDebugTarget()).step_out();
-
+               fTarget.step_out();
        }
+
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
         */
        public boolean canTerminate() {
                return !isTerminated();
        }
+
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
         */
        public boolean isTerminated() {
-               return getDebugTarget().isTerminated();
+               return fTerminated;
        }
+
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ITerminate#terminate()
         */
        public void terminate() throws DebugException {
-               getDebugTarget().terminate();
+               fTarget.getDebugConnection().stop();
+               fTerminated = true;
        }
        
+       public void terminated() throws DebugException {
+               fTerminated = true;
+       }
+
        /**
         * Sets whether this thread is stepping
         * 
@@ -225,13 +268,11 @@ public class XDebugThread extends XDebugElement implements IThread, IDebugEventS
        }
 
        public void handleDebugEvents(DebugEvent[] events) {
-               DebugEvent de=events[0];
-               System.out.println(de.toString());
-               
+               DebugEvent de = events[0];
+               System.out.println(de.toString());      
        }
 
        public void removeEventListeners() {
                DebugPlugin.getDefault().removeDebugEventListener(this);
-               
        }
-}
+}
\ No newline at end of file