Author: marek
Date: 2008-01-24 14:57:00 -0500 (Thu, 24 Jan 2008)
New Revision: 93830

Modified:
   trunk/mcs/mcs/ChangeLog
   trunk/mcs/mcs/ecore.cs
   trunk/mcs/mcs/expression.cs
   trunk/mcs/mcs/generic.cs
Log:
2008-01-24  Marek Safar  <[EMAIL PROTECTED]>

        * ecore.cs, expression.cs, generic.cs: Implemented Convert, 
ConvertChecked.
        Fixed user operator conversions.



Modified: trunk/mcs/mcs/ChangeLog
===================================================================
--- trunk/mcs/mcs/ChangeLog     2008-01-24 18:53:34 UTC (rev 93829)
+++ trunk/mcs/mcs/ChangeLog     2008-01-24 19:57:00 UTC (rev 93830)
@@ -1,5 +1,10 @@
 2008-01-24  Marek Safar  <[EMAIL PROTECTED]>
 
+       * ecore.cs, expression.cs, generic.cs: Implemented Convert, 
ConvertChecked.
+       Fixed user operator conversions.
+       
+2008-01-24  Marek Safar  <[EMAIL PROTECTED]>
+
        * generic.cs: Do nullable type to null comparison optimization during
        resolve phase.
        

Modified: trunk/mcs/mcs/ecore.cs
===================================================================
--- trunk/mcs/mcs/ecore.cs      2008-01-24 18:53:34 UTC (rev 93829)
+++ trunk/mcs/mcs/ecore.cs      2008-01-24 19:57:00 UTC (rev 93830)
@@ -1322,7 +1322,7 @@
                        ArrayList args = new ArrayList (2);
                        args.Add (new Argument (child.CreateExpressionTree 
(ec)));
                        args.Add (new Argument (new TypeOf (new TypeExpression 
(type, loc), loc)));
-                       return CreateExpressionFactoryCall ("Convert", args);
+                       return CreateExpressionFactoryCall (ec.CheckState ? 
"ConvertChecked" : "Convert", args);
                }
 
                public override Expression DoResolve (EmitContext ec)
@@ -3513,7 +3513,8 @@
 
                public override Expression CreateExpressionTree (EmitContext ec)
                {
-                       return new Cast (new TypeExpression (typeof 
(MethodInfo), loc), new TypeOfMethod (this));
+                       return new Cast (new TypeExpression (typeof 
(MethodInfo), loc),
+                               new TypeOfMethod ((MethodInfo)best_candidate, 
loc));
                }
                
                override public Expression DoResolve (EmitContext ec)

Modified: trunk/mcs/mcs/expression.cs
===================================================================
--- trunk/mcs/mcs/expression.cs 2008-01-24 18:53:34 UTC (rev 93829)
+++ trunk/mcs/mcs/expression.cs 2008-01-24 19:57:00 UTC (rev 93830)
@@ -89,9 +89,8 @@
                        return new UserOperatorCall (mg, args, null, loc);
                }
 
-               [Obsolete ("It may not be compatible with expression trees")]
-               public MethodInfo Method {
-                       get { return (MethodInfo)mg; }
+               public MethodGroupExpr Method {
+                       get { return mg; }
                }
        }
 
@@ -1044,7 +1043,7 @@
                                if (method == null)
                                        LoadOneAndEmitOp (ec, expr.Type);
                                else
-                                       ec.ig.Emit (OpCodes.Call, 
method.Method);
+                                       ec.ig.Emit (OpCodes.Call, 
(MethodInfo)method.Method);
                                recurse = false;
                                return;
                        }
