2003-10-13 Martin Baulig <martin@ximian.com>
authorMartin Baulig <martin@novell.com>
Mon, 13 Oct 2003 20:06:52 +0000 (20:06 -0000)
committerMartin Baulig <martin@novell.com>
Mon, 13 Oct 2003 20:06:52 +0000 (20:06 -0000)
* MethodBuilder.cs (MethodBuilder): Added
`TypeBuilder.MonoGenericParam[] generic_params' field.
(DefineGenericParameter, SetGenericMethodSignature): New public methods.

* TypeBuilder.cs (DefineGenericMethod): New public method.

svn path=/trunk/mcs/; revision=18983

mcs/class/corlib/System.Reflection.Emit/ChangeLog
mcs/class/corlib/System.Reflection.Emit/MethodBuilder.cs
mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs

index 746c9407c576d2e899f7d6d986a664f9065940e3..6529725d8c36254f8a1735108a3ee5474732594a 100644 (file)
@@ -1,12 +1,14 @@
-2003-10-13  Zoltan Varga  <vargaz@freemail.hu>
+2003-10-13  Martin Baulig  <martin@ximian.com>
 
-       * OpCode.cs: Fix Value property. Fixes #49328.
+       * MethodBuilder.cs (MethodBuilder): Added
+       `TypeBuilder.MonoGenericParam[] generic_params' field.
+       (DefineGenericParameter, SetGenericMethodSignature): New public methods.
 
-2003-10-10  Martin Baulig  <martin@ximian.com>
+       * TypeBuilder.cs (DefineGenericMethod): New public method.
 
-       * TypeBuilder.cs (TypeBuilder.MonoGenericParam): Added `index' field.
-       (TypeBuilder.DefineGenericParameter): Added overloaded version
-       taking an `int index' argument for generic methods.
+2003-10-13  Zoltan Varga  <vargaz@freemail.hu>
+
+       * OpCode.cs: Fix Value property. Fixes #49328.
 
 2003-10-03  Zoltan Varga  <vargaz@freemail.hu>
 
index 6f52da88dde329f0692df7a7d26f927c6bf10600..7e0a72f57f6da70bd4ae4d05a05a7ce02e9d1b8b 100755 (executable)
@@ -37,6 +37,7 @@ namespace System.Reflection.Emit {
                private CallingConvention native_cc;
                private CallingConventions call_conv;
                private bool init_locals = true;
+               private TypeBuilder.MonoGenericParam[] generic_params;
 
                internal MethodBuilder (TypeBuilder tb, string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) {
                        this.name = name;
@@ -233,6 +234,37 @@ namespace System.Reflection.Emit {
                private Exception NotSupported () {
                        return new NotSupportedException ("The invoked member is not supported in a dynamic module.");
                }
+
+#if GENERICS
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               private extern static Type define_generic_parameter (MethodBuilder tb, TypeBuilder.MonoGenericParam param);
+               
+               public Type DefineGenericParameter (string name, Type[] constraints)
+               {
+                       TypeBuilder.MonoGenericParam gparam = new TypeBuilder.MonoGenericParam (name, constraints);
+
+                       if (generic_params != null) {
+                               TypeBuilder.MonoGenericParam[] new_generic_params = new TypeBuilder.MonoGenericParam [generic_params.Length+1];
+                               System.Array.Copy (generic_params, new_generic_params, generic_params.Length);
+                               new_generic_params [generic_params.Length] = gparam;
+                               generic_params = new_generic_params;
+                       } else {
+                               generic_params = new TypeBuilder.MonoGenericParam [1];
+                               generic_params [0] = gparam;
+                       }
+
+                       return define_generic_parameter (this, gparam);
+               }
+
+               public void SetGenericMethodSignature (Type return_type, Type[] parameter_types)
+               {
+                       RejectIfCreated ();
+
+                       this.rtype = return_type;
+                       this.parameters = new Type [parameter_types.Length];
+                       System.Array.Copy (parameter_types, this.parameters, parameter_types.Length);
+               }
+#endif
        }
 }
 
index bc32db0852bb45fac9fcdf9b1603858c02df5cec..af881523054ece08e1b23b5a0daa79f80fc39a5a 100644 (file)
@@ -1049,16 +1049,9 @@ namespace System.Reflection.Emit {
                        return define_generic_parameter (this, gparam);
                }
 
-               /*
-                * This is used for generic methods; since TypeBuilder.DefineMethod() takes the parameter
-                * types as arguments, we need to create the type parameters before getting the
-                * MehtodBuilder.
-                */
-               public Type DefineGenericParameter (string name, int index, Type[] constraints)
+               public MethodBuilder DefineGenericMethod (string name, MethodAttributes attributes)
                {
-                       MonoGenericParam gparam = new MonoGenericParam (name, index, constraints);
-
-                       return define_generic_parameter (this, gparam);
+                       return DefineMethod (name, attributes, CallingConventions.Standard, null, null);
                }
 #endif
 
@@ -1066,7 +1059,6 @@ namespace System.Reflection.Emit {
                        private readonly uint Handle;
 
                        public readonly Type Type;
-                       public readonly int Index;
                        public readonly string Name;
                        public readonly int Flags;
                        public readonly Type[] Constraints;
@@ -1075,14 +1067,6 @@ namespace System.Reflection.Emit {
                        {
                                this.Name = name;
                                this.Constraints = constraints;
-                               this.Index = 0;
-                       }
-
-                       public MonoGenericParam (string name, int index, Type[] constraints)
-                       {
-                               this.Name = name;
-                               this.Constraints = constraints;
-                               this.Index = index + 1;
                        }
                }
        }