2007-05-16 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mcs / class / corlib / System.Reflection.Emit / TypeBuilder.cs
index 82bc20c3ba7c5047bfd99bf627214c289407b3c0..141046081c0961a2d49960dc6f8a5df99559ae05 100644 (file)
@@ -3,6 +3,7 @@
 //
 // Author:
 //   Paolo Molaro (lupus@ximian.com)
+//   Marek Safar (marek.safar@gmail.com)
 //
 // (C) 2001 Ximian, Inc.  http://www.ximian.com
 //
@@ -132,6 +133,7 @@ namespace System.Reflection.Emit {
                                System.Array.Copy (interfaces, this.interfaces, interfaces.Length);
                        }
                        pmodule = mb;
+
                        // skip .<Module> ?
                        table_idx = mb.get_next_table_index (this, 0x02, true);
                        setup_internal_class (this);
@@ -170,28 +172,9 @@ namespace System.Reflection.Emit {
                        return false;
                }*/
 
-               [MonoTODO]
                public override Type UnderlyingSystemType {
                        get {
-
-                               // Return this as requested by Zoltan.
-                               
                                return this;
-
-#if false
-                               // Dont know what to do with the rest, should be killed:
-                               // See bug: 75008.
-                               //
-                               ////// This should return the type itself for non-enum types but 
-                               ////// that breaks mcs.
-                               if (fields != null) {
-                                       foreach (FieldBuilder f in fields) {
-                                               if ((f != null) && (f.Attributes & FieldAttributes.Static) == 0)
-                                                       return f.FieldType;
-                                       }
-                               }
-                               throw new InvalidOperationException ("Underlying type information on enumeration is not specified.");
-#endif
                        }
                }
 
@@ -681,6 +664,10 @@ namespace System.Reflection.Emit {
                        if (created != null)
                                return created;
 
+                       if (!IsInterface && (parent == null) && (this != pmodule.assemblyb.corlib_object_type) && (FullName != "<Module>")) {
+                               SetParent (pmodule.assemblyb.corlib_object_type);
+                       }
+
                        create_generic_class ();
 
                        // Fire TypeResolve events for fields whose type is an unfinished
@@ -902,6 +889,9 @@ namespace System.Reflection.Emit {
                }
 
                public override FieldInfo[] GetFields (BindingFlags bindingAttr) {
+                       if (created != null)
+                               return created.GetFields (bindingAttr);
+
                        if (fields == null)
                                return new FieldInfo [0];
                        ArrayList l = new ArrayList ();
@@ -1343,18 +1333,22 @@ namespace System.Reflection.Emit {
 
                static int UnmanagedDataCount = 0;
                
-               public FieldBuilder DefineUninitializedData( string name, int size, FieldAttributes attributes) {
+               public FieldBuilder DefineUninitializedData( string name, int size, FieldAttributes attributes)
+               {
                        check_name ("name", name);
                        if ((size <= 0) || (size > 0x3f0000))
                                throw new ArgumentException ("size", "Data size must be > 0 and < 0x3f0000");
                        check_not_created ();
 
-                       string s = "$ArrayType$"+UnmanagedDataCount.ToString();
-                       UnmanagedDataCount++;
-                       TypeBuilder datablobtype = DefineNestedType (s,
-                               TypeAttributes.NestedPrivate|TypeAttributes.ExplicitLayout|TypeAttributes.Sealed,
-                               pmodule.assemblyb.corlib_value_type, null, PackingSize.Size1, size);
-                       datablobtype.CreateType ();
+                       string typeName = "$ArrayType$" + size;
+                       Type datablobtype = pmodule.GetRegisteredType (fullname + "+" + typeName);
+                       if (datablobtype == null) {
+                               TypeBuilder tb = DefineNestedType (typeName,
+                                       TypeAttributes.NestedPrivate|TypeAttributes.ExplicitLayout|TypeAttributes.Sealed,
+                                       pmodule.assemblyb.corlib_value_type, null, PackingSize.Size1, size);
+                               tb.CreateType ();
+                               datablobtype = tb;
+                       }
                        return DefineField (name, datablobtype, attributes|FieldAttributes.Static|FieldAttributes.HasFieldRVA);
                }
 
@@ -1368,7 +1362,7 @@ namespace System.Reflection.Emit {
 
                        if (parentType == null && (attrs & TypeAttributes.Interface) == 0)
                                throw new ArgumentNullException ("parentType");
-                       
+
                        parent = parentType;
                        // will just set the parent-related bits if called a second time
                        setup_internal_class (this);