Author: marek
Date: 2007-08-23 11:22:02 -0400 (Thu, 23 Aug 2007)
New Revision: 84703
Modified:
trunk/mcs/gmcs/ChangeLog
trunk/mcs/gmcs/generic.cs
Log:
2007-08-23 Marek Safar <[EMAIL PROTECTED]>
* generic.cs (TypeInferenceV3.DoSecondPhase): Handle nested delegate
type parameters.
(IsTypeNonDependent, RemoveDependentTypes): Handle nested delegate
type parameters.
Modified: trunk/mcs/gmcs/ChangeLog
===================================================================
--- trunk/mcs/gmcs/ChangeLog 2007-08-23 15:17:06 UTC (rev 84702)
+++ trunk/mcs/gmcs/ChangeLog 2007-08-23 15:22:02 UTC (rev 84703)
@@ -1,3 +1,10 @@
+2007-08-23 Marek Safar <[EMAIL PROTECTED]>
+
+ * generic.cs (TypeInferenceV3.DoSecondPhase): Handle nested delegate
+ type parameters.
+ (IsTypeNonDependent, RemoveDependentTypes): Handle nested delegate
+ type parameters.
+
2007-08-21 Marek Safar <[EMAIL PROTECTED]>
* cs-parser.jay, linq.cs: Implemented orderby clause.
Modified: trunk/mcs/gmcs/generic.cs
===================================================================
--- trunk/mcs/gmcs/generic.cs 2007-08-23 15:17:06 UTC (rev 84702)
+++ trunk/mcs/gmcs/generic.cs 2007-08-23 15:22:02 UTC (rev 84703)
@@ -2676,22 +2676,16 @@
rtype = g_args[rtype.GenericParameterPosition];
#endif
- if (!rtype.IsGenericParameter)
- continue;
-
- if (tic.IsUnfixed (rtype) < 0)
- continue;
-
- ParameterData d_parameters =
TypeManager.GetParameterData (mi);
- bool all_params_fixed = true;
- foreach (Type t in d_parameters.Types) {
- if (!t.IsGenericParameter)
- continue;
-
- if (tic.IsUnfixed (t) >= 0) {
- all_params_fixed = false;
- break;
- }
+ bool all_params_fixed = false;
+ if (rtype.IsGenericParameter) {
+ all_params_fixed =
tic.IsTypeNonDependent (mi, rtype);
+ } else if (rtype.IsGenericType) {
+ all_params_fixed = true;
+ foreach (Type t in
rtype.GetGenericArguments ())
+ if (!tic.IsTypeNonDependent
(mi, t)) {
+ all_params_fixed =
false;
+ break;
+ }
}
if (all_params_fixed)
@@ -2828,7 +2822,7 @@
MethodInfo invoke = Delegate.GetInvokeMethod
(t, t);
Type rtype = invoke.ReturnType;
- if (!rtype.IsGenericParameter)
+ if (!rtype.IsGenericParameter &&
!rtype.IsGenericType)
continue;
#if MS_COMPATIBLE
@@ -2839,16 +2833,17 @@
rtype = g_args [rtype.GenericParameterPosition];
#endif
- if (rtype.IsGenericParameter)
- types_to_fix
[rtype.GenericParameterPosition] = null;
+ // Remove dependent types, they cannot be fixed
yet
+ RemoveDependentTypes (types_to_fix, rtype);
}
foreach (Type t in types_to_fix) {
if (t == null)
continue;
- if (!FixType (IsUnfixed (t)))
+ if (!FixType (IsUnfixed (t))) {
return false;
+ }
}
fixed_any = types_to_fix.Count > 0;
@@ -2905,6 +2900,23 @@
return true;
}
+ public bool IsTypeNonDependent (MethodInfo mi, Type type)
+ {
+ if (IsUnfixed (type) < 0)
+ return false;
+
+ ParameterData d_parameters =
TypeManager.GetParameterData (mi);
+ foreach (Type t in d_parameters.Types) {
+ if (!t.IsGenericParameter)
+ continue;
+
+ if (IsUnfixed (t) >= 0)
+ return false;
+ }
+
+ return true;
+ }
+
public int IsUnfixed (Type type)
{
if (!type.IsGenericParameter)
@@ -3026,6 +3038,20 @@
LowerBoundInference (e.Type, t);
}
+ static void RemoveDependentTypes (ArrayList types, Type
returnType)
+ {
+ if (returnType.IsGenericParameter) {
+ types [returnType.GenericParameterPosition] =
null;
+ return;
+ }
+
+ if (returnType.IsGenericType) {
+ foreach (Type t in
returnType.GetGenericArguments ()) {
+ RemoveDependentTypes (types, t);
+ }
+ }
+ }
+
public bool UnfixedVariableExists {
get {
foreach (Type ut in unfixed_types)
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches