001    package railo.transformer.bytecode.statement.tag;
002    
003    import org.objectweb.asm.Type;
004    import org.objectweb.asm.commons.GeneratorAdapter;
005    import org.objectweb.asm.commons.Method;
006    
007    import railo.transformer.bytecode.BytecodeContext;
008    import railo.transformer.bytecode.BytecodeException;
009    import railo.transformer.bytecode.Position;
010    import railo.transformer.bytecode.cast.CastBoolean;
011    import railo.transformer.bytecode.expression.ExprBoolean;
012    import railo.transformer.bytecode.expression.Expression;
013    import railo.transformer.bytecode.literal.LitBoolean;
014    import railo.transformer.bytecode.util.Types;
015    
016    public final class TagInclude extends TagBaseNoFinal {
017    
018            private final static Method DO_INCLUDE_RUN_ONCE = new Method(
019                            "doInclude",
020                            Type.VOID_TYPE,
021                            new Type[]{Types.STRING,Types.BOOLEAN_VALUE});
022            
023            public TagInclude(Position start,Position end) {
024                    super(start,end);
025            }
026    
027            /**
028             * @see railo.transformer.bytecode.statement.tag.TagBase#_writeOut(org.objectweb.asm.commons.GeneratorAdapter)
029             */
030            public void _writeOut(BytecodeContext bc) throws BytecodeException {
031                    GeneratorAdapter adapter = bc.getAdapter();
032                    adapter.loadArg(0);
033                    
034                    // template
035                    getAttribute("template").getValue().writeOut(bc, Expression.MODE_REF);
036                    
037                    // run Once
038                    Attribute attr = getAttribute("runonce");
039                    ExprBoolean expr = (attr==null)?
040                                    LitBoolean.FALSE:
041                                    CastBoolean.toExprBoolean(attr.getValue());
042                    expr.writeOut(bc, Expression.MODE_VALUE);
043                    
044                    adapter.invokeVirtual(Types.PAGE_CONTEXT,DO_INCLUDE_RUN_ONCE);
045            }
046    }