001 package railo.transformer.bytecode.visitor; 002 003 import org.objectweb.asm.Label; 004 import org.objectweb.asm.Opcodes; 005 006 import railo.transformer.bytecode.BytecodeContext; 007 import railo.transformer.bytecode.util.ExpressionUtil; 008 009 public final class WhileVisitor implements LoopVisitor { 010 011 private Label begin; 012 private Label end; 013 014 public void visitBeforeExpression(BytecodeContext bc) { 015 begin = new Label(); 016 end = new Label(); 017 bc.getAdapter().visitLabel(begin); 018 } 019 020 public void visitAfterExpressionBeforeBody(BytecodeContext bc) { 021 bc.getAdapter().ifZCmp(Opcodes.IFEQ, end); 022 } 023 024 public void visitAfterBody(BytecodeContext bc,int endline) { 025 bc.getAdapter().visitJumpInsn(Opcodes.GOTO, begin); 026 bc.getAdapter().visitLabel(end); 027 ExpressionUtil.visitLine(bc, endline); 028 } 029 030 /** 031 * 032 * @see railo.transformer.bytecode.visitor.LoopVisitor#visitContinue(org.objectweb.asm.commons.GeneratorAdapter) 033 */ 034 public void visitContinue(BytecodeContext bc) { 035 bc.getAdapter().visitJumpInsn(Opcodes.GOTO, begin); 036 } 037 038 /** 039 * 040 * @see railo.transformer.bytecode.visitor.LoopVisitor#visitBreak(org.objectweb.asm.commons.GeneratorAdapter) 041 */ 042 public void visitBreak(BytecodeContext bc) { 043 bc.getAdapter().visitJumpInsn(Opcodes.GOTO, end); 044 } 045 046 /** 047 * 048 * @see railo.transformer.bytecode.visitor.LoopVisitor#getContinueLabel() 049 */ 050 public Label getContinueLabel() { 051 return begin; 052 } 053 054 /** 055 * 056 * @see railo.transformer.bytecode.visitor.LoopVisitor#getBreakLabel() 057 */ 058 public Label getBreakLabel() { 059 return end; 060 } 061 062 }