Fix null sessions in HttpContextWrapper.Session
[mono.git] / mcs / class / IKVM.Reflection / ConstructorInfo.cs
index 69e2b4df6fae1ec97abd24cd57ed8295d4a2b658..11d18a7a8433c4f6a31cfd6cd2807dde49bae23b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2009 Jeroen Frijters
+  Copyright (C) 2009-2012 Jeroen Frijters
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
 */
 using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 
 namespace IKVM.Reflection
 {
        public abstract class ConstructorInfo : MethodBase
        {
+               // prevent external subclasses
+               internal ConstructorInfo()
+               {
+               }
+
+               public sealed override string ToString()
+               {
+                       return GetMethodInfo().ToString();
+               }
+
                public static readonly string ConstructorName = ".ctor";
                public static readonly string TypeConstructorName = ".cctor";
 
@@ -38,16 +49,31 @@ namespace IKVM.Reflection
                        return new ConstructorInfoImpl((MethodInfo)GetMethodInfo().BindTypeParameters(type));
                }
 
+               public sealed override MethodBase __GetMethodOnTypeDefinition()
+               {
+                       return new ConstructorInfoImpl((MethodInfo)GetMethodInfo().__GetMethodOnTypeDefinition());
+               }
+
                public sealed override MemberTypes MemberType
                {
                        get { return MemberTypes.Constructor; }
                }
 
-               public override bool ContainsGenericParameters
+               public sealed override int __MethodRVA
+               {
+                       get { return GetMethodInfo().__MethodRVA; }
+               }
+
+               public sealed override bool ContainsGenericParameters
                {
                        get { return GetMethodInfo().ContainsGenericParameters; }
                }
 
+               public ParameterInfo __ReturnParameter
+               {
+                       get { return new ParameterInfoWrapper(this, GetMethodInfo().ReturnParameter); }
+               }
+
                public sealed override ParameterInfo[] GetParameters()
                {
                        ParameterInfo[] parameters = GetMethodInfo().GetParameters();
@@ -58,167 +84,156 @@ namespace IKVM.Reflection
                        return parameters;
                }
 
-               private sealed class ParameterInfoWrapper : ParameterInfo
+               public sealed override CallingConventions CallingConvention
                {
-                       private readonly ConstructorInfo ctor;
-                       private readonly ParameterInfo forward;
-
-                       internal ParameterInfoWrapper(ConstructorInfo ctor, ParameterInfo forward)
-                       {
-                               this.ctor = ctor;
-                               this.forward = forward;
-                       }
-
-                       public override string Name
-                       {
-                               get { return forward.Name; }
-                       }
-
-                       public override Type ParameterType
-                       {
-                               get { return forward.ParameterType; }
-                       }
-
-                       public override ParameterAttributes Attributes
-                       {
-                               get { return forward.Attributes; }
-                       }
-
-                       public override int Position
-                       {
-                               get { return forward.Position; }
-                       }
+                       get { return GetMethodInfo().CallingConvention; }
+               }
 
-                       public override object RawDefaultValue
-                       {
-                               get { return forward.RawDefaultValue; }
-                       }
+               public sealed override MethodAttributes Attributes
+               {
+                       get { return GetMethodInfo().Attributes; }
+               }
 
-                       public override Type[] GetOptionalCustomModifiers()
-                       {
-                               return forward.GetOptionalCustomModifiers();
-                       }
+               public sealed override MethodImplAttributes GetMethodImplementationFlags()
+               {
+                       return GetMethodInfo().GetMethodImplementationFlags();
+               }
 
-                       public override Type[] GetRequiredCustomModifiers()
-                       {
-                               return forward.GetRequiredCustomModifiers();
-                       }
+               public sealed override Type DeclaringType
+               {
+                       get { return GetMethodInfo().DeclaringType; }
+               }
 
-                       public override MemberInfo Member
-                       {
-                               get { return ctor; }
-                       }
+               public sealed override string Name
+               {
+                       get { return GetMethodInfo().Name; }
+               }
 
-                       public override int MetadataToken
-                       {
-                               get { return forward.MetadataToken; }
-                       }
+               public sealed override int MetadataToken
+               {
+                       get { return GetMethodInfo().MetadataToken; }
+               }
 
-                       internal override Module Module
-                       {
-                               get { return ctor.Module; }
-                       }
+               public sealed override Module Module
+               {
+                       get { return GetMethodInfo().Module; }
+               }
 
-                       internal override IList<CustomAttributeData> GetCustomAttributesData(Type attributeType)
-                       {
-                               return forward.GetCustomAttributesData(attributeType);
-                       }
+               public sealed override MethodBody GetMethodBody()
+               {
+                       return GetMethodInfo().GetMethodBody();
                }
-       }
 
