From 452b6589e12c2b75df440ba768a006bf6dd6fc5a Mon Sep 17 00:00:00 2001 From: marek Date: Thu, 5 Nov 2009 10:10:06 +0000 Subject: [PATCH] 2009-11-05 Marek Safar * statement.cs: Dynamic statements. git-svn-id: svn+ssh://mono-cvs.ximian.com/source/trunk/mcs@145469 e3ebcda4-bce8-0310-ba0a-eca2169e7518 --- mcs/ChangeLog | 4 ++++ mcs/statement.cs | 23 ++++++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/mcs/ChangeLog b/mcs/ChangeLog index 3a2e03d429..5cdfbeef1c 100644 --- a/mcs/ChangeLog +++ b/mcs/ChangeLog @@ -1,3 +1,7 @@ +2009-11-05 Marek Safar + + * statement.cs: Dynamic statements. + 2009-11-04 Marek Safar * dynamic.cs, assign.cs, context.cs, expression.cs, ecore.cs: diff --git a/mcs/statement.cs b/mcs/statement.cs index 7039e2aab8..b4bc0bfebf 100644 --- a/mcs/statement.cs +++ b/mcs/statement.cs @@ -4904,11 +4904,15 @@ namespace Mono.CSharp { expr_type = expr.Type; - if (!TypeManager.ImplementsInterface (expr_type, TypeManager.idisposable_type)) { - if (Convert.ImplicitConversion (ec, expr, TypeManager.idisposable_type, loc) == null) { + if (!TypeManager.ImplementsInterface (expr_type, TypeManager.idisposable_type) && + Convert.ImplicitConversion (ec, expr, TypeManager.idisposable_type, loc) == null) { + if (!TypeManager.IsDynamicType (expr_type)) { Using.Error_IsNotConvertibleToIDisposable (ec, expr); return false; } + + expr = Convert.ImplicitConversionRequired (ec, expr, TypeManager.idisposable_type, loc); + expr_type = expr.Type; } local_copy = new TemporaryVariable (expr_type, loc); @@ -5093,6 +5097,13 @@ namespace Mono.CSharp { Expression e = Convert.ImplicitConversionStandard (ec, assign, TypeManager.idisposable_type, var.Location); if (e == null) { + if (TypeManager.IsDynamicType (assign.Type)) { + e = Convert.ImplicitConversionRequired (ec, assign, TypeManager.idisposable_type, loc); + var = new TemporaryVariable (e.Type, loc); + assign = new SimpleAssign (var, e, loc).ResolveStatement (ec); + return true; + } + Error_IsNotConvertibleToIDisposable (ec, var); return false; } @@ -5643,6 +5654,10 @@ namespace Mono.CSharp { { enumerator_type = TypeManager.ienumerator_type; + bool is_dynamic = TypeManager.IsDynamicType (expr.Type); + if (is_dynamic) + expr = Convert.ImplicitConversionRequired (ec, expr, TypeManager.ienumerable_type, loc); + if (!ProbeCollectionType (ec, expr.Type)) { Error_Enumerator (ec); return false; @@ -5651,7 +5666,9 @@ namespace Mono.CSharp { VarExpr ve = var_type as VarExpr; if (ve != null) { // Infer implicitly typed local variable from foreach enumerable type - var_type = new TypeExpression (get_current.PropertyInfo.PropertyType, var_type.Location); + var_type = new TypeExpression ( + is_dynamic ? InternalType.Dynamic : get_current.PropertyInfo.PropertyType, + var_type.Location); } var_type = var_type.ResolveAsTypeTerminal (ec, false); -- 2.11.4.GIT