Author: marek
Date: 2007-10-20 10:46:09 -0400 (Sat, 20 Oct 2007)
New Revision: 87849

Modified:
   trunk/mcs/mcs/ChangeLog
   trunk/mcs/mcs/class.cs
   trunk/mcs/mcs/const.cs
   trunk/mcs/mcs/decl.cs
   trunk/mcs/mcs/delegate.cs
   trunk/mcs/mcs/enum.cs
   trunk/mcs/mcs/generic.cs
   trunk/mcs/mcs/roottypes.cs
   trunk/mcs/mcs/typemanager.cs
Log:
2007-10-20  Marek Safar  <[EMAIL PROTECTED]>
        
        * class.cs, const.cs, decl.cs, delegate.cs, enum.cs, generic.cs,
        roottypes.cs, typemanager.cs:
                
        A member cache creation logic changed to add members immediately and
        not rely on fallback. The member cache is now only prefered way
        how to access and find type declaration members. It saves 5 MB of memory
        during MWF compilation and makes code ready for more optimizations and
        clean-ups, it's also a pre-requirement for partial methods.
        


Modified: trunk/mcs/mcs/ChangeLog
===================================================================
--- trunk/mcs/mcs/ChangeLog     2007-10-20 11:33:55 UTC (rev 87848)
+++ trunk/mcs/mcs/ChangeLog     2007-10-20 14:46:09 UTC (rev 87849)
@@ -1,3 +1,14 @@
+2007-10-20  Marek Safar  <[EMAIL PROTECTED]>
+       
+       * class.cs, const.cs, decl.cs, delegate.cs, enum.cs, generic.cs,
+       roottypes.cs, typemanager.cs:
+               
+       A member cache creation logic changed to add members immediately and
+       not rely on fallback. The member cache is now only prefered way
+       how to access and find type declaration members. It saves 5 MB of memory
+       during MWF compilation and makes code ready for more optimizations and
+       clean-ups, it's also a pre-requirement for partial methods.
+       
 2007-10-18  Raja R Harinath  <[EMAIL PROTECTED]>
 
        * ecore.cs (Expression.Error_ValueCannotBeConverted): Add special

Modified: trunk/mcs/mcs/class.cs
===================================================================
--- trunk/mcs/mcs/class.cs      2007-10-20 11:33:55 UTC (rev 87848)
+++ trunk/mcs/mcs/class.cs      2007-10-20 14:46:09 UTC (rev 87849)
@@ -30,7 +30,6 @@
 //     basenames in the defined_names array.
 //
 //
-#define CACHE
 using System;
 using System.Collections;
 using System.Collections.Specialized;
@@ -300,7 +299,7 @@
                protected ArrayList initialized_static_fields;
 
                // Holds the list of constants
-               MemberCoreArrayList constants;
+               protected MemberCoreArrayList constants;
 
                // Holds the methods.
                MemberCoreArrayList methods;
@@ -351,7 +350,7 @@
 
                // The base member cache and our member cache
                MemberCache base_cache;
-               MemberCache member_cache;
+               protected MemberCache member_cache;
 
                public const string DefaultIndexerName = "Item";
 
@@ -1589,8 +1588,30 @@
                                ConstructedType ct = base_type as 
ConstructedType;
                                if ((ct != null) && !ct.CheckConstraints (this))
                                        return false;
+                               
+                               member_cache = new MemberCache (base_type.Type, 
this);
+                       } else if (Kind == Kind.Interface) {
+                               member_cache = new MemberCache (null, this);
+                               Type [] ifaces = TypeManager.GetInterfaces 
(TypeBuilder);
+                               for (int i = 0; i < ifaces.Length; ++i)
+                                       member_cache.AddInterface 
(TypeManager.LookupMemberCache (ifaces [i]));
+                       } else {
+                               member_cache = new MemberCache (null, this);
                        }
 
