Set svn:eol-style=native, delete svn:executable.
[mono.git] / mcs / class / corlib / System.Reflection.Emit / MethodBuilder.cs
old mode 100755 (executable)
new mode 100644 (file)
index 1c3b4eb..4c1c11d
@@ -57,7 +57,7 @@ namespace System.Reflection.Emit {
                private MethodInfo override_method;
                private string pi_dll;
                private string pi_entry;
-               private CharSet ncharset;
+               private CharSet ncharset; /* this also encodes set_last_error etc */
                private CallingConvention native_cc;
                private CallingConventions call_conv;
                private bool init_locals = true;
@@ -87,6 +87,10 @@ namespace System.Reflection.Emit {
                        if ((attributes & MethodAttributes.Static) == 0)
                                this.call_conv |= CallingConventions.HasThis;
                        if (parameterTypes != null) {
+                               for (int i = 0; i < parameterTypes.Length; ++i)
+                                       if (parameterTypes [i] == null)
+                                               throw new ArgumentException ("Elements of the parameterTypes array cannot be null", "parameterTypes");
+
                                this.parameters = new Type [parameterTypes.Length];
                                System.Array.Copy (parameterTypes, this.parameters, parameterTypes.Length);
                        }
@@ -140,6 +144,20 @@ namespace System.Reflection.Emit {
                        }
                }
 
+               /* Used by mcs */
+               internal bool BestFitMapping {
+                       set {
+                               ncharset = (CharSet)(((int)ncharset & ~0x30) | (value ? 0x10 : 0x20));
+                       }
+               }
+
+               /* Used by mcs */
+               internal bool ThrowOnUnmappableChar {
+                       set {
+                               ncharset = (CharSet)(((int)ncharset & ~0x3000) | (value ? 0x1000 : 0x2000));
+                       }
+               }
+
                public MethodToken GetToken() {
                        return new MethodToken(0x06000000 | table_idx);
                }
@@ -236,6 +254,10 @@ namespace System.Reflection.Emit {
                }
 
                internal void fixup () {
+                       if (((attrs & (MethodAttributes.Abstract | MethodAttributes.PinvokeImpl)) == 0) && ((iattrs & (MethodImplAttributes.Runtime | MethodImplAttributes.InternalCall)) == 0)) {
+                               if (((ilgen == null) || (ILGenerator.Mono_GetCurrentOffset (ilgen) == 0)) && (code == null))
+                                       throw new InvalidOperationException ("Method '" + Name + "' does not have a method body.");
+                       }
                        if (ilgen != null)
                                ilgen.label_fixup ();
                }