package railo.transformer.bytecode.statement.tag; import org.objectweb.asm.Type; import org.objectweb.asm.commons.GeneratorAdapter; import org.objectweb.asm.commons.Method; import railo.commons.lang.RandomUtil; import railo.runtime.tag.ThreadTag; import railo.transformer.bytecode.Body; import railo.transformer.bytecode.BodyBase; import railo.transformer.bytecode.BytecodeContext; import railo.transformer.bytecode.BytecodeException; import railo.transformer.bytecode.Page; import railo.transformer.bytecode.Position; import railo.transformer.bytecode.literal.LitString; import railo.transformer.bytecode.util.ASMUtil; import railo.transformer.bytecode.util.Types; public final class TagThread extends TagBaseNoFinal { public static final Type THREAD_TAG = Type.getType(ThreadTag.class); private static final Method REGISTER = new Method( "register",Types.VOID,new Type[]{Types.PAGE,Types.INT_VALUE}); public TagThread(Position start,Position end) { super(start,end); } /** * * @see railo.transformer.bytecode.statement.tag.TagBase#_writeOut(railo.transformer.bytecode.BytecodeContext) */ public void _writeOut(BytecodeContext bc) throws BytecodeException { String action=ASMUtil.getAttributeString(this, "action","run"); // no body if(!"run".equalsIgnoreCase(action)) { super._writeOut(bc); return; } /*if("run".equalsIgnoreCase(action) super.getBody()==null || super.getBody().getStatements()==null || super.getBody().getStatements().size()==0) { super._writeOut(bc); return; }*/ Attribute name = getAttribute("name"); if(name==null){ addAttribute(new Attribute(false, "name",LitString.toExprString("thread"+RandomUtil.createRandomStringLC(20)), "string")); } GeneratorAdapter adapter = bc.getAdapter(); Page page = ASMUtil.getAncestorPage(this); int index=page.addThread(this); super._writeOut(bc,false); adapter.loadLocal(bc.getCurrentTag()); adapter.loadThis(); adapter.push(index); adapter.invokeVirtual(THREAD_TAG, REGISTER); } /** * @see railo.transformer.bytecode.statement.tag.TagBase#getBody() */ public Body getBody() { return new BodyBase(); } public Body getRealBody() { return super.getBody(); } }