+                       if (types != null)
+                               foreach (TypeContainer tc in types)
+                                       member_cache.AddNestedType (tc);
+
+                       if (delegates != null)
+                               foreach (Delegate d in delegates)
+                                       member_cache.AddNestedType (d);
+
+                       if (partial_parts != null) {
+                               foreach (TypeContainer part in partial_parts)
+                                       part.member_cache = member_cache;
+                       }
+
                        if (!IsTopLevel) {
                                MemberInfo conflict_symbol = 
Parent.PartialContainer.FindBaseMemberWithSameName (Basename, false);
                                if (conflict_symbol == null) {
@@ -1631,13 +1652,15 @@
                                GenericType = CurrentType;
                        }
 
-#if CACHE
-                       member_cache = new MemberCache (this);
-                       if (partial_parts != null) {
-                               foreach (TypeContainer part in partial_parts)
-                                       part.member_cache = member_cache;
-                       }
-#endif
+#if GMCS_SOURCE
+                       //
+                       // FIXME: This hack is needed because member cache does 
not work
+                       // with generic types, we rely on runtime to inflate 
dynamic types.
+                       // TODO: This hack requires member cache refactoring to 
be removed
+                       //
+                       if (TypeBuilder.IsGenericType)
+                               member_cache = new MemberCache (this);
+#endif                 
 
                        return true;
                }
@@ -1892,6 +1915,10 @@
                //
                // Since the whole process is a no-op, it is fine to check for 
null here.
                //
+               // TODO: This approach will be one day completely removed, it's 
already
+               // used at few places only
+               //
+               //
                public override MemberList FindMembers (MemberTypes mt, 
BindingFlags bf,
                                                        MemberFilter filter, 
object criteria)
                {
@@ -2744,12 +2771,6 @@
                        }
                }
 
