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