Merge pull request #1323 from StephenMcConnel/bug-23591
[mono.git] / mcs / class / corlib / System.Reflection / MethodBase.cs
index cc669ab983a5b6733833a237b028a08b00c7d36e..d0fa181629f502c5856f656002068953fcc066e0 100644 (file)
@@ -6,6 +6,7 @@
 //
 // (C) 2001 Ximian, Inc.  http://www.ximian.com
 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
+// Copyright 2011 Xamarin Inc (http://www.xamarin.com).
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -29,7 +30,9 @@
 
 using System.Diagnostics;
 using System.Globalization;
+#if !FULL_AOT_RUNTIME
 using System.Reflection.Emit;
+#endif
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 
@@ -39,8 +42,11 @@ namespace System.Reflection {
        [ComDefaultInterfaceAttribute (typeof (_MethodBase))]
        [Serializable]
        [ClassInterface(ClassInterfaceType.None)]
+#if MOBILE
+       public abstract class MethodBase: MemberInfo {
+#else
        public abstract class MethodBase: MemberInfo, _MethodBase {
-
+#endif
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                public extern static MethodBase GetCurrentMethod ();
 
@@ -84,22 +90,23 @@ namespace System.Reflection {
                //
                // This is a quick version for our own use. We should override
                // it where possible so that it does not allocate an array.
+               // They cannot be abstract otherwise we break public contract
                //
-               internal virtual int GetParameterCount ()
+               internal virtual ParameterInfo[] GetParametersInternal ()
                {
-                       ParameterInfo [] pi = GetParameters ();
-                       if (pi == null)
-                               return 0;
-                       
-                       return pi.Length;
+                       // Override me
+                       return GetParameters ();
                }
 
-#if ONLY_1_1
-               public new Type GetType ()
+               internal virtual int GetParametersCount ()
                {
-                       return base.GetType ();
+                       // Override me
+                       return GetParametersInternal ().Length;
+               }
+
+               internal virtual Type GetParameterType (int pos) {
+                       throw new NotImplementedException ();
                }
-#endif
 
                [DebuggerHidden]
                [DebuggerStepThrough]           
@@ -187,6 +194,7 @@ namespace System.Reflection {
                }
 
                internal virtual int get_next_table_index (object obj, int table, bool inc) {
+#if !FULL_AOT_RUNTIME
                        if (this is MethodBuilder) {
                                MethodBuilder mb = (MethodBuilder)this;
                                return mb.get_next_table_index (obj, table, inc);
@@ -195,6 +203,7 @@ namespace System.Reflection {
                                ConstructorBuilder mb = (ConstructorBuilder)this;
                                return mb.get_next_table_index (obj, table, inc);
                        }
+#endif
                        throw new Exception ("Method is not a builder method");
                }
 
@@ -233,11 +242,10 @@ namespace System.Reflection {
                        throw new NotSupportedException ();
                }
 
-
 #if NET_4_0
                public override bool Equals (object obj)
                {
-                       return obj == this;
+                       return obj == (object) this;
                }
 
                public override int GetHashCode ()
@@ -262,13 +270,44 @@ namespace System.Reflection {
                                return true;
                        return !left.Equals (right);
                }
+               
+               public virtual bool IsSecurityCritical {
+                       get {
+                               throw new NotImplementedException ();
+                       }
+               }
+               
+               public virtual bool IsSecuritySafeCritical {
+                       get {
+                               throw new NotImplementedException ();
+                       }
+               }
+
+               public virtual bool IsSecurityTransparent {
+                       get {
+                               throw new NotImplementedException ();
+                       }
+               }
 #endif
 
+#if NET_4_5
+               public virtual MethodImplAttributes MethodImplementationFlags {
+                       get { return GetMethodImplementationFlags (); }
+               }
+#endif
+
+#if !MOBILE
                void _MethodBase.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
                {
                        throw new NotImplementedException ();
                }
 
+               Type _MethodBase.GetType ()
+               {
+                       // Required or object::GetType becomes virtual final
+                       return base.GetType ();
+               }               
+
                void _MethodBase.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
                {
                        throw new NotImplementedException ();
@@ -283,5 +322,6 @@ namespace System.Reflection {
                {
                        throw new NotImplementedException ();
                }
+#endif
        }
 }