-               MemberCache IMemberContainer.MemberCache {
-                       get {
-                               return member_cache;
-                       }
-               }
-
                bool IMemberContainer.IsInterface {
                        get {
                                return Kind == Kind.Interface;
@@ -2780,7 +2801,7 @@
                        get { return "T:"; }
                }
 
-               public virtual MemberCache BaseCache {
+               public MemberCache BaseCache {
                        get {
                                if (base_cache != null)
                                        return base_cache;
@@ -4112,9 +4133,16 @@
 
                        if (!MethodData.Define (Parent.PartialContainer))
                                return false;
-
+                                       
                        MethodBuilder = MethodData.MethodBuilder;
 
+#if GMCS_SOURCE                                                
+                       if (MethodBuilder.IsGenericMethod)
+                               Parent.MemberCache.AddGenericMember 
(MethodBuilder, this);
+#endif                 
+                       
+                       Parent.MemberCache.AddMember (MethodBuilder, this);
+
                        if (!TypeManager.IsGenericParameter (MemberType)) {
                                if (MemberType.IsAbstract && 
MemberType.IsSealed) {
                                        Report.Error (722, Location, Error722, 
TypeManager.CSharpName (MemberType));
@@ -4685,13 +4713,13 @@
                        
                        if (base_constructor_group == null)
                                return false;
-
+                       
                        base_constructor_group = 
base_constructor_group.OverloadResolve (
                                ec, argument_list, false, loc);
                        
                        if (base_constructor_group == null)
                                return false;
-
+                       
                        ConstructorInfo base_ctor = 
(ConstructorInfo)base_constructor_group;
                        
                        if (base_ctor == caller_builder){
@@ -4942,6 +4970,7 @@
                                ConstructorBuilder.SetImplementationFlags 
(MethodImplAttributes.InternalCall);
                        }
                        
+                       Parent.MemberCache.AddMember (ConstructorBuilder, this);
                        TypeManager.AddMethod (ConstructorBuilder, this);
 
                        return true;
@@ -5061,7 +5090,7 @@
                        
                        if (ParameterInfo.Count > 0) {
                                ArrayList al = 
(ArrayList)Parent.MemberCache.Members [".ctor"];
-                               if (al.Count > 3)
+                               if (al.Count > 2)
                                        MemberCache.VerifyClsParameterConflict 
(al, this, ConstructorBuilder);
  
                                if (Parent.TypeBuilder.IsSubclassOf 
(TypeManager.attribute_type)) {
@@ -5960,6 +5989,8 @@
                        RootContext.RegisterCompilerGeneratedType 
(fixed_buffer_type);
 
                        FieldBuilder = Parent.TypeBuilder.DefineField (Name, 
fixed_buffer_type, Modifiers.FieldAttr (ModFlags));
+
+                       Parent.MemberCache.AddMember (FieldBuilder, this);
                        TypeManager.RegisterFieldBase (FieldBuilder, this);
 
                        return true;
@@ -6082,6 +6113,7 @@
                                FieldBuilder = Parent.TypeBuilder.DefineField (
                                        Name, MemberType, Modifiers.FieldAttr 
(ModFlags));
 
+                               Parent.MemberCache.AddMember (FieldBuilder, 
this);
                                TypeManager.RegisterFieldBase (FieldBuilder, 
this);
                        }
                        catch (ArgumentException) {
@@ -6990,13 +7022,18 @@
                        PropertyBuilder = Parent.TypeBuilder.DefineProperty (
                                MemberName.ToString (), 
PropertyAttributes.None, MemberType, null);
 
-                       if (!Get.IsDummy)
+                       if (!Get.IsDummy) {
                                PropertyBuilder.SetGetMethod (GetBuilder);
-                               
-                       if (!Set.IsDummy)
+                               Parent.MemberCache.AddMember (GetBuilder, Get);
+                       }
+
+                       if (!Set.IsDummy) {
                                PropertyBuilder.SetSetMethod (SetBuilder);
+                               Parent.MemberCache.AddMember (SetBuilder, Set);
+                       }
                        
                        TypeManager.RegisterProperty (PropertyBuilder, this);
+                       Parent.MemberCache.AddMember (PropertyBuilder, this);
                        return true;
                }
 
@@ -7591,6 +7628,9 @@
                        EventBuilder = new MyEventBuilder (this, 
Parent.TypeBuilder, Name, EventAttributes.None, MemberType);                    
                       
                        EventBuilder.SetAddOnMethod (AddBuilder);
                        EventBuilder.SetRemoveOnMethod (RemoveBuilder);
+
+                       Parent.MemberCache.AddMember (EventBuilder, this);
+
                        return true;
                }
 
@@ -7630,7 +7670,7 @@
  
        public class Indexer : PropertyBase
        {
-               public class GetIndexerMethod : GetMethod
+               class GetIndexerMethod : GetMethod
                {
                        public GetIndexerMethod (PropertyBase method):
                                base (method)
@@ -7642,6 +7682,15 @@
                        {
                        }
 
+                       public override void EnableOverloadChecks (MemberCore 
overload)
+                       {
+                               //
+                               // Enable checks on both overloads, because we 
don't know which one came first
+                               //
+                               caching_flags |= Flags.TestMethodDuplication;
+                               overload.caching_flags |= 
Flags.TestMethodDuplication;
+                       }
+
                        public override Parameters ParameterInfo {
                                get {
                                        return ((Indexer)method).parameters;
@@ -7649,7 +7698,7 @@
                        }
                }
 
-               public class SetIndexerMethod: SetMethod
+               class SetIndexerMethod: SetMethod
                {
                        public SetIndexerMethod (PropertyBase method):
                                base (method)
@@ -7666,6 +7715,15 @@
                                parameters = Parameters.MergeGenerated 
(((Indexer)method).parameters,
                                        new Parameter (method.MemberType, 
"value", Parameter.Modifier.NONE, null, method.Location));
                        }
+
+                       public override void EnableOverloadChecks (MemberCore 
overload)
+                       {
+                               //
+                               // Enable checks on both overloads, because we 
don't know which one came first
+                               //
+                               caching_flags |= Flags.TestMethodDuplication;
+                               overload.caching_flags |= 
Flags.TestMethodDuplication;
+                       }
                }
 
                const int AllowedModifiers =
@@ -7831,15 +7889,19 @@
 
                        PropertyBuilder = Parent.TypeBuilder.DefineProperty (
                                Name, PropertyAttributes.None, MemberType, 
parameters.Types);
-                       
-                       if (!Get.IsDummy)
+
+                       if (!Get.IsDummy) {
                                PropertyBuilder.SetGetMethod (GetBuilder);
+                               Parent.MemberCache.AddMember (GetBuilder, Get);
+                       }
 
-                       if (!Set.IsDummy)
+                       if (!Set.IsDummy) {
                                PropertyBuilder.SetSetMethod (SetBuilder);
+                               Parent.MemberCache.AddMember (SetBuilder, Set);
+                       }
                                
                        TypeManager.RegisterIndexer (PropertyBuilder, 
GetBuilder, SetBuilder, parameters.Types);
-
+                       Parent.MemberCache.AddMember (PropertyBuilder, this);
                        return true;
                }
 
@@ -7991,7 +8053,7 @@
 
                        // imlicit and explicit operator of same types are not 
allowed
                        if (OperatorType == OpType.Explicit || OperatorType == 
OpType.Implicit)
-                               EnableOverloadChecks ();
+                               EnableOverloadChecks (null);
 
                        if (!base.Define ())
                                return false;

Modified: trunk/mcs/mcs/const.cs
===================================================================
--- trunk/mcs/mcs/const.cs      2007-10-20 11:33:55 UTC (rev 87848)
+++ trunk/mcs/mcs/const.cs      2007-10-20 14:46:09 UTC (rev 87849)
@@ -95,6 +95,7 @@
 
                        FieldBuilder = Parent.TypeBuilder.DefineField (Name, 
MemberType, field_attr);
                        TypeManager.RegisterConstant (FieldBuilder, this);
+                       Parent.MemberCache.AddMember (FieldBuilder, this);
 
                        if (ttype == TypeManager.decimal_type)
                                
Parent.PartialContainer.RegisterFieldForInitialization (this,

Modified: trunk/mcs/mcs/decl.cs
===================================================================
--- trunk/mcs/mcs/decl.cs       2007-10-20 11:33:55 UTC (rev 87848)
+++ trunk/mcs/mcs/decl.cs       2007-10-20 14:46:09 UTC (rev 87849)
@@ -566,7 +566,7 @@
                        }
                }
 
-               public void EnableOverloadChecks ()
+               public virtual void EnableOverloadChecks (MemberCore overload)
                {
                        caching_flags |= Flags.TestMethodDuplication;
                }
@@ -763,13 +763,7 @@
                        }
 
                        if (symbol.IsOverloadable && mc.IsOverloadable) {
-                               //
-                               // Enable both symbols check for indexers, 
because we don't know which one came first
-                               //
-                               if (symbol is Indexer.SetIndexerMethod || 
symbol is Indexer.GetIndexerMethod)
-                                       mc.EnableOverloadChecks ();
-                               
-                               symbol.EnableOverloadChecks ();
+                               symbol.EnableOverloadChecks (mc);
                                return true;
                        }
 
@@ -1081,13 +1075,25 @@
 
                private Type LookupNestedTypeInHierarchy (string name)
                {
+                       Type t = null;
                        // if the member cache has been created, lets use it.
                        // the member cache is MUCH faster.
-                       if (MemberCache != null)
-                               return MemberCache.FindNestedType (name);
+                       if (MemberCache != null) {
+                               t = MemberCache.FindNestedType (name);
+                               if (t == null)
+                                       return null;
+                               
+                       //
+                       // FIXME: This hack is needed because member cache does 
not work
+                       // with nested base generic types, it does only type 
name copy and
+                       // not type construction
+                       //
+#if !GMCS_SOURCE
+                               return t;
+#endif                         
+                       }
 
                        // no member cache. Do it the hard way -- reflection
-                       Type t = null;
                        for (Type current_type = TypeBuilder;
                             current_type != null && current_type != 
TypeManager.object_type;
                             current_type = current_type.BaseType) {
@@ -1158,8 +1164,13 @@
                ///   be used while the type is still being created since it 
doesn't use the cache
                ///   and relies on the filter doing the member name check.
                /// </remarks>
-               public abstract MemberList FindMembers (MemberTypes mt, 
BindingFlags bf,
-                                                       MemberFilter filter, 
object criteria);
+               ///
+               // [Obsolete ("Only MemberCache approach should be used")]
+               public virtual MemberList FindMembers (MemberTypes mt, 
BindingFlags bf,
+                                                       MemberFilter filter, 
object criteria)
+               {
+                       throw new NotSupportedException ();
+               }
 
                /// <remarks>
                ///   If we have a MemberCache, return it.  This property may 
return null if the
@@ -1447,7 +1458,7 @@
                        List = list;
                }
 
-               public static readonly MemberList Empty = new MemberList (new 
ArrayList ());
+               public static readonly MemberList Empty = new MemberList (new 
ArrayList (0));
 
                /// <summary>
                ///   Cast the MemberList into a MemberInfo[] array.
@@ -1615,13 +1626,6 @@
                ///   this method is called multiple times with different 
BindingFlags.
                /// </remarks>
                MemberList GetMembers (MemberTypes mt, BindingFlags bf);
-
-               /// <summary>
-               ///   Return the container's member cache.
-               /// </summary>
-               MemberCache MemberCache {
-                       get;
-               }
        }
 
        /// <summary>
@@ -1677,6 +1681,15 @@
                        Timer.StopTimer (TimerType.CacheInit);
                }
 
+               public MemberCache (Type baseType, IMemberContainer container)
+               {
+                       this.Container = container;
+                       if (baseType == null)
+                               this.member_hash = new Hashtable ();
+                       else
+                               this.member_hash = SetupCache 
(TypeManager.LookupMemberCache (baseType));
+               }
+
                public MemberCache (Type[] ifaces)
                {
                        //
@@ -1720,19 +1733,37 @@
                /// </summary>
                static Hashtable SetupCache (MemberCache base_class)
                {
-                       Hashtable hash = new Hashtable ();
-
                        if (base_class == null)
-                               return hash;
+                               return new Hashtable ();
 
+                       Hashtable hash = new Hashtable 
(base_class.member_hash.Count);
                        IDictionaryEnumerator it = 
base_class.member_hash.GetEnumerator ();
                        while (it.MoveNext ()) {
-                               hash [it.Key] = ((ArrayList) it.Value).Clone ();
+                               hash.Add (it.Key, ((ArrayList) it.Value).Clone 
());
                         }
                                 
                        return hash;
                }
+               
+               //
+               // Converts ModFlags to BindingFlags
+               //
+               static BindingFlags GetBindingFlags (int modifiers)
+               {
+                       BindingFlags bf;
+                       if ((modifiers & Modifiers.STATIC) != 0)
+                               bf = BindingFlags.Static;
+                       else
+                               bf = BindingFlags.Instance;
 
+                       if ((modifiers & Modifiers.PRIVATE) != 0)
+                               bf |= BindingFlags.NonPublic;
+                       else
+                               bf |= BindingFlags.Public;
+
+                       return bf;
+               }               
+
                /// <summary>
                ///   Add the contents of `cache' to the member_hash.
                /// </summary>
@@ -1784,6 +1815,28 @@
                        AddMembers (mt, BindingFlags.Instance | 
BindingFlags.NonPublic, container);
                }
 
+               public void AddMember (MemberInfo mi, MemberCore mc)
+               {
+                       AddMember (mi.MemberType, GetBindingFlags 
(mc.ModFlags), Container, mi.Name, mi);
+               }
+
+               public void AddGenericMember (MemberInfo mi, MemberCore mc)
+               {
+                       AddMember (mi.MemberType, GetBindingFlags 
(mc.ModFlags), Container, mc.MemberName.Basename, mi);
+               }
+
+               public void AddNestedType (DeclSpace type)
+               {
+                       AddMember (MemberTypes.NestedType, GetBindingFlags 
(type.ModFlags), (IMemberContainer) type.Parent,
+                               type.TypeBuilder.Name, type.TypeBuilder);
+               }
+
+               public void AddInterface (MemberCache baseCache)
+               {
+                       if (baseCache.member_hash.Count > 0)
+                               AddCacheContents (baseCache);
+               }
+
                void AddMember (MemberTypes mt, BindingFlags bf, 
IMemberContainer container,
                                string name, MemberInfo member)
                {
@@ -2043,7 +2096,7 @@
                {
                        if (using_global)
                                throw new Exception ();
-                       
+
                        bool declared_only = (bf & BindingFlags.DeclaredOnly) 
!= 0;
                        bool method_search = mt == MemberTypes.Method;
                        // If we have a method cache and we aren't already 
doing a method-only search,

Modified: trunk/mcs/mcs/delegate.cs
===================================================================
--- trunk/mcs/mcs/delegate.cs   2007-10-20 11:33:55 UTC (rev 87848)
+++ trunk/mcs/mcs/delegate.cs   2007-10-20 14:46:09 UTC (rev 87849)
@@ -23,7 +23,8 @@
        /// <summary>
        ///   Holds Delegates
        /// </summary>
-       public class Delegate : DeclSpace {
+       public class Delegate : DeclSpace, IMemberContainer
+       {
                public Expression ReturnType;
                public Parameters      Parameters;
 
@@ -39,6 +40,8 @@
                Expression instance_expr;
                MethodBase delegate_method;
                ReturnParameter return_attributes;
+
+               MemberCache member_cache;
        
                const int AllowedModifiers =
                        Modifiers.NEW |
@@ -160,6 +163,7 @@
                                }
                        }
 #endif
+                       member_cache = new MemberCache 
(TypeManager.multicast_delegate_type, this);
 
                        // FIXME: POSSIBLY make this static, as it is always 
constant
                        //
@@ -188,7 +192,7 @@
                        const_parameters.Resolve (null);
                        
                        TypeManager.RegisterMethod (ConstructorBuilder, 
const_parameters);
-                               
+                       member_cache.AddMember (ConstructorBuilder, this);
                        
                        ConstructorBuilder.SetImplementationFlags 
(MethodImplAttributes.Runtime);
 
@@ -253,6 +257,7 @@
                        InvokeBuilder.SetImplementationFlags 
(MethodImplAttributes.Runtime);
 
                        TypeManager.RegisterMethod (InvokeBuilder, Parameters);
+                       member_cache.AddMember (InvokeBuilder, this);
 
                        //
                        // BeginInvoke
@@ -267,6 +272,7 @@
 
                        BeginInvokeBuilder.SetImplementationFlags 
(MethodImplAttributes.Runtime);
                        TypeManager.RegisterMethod (BeginInvokeBuilder, 
async_parameters);
+                       member_cache.AddMember (BeginInvokeBuilder, this);
 
                        //
                        // EndInvoke is a bit more interesting, all the 
parameters labeled as
@@ -315,6 +321,7 @@
 
                        end_parameters.ApplyAttributes (EndInvokeBuilder);
                        TypeManager.RegisterMethod (EndInvokeBuilder, 
end_parameters);
+                       member_cache.AddMember (EndInvokeBuilder, this);
 
                        return true;
                }
@@ -602,37 +609,9 @@
                        return sb.ToString ();                  
                }
                
-               // Hack around System.Reflection as found everywhere else
-               public override MemberList FindMembers (MemberTypes mt, 
BindingFlags bf,
-                                                       MemberFilter filter, 
object criteria)
-               {
-                       ArrayList members = new ArrayList (2);
-
-                       if ((mt & MemberTypes.Constructor) != 0) {
-                               if (ConstructorBuilder != null && filter 
(ConstructorBuilder, criteria))
-                                       members.Add (ConstructorBuilder);
-                       }
-
-                       if ((mt & MemberTypes.Method) != 0) {
-                               if (InvokeBuilder != null)
-                               if (filter (InvokeBuilder, criteria))
-                                       members.Add (InvokeBuilder);
-
-                               if (BeginInvokeBuilder != null)
-                               if (filter (BeginInvokeBuilder, criteria))
-                                       members.Add (BeginInvokeBuilder);
-
-                               if (EndInvokeBuilder != null)
-                               if (filter (EndInvokeBuilder, criteria))
-                                       members.Add (EndInvokeBuilder);
-                       }
-
-                       return new MemberList (members);
-               }
-
                public override MemberCache MemberCache {
                        get {
-                               return null;
+                               return member_cache;
                        }
                }
 
@@ -672,6 +651,36 @@
                public override string DocCommentHeader {
                        get { return "T:"; }
                }
+
+               #region IMemberContainer Members
+
+               string IMemberContainer.Name
+               {
+                       get { throw new NotImplementedException (); }
+               }
+
+               Type IMemberContainer.Type
+               {
+                       get { throw new NotImplementedException (); }
+               }
+
+               MemberCache IMemberContainer.BaseCache
+               {
+                       get { throw new NotImplementedException (); }
+               }
+
+               bool IMemberContainer.IsInterface {
+                       get {
+                               return false;
+                       }
+               }
+
+               MemberList IMemberContainer.GetMembers (MemberTypes mt, 
BindingFlags bf)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               #endregion
        }
 
        //

Modified: trunk/mcs/mcs/enum.cs
===================================================================
--- trunk/mcs/mcs/enum.cs       2007-10-20 11:33:55 UTC (rev 87848)
+++ trunk/mcs/mcs/enum.cs       2007-10-20 14:46:09 UTC (rev 87849)
@@ -79,6 +79,7 @@
                {
                        const FieldAttributes attr = FieldAttributes.Public | 
FieldAttributes.Static | FieldAttributes.Literal;
                        FieldBuilder = Parent.TypeBuilder.DefineField (Name, 
MemberType, attr);
+                       Parent.MemberCache.AddMember (FieldBuilder, this);
                        TypeManager.RegisterConstant (FieldBuilder, this);
                        return true;
                }
@@ -204,6 +205,13 @@
                        return true;
                }
 
+               protected override bool DoDefineMembers ()
+               {
+                       member_cache = new MemberCache (TypeManager.enum_type, 
this);
+                       DefineContainerMembers (constants);
+                       return true;
+               }
+
                //
                // Used for error reporting only
                //

Modified: trunk/mcs/mcs/generic.cs
===================================================================
--- trunk/mcs/mcs/generic.cs    2007-10-20 11:33:55 UTC (rev 87848)
+++ trunk/mcs/mcs/generic.cs    2007-10-20 14:46:09 UTC (rev 87849)
@@ -138,10 +138,6 @@
                        throw new NotImplementedException ();
                }
 
