Merge pull request #2781 from alexanderkyte/inflated_method_header_leak
[mono.git] / mcs / class / System.Web / System.Web.Compilation / AppCodeCompiler.cs
index 57422ead522e6a76bb907386a53d6852bd507b47..fef206848afe71ca028e375aeb3b6932decaa4de 100644 (file)
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-#if NET_2_0
+
 using System;
 using System.CodeDom;
 using System.CodeDom.Compiler;
 using System.Configuration;
 using System.Collections;
 using System.Collections.Generic;
+using System.Collections.Specialized;
 using System.Globalization;
 using System.IO;
 using System.Reflection;
@@ -80,21 +81,22 @@ namespace System.Web.Compilation
                                if (asm == null)
                                        throw new HttpException (String.Format ("Unable to find assembly {0}", assemblyName), error);
 
-                               assemblyCache.Add (assemblyName, asm.Location);
-                               return asm.Location;
+                               string path = new Uri (asm.CodeBase).LocalPath;
+                               assemblyCache.Add (assemblyName, path);
+                               return path;
                        }
                }
        }
        
        internal class AppCodeAssembly
        {
-               private List<string> files;
-               private List<CodeCompileUnit> units;
+               List<string> files;
+               List<CodeCompileUnit> units;
                
-               private string name;
-               private string path;
-               private bool validAssembly;
-               private string outputAssemblyName;
+               string name;
+               string path;
+               bool validAssembly;
+               string outputAssemblyName;
 
                public string OutputAssemblyName
                {
@@ -198,7 +200,7 @@ namespace System.Web.Compilation
                        }
 
                        CodeDomProvider provider = null;
-                       CompilationSection compilationSection = WebConfigurationManager.GetSection ("system.web/compilation") as CompilationSection;
+                       CompilationSection compilationSection = WebConfigurationManager.GetWebApplicationSection ("system.web/compilation") as CompilationSection;
                        if (compilerInfo == null) {
                                if (!CodeDomProvider.IsDefinedLanguage (compilationSection.DefaultLanguage))
                                        throw new HttpException ("Failed to retrieve default source language");
@@ -221,8 +223,15 @@ namespace System.Web.Compilation
                        CompilerParameters parameters = compilerInfo.CreateDefaultCompilerParameters ();
                        parameters.IncludeDebugInformation = compilationSection.Debug;
                        
-                       if (binAssemblies != null && binAssemblies.Length > 0)
-                               parameters.ReferencedAssemblies.AddRange (binAssemblies);
+                       if (binAssemblies != null && binAssemblies.Length > 0) {
+                               StringCollection parmRefAsm = parameters.ReferencedAssemblies;
+                               foreach (string binAsm in binAssemblies) {
+                                       if (parmRefAsm.Contains (binAsm))
+                                               continue;
+                                       
+                                       parmRefAsm.Add (binAsm);
+                               }
+                       }
                        
                        if (compilationSection != null) {
                                foreach (AssemblyInfo ai in compilationSection.Assemblies)
@@ -271,17 +280,17 @@ namespace System.Web.Compilation
                        }
                }
                
-               private string PhysicalToVirtual (string file)
+               VirtualPath PhysicalToVirtual (string file)
                {
-                       return file.Replace (HttpRuntime.AppDomainAppPath, "/").Replace (Path.DirectorySeparatorChar, '/');
+                       return new VirtualPath (file.Replace (HttpRuntime.AppDomainAppPath, "~/").Replace (Path.DirectorySeparatorChar, '/'));
                }
                
-               private BuildProvider GetBuildProviderFor (string file, BuildProviderCollection buildProviders)
+               BuildProvider GetBuildProviderFor (string file, BuildProviderCollection buildProviders)
                {
                        if (file == null || file.Length == 0 || buildProviders == null || buildProviders.Count == 0)
                                return null;
 
-                       BuildProvider ret = buildProviders.GetProviderForExtension (Path.GetExtension (file));
+                       BuildProvider ret = buildProviders.GetProviderInstanceForExtension (Path.GetExtension (file));
                        if (ret != null && IsCorrectBuilderType (ret)) {
                                ret.SetVirtualPath (PhysicalToVirtual (file));
                                return ret;
@@ -290,7 +299,7 @@ namespace System.Web.Compilation
                        return null;
                }
 
-               private bool IsCorrectBuilderType (BuildProvider bp)
+               bool IsCorrectBuilderType (BuildProvider bp)
                {
                        if (bp == null)
                                return false;
@@ -323,7 +332,7 @@ namespace System.Web.Compilation
        
        internal class AppCodeCompiler
        {
-               static private bool _alreadyCompiled;
+               static bool _alreadyCompiled;
                internal static string DefaultAppCodeAssemblyName;
                
                // A dictionary that contains an entry per an assembly that will
@@ -348,7 +357,7 @@ namespace System.Web.Compilation
                // Files for which exist BuildProviders but which have no
                // unambiguous language assigned to them (e.g. .wsdl files), are
                // built using the default website compiler.
-               private List<AppCodeAssembly> assemblies;
+               List<AppCodeAssembly> assemblies;
                string providerTypeName = null;
                
                public AppCodeCompiler ()
@@ -359,7 +368,7 @@ namespace System.Web.Compilation
                bool ProcessAppCodeDir (string appCode, AppCodeAssembly defasm)
                {
                        // First process the codeSubDirectories
-                       CompilationSection cs = (CompilationSection) WebConfigurationManager.GetSection ("system.web/compilation");
+                       CompilationSection cs = (CompilationSection) WebConfigurationManager.GetWebApplicationSection ("system.web/compilation");
                        
                        if (cs != null) {
                                string aname;
@@ -583,12 +592,20 @@ namespace System.Web.Compilation
                        }
                        
                        string baseType = ps.Inherits;
-                       bool baseIsGlobal = false;
-                       if (String.IsNullOrEmpty (baseType)) {
+                       if (String.IsNullOrEmpty (baseType))
                                baseType = "System.Web.Profile.ProfileBase";
-                               baseIsGlobal = true;
+                       else {
+                               string[] parts = baseType.Split (new char[] {','});
+                               if (parts.Length > 1)
+                                       baseType = parts [0].Trim ();
                        }
                        
+                       bool baseIsGlobal;
+                       if (baseType.IndexOf ('.') != -1)
+                               baseIsGlobal = true;
+                       else
+                               baseIsGlobal = false;
+                       
                        BuildProfileClass (ps, "ProfileCommon", props, ns, baseType, baseIsGlobal, groupProperties);
                        return true;
                }
@@ -606,7 +623,11 @@ namespace System.Web.Compilation
                {
                        if (ps == null || !ps.Enabled)
                                return false;
-                       if (!String.IsNullOrEmpty (ps.Inherits) || (ps.PropertySettings != null && ps.PropertySettings.Count > 0))
+
+                       RootProfilePropertySettingsCollection props = ps.PropertySettings;
+                       ProfileGroupSettingsCollection groups = props != null ? props.GroupSettings : null;
+                       
+                       if (!String.IsNullOrEmpty (ps.Inherits) || (props != null && props.Count > 0) || (groups != null && groups.Count > 0))
                                return true;
 
                        return false;
@@ -618,7 +639,7 @@ namespace System.Web.Compilation
                                return;
                        
                        string appCode = Path.Combine (HttpRuntime.AppDomainAppPath, "App_Code");
-                       ProfileSection ps = WebConfigurationManager.GetSection ("system.web/profile") as ProfileSection;
+                       ProfileSection ps = WebConfigurationManager.GetWebApplicationSection ("system.web/profile") as ProfileSection;
                        bool haveAppCodeDir = Directory.Exists (appCode);
                        bool haveCustomProfile = HaveCustomProfile (ps);
                        
@@ -660,9 +681,17 @@ namespace System.Web.Compilation
                                } else
                                        return;
 
-                               if (HttpApplication.LoadTypeFromBin (providerTypeName) == null)
-                                       throw new HttpException (String.Format ("Profile provider type not found: {0}",
-                                                                               providerTypeName));
+                               Exception noTypeException = null;
+                               Type ptype = null;
+                               
+                               try {
+                                       ptype = HttpApplication.LoadTypeFromBin (providerTypeName);
+                               } catch (Exception ex) {
+                                       noTypeException = ex;
+                               }
+
+                               if (ptype == null)
+                                       throw new HttpException (String.Format ("Profile provider type not found: {0}", providerTypeName), noTypeException);
                        }
                }
 
@@ -684,7 +713,7 @@ namespace System.Web.Compilation
                                        tmi = type.GetMethod ("AppInitialize",
                                                              BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase,
                                                              null,
-                                                             new Type[0],
+                                                             Type.EmptyTypes,
                                                              null);
                                        if (tmi == null)
                                                continue;
@@ -702,7 +731,7 @@ namespace System.Web.Compilation
                        mi.Invoke (null, null);
                }
                
-               private bool CollectFiles (string dir, AppCodeAssembly aca)
+               bool CollectFiles (string dir, AppCodeAssembly aca)
                {
                        bool haveFiles = false;
                        
@@ -726,4 +755,4 @@ namespace System.Web.Compilation
                }
        }
 }
-#endif
+