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 }