-               MemberCache IMemberContainer.MemberCache {
-                       get { throw new NotImplementedException (); }
-               }
-
                public bool IsSubclassOf (Type t)
                {
                        throw new NotImplementedException ();
@@ -267,12 +263,6 @@
                {
                }
 
-               public override MemberList FindMembers (MemberTypes mt, 
BindingFlags bf,
-                                                       MemberFilter filter, 
object criteria)
-               {
-                       throw new NotImplementedException ();
-               }               
-
                public override MemberCache MemberCache {
                        get { throw new NotImplementedException (); }
                }

Modified: trunk/mcs/mcs/roottypes.cs
===================================================================
--- trunk/mcs/mcs/roottypes.cs  2007-10-20 11:33:55 UTC (rev 87848)
+++ trunk/mcs/mcs/roottypes.cs  2007-10-20 14:46:09 UTC (rev 87849)
@@ -117,11 +117,6 @@
                        throw new InternalErrorException ("should not be 
called");
                }
 
-               public override MemberList FindMembers (MemberTypes mt, 
BindingFlags bf, MemberFilter filter, object criteria)
-               {
-                       throw new InternalErrorException ("should not be 
called");
-               }
-
                public override MemberCache MemberCache {
                        get { return PartialContainer.MemberCache; }
                }

Modified: trunk/mcs/mcs/typemanager.cs
===================================================================
--- trunk/mcs/mcs/typemanager.cs        2007-10-20 11:33:55 UTC (rev 87848)
+++ trunk/mcs/mcs/typemanager.cs        2007-10-20 14:46:09 UTC (rev 87849)
@@ -440,15 +440,15 @@
 
        public static MemberCache LookupMemberCache (Type t)
        {
-               if (t.Assembly == CodeGen.Assembly.Builder) {
-                       IMemberContainer container = builder_to_declspace [t] 
as IMemberContainer;
+               if (t.Module == CodeGen.Module.Builder) {
+                       DeclSpace container = (DeclSpace)builder_to_declspace 
[t];
                        if (container != null)
                                return container.MemberCache;
                }
 
 #if GMCS_SOURCE
                if (t is GenericTypeParameterBuilder) {
-                       IMemberContainer container = builder_to_type_param [t] 
as IMemberContainer;
+                       TypeParameter container = builder_to_type_param [t] as 
TypeParameter;
 
                        if (container != null)
                                return container.MemberCache;
@@ -3585,7 +3585,7 @@
        /// <summary>
        ///   Returns the TypeHandle for TypeManager.array_type.
        /// </summary>
-       public static IMemberContainer ArrayType {
+       public static TypeHandle ArrayType {
                get {
                        if (array_type != null)
                                return array_type;
@@ -3610,10 +3610,6 @@
        private TypeHandle (Type type)
        {
                this.type = type;
-#if MS_COMPATIBLE && GMCS_SOURCE
-               if (type.IsGenericType && !type.IsGenericTypeDefinition)
-                       this.type = this.type.GetGenericTypeDefinition ();
-#endif
                full_name = type.FullName != null ? type.FullName : type.Name;
                if (type.BaseType != null) {
                        base_cache = TypeManager.LookupMemberCache 
(type.BaseType);
@@ -3652,7 +3648,7 @@
 
        public MemberList GetMembers (MemberTypes mt, BindingFlags bf)
        {
-                MemberInfo [] members;
+               MemberInfo [] members;
 
 #if GMCS_SOURCE
                if (type is GenericTypeParameterBuilder)
@@ -3660,13 +3656,16 @@
 #endif
 
                if (mt == MemberTypes.Event)
-                        members = type.GetEvents (bf | 
BindingFlags.DeclaredOnly);
-                else
-                        members = type.FindMembers (mt, bf | 
BindingFlags.DeclaredOnly,
-                                                    null, null);
-                Array.Reverse (members);
+                       members = type.GetEvents (bf | 
BindingFlags.DeclaredOnly);
+               else
+                       members = type.FindMembers (mt, bf | 
BindingFlags.DeclaredOnly,
+                                                                               
null, null);
 
-                return new MemberList (members);
+               if (members.Length == 0)
+                       return MemberList.Empty;
+
+               Array.Reverse (members);
+               return new MemberList (members);
        }
 
        // IMemberFinder methods

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to