Merge pull request #1898 from alexanderkyte/debugger_variable_reflection
[mono.git] / mcs / class / corlib / System.Reflection.Emit / ConstructorOnTypeBuilderInst.cs
index 708a61c76833f3f04c15f3962a4edb4dad8abd59..149e5dbd6633d1a5d6940d761cfcc18be4a8e37f 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
+#if !FULL_AOT_RUNTIME
 using System;
 using System.Globalization;
 using System.Reflection;
+using System.Runtime.InteropServices;
 
 namespace System.Reflection.Emit
 {
        /*
         * This class represents a ctor of an instantiation of a generic type builder.
         */
+       [StructLayout (LayoutKind.Sequential)]
        internal class ConstructorOnTypeBuilderInst : ConstructorInfo
        {
                #region Keep in sync with object-internals.h
                MonoGenericClass instantiation;
-               ConstructorBuilder cb;
+               ConstructorInfo cb;
                #endregion
 
-               public ConstructorOnTypeBuilderInst (MonoGenericClass instantiation, ConstructorBuilder cb)
+               public ConstructorOnTypeBuilderInst (MonoGenericClass instantiation, ConstructorInfo cb)
                {
                        this.instantiation = instantiation;
                        this.cb = cb;
@@ -71,6 +74,12 @@ namespace System.Reflection.Emit
                        }
                }
 
+               public override Module Module {
+                       get {
+                               return cb.Module;
+                       }
+               }
+
                public override bool IsDefined (Type attributeType, bool inherit)
                {
                        return cb.IsDefined (attributeType, inherit);
@@ -97,28 +106,43 @@ namespace System.Reflection.Emit
 
                public override ParameterInfo[] GetParameters ()
                {
-                       if (!((ModuleBuilder)cb.Module).assemblyb.IsCompilerContext && !instantiation.generic_type.is_created)
+                       /*FIXME, maybe the right thing to do when the type is creates is to retrieve from the inflated type*/
+                       if (!instantiation.IsCreated)
                                throw new NotSupportedException ();
 
-                       ParameterInfo [] res = new ParameterInfo [cb.parameters.Length];
-                       for (int i = 0; i < cb.parameters.Length; i++) {
-                               Type type = instantiation.InflateType (cb.parameters [i]);
-                               res [i] = new ParameterInfo (cb.pinfo == null ? null : cb.pinfo [i], type, this, i + 1);
+                       return GetParametersInternal ();
+               }
+
+               internal override ParameterInfo[] GetParametersInternal ()
+               {
+                       ParameterInfo [] res;
+                       if (cb is ConstructorBuilder) {
+                               ConstructorBuilder cbuilder = (ConstructorBuilder)cb;
+                               res = new ParameterInfo [cbuilder.parameters.Length];
+                               for (int i = 0; i < cbuilder.parameters.Length; i++) {
+                                       Type type = instantiation.InflateType (cbuilder.parameters [i]);
+                                       res [i] = ParameterInfo.New (cbuilder.pinfo == null ? null : cbuilder.pinfo [i], type, this, i + 1);
+                               }
+                       } else {
+                               ParameterInfo[] parms = cb.GetParameters ();
+                               res = new ParameterInfo [parms.Length];
+                               for (int i = 0; i < parms.Length; i++) {
+                                       Type type = instantiation.InflateType (parms [i].ParameterType);
+                                       res [i] = ParameterInfo.New (parms [i], type, this, i + 1);
+                               }
                        }
                        return res;
                }
 
                public override int MetadataToken {
                        get {
-                               if (!((ModuleBuilder)cb.Module).assemblyb.IsCompilerContext)
-                                       return base.MetadataToken;
-                               return cb.MetadataToken;
+                               return base.MetadataToken;
                        }
                }
 
-               internal override int GetParameterCount ()
+               internal override int GetParametersCount ()
                {
-                       return cb.GetParameterCount ();
+                       return cb.GetParametersCount ();
                }
 
                public override Object Invoke (Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
@@ -180,3 +204,4 @@ namespace System.Reflection.Emit
        }
 }
 
+#endif