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 }