001    package railo.transformer.bytecode.statement;
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.util.ASMUtil;
009    
010    public final class Break extends StatementBase {
011    
012            public Break(int line) {
013                    super(line);
014                    setHasFlowController(true);
015            }
016    
017            /**
018             *
019             * @see railo.transformer.bytecode.statement.StatementBase#_writeOut(railo.transformer.bytecode.BytecodeContext)
020             */
021            public void _writeOut(BytecodeContext bc) throws BytecodeException {
022                    FlowControl fc = ASMUtil.getAncestorFlowControlStatement(this);
023                    if(fc!=null)
024                            bc.getAdapter().visitJumpInsn(Opcodes.GOTO, fc.getBreakLabel());
025                    else throw new BytecodeException("break must be inside a loop (for,while,do-while,<cfloop>,<cfwhile> ...)",getLine());
026            }
027            
028            /**
029             *
030             * @see railo.transformer.bytecode.statement.StatementBase#setParent(railo.transformer.bytecode.Statement)
031             */
032            public void setParent(Statement parent) {
033                    super.setParent(parent);
034                    parent.setHasFlowController(true);
035            }
036    }