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.runtime.tag.ThreadTag; 008 import railo.transformer.bytecode.Body; 009 import railo.transformer.bytecode.BodyBase; 010 import railo.transformer.bytecode.BytecodeContext; 011 import railo.transformer.bytecode.BytecodeException; 012 import railo.transformer.bytecode.Page; 013 import railo.transformer.bytecode.util.ASMUtil; 014 import railo.transformer.bytecode.util.Types; 015 016 public final class TagThread extends TagBase { 017 018 019 020 public static final Type THREAD_TAG = Type.getType(ThreadTag.class); 021 022 023 private static final Method REGISTER = new Method( 024 "register",Types.VOID,new Type[]{Types.PAGE,Types.INT_VALUE}); 025 026 /** 027 * Constructor of the class 028 * @param line 029 */ 030 public TagThread(int line) { 031 super(line); 032 } 033 public TagThread(int sl,int el) { 034 super(sl,el); 035 } 036 037 038 039 040 041 /** 042 * 043 * @see railo.transformer.bytecode.statement.tag.TagBase#_writeOut(railo.transformer.bytecode.BytecodeContext) 044 */ 045 public void _writeOut(BytecodeContext bc) throws BytecodeException { 046 String action=ASMUtil.getAttributeString(this, "action","run"); 047 // no body 048 if(!"run".equalsIgnoreCase(action)) { 049 super._writeOut(bc); 050 return; 051 } 052 /*if("run".equalsIgnoreCase(action) 053 super.getBody()==null || 054 super.getBody().getStatements()==null || 055 super.getBody().getStatements().size()==0) { 056 super._writeOut(bc); 057 return; 058 }*/ 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 }