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 }