001    package railo.transformer.bytecode.visitor;
002    
003    import org.objectweb.asm.Label;
004    import org.objectweb.asm.Opcodes;
005    import org.objectweb.asm.commons.GeneratorAdapter;
006    
007    import railo.transformer.bytecode.BytecodeContext;
008    
009    // TODO testen wurde noch nicht getestet
010    
011    public final class DoWhileVisitor implements LoopVisitor{
012    
013            private Label begin;
014            private Label end;
015            private Label beforeEnd;
016    
017            public void visitBeginBody(GeneratorAdapter mv) {
018                    end = new Label();
019                    beforeEnd = new Label();
020                    
021                    begin=new Label();
022                    mv.visitLabel(begin);
023            }
024            
025    
026            public void visitEndBodyBeginExpr(GeneratorAdapter mv) {
027                    mv.visitLabel(beforeEnd);
028            }
029    
030            public void visitEndExpr(GeneratorAdapter mv) {
031                    mv.ifZCmp(Opcodes.IFNE, begin);
032                    mv.visitLabel(end);
033            }
034    
035            /**
036             * @see railo.transformer.bytecode.visitor.LoopVisitor#getBreakLabel()
037             */
038            public Label getBreakLabel() {
039                    return end;
040            }
041    
042            /**
043             * @see railo.transformer.bytecode.visitor.LoopVisitor#getContinueLabel()
044             */
045            public Label getContinueLabel() {
046                    return beforeEnd;
047            }
048    
049    
050            /**
051             *
052             * @see railo.transformer.bytecode.visitor.LoopVisitor#visitContinue(org.objectweb.asm.commons.GeneratorAdapter)
053             */
054            public void visitContinue(BytecodeContext bc) {
055                    bc.getAdapter().visitJumpInsn(Opcodes.GOTO, getContinueLabel());
056            }
057            
058            /**
059             *
060             * @see railo.transformer.bytecode.visitor.LoopVisitor#visitBreak(org.objectweb.asm.commons.GeneratorAdapter)
061             */
062            public void visitBreak(BytecodeContext bc) {
063                    bc.getAdapter().visitJumpInsn(Opcodes.GOTO, getBreakLabel());
064            }
065    
066    }