|
@@ -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 );
|
|
|
}
|