@@ -2012,15 +2011,12 @@
 
                                if (union != null) {
                                        ArrayList args = new ArrayList (2);
-                                       args.Add (new Argument (left, 
Argument.AType.Expression));
-                                       args.Add (new Argument (right, 
Argument.AType.Expression));
+                                       args.Add (new Argument (left));
+                                       args.Add (new Argument (right));
 
-                                       union = union.OverloadResolve (ec, ref 
args, true, Location.Null);
-
-                                       if (union != null) {
-                                               MethodInfo mi = (MethodInfo) 
union;
-                                               return new BinaryMethod 
(mi.ReturnType, mi, args);
-                                       }
+                                       union = union.OverloadResolve (ec, ref 
args, true, loc);
+                                       if (union != null)
+                                               return new UserOperatorCall 
(union, args, CreateExpressionTree, loc);                           
                                }
                        }
 
@@ -3066,13 +3062,18 @@
                        target.left = left.Clone (clonectx);
                        target.right = right.Clone (clonectx);
                }
-
+               
                public override Expression CreateExpressionTree (EmitContext ec)
                {
+                       return CreateExpressionTree (ec, null);
+               }
+
+               Expression CreateExpressionTree (EmitContext ec, 
MethodGroupExpr method)                
+               {
                        string method_name;
                        switch (oper) {
                        case Operator.Addition:
-                               if (ec.CheckState)
+                               if (method == null && ec.CheckState)
                                        method_name = "AddChecked";
                                else
                                        method_name = "Add";
@@ -3104,6 +3105,9 @@
                        ArrayList args = new ArrayList (2);
                        args.Add (new Argument (left.CreateExpressionTree 
(ec)));
                        args.Add (new Argument (right.CreateExpressionTree 
(ec)));
+                       if (method != null)
+                               args.Add (new Argument 
(method.CreateExpressionTree (ec)));
+                       
                        return CreateExpressionFactoryCall (method_name, args);
                }
        }
@@ -3273,7 +3277,8 @@
        public class ConditionalLogicalOperator : Expression {
                Expression left, right;
                bool is_and;
-               Expression op_true, op_false, op;
+               Expression op_true, op_false;
+               UserOperatorCall op;
                LocalTemporary left_temp;
 
                public ConditionalLogicalOperator (bool is_and, Expression 
left, Expression right, Type t, Location loc)
@@ -3285,6 +3290,15 @@
                        this.right = right;
                        this.is_and = is_and;
                }
+               
+               public override Expression CreateExpressionTree (EmitContext ec)
+               {
+                       ArrayList args = new ArrayList (3);
+                       args.Add (new Argument (left.CreateExpressionTree 
(ec)));
+                       args.Add (new Argument (right.CreateExpressionTree 
(ec)));
+                       args.Add (new Argument (op.Method.CreateExpressionTree 
(ec)));
+                       return CreateExpressionFactoryCall (is_and ? "AndAlso" 
: "OrAlso", args);
+               }               
 
                protected void Error19 ()
                {
@@ -6430,7 +6444,7 @@
 
        internal class TypeOfMethod : Expression
        {
-               readonly MethodGroupExpr method;
+               readonly MethodInfo method;
                static MethodInfo get_type_from_handle;
 
                static TypeOfMethod ()
@@ -6439,10 +6453,10 @@
                                new Type [] { 
TypeManager.runtime_method_handle_type });
                }
 
-               public TypeOfMethod (MethodGroupExpr method)
+               public TypeOfMethod (MethodInfo method, Location loc)
                {
                        this.method = method;
-                       loc = method.Location;
+                       this.loc = loc;
                }
 
                public override Expression DoResolve (EmitContext ec)
@@ -6454,7 +6468,7 @@
 
                public override void Emit (EmitContext ec)
                {
-                       ec.ig.Emit (OpCodes.Ldtoken, (MethodInfo)method);
+                       ec.ig.Emit (OpCodes.Ldtoken, method);
                        ec.ig.Emit (OpCodes.Call, get_type_from_handle);
                }
        }
@@ -6960,6 +6974,12 @@
                        Expr = e;
                        loc = l;
                }
