Author: martin
Date: 2005-05-10 11:50:31 -0400 (Tue, 10 May 2005)
New Revision: 44328

Modified:
   trunk/mcs/gmcs/ChangeLog
   trunk/mcs/gmcs/class.cs
   trunk/mcs/gmcs/codegen.cs
   trunk/mcs/gmcs/decl.cs
   trunk/mcs/gmcs/ecore.cs
   trunk/mcs/gmcs/rootcontext.cs
   trunk/mcs/gmcs/typemanager.cs
Log:
2005-05-10  Martin Baulig  <[EMAIL PROTECTED]>

        * typemanager.cs (TypeManager.MemberLookup_FindMembers): Don't use
        the cache if we're just looking for `MemberTypes.NestedType' in a
        generic instance.

        * ecore.cs (Expression.ResolveAsTypeTerminal): Don't check the
        constraints if we're still resolving the type tree.
        (Expression.MemberLookup): If we're resolving the type tree, only
        look for `MemberTypes.NestedType' since we're only interested in
        getting types.

        * class.cs (TypeContainer.DefineType): Don't resolve the type
        parameters here; do this later in ResolveType() after the type
        tree has been resolved.
        (TypeContainer.ResolveType): New public method; this is called
        after the type tree is resolved and before the types are being
        populated.  We resolve the generic constraints here.
        (TypeContainer.DoDefineMember): Check the constraints on our base
        class and interfaces.

        * decl.cs (DeclSpace.ResolveBaseTypeExpr): Make this protected;
        set the `ResolvingTypeTree' flag on the EmitContext.

        * codegen.cs (EmitContext.ResolvingTypeTree): New public field.



Modified: trunk/mcs/gmcs/ChangeLog
===================================================================
--- trunk/mcs/gmcs/ChangeLog    2005-05-10 13:41:52 UTC (rev 44327)
+++ trunk/mcs/gmcs/ChangeLog    2005-05-10 15:50:31 UTC (rev 44328)
@@ -1,3 +1,29 @@
+2005-05-10  Martin Baulig  <[EMAIL PROTECTED]>
+
+       * typemanager.cs (TypeManager.MemberLookup_FindMembers): Don't use
+       the cache if we're just looking for `MemberTypes.NestedType' in a
+       generic instance.
+
+       * ecore.cs (Expression.ResolveAsTypeTerminal): Don't check the
+       constraints if we're still resolving the type tree.
+       (Expression.MemberLookup): If we're resolving the type tree, only
+       look for `MemberTypes.NestedType' since we're only interested in
+       getting types.
+
+       * class.cs (TypeContainer.DefineType): Don't resolve the type
+       parameters here; do this later in ResolveType() after the type
+       tree has been resolved.
+       (TypeContainer.ResolveType): New public method; this is called
+       after the type tree is resolved and before the types are being
+       populated.  We resolve the generic constraints here.
+       (TypeContainer.DoDefineMember): Check the constraints on our base
+       class and interfaces.
+
+       * decl.cs (DeclSpace.ResolveBaseTypeExpr): Make this protected;
+       set the `ResolvingTypeTree' flag on the EmitContext.
+
+       * codegen.cs (EmitContext.ResolvingTypeTree): New public field.
+
 2005-05-09  Marek Safar  <[EMAIL PROTECTED]>
 
        * typemanager.cs (TypeManager): Moved InitGenerics to Reset method.

Modified: trunk/mcs/gmcs/class.cs
===================================================================
--- trunk/mcs/gmcs/class.cs     2005-05-10 13:41:52 UTC (rev 44327)
+++ trunk/mcs/gmcs/class.cs     2005-05-10 15:50:31 UTC (rev 44328)
@@ -453,6 +453,7 @@
                //
                string base_class_name;
                TypeExpr base_type;
+               TypeExpr[] iface_exprs;
 
                ArrayList type_bases;
 
@@ -470,6 +471,7 @@
                public const string DefaultIndexerName = "Item";
 
                Type GenericType;
+               GenericTypeParameterBuilder[] gen_params;
 
                // This is used to catch recursive definitions in declarations.
                protected bool InTransit;
@@ -1246,51 +1248,19 @@
                                ec.ContainerType = TypeBuilder;
                        }
 
-                       Expression current_type = null;
-
                        if (IsGeneric) {
                                string[] param_names = new string 
[TypeParameters.Length];
                                for (int i = 0; i < TypeParameters.Length; i++)
                                        param_names [i] = TypeParameters 
[i].Name;
 
-                               GenericTypeParameterBuilder[] gen_params;
                                gen_params = 
TypeBuilder.DefineGenericParameters (param_names);
 
                                int offset = CountTypeParameters - 
CurrentTypeParameters.Length;
                                for (int i = offset; i < gen_params.Length; i++)
                                        CurrentTypeParameters [i - 
offset].Define (gen_params [i]);
-
-                               if (Parts != null) {
-                                       foreach (ClassPart part in Parts) {
-                                               if (!part.DefineTypeParameters 
()) {
-                                                       error = true;
-                                                       return null;
-                                               }
-                                       }
-                               } else {
-                                       foreach (TypeParameter type_param in 
CurrentTypeParameters) {
-                                               if (!type_param.Resolve (this)) 
{
-                                                       error = true;
-                                                       return null;
-                                               }
-                                       }
-
-                                       for (int i = offset; i < 
gen_params.Length; i++)
-                                               CurrentTypeParameters [i - 
offset].DefineConstraints ();
-
-                                       foreach (TypeParameter type_param in 
TypeParameters) {
-                                               if (!type_param.DefineType 
(ec)) {
-                                                       error = true;
-                                                       return null;
-                                               }
-                                       }
-
-                                       current_type = new ConstructedType (
-                                               TypeBuilder, TypeParameters, 
Location);
-                               }
                        }
 
