diff options
author | Gonzalo Paniagua Javier <gonzalo.mono@gmail.com> | 2004-09-05 23:42:12 +0400 |
---|---|---|
committer | Gonzalo Paniagua Javier <gonzalo.mono@gmail.com> | 2004-09-05 23:42:12 +0400 |
commit | c739fab91fadd24f469d2048368b797459676456 (patch) | |
tree | 377e2ae9bc983c5bfb2c619481025a75cd77ad1e | |
parent | e74c868b0080c99442dc2720f695ebbf96092b34 (diff) |
2004-09-05 Gonzalo Paniagua Javier <gonzalo@ximian.com>
* System.Web.Compilation/BaseCompiler.cs:
* System.Web.Compilation/CachingCompiler.cs:
* System.Web.Compilation/WebServiceCompiler.cs:
* System.Web.UI/SimpleWebHandlerParser.cs: correctly cache Type instead
of the assembly for ashx/asmx. Otherwise we need to open the file and
check for the class name in there. Thanks to Ben for pointing this out.
svn path=/branches/mono-1-0/mcs/; revision=33383
6 files changed, 59 insertions, 18 deletions
diff --git a/mcs/class/System.Web/System.Web.Compilation/BaseCompiler.cs b/mcs/class/System.Web/System.Web.Compilation/BaseCompiler.cs index c5f1c410923..07578009be5 100644 --- a/mcs/class/System.Web/System.Web.Compilation/BaseCompiler.cs +++ b/mcs/class/System.Web/System.Web.Compilation/BaseCompiler.cs @@ -284,7 +284,7 @@ namespace System.Web.Compilation public virtual Type GetCompiledType () { - Type type = CachingCompiler.GetTypeFromCache (parser.InputFile, parser.ClassName); + Type type = CachingCompiler.GetTypeFromCache (parser.InputFile); if (type != null) return type; diff --git a/mcs/class/System.Web/System.Web.Compilation/CachingCompiler.cs b/mcs/class/System.Web/System.Web.Compilation/CachingCompiler.cs index 0c14da135a5..0e6f7d12bbf 100644 --- a/mcs/class/System.Web/System.Web.Compilation/CachingCompiler.cs +++ b/mcs/class/System.Web/System.Web.Compilation/CachingCompiler.cs @@ -44,21 +44,20 @@ namespace System.Web.Compilation { static object compilationLock = new object (); const string cachePrefix = "@@Assembly"; + const string cacheTypePrefix = "@@@Type"; - public static Type GetTypeFromCache (string filename, string typename) + public static void InsertType (Type type, string filename) { - string key = CachingCompiler.cachePrefix + filename; - CompilerResults results = (CompilerResults) HttpRuntime.Cache [key]; - if (results == null) - return null; - - Assembly a = results.CompiledAssembly; - if (a == null) - return null; + string [] cacheKeys = new string [] { cachePrefix + filename }; + CacheDependency dep = new CacheDependency (null, cacheKeys); + HttpRuntime.Cache.Insert (cacheTypePrefix + filename, type, dep); + } - return a.GetType (typename, false); + public static Type GetTypeFromCache (string filename) + { + return (Type) HttpRuntime.Cache [cacheTypePrefix + filename]; } - + public static CompilerResults Compile (BaseCompiler compiler) { Cache cache = HttpRuntime.Cache; @@ -153,6 +152,26 @@ namespace System.Web.Compilation return results; } + + public static Type CompileAndGetType (string typename, string language, string key, + string file, ArrayList assemblies) + { + CompilerResults result = CachingCompiler.Compile (language, key, file, assemblies); + if (result.NativeCompilerReturnValue != 0) { + StreamReader reader = new StreamReader (file); + throw new CompilationException (file, result.Errors, reader.ReadToEnd ()); + } + + Assembly assembly = result.CompiledAssembly; + if (assembly == null) { + StreamReader reader = new StreamReader (file); + throw new CompilationException (file, result.Errors, reader.ReadToEnd ()); + } + + Type type = assembly.GetType (typename, true); + InsertType (type, file); + return type; + } } } diff --git a/mcs/class/System.Web/System.Web.Compilation/ChangeLog b/mcs/class/System.Web/System.Web.Compilation/ChangeLog index 8e4e6ea4029..5d1e428381b 100644 --- a/mcs/class/System.Web/System.Web.Compilation/ChangeLog +++ b/mcs/class/System.Web/System.Web.Compilation/ChangeLog @@ -1,3 +1,11 @@ +2004-09-05 Gonzalo Paniagua Javier <gonzalo@ximian.com> + + * BaseCompiler.cs: + * CachingCompiler.cs: + * WebServiceCompiler.cs: correctly cache Type instead of the assembly + for ashx/asmx. Otherwise we need to open the file and check for the + class name in there. Thanks to Ben for pointing this out. + 2004-09-01 Gonzalo Paniagua Javier <gonzalo@ximian.com> * CachingCompiler.cs: don't try to watch for changes in system diff --git a/mcs/class/System.Web/System.Web.Compilation/WebServiceCompiler.cs b/mcs/class/System.Web/System.Web.Compilation/WebServiceCompiler.cs index f6884bf428b..469bb0aba72 100644 --- a/mcs/class/System.Web/System.Web.Compilation/WebServiceCompiler.cs +++ b/mcs/class/System.Web/System.Web.Compilation/WebServiceCompiler.cs @@ -59,12 +59,15 @@ namespace System.Web.Compilation public override Type GetCompiledType () { - Type type = CachingCompiler.GetTypeFromCache (parser.PhysicalPath, parser.ClassName); + Type type = CachingCompiler.GetTypeFromCache (parser.PhysicalPath); if (type != null) return type; - if (parser.Program.Trim () == "") - return parser.GetTypeFromBin (parser.ClassName); + if (parser.Program.Trim () == "") { + type = parser.GetTypeFromBin (parser.PhysicalPath); + CachingCompiler.InsertType (type, parser.PhysicalPath); + return type; + } string lang = parser.Language; CompilationConfiguration config; @@ -106,7 +109,9 @@ namespace System.Web.Compilation "No assembly returned after compilation!?"); results.TempFiles.Delete (); - return results.CompiledAssembly.GetType (parser.ClassName, true); + type = results.CompiledAssembly.GetType (parser.ClassName, true); + CachingCompiler.InsertType (type, parser.PhysicalPath); + return type; } void CheckCompilerErrors (CompilerResults results) diff --git a/mcs/class/System.Web/System.Web.UI/ChangeLog b/mcs/class/System.Web/System.Web.UI/ChangeLog index 0ffb5a9a4fb..6337d82a2c2 100644 --- a/mcs/class/System.Web/System.Web.UI/ChangeLog +++ b/mcs/class/System.Web/System.Web.UI/ChangeLog @@ -1,5 +1,11 @@ 2004-09-05 Gonzalo Paniagua Javier <gonzalo@ximian.com> + * SimpleWebHandlerParser.cs: correctly cache Type instead of the + assembly for ashx/asmx. Otherwise we need to open the file and check + for the class name in there. Thanks to Ben for pointing this out. + +2004-09-05 Gonzalo Paniagua Javier <gonzalo@ximian.com> + * TemplateParser.cs: removed creation of StringWriter. It's not used. * Control.cs: don't create the EventHandlerList until requested. diff --git a/mcs/class/System.Web/System.Web.UI/SimpleWebHandlerParser.cs b/mcs/class/System.Web/System.Web.UI/SimpleWebHandlerParser.cs index 4c200a93568..d075d404a5c 100644 --- a/mcs/class/System.Web/System.Web.UI/SimpleWebHandlerParser.cs +++ b/mcs/class/System.Web/System.Web.UI/SimpleWebHandlerParser.cs @@ -64,6 +64,10 @@ namespace System.Web.UI protected SimpleWebHandlerParser (HttpContext context, string virtualPath, string physicalPath) { + cachedType = CachingCompiler.GetTypeFromCache (physicalPath); + if (cachedType != null) + return; // We don't need anything else. + this.context = context; this.vPath = virtualPath; this.physPath = physicalPath; @@ -104,8 +108,7 @@ namespace System.Web.UI ParseDirective (trimmed); directiveFound = true; if (gotDefault) { - cachedType = CachingCompiler.GetTypeFromCache (physPath, - className); + cachedType = CachingCompiler.GetTypeFromCache (physPath); if (cachedType != null) break; } |