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