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 }