[656918] Emit instance expression for ET delegate creation
authorMarek Safar <marek.safar@gmail.com>
Tue, 14 Dec 2010 14:10:14 +0000 (14:10 +0000)
committerMarek Safar <marek.safar@gmail.com>
Tue, 14 Dec 2010 14:11:20 +0000 (14:11 +0000)
mcs/mcs/delegate.cs
mcs/tests/gtest-etree-07.cs

index 5363231550ae2ba64cc15ce88c87f9c73179c53c..1d7be8f894b569cc3e0cbf18c48550c990f62d62 100644 (file)
@@ -451,7 +451,12 @@ namespace Mono.CSharp {
 
                        Arguments args = new Arguments (3);
                        args.Add (new Argument (new TypeOf (new TypeExpression (type, loc), loc)));
-                       args.Add (new Argument (new NullLiteral (loc)));
+
+                       if (method_group.InstanceExpression == null)
+                               args.Add (new Argument (new NullLiteral (loc)));
+                       else
+                               args.Add (new Argument (method_group.InstanceExpression.CreateExpressionTree (ec)));
+
                        args.Add (new Argument (method_group.CreateExpressionTree (ec)));
                        Expression e = new Invocation (ma, args).Resolve (ec);
                        if (e == null)
index 067717a7f1e6bb808baaceb6a60a9eeee03f22fd..14455fac6a1130ad23903c599e4ece4d3dd85617 100644 (file)
@@ -20,6 +20,21 @@ class C
                return (int*)1;
        }
        
+       void M ()
+       {
+       }
+       
+       int TestInstance ()
+       {
+               Expression<Func<EmptyDelegate>> e = () => M;
+               Console.WriteLine (e.Body.ToString ());
+               if (e.Body.ToString () != "Convert(CreateDelegate(EmptyDelegate, value(C), Void M()))")
+                       return 1;
+               
+               e.Compile () ();
+               return 0;
+       }
+       
        public static int Main ()
        {
                Expression<Func<EmptyDelegate>> e = () => new EmptyDelegate (Test);
@@ -52,6 +67,9 @@ class C
                        if (v3.Invoke ()() != (int*)1)
                                return 6;
                }
+               
+               if (new C ().TestInstance () != 0)
+                       return 7;
 
                Console.WriteLine ("OK");
                return 0;