+               
+               public override Expression CreateExpressionTree (EmitContext ec)
+               {
+                       using (ec.With (EmitContext.Flags.AllCheckStateFlags, 
true))
+                               return Expr.CreateExpressionTree (ec);
+               }
 
                public override Expression DoResolve (EmitContext ec)
                {
@@ -7009,6 +7029,12 @@
                        Expr = e;
                        loc = l;
                }
+               
+               public override Expression CreateExpressionTree (EmitContext ec)
+               {
+                       using (ec.With (EmitContext.Flags.AllCheckStateFlags, 
false))
+                               return Expr.CreateExpressionTree (ec);
+               }
 
                public override Expression DoResolve (EmitContext ec)
                {
@@ -8165,7 +8191,7 @@
        }       
 
        public class UserCast : Expression {
-               MethodBase method;
+               MethodInfo method;
                Expression source;
                
                public UserCast (MethodInfo method, Expression source, Location 
l)
@@ -8182,6 +8208,16 @@
                                return source;
                        }
                }
+
+               public override Expression CreateExpressionTree (EmitContext ec)
+               {
+                       ArrayList args = new ArrayList (2);
+                       args.Add (new Argument (source.CreateExpressionTree 
(ec)));
+                       args.Add (new Argument (new TypeOf (new TypeExpression 
(type, loc), loc)));
+                       args.Add (new Argument (new Cast (new TypeExpression 
(typeof (MethodInfo), loc),
+                               new TypeOfMethod (method, loc))));
+                       return CreateExpressionFactoryCall ("Convert", args);
+               }
                        
                public override Expression DoResolve (EmitContext ec)
                {
@@ -8193,15 +8229,8 @@
 
                public override void Emit (EmitContext ec)
                {
-                       ILGenerator ig = ec.ig;
-
                        source.Emit (ec);
-                       
-                       if (method is MethodInfo)
-                               ig.Emit (OpCodes.Call, (MethodInfo) method);
-                       else
-                               ig.Emit (OpCodes.Call, (ConstructorInfo) 
method);
-
+                       ec.ig.Emit (OpCodes.Call, method);
                }
        }
 
@@ -8725,7 +8754,7 @@
                                if (e == EmptyExpressionStatement.Instance)
                                        initializers.RemoveAt (i--);
                                else
-                                       initializers [i] = e;                   
        
+                                       initializers [i] = e;
                        }
 
                        type = typeof (CollectionOrObjectInitializers);

Modified: trunk/mcs/mcs/generic.cs
===================================================================
--- trunk/mcs/mcs/generic.cs    2008-01-24 18:53:34 UTC (rev 93829)
+++ trunk/mcs/mcs/generic.cs    2008-01-24 19:57:00 UTC (rev 93830)
@@ -3380,6 +3380,11 @@
                                this.expr = expr;
                                this.loc = loc;
                        }
+                       
+                       public override Expression CreateExpressionTree 
(EmitContext ec)
+                       {
+                               return expr.CreateExpressionTree (ec);
+                       }                       
 
                        public override Expression DoResolve (EmitContext ec)
                        {
@@ -3775,9 +3780,23 @@
                        
                        public override Expression CreateExpressionTree 
(EmitContext ec)
                        {
-                               ArrayList args = new ArrayList (2);
+                               UserCast uc = left as UserCast;
+                               Expression conversion = null;
+                               if (uc != null) {
+                                       left = uc.Source;
+
+                                       ArrayList c_args = new ArrayList (2);
+                                       c_args.Add (new Argument 
(uc.CreateExpressionTree (ec)));
+                                       c_args.Add (new Argument 
(left.CreateExpressionTree (ec)));
+                                       conversion = 
CreateExpressionFactoryCall ("Lambda", c_args);
+                               }
+
+                               ArrayList args = new ArrayList (3);
                                args.Add (new Argument 
(left.CreateExpressionTree (ec)));
                                args.Add (new Argument 
(right.CreateExpressionTree (ec)));
+                               if (conversion != null)
+                                       args.Add (new Argument (conversion));
+                               
                                return CreateExpressionFactoryCall ("Coalesce", 
args);
                        }                       
 

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to