123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- package codelines;
- import animation.CodeLine;
- import animation.ControlFlow;
- import animation.Memory;
- import animation.StackFrame;
- import animation.Memory.MemoryType;
- import animation.StackFrame.FrameType;
- /**
- * Yey, IF is a LOOP.
- * @author kolja
- *
- */
- public abstract class IfLoop extends CodeLine {
- @Override
- public ControlFlow runForward(Memory m) {
- if( m.isDefined( "line_" + lineId + "_inside", MemoryType.LOCAL ) )
- {
- StackFrame old = m.removeFrame();
- actions.push( (Memory mem) -> {
- mem.addFrame( old );
- return new ControlFlow( ControlFlow.STEP_INTO );
- } );
- return new ControlFlow( ControlFlow.STEP_OVER );
- }
- else
- {
- if( condition( m ) ) {
- m.addFrame( new StackFrame( FrameType.LOOP ) );
- m.declare( "line_" + lineId + "_inside", true, MemoryType.LOCAL );
- actions.push( (Memory mem) -> {
- mem.removeFrame();
- return new ControlFlow( ControlFlow.STEP_OVER );
- } );
- return new ControlFlow( ControlFlow.STEP_INTO );
- } else {
- actions.push( (Memory mem) -> {
- return new ControlFlow( ControlFlow.STEP_OVER );
- } );
- return new ControlFlow( ControlFlow.STEP_OVER );
- }
- }
- }
- abstract protected boolean condition( Memory m );
- }
|