001 package railo.transformer.bytecode.visitor; 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.BytecodeContext; 008 009 // TODO testen wurde noch nicht getestet 010 011 public final class DoWhileVisitor implements LoopVisitor{ 012 013 private Label begin; 014 private Label end; 015 private Label beforeEnd; 016 017 public void visitBeginBody(GeneratorAdapter mv) { 018 end = new Label(); 019 beforeEnd = new Label(); 020 021 begin=new Label(); 022 mv.visitLabel(begin); 023 } 024 025 026 public void visitEndBodyBeginExpr(GeneratorAdapter mv) { 027 mv.visitLabel(beforeEnd); 028 } 029 030 public void visitEndExpr(GeneratorAdapter mv) { 031 mv.ifZCmp(Opcodes.IFNE, begin); 032 mv.visitLabel(end); 033 } 034 035 /** 036 * @see railo.transformer.bytecode.visitor.LoopVisitor#getBreakLabel() 037 */ 038 public Label getBreakLabel() { 039 return end; 040 } 041 042 /** 043 * @see railo.transformer.bytecode.visitor.LoopVisitor#getContinueLabel() 044 */ 045 public Label getContinueLabel() { 046 return beforeEnd; 047 } 048 049 050 /** 051 * 052 * @see railo.transformer.bytecode.visitor.LoopVisitor#visitContinue(org.objectweb.asm.commons.GeneratorAdapter) 053 */ 054 public void visitContinue(BytecodeContext bc) { 055 bc.getAdapter().visitJumpInsn(Opcodes.GOTO, getContinueLabel()); 056 } 057 058 /** 059 * 060 * @see railo.transformer.bytecode.visitor.LoopVisitor#visitBreak(org.objectweb.asm.commons.GeneratorAdapter) 061 */ 062 public void visitBreak(BytecodeContext bc) { 063 bc.getAdapter().visitJumpInsn(Opcodes.GOTO, getBreakLabel()); 064 } 065 066 }