-                       TypeExpr[] iface_exprs = GetClassBases (out base_type);
+                       iface_exprs = GetClassBases (out base_type);
                        if (iface_exprs == null && base_type != null) {
                                InTransit = false;
                                return null;
@@ -1357,34 +1327,73 @@
                                TypeManager.RegisterBuilder (TypeBuilder, 
ifaces);
                        }
 
-                       if (IsGeneric) {
-                               foreach (TypeParameter type_param in 
TypeParameters)
-                                       if (!type_param.CheckDependencies (ec)) 
{
+                       if (!(this is Iterator))
+                               RootContext.RegisterOrder (this); 
+                       else if (!ResolveType ())
+                               return null;
+
+                       InTransit = false;
+
+                       if (!DefineNestedTypes ()) {
+                               return null;
+                       }
+
+                       return TypeBuilder;
+               }
+
+               public bool ResolveType ()
+               {
+                       if (!IsGeneric)
+                               return true;
+
+                       TypeExpr current_type = null;
+                       if (Parts != null) {
+                               foreach (ClassPart part in Parts) {
+                                       if (!part.DefineTypeParameters ()) {
                                                error = true;
-                                               return null;
+                                               return false;
                                        }
+                               }
+                       } else {
+                               foreach (TypeParameter type_param in 
CurrentTypeParameters) {
+                                       if (!type_param.Resolve (this)) {
+                                               error = true;
+                                               return false;
+                                       }
+                               }
+
+                               int offset = CountTypeParameters - 
CurrentTypeParameters.Length;
+                               for (int i = offset; i < gen_params.Length; i++)
+                                       CurrentTypeParameters [i - 
offset].DefineConstraints ();
+
+                               foreach (TypeParameter type_param in 
TypeParameters) {
+                                       if (!type_param.DefineType (ec)) {
+                                               error = true;
+                                               return false;
+                                       }
+                               }
+
+                               current_type = new ConstructedType (
+                                       TypeBuilder, TypeParameters, Location);
                        }
 
+                       foreach (TypeParameter type_param in TypeParameters)
+                               if (!type_param.CheckDependencies (ec)) {
+                                       error = true;
+                                       return false;
+                               }
+
                        if (current_type != null) {
                                current_type = 
current_type.ResolveAsTypeTerminal (ec);
                                if (current_type == null) {
                                        error = true;
-                                       return null;
+                                       return false;
                                }
 
                                CurrentType = current_type.Type;
                        }
 
-                       if (!(this is Iterator))
-                               RootContext.RegisterOrder (this); 
-
-                       InTransit = false;
-
-                       if (!DefineNestedTypes ()) {
-                               return null;
-                       }
-
-                       return TypeBuilder;
+                       return true;
                }
 
                protected virtual bool DefineNestedTypes ()
@@ -1463,6 +1472,20 @@
 
                protected virtual bool DoDefineMembers ()
                {
+                       if (iface_exprs != null) {
+                               foreach (TypeExpr iface in iface_exprs) {
+                                       ConstructedType ct = iface as 
ConstructedType;
+                                       if ((ct != null) && 
!ct.CheckConstraints (ec))
+                                               return false;
+                               }
+                       }
+
+                       if (base_type != null) {
+                               ConstructedType ct = base_type as 
ConstructedType;
+                               if ((ct != null) && !ct.CheckConstraints (ec))
+                                       return false;
+                       }
+
                        if (IsTopLevel) {
                                if ((ModFlags & Modifiers.NEW) != 0)
                                        Error_KeywordNotAllowed (Location);
@@ -2065,7 +2088,7 @@
                        if (members == null)
                                return MemberList.Empty;
                        else
-                       return new MemberList (members);
+                               return new MemberList (members);
                }
 
                public override MemberCache MemberCache {

Modified: trunk/mcs/gmcs/codegen.cs
===================================================================
--- trunk/mcs/gmcs/codegen.cs   2005-05-10 13:41:52 UTC (rev 44327)
+++ trunk/mcs/gmcs/codegen.cs   2005-05-10 15:50:31 UTC (rev 44328)
@@ -312,6 +312,11 @@
                public bool IsFieldInitializer;
 
                /// <summary>
+               ///   We are resolving a class'es base class and interfaces.
+               /// </summary>
+               public bool ResolvingTypeTree;
+
+               /// <summary>
                ///   The value that is allowed to be returned or NULL if there 
is no
                ///   return type.
                /// </summary>

Modified: trunk/mcs/gmcs/decl.cs
===================================================================
--- trunk/mcs/gmcs/decl.cs      2005-05-10 13:41:52 UTC (rev 44327)
+++ trunk/mcs/gmcs/decl.cs      2005-05-10 15:50:31 UTC (rev 44328)
@@ -804,10 +804,11 @@
                //    Resolves the expression `e' for a type, and will 
recursively define
                //    types.  This should only be used for resolving base types.
                // </summary>
-               public TypeExpr ResolveBaseTypeExpr (Expression e, bool silent, 
Location loc)
+               protected TypeExpr ResolveBaseTypeExpr (Expression e, bool 
silent, Location loc)
                {
                        TypeResolveEmitContext.loc = loc;
                        TypeResolveEmitContext.ContainerType = TypeBuilder;
+                       TypeResolveEmitContext.ResolvingTypeTree = true;
                        if (this is GenericMethod)
                                TypeResolveEmitContext.ContainerType = 
Parent.TypeBuilder;
                        else

Modified: trunk/mcs/gmcs/ecore.cs
===================================================================
--- trunk/mcs/gmcs/ecore.cs     2005-05-10 13:41:52 UTC (rev 44327)
+++ trunk/mcs/gmcs/ecore.cs     2005-05-10 15:50:31 UTC (rev 44328)
@@ -289,7 +289,7 @@
                        }
 
                        ConstructedType ct = te as ConstructedType;
-                       if ((ct != null) && !ct.CheckConstraints (ec))
+                       if ((ct != null) && !ec.ResolvingTypeTree && 
!ct.CheckConstraints (ec))
                                return null;
 
                        return te;
@@ -580,7 +580,7 @@
                        almostMatchedMembers.Clear ();
 
                        MemberInfo [] mi = TypeManager.MemberLookup (
-                               container_type, qualifier_type,queried_type, 
mt, bf, name,
+                               container_type, qualifier_type, queried_type, 
mt, bf, name,
                                almostMatchedMembers);
 
                        if (mi == null)
@@ -620,8 +620,14 @@
                public static Expression MemberLookup (EmitContext ec, Type 
qualifier_type,
                                                       Type queried_type, 
string name, Location loc)
                {
-                       return MemberLookup (ec, ec.ContainerType, 
qualifier_type, queried_type,
-                                            name, AllMemberTypes, 
AllBindingFlags, loc);
+                       if (ec.ResolvingTypeTree)
+                               return MemberLookup (ec, ec.ContainerType, 
qualifier_type,
+                                                    queried_type, name, 
MemberTypes.NestedType,
+                                                    AllBindingFlags, loc);
+                       else
+                               return MemberLookup (ec, ec.ContainerType, 
qualifier_type,
+                                                    queried_type, name, 
AllMemberTypes,
+                                                    AllBindingFlags, loc);
                }
 
                public static Expression MethodLookup (EmitContext ec, Type 
queried_type,

Modified: trunk/mcs/gmcs/rootcontext.cs
===================================================================
--- trunk/mcs/gmcs/rootcontext.cs       2005-05-10 13:41:52 UTC (rev 44327)
+++ trunk/mcs/gmcs/rootcontext.cs       2005-05-10 15:50:31 UTC (rev 44328)
@@ -523,6 +523,8 @@
                        TypeContainer root = Tree.Types;
 
                        if (type_container_resolve_order != null){
+                               foreach (TypeContainer tc in 
type_container_resolve_order)
+                                       tc.ResolveType ();
                                if (RootContext.StdLib){
                                        foreach (TypeContainer tc in 
type_container_resolve_order)
                                                tc.DefineMembers (root);

Modified: trunk/mcs/gmcs/typemanager.cs
===================================================================
--- trunk/mcs/gmcs/typemanager.cs       2005-05-10 13:41:52 UTC (rev 44327)
+++ trunk/mcs/gmcs/typemanager.cs       2005-05-10 15:50:31 UTC (rev 44328)
@@ -1520,7 +1520,7 @@
        ///   to check base classes and interfaces anymore.
        /// </summary>
        private static MemberInfo [] MemberLookup_FindMembers (Type t, 
MemberTypes mt, BindingFlags bf,
-                                                           string name, out 
bool used_cache)
+                                                              string name, out 
bool used_cache)
        {
                MemberCache cache;
 
@@ -1577,6 +1577,18 @@
                        return (MemberInfo []) list;
                }
 
+               if (t.IsGenericInstance && (mt == MemberTypes.NestedType)) {
+                       //
+                       // This happens if we're resolving a class'es base 
class and interfaces
+                       // in TypeContainer.DefineType().  At this time, the 
types aren't
+                       // populated yet, so we can't use the cache.
+                       //
+                       MemberInfo[] info = t.FindMembers (mt, bf | 
BindingFlags.DeclaredOnly,
+                                                          
FilterWithClosure_delegate, name);
+                       used_cache = false;
+                       return info;
+               }
+
                //
                // This call will always succeed.  There is exactly one 
TypeHandle instance per
                // type, TypeHandle.GetMemberCache() will, if necessary, create 
a new one, and return

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

Reply via email to