-       sealed class ConstructorInfoImpl : ConstructorInfo
-       {
-               private readonly MethodInfo method;
+               public sealed override bool __IsMissing
+               {
+                       get { return GetMethodInfo().__IsMissing; }
+               }
 
-               internal ConstructorInfoImpl(MethodInfo method)
+               internal sealed override int ParameterCount
                {
-                       this.method = method;
+                       get { return GetMethodInfo().ParameterCount; }
                }
 
-               public override bool Equals(object obj)
+               internal sealed override MemberInfo SetReflectedType(Type type)
                {
-                       ConstructorInfoImpl other = obj as ConstructorInfoImpl;
-                       return other != null && other.method.Equals(method);
+                       return new ConstructorInfoWithReflectedType(type, this);
                }
 
-               public override int GetHashCode()
+               internal sealed override int GetCurrentToken()
                {
-                       return method.GetHashCode();
+                       return GetMethodInfo().GetCurrentToken();
                }
 
-               public override MethodBody GetMethodBody()
+               internal sealed override List<CustomAttributeData> GetPseudoCustomAttributes(Type attributeType)
                {
-                       return method.GetMethodBody();
+                       return GetMethodInfo().GetPseudoCustomAttributes(attributeType);
                }
 
-               public override CallingConventions CallingConvention
+               internal sealed override bool IsBaked
                {
-                       get { return method.CallingConvention; }
+                       get { return GetMethodInfo().IsBaked; }
                }
 
-               public override MethodAttributes Attributes
+               internal sealed override MethodSignature MethodSignature
                {
-                       get { return method.Attributes; }
+                       get { return GetMethodInfo().MethodSignature; }
                }
 
-               public override MethodImplAttributes GetMethodImplementationFlags()
+               internal sealed override int ImportTo(Emit.ModuleBuilder module)
                {
-                       return method.GetMethodImplementationFlags();
+                       return GetMethodInfo().ImportTo(module);
                }
+       }
 
-               internal override int ParameterCount
+       sealed class ConstructorInfoImpl : ConstructorInfo
+       {
+               private readonly MethodInfo method;
+
+               internal ConstructorInfoImpl(MethodInfo method)
                {
-                       get { return method.ParameterCount; }
+                       this.method = method;
                }
 
-               public override Type DeclaringType
+               public override bool Equals(object obj)
                {
-                       get { return method.DeclaringType; }
+                       ConstructorInfoImpl other = obj as ConstructorInfoImpl;
+                       return other != null && other.method.Equals(method);
                }
 
-               public override string Name
+               public override int GetHashCode()
                {
-                       get { return method.Name; }
+                       return method.GetHashCode();
                }
 
-               public override string ToString()
+               internal override MethodInfo GetMethodInfo()
                {
-                       return method.ToString();
+                       return method;
                }
 
-               public override Module Module
+               internal override MethodInfo GetMethodOnTypeDefinition()
                {
-                       get { return method.Module; }
+                       return method.GetMethodOnTypeDefinition();
                }
+       }
+
+       sealed class ConstructorInfoWithReflectedType : ConstructorInfo
+       {
+               private readonly Type reflectedType;
+               private readonly ConstructorInfo ctor;
 
-               public override int MetadataToken
+               internal ConstructorInfoWithReflectedType(Type reflectedType, ConstructorInfo ctor)
                {
-                       get { return method.MetadataToken; }
+                       Debug.Assert(reflectedType != ctor.DeclaringType);
+                       this.reflectedType = reflectedType;
+                       this.ctor = ctor;
                }
 
-               internal override MethodInfo GetMethodInfo()
+               public override bool Equals(object obj)
                {
-                       return method;
+                       ConstructorInfoWithReflectedType other = obj as ConstructorInfoWithReflectedType;
+                       return other != null
+                               && other.reflectedType == reflectedType
+                               && other.ctor == ctor;
                }
 
-               internal override IList<CustomAttributeData> GetCustomAttributesData(Type attributeType)
+               public override int GetHashCode()
                {
-                       return method.GetCustomAttributesData(attributeType);
+                       return reflectedType.GetHashCode() ^ ctor.GetHashCode();
                }
 
-               internal override MethodInfo GetMethodOnTypeDefinition()
+               public override Type ReflectedType
                {
-                       return method.GetMethodOnTypeDefinition();
+                       get { return reflectedType; }
                }
 
-               internal override MethodSignature MethodSignature
+               internal override MethodInfo GetMethodInfo()
                {
-                       get { return method.MethodSignature; }
+                       return ctor.GetMethodInfo();
                }
 
-               internal override int ImportTo(Emit.ModuleBuilder module)
+               internal override MethodInfo GetMethodOnTypeDefinition()
                {
-                       return method.ImportTo(module);
+                       return ctor.GetMethodOnTypeDefinition();
                }
        }
 }