Fri Jul 12 11:34:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
[mono.git] / mcs / class / corlib / System.Reflection.Emit / MethodBuilder.cs
index 2325f0a8133527406c623edcc1848a1761be429b..e00a3b99ba0b40e59b71713138d67a3385fa663b 100755 (executable)
@@ -28,12 +28,14 @@ namespace System.Reflection.Emit {
                private ILGenerator ilgen;
                private TypeBuilder type;
                private ParameterBuilder[] pinfo;
+               private CustomAttributeBuilder[] cattrs;
                private MethodInfo override_method;
                private string pi_dll;
                private string pi_entry;
                private CharSet ncharset;
                private CallingConvention native_cc;
                private CallingConventions call_conv;
+               private bool init_locals = true;
 
                internal MethodBuilder (TypeBuilder tb, string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes) {
                        this.name = name;
@@ -45,7 +47,7 @@ namespace System.Reflection.Emit {
                                System.Array.Copy (parameterTypes, this.parameters, parameterTypes.Length);
                        }
                        type = tb;
-                       table_idx = get_next_table_index (0x06, true);
+                       table_idx = get_next_table_index (this, 0x06, true);
                        //Console.WriteLine ("index for "+name+" set to "+table_idx.ToString());
                }
 
@@ -59,6 +61,11 @@ namespace System.Reflection.Emit {
                        ncharset = nativeCharset;
                }
 
+               public bool InitLocals {
+                       get {return init_locals;}
+                       set {init_locals = value;}
+               }
+
                internal TypeBuilder TypeBuilder {
                        get {return type;}
                }
@@ -83,7 +90,18 @@ namespace System.Reflection.Emit {
                        return iattrs;
                }
                public override ParameterInfo[] GetParameters() {
-                       return null;
+                       if ((parameters == null) || (pinfo == null))
+                               return null;
+
+                       ParameterInfo[] retval = new ParameterInfo [parameters.Length];
+                       for (int i = 1; i < parameters.Length + 1; i++) {
+                               if (pinfo [i] == null)
+                                       return null;
+
+                               retval [i - 1] = new ParameterInfo (pinfo [i], parameters [i - 1], this);
+                       }
+
+                       return retval;
                }
                
                public void CreateMethodBody( byte[] il, int count) {
@@ -114,7 +132,10 @@ namespace System.Reflection.Emit {
                public ParameterBuilder DefineParameter (int position, ParameterAttributes attributes, string strParamName)
                {
                        ParameterBuilder pb = new ParameterBuilder (this, position, attributes, strParamName);
-                       /* FIXME: add it to pinfo */
+                       // check position
+                       if (pinfo == null)
+                               pinfo = new ParameterBuilder [parameters.Length + 1];
+                       pinfo [position] = pb;
                        return pb;
                }
 
@@ -124,14 +145,33 @@ namespace System.Reflection.Emit {
                }
 
                public void SetCustomAttribute( CustomAttributeBuilder customBuilder) {
+                       string attrname = customBuilder.Ctor.ReflectedType.FullName;
+                       if (attrname == "System.Runtime.CompilerServices.MethodImplAttribute") {
+                               byte[] data = customBuilder.Data;
+                               int impla; // the (stupid) ctor takes a short or an int ... 
+                               impla = (int)data [2];
+                               impla |= ((int)data [3]) << 8;
+                               SetImplementationFlags ((MethodImplAttributes)impla);
+                               return;
+                       }
+                       if (cattrs != null) {
+                               CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1];
+                               cattrs.CopyTo (new_array, 0);
+                               new_array [cattrs.Length] = customBuilder;
+                               cattrs = new_array;
+                       } else {
+                               cattrs = new CustomAttributeBuilder [1];
+                               cattrs [0] = customBuilder;
+                       }
                }
                public void SetCustomAttribute( ConstructorInfo con, byte[] binaryAttribute) {
+                       SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute));
                }
                public void SetImplementationFlags( MethodImplAttributes attributes) {
                        iattrs = attributes;
                }
-               internal override int get_next_table_index (int table, bool inc) {
-                       return type.get_next_table_index (table, inc);
+               internal override int get_next_table_index (object obj, int table, bool inc) {
+                       return type.get_next_table_index (obj, table, inc);
                }
 
                internal void set_override (MethodInfo mdecl) {