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