Author: marek
Date: 2008-01-22 10:47:33 -0500 (Tue, 22 Jan 2008)
New Revision: 93539
Modified:
trunk/mcs/mcs/ChangeLog
trunk/mcs/mcs/anonymous.cs
trunk/mcs/mcs/convert.cs
trunk/mcs/mcs/ecore.cs
trunk/mcs/mcs/generic.cs
trunk/mcs/mcs/lambda.cs
Log:
2008-01-22 Marek Safar <[EMAIL PROTECTED]>
A fix for bug #355145
* anonymous.cs, convert.cs, ecore.cs, generic.cs, lambda.cs: Implemented
expression tree type inference.
Modified: trunk/mcs/mcs/ChangeLog
===================================================================
--- trunk/mcs/mcs/ChangeLog 2008-01-22 15:40:26 UTC (rev 93538)
+++ trunk/mcs/mcs/ChangeLog 2008-01-22 15:47:33 UTC (rev 93539)
@@ -1,3 +1,9 @@
+2008-01-22 Marek Safar <[EMAIL PROTECTED]>
+
+ A fix for bug #355145
+ * anonymous.cs, convert.cs, ecore.cs, generic.cs, lambda.cs: Implemented
+ expression tree type inference.
+
2008-01-22 Raja R Harinath <[EMAIL PROTECTED]>
Fix #354663
@@ -2,3 +8,3 @@
* expression.cs (Binary.IsUnsignedType): Fix typo.
-
+
2008-01-22 Marek Safar <[EMAIL PROTECTED]>
Modified: trunk/mcs/mcs/anonymous.cs
===================================================================
--- trunk/mcs/mcs/anonymous.cs 2008-01-22 15:40:26 UTC (rev 93538)
+++ trunk/mcs/mcs/anonymous.cs 2008-01-22 15:47:33 UTC (rev 93539)
@@ -1269,9 +1269,15 @@
if (!HasExplicitParameters)
return false;
- if (!TypeManager.IsDelegateType (delegate_type))
- return false;
+ if (!TypeManager.IsDelegateType (delegate_type)) {
+ if (TypeManager.DropGenericTypeArguments
(delegate_type) != TypeManager.expression_type)
+ return false;
+ delegate_type =
delegate_type.GetGenericArguments () [0];
+ if (!TypeManager.IsDelegateType (delegate_type))
+ return false;
+ }
+
ParameterData d_params =
TypeManager.GetDelegateParameters (delegate_type);
if (d_params.Count != Parameters.Count)
return false;
Modified: trunk/mcs/mcs/convert.cs
===================================================================
--- trunk/mcs/mcs/convert.cs 2008-01-22 15:40:26 UTC (rev 93538)
+++ trunk/mcs/mcs/convert.cs 2008-01-22 15:47:33 UTC (rev 93539)
@@ -901,9 +901,10 @@
return true;
if (expr_type == TypeManager.anonymous_method_type){
- if (!TypeManager.IsDelegateType (target_type))
+ if (!TypeManager.IsDelegateType (target_type) &&
+ TypeManager.DropGenericTypeArguments
(target_type) != TypeManager.expression_type)
return false;
-
+
AnonymousMethodExpression ame =
(AnonymousMethodExpression) expr;
return ame.ImplicitStandardConversionExists
(target_type);
}
Modified: trunk/mcs/mcs/ecore.cs
===================================================================
--- trunk/mcs/mcs/ecore.cs 2008-01-22 15:40:26 UTC (rev 93538)
+++ trunk/mcs/mcs/ecore.cs 2008-01-22 15:47:33 UTC (rev 93539)
@@ -4041,7 +4041,7 @@
return null;
}
} else {
- if (type_arguments !=
null) {
+ if (type_arguments !=
null && !TypeManager.IsGenericMethod (best_candidate)) {
Namespace.Error_TypeArgumentsCannotBeUsed (best_candidate, loc);
return null;
}
Modified: trunk/mcs/mcs/generic.cs
===================================================================
--- trunk/mcs/mcs/generic.cs 2008-01-22 15:40:26 UTC (rev 93538)
+++ trunk/mcs/mcs/generic.cs 2008-01-22 15:47:33 UTC (rev 93539)
@@ -2582,9 +2582,13 @@
// an output type inference is made
for (int i = 0; i < arg_count; i++) {
Type t_i = methodParameters.ParameterType (i);
- if (!TypeManager.IsDelegateType (t_i))
- continue;
+ if (!TypeManager.IsDelegateType (t_i)) {
+ if
(TypeManager.DropGenericTypeArguments (t_i) != TypeManager.expression_type)
+ continue;
+ t_i = t_i.GetGenericArguments () [0];
+ }
+
MethodInfo mi = Delegate.GetInvokeMethod (t_i,
t_i);
Type rtype = mi.ReturnType;
@@ -2746,13 +2750,18 @@
public bool FixIndependentTypeArguments (ParameterData
methodParameters, ref bool fixed_any)
{
ArrayList types_to_fix = new ArrayList (unfixed_types);
- foreach (Type t in methodParameters.Types) {
+ for (int i = 0; i < methodParameters.Types.Length; ++i)
{
+ Type t = methodParameters.Types [i];
if (t.IsGenericParameter)
continue;
- if (!TypeManager.IsDelegateType (t))
- continue;
+ if (!TypeManager.IsDelegateType (t)) {
+ if
(TypeManager.DropGenericTypeArguments (t) != TypeManager.expression_type)
+ continue;
+ t = t.GetGenericArguments () [0];
+ }
+
MethodInfo invoke = Delegate.GetInvokeMethod
(t, t);
Type rtype = invoke.ReturnType;
if (!rtype.IsGenericParameter &&
!rtype.IsGenericType)
Modified: trunk/mcs/mcs/lambda.cs
===================================================================
--- trunk/mcs/mcs/lambda.cs 2008-01-22 15:40:26 UTC (rev 93538)
+++ trunk/mcs/mcs/lambda.cs 2008-01-22 15:47:33 UTC (rev 93539)
@@ -36,6 +36,9 @@
protected override Expression CreateExpressionTree (EmitContext
ec, Type delegate_type)
{
+ if (ec.IsInProbingMode)
+ return this;
+
Expression args = Parameters.CreateExpressionTree (ec,
loc);
Expression expr = Block.CreateExpressionTree (ec);
if (expr == null)
@@ -187,7 +190,8 @@
{
if (ec.ReturnType == TypeManager.void_type) {
statement_return = true;
- return Expr.Resolve (ec) != null;
+ Expr = Expr.Resolve (ec);
+ return Expr != null;
}
return base.Resolve (ec);
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches