Преглед изворни кода

fixed an stack overflow issue in only expanded mode

Kolja Strohm пре 6 година
родитељ
комит
576b8a2321

+ 15 - 6
src/processor/PseudoCodeProcessor.java

@@ -42,6 +42,7 @@ public class PseudoCodeProcessor extends Thread {
     private boolean renderImage = true;
     private JFrame view;
     private ProcessController controller;
+    private boolean insideNotSkipLoop = false; // needet to avoid stack overflow errors
     
     /**
      * creates a new {@link PseudoCodeProcessor}
@@ -77,8 +78,12 @@ public class PseudoCodeProcessor extends Thread {
             skip = false;
             return CodeStatus.UNFINISHED;
         case SKIP:
+            skip = true;
+            if( insideNotSkipLoop )
+                return CodeStatus.UNFINISHED;
             return forwardStepOverUntilNotSkip();
         case STOP:
+            skip = false;
             return CodeStatus.BREAKPOINT;
         default:
             break;
@@ -162,14 +167,14 @@ public class PseudoCodeProcessor extends Thread {
     }
     
     private CodeStatus forwardStepOverUntilNotSkip() {
-        skip = true;
         if( programPointer == null )
             return CodeStatus.FINISHED;
-        int stackSize = mem.getSize();
         CodeStatus status = CodeStatus.UNFINISHED;
         do {
+            insideNotSkipLoop = true;
             status = forwardStep();
-        } while( mem.getSize() > stackSize && status == CodeStatus.UNFINISHED && skip );
+            insideNotSkipLoop = false;
+        } while( status == CodeStatus.UNFINISHED && skip );
         return status;
     }
     
@@ -207,8 +212,12 @@ public class PseudoCodeProcessor extends Thread {
             skip = false;
             return CodeStatus.UNFINISHED;
         case SKIP:
+            skip = true;
+            if( insideNotSkipLoop )
+                return CodeStatus.UNFINISHED;
             return backwardStepOverUntilNotSkip();
         case STOP:
+            skip = false;
             return CodeStatus.BREAKPOINT;
         default:
             break;
@@ -236,14 +245,14 @@ public class PseudoCodeProcessor extends Thread {
     
     private CodeStatus backwardStepOverUntilNotSkip()
     {
-        skip = true;
         if( programPointer == null )
             return CodeStatus.FINISHED;
-        int stackSize = mem.getSize();
         CodeStatus status = CodeStatus.UNFINISHED;
         do {
+            insideNotSkipLoop = true;
             status = backwardStep();
-        } while( mem.getSize() > stackSize && status == CodeStatus.UNFINISHED && skip );
+            insideNotSkipLoop = false;
+        } while( status == CodeStatus.UNFINISHED && skip );
         return status;
     }
     

+ 1 - 0
src/test/RandomProcessor.java

@@ -50,6 +50,7 @@ class RandomProcessor extends PseudoCodeProcessor {
                 if( !controlStack.isEmpty() )
                     throw new IllegalStateException( "There are too manny Objects in the control Stack." );
                 System.out.println( "Random Iteration " + i + " finished successfully." );
+                getController().setStepOption( Math.abs( getController().getStepOption() - 1 ) );
             }
         } catch (Exception e) {
             e.printStackTrace();

+ 20 - 1
src/test/TestProcessor.java

@@ -2,6 +2,7 @@ package test;
 
 import javax.swing.JFrame;
 import javax.swing.JTree;
+import javax.swing.tree.DefaultTreeModel;
 
 import bk.BKNodePlacement;
 import graph.LayeredGraphNode;
@@ -17,7 +18,7 @@ class TestProcessor {
     
     public static void main(String[] args) throws InterruptedException {
     	
-    	RandomGraphGenerator r = new RandomGraphGenerator( 0.2, 0.8, 3, 15, 2, 15, 3 );
+    	RandomGraphGenerator r = new RandomGraphGenerator( 0.2, 0.8, 3, 5, 2, 5, 3 );
         LayeredGraphNode graph = r.createRandomNode( null, 0, true );
         SweepCrossingMinimizer cminzer = new SweepCrossingMinimizer();
         for( int i = 0; i < 10; i++ )
@@ -31,14 +32,32 @@ class TestProcessor {
         BKNodePlacement algorithm = new BKNodePlacement();
         JTree pseudoTree = new JTree();
         PseudoCodeNode tree = algorithm.createPseudocodeTree( pseudoTree );
+        pseudoTree.setModel( new DefaultTreeModel( tree ) );
         JFrame frame = new JFrame( "NodeShuffler" );
         PseudoCodeProcessor processor = new StepInProcessor( tree, graph, frame );
+        tree.setController( processor.getController() );
+        processor.start();
+        processor.join();
+        processor = new StepInProcessor( tree, graph, frame );
+        tree.setController( processor.getController() );
+        for( int i = pseudoTree.getRowCount() - 1; i > 0; i-- )
+            pseudoTree.collapseRow( i );
+        processor.getController().setStepOption( 1 );
+        processor.start();
+        processor.join();
+        processor = new StepOverProcessor( tree, graph, frame );
+        tree.setController( processor.getController() );
         processor.start();
         processor.join();
         processor = new StepOverProcessor( tree, graph, frame );
+        tree.setController( processor.getController() );
+        for( int i = pseudoTree.getRowCount() - 1; i > 0; i-- )
+            pseudoTree.collapseRow( i );
+        processor.getController().setStepOption( 1 );
         processor.start();
         processor.join();
         processor = new RandomProcessor( tree, graph, frame );
+        tree.setController( processor.getController() );
         processor.start();
         processor.join();
         System.out.println( "Tests Finished." );

+ 7 - 0
src/view/LegendView.java

@@ -38,6 +38,13 @@ public class LegendView extends JPanel {
 		g.setColor( Color.BLACK );
 		g.drawString( "block root", x, fm.getMaxAscent() + PADDING );
 		x += fm.stringWidth( "block root" ) + PADDING * 4;
+        
+        g.setColor( Color.LIGHT_GRAY );
+        g.fillOval( x, PADDING, height / 3, height - PADDING*2 );
+        x += height / 3 + PADDING;
+        g.setColor( Color.BLACK );
+        g.drawString( "dummy node", x, fm.getMaxAscent() + PADDING );
+        x += fm.stringWidth( "dummy node" ) + PADDING * 4;
 		
 		g.setColor( Color.LIGHT_GRAY );
         ((Graphics2D)g).setStroke(new BasicStroke(2));