public ParameterBuilder DefineParameter (int iSequence, ParameterAttributes attributes, string strParamName)
{
- if (iSequence < 1 || iSequence > GetParametersCount ())
+ // The 0th ParameterBuilder does not correspond to an
+ // actual parameter, but .NETFramework lets you define
+ // it anyway. It is not useful.
+ if (iSequence < 0 || iSequence > GetParametersCount ())
throw new ArgumentOutOfRangeException ("iSequence");
if (type.is_created)
throw not_after_created ();
[MethodImplAttribute(MethodImplOptions.InternalCall)]
static extern byte[] GetBlob(Assembly asmb, ConstructorInfo con, object[] constructorArgs, PropertyInfo[] namedProperties, object[] propertyValues, FieldInfo[] namedFields, object[] fieldValues);
- internal CustomAttributeBuilder( ConstructorInfo con, byte[] cdata) {
+ internal CustomAttributeBuilder( ConstructorInfo con, byte[] binaryAttribute) {
+ if (con == null)
+ throw new ArgumentNullException ("con");
+ if (binaryAttribute == null)
+ throw new ArgumentNullException ("binaryAttribute");
ctor = con;
- data = (byte[])cdata.Clone ();
+ data = (byte[])binaryAttribute.Clone ();
/* should we check that the user supplied data is correct? */
}
public void SetCustomAttribute (CustomAttributeBuilder customBuilder) {
RejectIfCreated ();
+ if (customBuilder == null)
+ throw new ArgumentNullException ("customBuilder");
+
string attrname = customBuilder.Ctor.ReflectedType.FullName;
if (attrname == "System.Runtime.InteropServices.FieldOffsetAttribute") {
byte[] data = customBuilder.Data;
public void SetOffset( int iOffset) {
RejectIfCreated ();
+ if (iOffset < 0)
+ throw new ArgumentException ("Negative field offset is not allowed");
offset = iOffset;
}
//
// Extension: Mono allows position == 0 for the return attribute
//
- if ((position < 0) || (position > parameters.Length))
+ if ((position < 0) || parameters == null || (position > parameters.Length))
throw new ArgumentOutOfRangeException ("position");
ParameterBuilder pb = new ParameterBuilder (this, position, attributes, strParamName);
if (data == null)
throw new ArgumentNullException ("data");
- FieldBuilder fb = DefineUninitializedData (name, data.Length,
- attributes | FieldAttributes.HasFieldRVA);
+ var maskedAttributes = attributes & ~FieldAttributes.ReservedMask;
+ FieldBuilder fb = DefineDataImpl (name, data.Length, maskedAttributes | FieldAttributes.HasFieldRVA);
fb.SetRVAData (data);
return fb;
}
public FieldBuilder DefineUninitializedData (string name, int size, FieldAttributes attributes)
+ {
+ return DefineDataImpl (name, size, attributes & ~FieldAttributes.ReservedMask);
+ }
+
+ private FieldBuilder DefineDataImpl (string name, int size, FieldAttributes attributes)
{
if (name == null)
throw new ArgumentNullException ("name");
+ if (name == String.Empty)
+ throw new ArgumentException ("name cannot be empty", "name");
if (global_type_created != null)
throw new InvalidOperationException ("global fields already created");
- if ((size <= 0) || (size > 0x3f0000))
- throw new ArgumentException ("size", "Data size must be > 0 and < 0x3f0000");
+ if ((size <= 0) || (size >= 0x3f0000))
+ throw new ArgumentException ("Data size must be > 0 and < 0x3f0000", null as string);
CreateGlobalType ();
}
[Test]
- [Category ("NotDotNet")] // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=341439
public void DefineParameter_Position_Zero ()
{
+ // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=341439
+ // https://msdn.microsoft.com/en-us/library/system.reflection.emit.constructorbuilder.defineparameter(v=vs.110).aspx
+ // "If you specify 0 (zero) for iSequence, this method returns
+ // a ParameterBuilder instead of throwing an exception. There
+ // is nothing useful that you can do with this
+ // ParameterBuilder."
+
ConstructorBuilder cb = genClass.DefineConstructor (
0, 0, new Type [2] { typeof (int), typeof (int) });
- try {
- cb.DefineParameter (0, ParameterAttributes.In, "param1");
- Assert.Fail ("#1");
- } catch (ArgumentOutOfRangeException ex) {
- // Specified argument was out of the range of valid values
- Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
- Assert.IsNull (ex.ActualValue, "#3");
- Assert.IsNull (ex.InnerException, "#4");
- Assert.IsNotNull (ex.Message, "#5");
- Assert.IsNotNull (ex.ParamName, "#6");
- }
+ var pb = cb.DefineParameter (0, ParameterAttributes.In, "param1");
+ Assert.IsNotNull (pb);
}
[Test]
#../../../external/corefx/src/System.Reflection.Emit/tests/AssemblyBuilderTests.cs
# ../../../external/corefx/src/System.Reflection.Emit/tests/
-#../../../external/corefx/src/System.Reflection.Emit/tests/ConstructorBuilder/ConstructorBuilderDefineParameter.cs
+../../../external/corefx/src/System.Reflection.Emit/tests/ConstructorBuilder/ConstructorBuilderDefineParameter.cs
#../../../external/corefx/src/System.Reflection.Emit/tests/ConstructorBuilder/ConstructorBuilderGetILGenerator.cs
../../../external/corefx/src/System.Reflection.Emit/tests/ConstructorBuilder/ConstructorBuilderInitLocals.cs
../../../external/corefx/src/System.Reflection.Emit/tests/ConstructorBuilder/ConstructorBuilderSetCustomAttribute.cs
../../../external/corefx/src/System.Reflection.Emit/tests/FieldBuilder/FieldBuilderGetValue.cs
#../../../external/corefx/src/System.Reflection.Emit/tests/FieldBuilder/FieldBuilderSetConstant.cs
-#../../../external/corefx/src/System.Reflection.Emit/tests/FieldBuilder/FieldBuilderSetCustomAttribute.cs
-#../../../external/corefx/src/System.Reflection.Emit/tests/FieldBuilder/FieldBuilderSetOffset.cs
+../../../external/corefx/src/System.Reflection.Emit/tests/FieldBuilder/FieldBuilderSetCustomAttribute.cs
+../../../external/corefx/src/System.Reflection.Emit/tests/FieldBuilder/FieldBuilderSetOffset.cs
../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTyepParameterBuilderSetBaseTypeConstraint.cs
../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderGUID.cs
../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderMakeByRefType.cs
../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderMakeGenericType.cs
../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderMakePointerType.cs
-#../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderSetCustomAttribute.cs
+../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderSetCustomAttribute.cs
#../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderSetGenericParameterAttributes.cs
#../../../external/corefx/src/System.Reflection.Emit/tests/GenericTypeParameterBuilder/GenericTypeParameterBuilderSetInterfaceConstraints.cs
../../../external/corefx/src/System.Reflection.Emit/tests/MethodBuilder/MethodBuilderContainsGenericParameters.cs
#../../../external/corefx/src/System.Reflection.Emit/tests/MethodBuilder/MethodBuilderDefineGenericParameters.cs
-#../../../external/corefx/src/System.Reflection.Emit/tests/MethodBuilder/MethodBuilderDefineParameter.cs
+../../../external/corefx/src/System.Reflection.Emit/tests/MethodBuilder/MethodBuilderDefineParameter.cs
#../../../external/corefx/src/System.Reflection.Emit/tests/MethodBuilder/MethodBuilderEquals.cs
../../../external/corefx/src/System.Reflection.Emit/tests/MethodBuilder/MethodBuilderGetGenericArguments.cs
../../../external/corefx/src/System.Reflection.Emit/tests/MethodBuilder/MethodBuilderGetGenericMethodDefinition.cs
../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderCreateGlobalFunctions.cs
#../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderDefineEnum.cs
-#../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderDefineInitializedData.cs
+../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderDefineInitializedData.cs
#../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderDefineType.cs
-#../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderDefineUninitializedData.cs
+../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderDefineUninitializedData.cs
#../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderGetArrayMethod.cs
#../../../external/corefx/src/System.Reflection.Emit/tests/ModuleBuilder/ModuleBuilderSetCustomAttribute.cs