001    package railo.transformer.bytecode.statement;
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.Body;
008    import railo.transformer.bytecode.BytecodeContext;
009    import railo.transformer.bytecode.BytecodeException;
010    import railo.transformer.bytecode.cast.CastBoolean;
011    import railo.transformer.bytecode.expression.ExprBoolean;
012    import railo.transformer.bytecode.expression.Expression;
013    import railo.transformer.bytecode.literal.LitBoolean;
014    
015    public final class While extends StatementBase implements FlowControl,HasBody {
016            
017            private ExprBoolean expr;
018            private Body body;
019            
020    
021            private Label begin = new Label();
022            private Label end = new Label();
023    
024    
025    
026            /**
027             * Constructor of the class
028             * @param expr
029             * @param body
030             * @param line
031             */
032            public While(Expression expr,Body body,int startline,int endline) {
033                    super(startline,endline);
034                    this.expr=CastBoolean.toExprBoolean(expr);
035                    this.body=body;
036                    body.setParent(this);
037            }
038            
039            
040            /**
041             * Constructor of the class
042             * @param b
043             * @param body
044             * @param line
045             */
046            public While(boolean b, Body body,int startline,int endline) {
047                    this(LitBoolean.toExprBoolean(b, -1),body,startline, endline);
048            }
049    
050    
051            /**
052             *
053             * @see railo.transformer.bytecode.statement.StatementBase#_writeOut(org.objectweb.asm.commons.GeneratorAdapter)
054             */
055            public void _writeOut(BytecodeContext bc) throws BytecodeException {
056                    GeneratorAdapter adapter = bc.getAdapter();
057                    adapter.visitLabel(begin);
058                    
059                    expr.writeOut(bc, Expression.MODE_VALUE);
060                    adapter.ifZCmp(Opcodes.IFEQ, end);
061                    
062                    body.writeOut(bc);
063                    adapter.visitJumpInsn(Opcodes.GOTO, begin);
064                    
065                    adapter.visitLabel(end);
066            }
067    
068    
069            /**
070             *
071             * @see railo.transformer.bytecode.statement.FlowControl#getBreakLabel()
072             */
073            public Label getBreakLabel() {
074                    return end;
075            }
076    
077    
078            /**
079             *
080             * @see railo.transformer.bytecode.statement.FlowControl#getContinueLabel()
081             */
082            public Label getContinueLabel() {
083                    return begin;
084            }
085    
086            /**
087             * @see railo.transformer.bytecode.statement.HasBody#getBody()
088             */
089            public Body getBody() {
090                    return body;
091            }
092    }