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