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

Reply via email to