001 package railo.transformer.bytecode.statement.tag; 002 003 import org.objectweb.asm.Opcodes; 004 005 import railo.transformer.bytecode.BytecodeContext; 006 import railo.transformer.bytecode.BytecodeException; 007 import railo.transformer.bytecode.Statement; 008 import railo.transformer.bytecode.statement.FlowControl; 009 import railo.transformer.bytecode.util.ASMUtil; 010 011 public final class TagBreak extends TagBase { 012 013 /** 014 * Constructor of the class 015 * @param tag 016 */ 017 public TagBreak(int line) { 018 super(line); 019 setHasFlowController(true); 020 } 021 022 public TagBreak(int sl,int el) { 023 super(sl,el); 024 setHasFlowController(true); 025 } 026 027 /** 028 * @see railo.transformer.bytecode.statement.StatementBase#_writeOut(org.objectweb.asm.commons.GeneratorAdapter) 029 */ 030 public void _writeOut(BytecodeContext bc) throws BytecodeException { 031 032 FlowControl fc = ASMUtil.getAncestorFlowControlStatement(this); 033 034 if(fc!=null) 035 bc.getAdapter().visitJumpInsn(Opcodes.GOTO, fc.getBreakLabel()); 036 else throw new BytecodeException("break must be inside a loop (for,while,do-while,<cfloop>,<cfwhile> ...)",getLine()); 037 } 038 039 /** 040 * 041 * @see railo.transformer.bytecode.statement.StatementBase#setParent(railo.transformer.bytecode.Statement) 042 */ 043 public void setParent(Statement parent) { 044 super.setParent(parent); 045 parent.setHasFlowController(true); 046 } 047 048 }