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    }