001    package railo.transformer.bytecode.statement.tag;
002    
003    import org.objectweb.asm.Label;
004    
005    import railo.transformer.bytecode.BytecodeContext;
006    import railo.transformer.bytecode.BytecodeException;
007    import railo.transformer.bytecode.Position;
008    import railo.transformer.bytecode.expression.Expression;
009    import railo.transformer.bytecode.statement.FlowControlBreak;
010    import railo.transformer.bytecode.statement.FlowControlContinue;
011    import railo.transformer.bytecode.visitor.WhileVisitor;
012    
013    public final class TagWhile extends TagBaseNoFinal implements FlowControlBreak,FlowControlContinue {
014    
015            private WhileVisitor wv;
016            private String label;
017    
018            public TagWhile(Position start,Position end) {
019                    super(start,end);
020            }
021    
022    
023            /**
024             * @see railo.transformer.bytecode.statement.StatementBase#_writeOut(org.objectweb.asm.commons.GeneratorAdapter)
025             */
026            public void _writeOut(BytecodeContext bc) throws BytecodeException {
027                    wv = new WhileVisitor();
028                    wv.visitBeforeExpression(bc);
029                            getAttribute("condition").getValue().writeOut(bc, Expression.MODE_VALUE);
030                    wv.visitAfterExpressionBeforeBody(bc);
031                            getBody().writeOut(bc);
032                    wv.visitAfterBody(bc,getEnd());
033            }
034    
035    
036            /**
037             * @see railo.transformer.bytecode.statement.FlowControl#getBreakLabel()
038             */
039            public Label getBreakLabel() {
040                    return wv.getBreakLabel();
041            }
042    
043    
044            /**
045             * @see railo.transformer.bytecode.statement.FlowControl#getContinueLabel()
046             */
047            public Label getContinueLabel() {
048                    return wv.getContinueLabel();
049            }
050    
051    
052            @Override
053            public String getLabel() {
054                    return label;
055            }
056    
057            public void setLabel(String label) {
058                    this.label=label;
059            }
060    
061    }