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.Application;
008    import railo.runtime.type.scope.Argument;
009    import railo.runtime.type.scope.CGI;
010    import railo.runtime.type.scope.Client;
011    import railo.runtime.type.scope.Cluster;
012    import railo.runtime.type.scope.Cookie;
013    import railo.runtime.type.scope.Form;
014    import railo.runtime.type.scope.Local;
015    import railo.runtime.type.scope.Request;
016    import railo.runtime.type.scope.Scope;
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]=                      Type.getType(Local.class);
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]=                 SCOPES[Scope.SCOPE_LOCAL]; 
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",                  Types.OBJECT,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_VAR_BIND=new Method("localScope",SCOPES[ScopeSupport.SCOPE_VAR],new Type[]{Types.BOOLEAN_VALUE});
066        
067        public final static Method METHOD_LOCAL_BIND=new Method("localGet",Types.OBJECT,new Type[]{Types.BOOLEAN_VALUE});
068        public final static Method METHOD_LOCAL_TOUCH=new Method("localTouch",                      Types.OBJECT,new Type[]{});
069        public final static Method METHOD_THIS_BIND=new Method("thisGet",Types.OBJECT,new Type[]{Types.BOOLEAN_VALUE});
070        public final static Method METHOD_THIS_TOUCH=new Method("thisTouch",                        Types.OBJECT,new Type[]{});
071            
072        
073        
074        public final static Type SCOPE_ARGUMENT=            Type.getType(Argument.class);
075        
076        
077        public static Type invokeScope(GeneratorAdapter adapter, int scope) {
078                    return invokeScope(adapter,TypeScope.METHODS[scope],Types.PAGE_CONTEXT);
079            }
080            
081            public static Type invokeScope(GeneratorAdapter adapter, Method m, Type type) {
082                    if(type==null) 
083                            type=Types.PAGE_CONTEXT;
084                            adapter.invokeVirtual(type,m);
085                            return m.getReturnType();
086            }
087        
088    }