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    }