浏览代码

Bugs in forwars step over and forward step out behoben

Kolja Strohm 6 年之前
父节点
当前提交
1b4e27e0b4
共有 3 个文件被更改,包括 97 次插入53 次删除
  1. 14 0
      src/animation/AnimatedAlgorithm.java
  2. 82 52
      src/animation/PseudoCodeNode.java
  3. 1 1
      src/main/Main.java

+ 14 - 0
src/animation/AnimatedAlgorithm.java

@@ -45,6 +45,20 @@ public abstract class AnimatedAlgorithm extends Thread implements AlgorithmStage
     		activeFunction.peek().writeToStack( mem );
     	activeFunction.push( n );
     }
+    
+    public PseudoCodeNode getActiveFunction()
+    {
+    	if( activeFunction.empty() )
+    		return null;
+    	return activeFunction.peek();
+    }
+    
+    public boolean isActiveFunction( PseudoCodeNode n )
+    {
+    	if( activeFunction.empty() )
+    		return false;
+    	return activeFunction.peek() == n;
+    }
 
     private void update()
     {

+ 82 - 52
src/animation/PseudoCodeNode.java

@@ -356,45 +356,8 @@ public class PseudoCodeNode extends DefaultMutableTreeNode {
                 hiddenActionWithoutSideEffects( m );
                 return CodeStatus.BREAKPOINT;
             case FINISHED:
-                ( (PseudoCodeNode)children.get( currentCodeLine ) ).setSelected( false );
-                currentCodeLine++;
-                if( children.size() <= currentCodeLine )
-                {
-                    currentCodeLine = -1;
-                    switch( setSelected( true ) )
-                    {
-					case SKIP:
-                        hiddenActionWithoutSideEffects( m );
-						return forwardStepOverIntern( m );
-					case STOP:
-                        hiddenActionWithoutSideEffects( m );
-						return CodeStatus.BREAKPOINT;
-					default:
-						break;
-                    }
-                }
-                else
-                {
-                    CodeStatus status = selectChild( currentCodeLine, m );
-                    if( status == CodeStatus.FINISHED )
-                    {
-                        currentCodeLine = -1;
-                        status = CodeStatus.UNFINISHED;
-                        switch( setSelected( true ) )
-                        {
-    					case SKIP:
-                            hiddenActionWithoutSideEffects( m );
-    						return forwardStepOverIntern( m );
-    					case STOP:
-                            hiddenActionWithoutSideEffects( m );
-    						return CodeStatus.BREAKPOINT;
-    					default:
-    						break;
-                        }
-                    }
-                    hiddenActionWithoutSideEffects( m );
-                    return status;
-                }
+                hiddenActionWithoutSideEffects( m );
+                return childNodeFinished( m );
             case UNFINISHED:
                 hiddenActionWithoutSideEffects( m );
                 return CodeStatus.UNFINISHED;
@@ -404,6 +367,45 @@ public class PseudoCodeNode extends DefaultMutableTreeNode {
         return CodeStatus.UNFINISHED;
     }
     
+    private CodeStatus childNodeFinished( Memory m )
+    {
+        ( (PseudoCodeNode)children.get( currentCodeLine ) ).setSelected( false );
+    	currentCodeLine++;
+        if( children.size() <= currentCodeLine )
+        {
+            currentCodeLine = -1;
+            switch( setSelected( true ) )
+            {
+			case SKIP:
+				return forwardStepOverIntern( m );
+			case STOP:
+				return CodeStatus.BREAKPOINT;
+			default:
+				break;
+            }
+        }
+        else
+        {
+            CodeStatus status = selectChild( currentCodeLine, m );
+            if( status == CodeStatus.FINISHED )
+            {
+                currentCodeLine = -1;
+                status = CodeStatus.UNFINISHED;
+                switch( setSelected( true ) )
+                {
+				case SKIP:
+					return forwardStepOverIntern( m );
+				case STOP:
+					return CodeStatus.BREAKPOINT;
+				default:
+					break;
+                }
+            }
+            return status;
+        }
+        return CodeStatus.UNFINISHED;
+    }
+    
     private CodeStatus selectChild( int index, Memory m  )
     {
         switch( ( (PseudoCodeNode)children.get( index ) ).setSelected( true ) )
@@ -416,16 +418,7 @@ public class PseudoCodeNode extends DefaultMutableTreeNode {
             case BREAKPOINT:
                 return CodeStatus.BREAKPOINT;
             case FINISHED:
-                ( (PseudoCodeNode)children.get( index ) ).setSelected( false );
-                currentCodeLine++;
-                if( children == null || currentCodeLine >= children.size() )
-                {
-                    return CodeStatus.FINISHED;
-                }
-                else
-                {
-                    return selectChild( currentCodeLine, m );
-                }
+                return childNodeFinished( m );
             case UNFINISHED:
             	throw new IllegalStateException( "Skipping a node returned UNFINISHED" );
             }
@@ -443,14 +436,39 @@ public class PseudoCodeNode extends DefaultMutableTreeNode {
      */
     public CodeStatus forwardStepOver( Memory m )
     {
-        return getForwardNode().forwardStepOverIntern( m );
+        switch( getForwardNode().forwardStepOverIntern( m ) )
+        {
+		case BREAKPOINT:
+			return CodeStatus.BREAKPOINT;
+		case FINISHED:
+			if( getForwardNode() == this )
+				return CodeStatus.FINISHED;
+			else
+				return childNodeFinished( m );
+		case UNFINISHED:
+			return CodeStatus.UNFINISHED;
+        }
+		return CodeStatus.UNFINISHED;
     }
     
     private CodeStatus forwardStepOverIntern( Memory m )
     {
         CodeStatus status = null;
         do {
+        	PseudoCodeNode af = alg.getActiveFunction();
             status = forwardStep( m );
+            if( status == CodeStatus.UNFINISHED && af != alg.getActiveFunction() )
+            {
+            	switch( alg.getActiveFunction().forwardStepOverIntern( m ) )
+            	{
+				case BREAKPOINT:
+					return CodeStatus.BREAKPOINT;
+				case FINISHED:
+					break;
+				case UNFINISHED:
+					throw new IllegalStateException( "StepOver did not return finished" );
+            	}
+            }
         } while( status == CodeStatus.UNFINISHED );
         return status;
     }
@@ -463,12 +481,24 @@ public class PseudoCodeNode extends DefaultMutableTreeNode {
      */
     public CodeStatus forwardStepOut( Memory m )
     {
-        return getForwardNode().forwardStepOutIntern( m );
+        switch( getForwardNode().forwardStepOutIntern( m ) )
+        {
+		case BREAKPOINT:
+			return CodeStatus.BREAKPOINT;
+		case FINISHED:
+			if( getForwardNode() == this )
+				return CodeStatus.FINISHED;
+			else
+				return childNodeFinished( m );
+		case UNFINISHED:
+	        return CodeStatus.UNFINISHED;
+        }
+        return CodeStatus.UNFINISHED;
     }
     
     private CodeStatus forwardStepOutIntern( Memory m )
     {
-        if( parent != null )
+        if( parent != null && !alg.isActiveFunction( this ) )
             return ((PseudoCodeNode)parent).forwardStepOverIntern( m );
         return forwardStepOverIntern( m );
     }

+ 1 - 1
src/main/Main.java

@@ -17,7 +17,7 @@ public class Main {
      * @param args the command line arguments, currently not in use
      */
     public static void main(String[] args) {
-        Reader r = new Reader( "logo.json" );
+        Reader r = new Reader( "papergraph.json" );
         LayeredGraphNode graph = r.readInputGraph();
         InitializeNodePositions.placeNodes( graph );
         new MainView( graph );