namespace System.Reflection.Emit {
public sealed class ConstructorBuilder : ConstructorInfo {
+ private RuntimeMethodHandle mhandle;
private ILGenerator ilgen;
private Type[] parameters;
private MethodAttributes attrs;
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];
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;}
}
[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)
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);
}
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);
}
}
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";
}
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.");
+ }
}
}