[mcs] Resolve delegate optional parameters only once. Fixes #26840
authorMarek Safar <marek.safar@gmail.com>
Tue, 10 Feb 2015 07:49:11 +0000 (08:49 +0100)
committerMarek Safar <marek.safar@gmail.com>
Tue, 10 Feb 2015 07:49:50 +0000 (08:49 +0100)
mcs/mcs/class.cs
mcs/mcs/delegate.cs
mcs/mcs/method.cs
mcs/mcs/property.cs
mcs/tests/gtest-optional-35.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_5.xml

index eafcb6d9d1bcfe3b9aef909cf35270e6a76d43b3..5725f0d45ff6123c89fc18ef12d153b58e48b7d9 100644 (file)
@@ -1730,21 +1730,14 @@ namespace Mono.CSharp
 
                        foreach (var member in members) {
                                var pbm = member as PropertyBasedMember;
-                               if (pbm != null)
+                               if (pbm != null) {
                                        pbm.PrepareEmit ();
+                                       continue;
+                               }
 
-                               var pm = member as IParametersMember;
-                               if (pm != null) {
-                                       var mc = member as MethodOrOperator;
-                                       if (mc != null) {
-                                               mc.PrepareEmit ();
-                                       }
-
-                                       var p = pm.Parameters;
-                                       if (p.IsEmpty)
-                                               continue;
-
-                                       ((ParametersCompiled) p).ResolveDefaultValues (member);
+                               var mc = member as MethodCore;
+                               if (mc != null) {
+                                       mc.PrepareEmit ();
                                        continue;
                                }
 
index 844c04e5771a7aeb4eb23dcbc5773abb5d076ca7..2073041afa252248e1f856efef43e9b91afaa1d4 100644 (file)
@@ -297,10 +297,6 @@ namespace Mono.CSharp {
                        if ((caching_flags & Flags.CloseTypeCreated) != 0)
                                return;
 
-                       if (!Parameters.IsEmpty) {
-                               parameters.ResolveDefaultValues (this);
-                       }
-
                        InvokeBuilder.PrepareEmit ();
                        if (BeginInvokeBuilder != null) {
                                BeginInvokeBuilder.PrepareEmit ();
index 32755b36de183e1e984dafad2f764445a8e898d3..8df1be80a97852aef5909b2e0f42bf905035dd73 100644 (file)
@@ -165,6 +165,11 @@ namespace Mono.CSharp {
                        return s + parameters.GetSignatureForDocumentation ();
                }
 
+               public virtual void PrepareEmit ()
+               {
+                       parameters.ResolveDefaultValues (this);
+               }
+
                public MethodSpec Spec {
                        get { return spec; }
                }
@@ -816,8 +821,10 @@ namespace Mono.CSharp {
 
                #endregion
 
-               public virtual void PrepareEmit ()
+               public override void PrepareEmit ()
                {
+                       base.PrepareEmit ();
+
                        var mb = MethodData.DefineMethodBuilder (Parent);
 
                        if (CurrentTypeParameters != null) {
index 3b42095de9f9ec178b064b05272c1164345a3877..d52b1da393ea05e99971a02458a74f56cb66fbd9 100644 (file)
@@ -1756,6 +1756,13 @@ namespace Mono.CSharp
                        return base.GetSignatureForDocumentation () + parameters.GetSignatureForDocumentation ();
                }
 
+               public override void PrepareEmit ()
+               {
+                       parameters.ResolveDefaultValues (this);
+
+                       base.PrepareEmit ();
+               }
+
                protected override bool VerifyClsCompliance ()
                {
                        if (!base.VerifyClsCompliance ())
diff --git a/mcs/tests/gtest-optional-35.cs b/mcs/tests/gtest-optional-35.cs
new file mode 100644 (file)
index 0000000..e354bd7
--- /dev/null
@@ -0,0 +1,11 @@
+using System;
+using System.Runtime.InteropServices;
+
+public static class MainClass
+{
+       public static void Main (string[] args)
+       {
+       }
+
+       public delegate Int32 FooDelegate ([In, Optional] int foo);
+}
\ No newline at end of file
index d96050927c723bf3dff597f7f729cbabeee7c28c..7aa05bec7e89b7e7adb1fbbc310d787b9e8b6df3 100644 (file)
       </method>\r
     </type>\r
   </test>\r
+  <test name="gtest-optional-35.cs">\r
+    <type name="MainClass">\r
+      <method name="Void Main(System.String[])" attrs="150">\r
+        <size>2</size>\r
+      </method>\r
+    </type>\r
+    <type name="MainClass+FooDelegate">\r
+      <method name="Int32 Invoke(Int32)" attrs="454">\r
+        <size>0</size>\r
+      </method>\r
+      <method name="System.IAsyncResult BeginInvoke(Int32, System.AsyncCallback, System.Object)" attrs="454">\r
+        <size>0</size>\r
+      </method>\r
+      <method name="Int32 EndInvoke(System.IAsyncResult)" attrs="454">\r
+        <size>0</size>\r
+      </method>\r
+      <method name="Void .ctor(Object, IntPtr)" attrs="6278">\r
+        <size>0</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="gtest-partial-01.cs">\r
     <type name="B`1[U]">\r
       <method name="Void .ctor()" attrs="6278">\r
       </method>\r
     </type>\r
   </test>\r
+  <test name="test-pragma-unrecognized.cs">\r
+    <type name="C">\r
+      <method name="Void Main()" attrs="150">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="test-primary-ctor-01.cs">\r
     <type name="Simple">\r
       <method name="Int32 get_Property()" attrs="2177">\r
       </method>\r
     </type>\r
   </test>\r
-  <test name="test-pragma-unrecognized.cs">\r
-    <type name="C">\r
-      <method name="Void Main()" attrs="150">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
-    </type>\r
-  </test>\r
 </tests>
\ No newline at end of file