2003-05-19 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / corlib / System.Reflection.Emit / ConstructorBuilder.cs
index e0d3487578ee00c40751530cf6e5a1948fdce7ce..7dad4f267039746a0c7f8cc282327fa7f173a629 100644 (file)
@@ -16,6 +16,7 @@ using System.Security.Permissions;
 
 namespace System.Reflection.Emit {
        public sealed class ConstructorBuilder : ConstructorInfo {
+               private RuntimeMethodHandle mhandle;
                private ILGenerator ilgen;
                private Type[] parameters;
                private MethodAttributes attrs;
@@ -28,7 +29,7 @@ namespace System.Reflection.Emit {
                private bool init_locals = true;
 
                internal ConstructorBuilder (TypeBuilder tb, MethodAttributes attributes, CallingConventions callingConvention, Type[] parameterTypes) {
-                       attrs = attributes;
+                       attrs = attributes | MethodAttributes.SpecialName;
                        call_conv = callingConvention;
                        if (parameterTypes != null) {
                                this.parameters = new Type [parameterTypes.Length];
@@ -51,27 +52,29 @@ namespace System.Reflection.Emit {
                        return iattrs;
                }
                public override ParameterInfo[] GetParameters() {
-                       if ((parameters == null) || (pinfo == null))
+                       if (parameters == null)
                                return null;
 
                        ParameterInfo[] retval = new ParameterInfo [parameters.Length];
                        for (int i = 0; i < parameters.Length; i++) {
-                               if (pinfo [i+1] == null)
-                                       return null;
-
-                               retval [i] = new ParameterInfo (pinfo [i+1], parameters [i], this);
+                               retval [i] = new ParameterInfo (pinfo == null ? null : pinfo [i+1], parameters [i], this, i + 1);
                        }
 
                        return retval;
                }
                public override Object Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) {
-                       return null;
+                       throw not_supported ();
                }
                public override object Invoke(BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) {
-                       return null;
+                       throw not_supported ();
+               }
+
+               public override RuntimeMethodHandle MethodHandle { 
+                       get {
+                               throw not_supported ();
+                       }
                }
 
-               public override RuntimeMethodHandle MethodHandle { get {return new RuntimeMethodHandle ();} }
                public override MethodAttributes Attributes { 
                        get {return attrs;} 
                }
@@ -91,6 +94,11 @@ namespace System.Reflection.Emit {
                [MonoTODO]
                public ParameterBuilder DefineParameter(int iSequence, ParameterAttributes attributes, string strParamName)
                {
+                       if ((iSequence < 1) || (iSequence > parameters.Length))
+                               throw new ArgumentOutOfRangeException ("iSequence");
+                       if (type.is_created)
+                               throw not_after_created ();
+
                        ParameterBuilder pb = new ParameterBuilder (this, iSequence, attributes, strParamName);
                        // check iSequence
                        if (pinfo == null)
@@ -99,14 +107,20 @@ namespace System.Reflection.Emit {
                        return pb;
                }
 
-               public override bool IsDefined (Type attribute_type, bool inherit) {return false;}
+               public override bool IsDefined (Type attribute_type, bool inherit) {
+                       throw not_supported ();
+               }
 
-               public override object [] GetCustomAttributes (bool inherit) {return null;}
+               public override object [] GetCustomAttributes (bool inherit) {
+                       throw not_supported ();
+               }
 
-               public override object [] GetCustomAttributes (Type attribute_type, bool inherit) {return null;}
+               public override object [] GetCustomAttributes (Type attribute_type, bool inherit) {
+                       throw not_supported ();
+               }
 
                public ILGenerator GetILGenerator () {
-                       return GetILGenerator (256);
+                       return GetILGenerator (64);
                }
                internal ILGenerator GetILGenerator (int size) {
                        ilgen = new ILGenerator (this, size);
@@ -114,6 +128,18 @@ namespace System.Reflection.Emit {
                }
 
                public void SetCustomAttribute( CustomAttributeBuilder customBuilder) {
+                       if (customBuilder == null)
+                               throw new ArgumentNullException ("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);
@@ -125,19 +151,32 @@ namespace System.Reflection.Emit {
                        }
                }
                public void SetCustomAttribute( ConstructorInfo con, byte[] binaryAttribute) {
+                       if (con == null)
+                               throw new ArgumentNullException ("con");
+                       if (binaryAttribute == null)
+                               throw new ArgumentNullException ("binaryAttribute");
+
                        SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute));
                }
                public void SetImplementationFlags( MethodImplAttributes attributes) {
+                       if (type.is_created)
+                               throw not_after_created ();
+
                        iattrs = attributes;
                }
                public Module GetModule() {
-                       return null;
+                       return type.Module;
                }
                public MethodToken GetToken() {
                        return new MethodToken (0x06000000 | table_idx);
                }
+
+               [MonoTODO]
                public void SetSymCustomAttribute( string name, byte[] data) {
+                       if (type.is_created)
+                               throw not_after_created ();
                }
+
                public override string ToString() {
                        return "constructor";
                }
@@ -150,5 +189,12 @@ namespace System.Reflection.Emit {
                        return type.get_next_table_index (obj, table, inc);
                }
 
+               private Exception not_supported () {
+                       return new NotSupportedException ("The invoked member is not supported in a dynamic module.");
+               }
+
+               private Exception not_after_created () {
+                       return new InvalidOperationException ("Unable to change after type has been created.");
+               }
        }
 }