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.commons.lang.RandomUtil; 008 import railo.runtime.tag.ThreadTag; 009 import railo.transformer.bytecode.Body; 010 import railo.transformer.bytecode.BodyBase; 011 import railo.transformer.bytecode.BytecodeContext; 012 import railo.transformer.bytecode.BytecodeException; 013 import railo.transformer.bytecode.Page; 014 import railo.transformer.bytecode.Position; 015 import railo.transformer.bytecode.literal.LitString; 016 import railo.transformer.bytecode.util.ASMUtil; 017 import railo.transformer.bytecode.util.Types; 018 019 public final class TagThread extends TagBaseNoFinal { 020 021 022 023 public static final Type THREAD_TAG = Type.getType(ThreadTag.class); 024 025 026 private static final Method REGISTER = new Method( 027 "register",Types.VOID,new Type[]{Types.PAGE,Types.INT_VALUE}); 028 029 030 public TagThread(Position start,Position end) { 031 super(start,end); 032 } 033 034 035 036 037 038 /** 039 * 040 * @see railo.transformer.bytecode.statement.tag.TagBase#_writeOut(railo.transformer.bytecode.BytecodeContext) 041 */ 042 public void _writeOut(BytecodeContext bc) throws BytecodeException { 043 String action=ASMUtil.getAttributeString(this, "action","run"); 044 // no body 045 if(!"run".equalsIgnoreCase(action)) { 046 super._writeOut(bc); 047 return; 048 } 049 /*if("run".equalsIgnoreCase(action) 050 super.getBody()==null || 051 super.getBody().getStatements()==null || 052 super.getBody().getStatements().size()==0) { 053 super._writeOut(bc); 054 return; 055 }*/ 056 Attribute name = getAttribute("name"); 057 if(name==null){ 058 addAttribute(new Attribute(false, "name",LitString.toExprString("thread"+RandomUtil.createRandomStringLC(20)), "string")); 059 } 060 061 GeneratorAdapter adapter = bc.getAdapter(); 062 Page page = ASMUtil.getAncestorPage(this); 063 064 int index=page.addThread(this); 065 super._writeOut(bc,false); 066 067 adapter.loadLocal(bc.getCurrentTag()); 068 adapter.loadThis(); 069 adapter.push(index); 070 adapter.invokeVirtual(THREAD_TAG, REGISTER); 071 072 } 073 074 075 076 077 078 /** 079 * @see railo.transformer.bytecode.statement.tag.TagBase#getBody() 080 */ 081 public Body getBody() { 082 return new BodyBase(); 083 } 084 085 public Body getRealBody() { 086 return super.getBody(); 087 } 088 089 }