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