001    package railo.transformer.bytecode.util;
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.type.Scope;
008    import railo.runtime.type.scope.Application;
009    import railo.runtime.type.scope.ArgumentImpl;
010    import railo.runtime.type.scope.ArgumentPro;
011    import railo.runtime.type.scope.CGI;
012    import railo.runtime.type.scope.Client;
013    import railo.runtime.type.scope.Cluster;
014    import railo.runtime.type.scope.Cookie;
015    import railo.runtime.type.scope.Form;
016    import railo.runtime.type.scope.Request;
017    import railo.runtime.type.scope.ScopeSupport;
018    import railo.runtime.type.scope.Server;
019    import railo.runtime.type.scope.Session;
020    import railo.runtime.type.scope.URL;
021    import railo.runtime.type.scope.Undefined;
022    
023    public final class TypeScope {
024            
025            public final static Type SCOPE = Type.getType(Scope.class);
026            public final static Type[] SCOPES = new Type[ScopeSupport.SCOPE_COUNT];
027        static {
028            SCOPES[Scope.SCOPE_APPLICATION]=        Type.getType(Application.class);
029            SCOPES[Scope.SCOPE_ARGUMENTS]=          Type.getType(railo.runtime.type.scope.Argument.class);
030            SCOPES[Scope.SCOPE_CGI]=                        Type.getType(CGI.class);
031            SCOPES[Scope.SCOPE_CLIENT]=                     Type.getType(Client.class);
032            SCOPES[Scope.SCOPE_COOKIE]=                     Type.getType(Cookie.class);
033            SCOPES[Scope.SCOPE_FORM]=                       Type.getType(Form.class);
034            SCOPES[Scope.SCOPE_LOCAL]=                      Types.OBJECT;
035            SCOPES[Scope.SCOPE_REQUEST]=            Type.getType(Request.class);
036            SCOPES[Scope.SCOPE_SERVER]=                     Type.getType(Server.class);
037            SCOPES[Scope.SCOPE_SESSION]=            Type.getType(Session.class);
038            SCOPES[Scope.SCOPE_UNDEFINED]=          Type.getType(Undefined.class);
039            SCOPES[Scope.SCOPE_URL]=                        Type.getType(URL.class);
040            SCOPES[Scope.SCOPE_VARIABLES]=          Types.VARIABLES;
041            SCOPES[Scope.SCOPE_CLUSTER]=            Type.getType(Cluster.class); 
042            SCOPES[ScopeSupport.SCOPE_VAR]=                 SCOPE; 
043        }
044        
045            public final static Method[] METHODS = new Method[ScopeSupport.SCOPE_COUNT];
046        static {
047            METHODS[Scope.SCOPE_APPLICATION]=       new Method("applicationScope",  SCOPES[Scope.SCOPE_APPLICATION],new Type[]{});
048            METHODS[Scope.SCOPE_ARGUMENTS]=         new Method("argumentsScope",    SCOPES[Scope.SCOPE_ARGUMENTS],new Type[]{});
049            METHODS[Scope.SCOPE_CGI]=                       new Method("cgiScope",                  SCOPES[Scope.SCOPE_CGI],new Type[]{});
050            METHODS[Scope.SCOPE_CLIENT]=            new Method("clientScope",               SCOPES[Scope.SCOPE_CLIENT],new Type[]{});
051            METHODS[Scope.SCOPE_COOKIE]=            new Method("cookieScope",               SCOPES[Scope.SCOPE_COOKIE],new Type[]{});
052            METHODS[Scope.SCOPE_FORM]=                      new Method("formScope",                 SCOPES[Scope.SCOPE_FORM],new Type[]{});
053            METHODS[Scope.SCOPE_LOCAL]=                     new Method("localGet",                  SCOPES[Scope.SCOPE_LOCAL],new Type[]{});
054            METHODS[Scope.SCOPE_REQUEST]=           new Method("requestScope",              SCOPES[Scope.SCOPE_REQUEST],new Type[]{});
055            METHODS[Scope.SCOPE_SERVER]=            new Method("serverScope",               SCOPES[Scope.SCOPE_SERVER],new Type[]{});
056            METHODS[Scope.SCOPE_SESSION]=           new Method("sessionScope",              SCOPES[Scope.SCOPE_SESSION],new Type[]{});
057            METHODS[Scope.SCOPE_UNDEFINED]=         new Method("us",                                SCOPES[Scope.SCOPE_UNDEFINED],new Type[]{});
058            METHODS[Scope.SCOPE_URL]=                       new Method("urlScope",                  SCOPES[Scope.SCOPE_URL],new Type[]{});
059            METHODS[Scope.SCOPE_VARIABLES]=         new Method("variablesScope",    SCOPES[Scope.SCOPE_VARIABLES],new Type[]{});
060            METHODS[Scope.SCOPE_CLUSTER]=           new Method("clusterScope",              SCOPES[Scope.SCOPE_CLUSTER],new Type[]{}); 
061            METHODS[ScopeSupport.SCOPE_VAR]=        new Method("localScope",                SCOPES[ScopeSupport.SCOPE_VAR],new Type[]{}); 
062            }
063        // Argument argumentsScope (boolean)
064        public final static Method METHOD_ARGUMENT_BIND=new Method("argumentsScope",SCOPES[Scope.SCOPE_ARGUMENTS],new Type[]{Types.BOOLEAN_VALUE});
065        public final static Method METHOD_LOCAL_BIND=new Method("localGet",SCOPES[Scope.SCOPE_LOCAL],new Type[]{Types.BOOLEAN_VALUE});
066        public final static Method METHOD_VAR_BIND=new Method("localScope",SCOPES[ScopeSupport.SCOPE_VAR],new Type[]{Types.BOOLEAN_VALUE});
067        public final static Method METHOD_LOCAL_TOUCH=new Method("localTouch",                      SCOPES[Scope.SCOPE_LOCAL],new Type[]{});
068            
069        
070        
071        public final static Type SCOPE_ARGUMENT=            Type.getType(ArgumentPro.class);
072        public final static Type SCOPE_ARGUMENT_IMPL=               Type.getType(ArgumentImpl.class);
073        
074        
075        public static Type invokeScope(GeneratorAdapter adapter, int scope) {
076                    boolean isLocal=scope==Scope.SCOPE_LOCAL;
077            if(isLocal){
078                    adapter.checkCast(Types.PAGE_CONTEXT_IMPL);
079            }
080            return invokeScope(adapter,TypeScope.METHODS[scope],isLocal?Types.PAGE_CONTEXT_IMPL:Types.PAGE_CONTEXT);
081            }
082            
083            public static Type invokeScope(GeneratorAdapter adapter, Method m, Type type) {
084                    if(type==null) 
085                            type=Types.PAGE_CONTEXT;
086                    
087                    //if(m==METHOD_VAR_BIND || m==METHOD_LOCAL_BIND || METHODS[Scope.SCOPE_LOCAL]==m) // FUTURE add this methods to interface and remove this
088                    //else 
089                            adapter.invokeVirtual(type,m);
090                            return m.getReturnType();
091            }
092        
093    }