2010-06-29 Marek Safar <marek.safar@gmail.com>
authorMarek Safar <marek.safar@gmail.com>
Tue, 29 Jun 2010 10:17:44 +0000 (10:17 -0000)
committerMarek Safar <marek.safar@gmail.com>
Tue, 29 Jun 2010 10:17:44 +0000 (10:17 -0000)
* driver.cs, expression.cs: Use Membercache for StringConcat when
it got all what is needed.

svn path=/trunk/mcs/; revision=159653

mcs/mcs/ChangeLog
mcs/mcs/driver.cs
mcs/mcs/expression.cs

index 71b8f2214349837cf53570c028e31c9dd875c562..4f42784ee94bfaa70c2550e8c1a994e5819504c0 100644 (file)
@@ -1,3 +1,8 @@
+2010-06-29  Marek Safar  <marek.safar@gmail.com>
+
+       * driver.cs, expression.cs: Use Membercache for StringConcat when
+       it got all what is needed.
+
 2010-06-29  Marek Safar  <marek.safar@gmail.com>
 
        * membercache.cs, expression.cs, statement.cs, doc.cs, ecore.cs:
index 2d0d096ed2b75c4072fad47f9de7b4912d0a6035..ed82199c88814f9226ac45e4e764e88977e5fd79 100644 (file)
@@ -2042,6 +2042,7 @@ namespace Mono.CSharp
                        Binary.Reset ();
                        ConstantFold.Reset ();
                        CastFromDecimal.Reset ();
+                       StringConcat.Reset ();
                        
                        NamespaceEntry.Reset ();
                        CodeGen.Reset ();
index d27cb589173a354552eb178f12caccef95cb464e..f1f59bb514effa16d7a2f20957b70c850c9eab2e 100644 (file)
@@ -3762,6 +3762,7 @@ namespace Mono.CSharp {
        //
        public class StringConcat : Expression {
                Arguments arguments;
+               static IList<MemberSpec> concat_members;
                
                public StringConcat (Expression left, Expression right, Location loc)
                {
@@ -3803,7 +3804,7 @@ namespace Mono.CSharp {
                        concat_args.Add (arguments [pos]);
                        add_args.Add (new Argument (arguments [pos].CreateExpressionTree (ec)));
 
-                       MethodGroupExpr method = CreateConcatMemberExpression ().Resolve (ec) as MethodGroupExpr;
+                       MethodGroupExpr method = CreateConcatMethodGroup ();
                        if (method == null)
                                return null;
 
@@ -3856,17 +3857,22 @@ namespace Mono.CSharp {
                        arguments.Add (new Argument (operand));
                }
 
-               Expression CreateConcatMemberExpression ()
+               MethodGroupExpr CreateConcatMethodGroup ()
                {
-                       return new MemberAccess (new MemberAccess (new QualifiedAliasMember ("global", "System", loc), "String", loc), "Concat", loc);
+                       if (concat_members == null) {
+                               concat_members = MemberCache.FindMembers (type,
+                                       MemberFilter.Method ("Concat", -1, null, type), BindingRestriction.DeclaredOnly);
+                       }
+
+                       return new MethodGroupExpr (concat_members, type, loc);
                }
 
                public override void Emit (EmitContext ec)
                {
-                       Expression concat = new Invocation (CreateConcatMemberExpression (), arguments, true);
-                       concat = concat.Resolve (new ResolveContext (ec.MemberContext));
-                       if (concat != null)
-                               concat.Emit (ec);
+                       var mg = CreateConcatMethodGroup ();
+                       mg = mg.OverloadResolve (new ResolveContext (ec.MemberContext), ref arguments, false, loc);
+                       if (mg != null)
+                               mg.EmitCall (ec, arguments);
                }
 
                public override SLE.Expression MakeExpression (BuilderContext ctx)
@@ -3877,6 +3883,11 @@ namespace Mono.CSharp {
                        var concat = typeof (string).GetMethod ("Concat", new[] { typeof (object), typeof (object) });
                        return SLE.Expression.Add (arguments[0].Expr.MakeExpression (ctx), arguments[1].Expr.MakeExpression (ctx), concat);
                }
+
+               public static void Reset ()
+               {
+                       concat_members = null;
+               }
        }
 
        //