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 }