[mcs] Emit all method like members in same order as they appear in source code. Fixes...
authorMarek Safar <marek.safar@gmail.com>
Mon, 5 May 2014 15:53:26 +0000 (17:53 +0200)
committerMarek Safar <marek.safar@gmail.com>
Mon, 5 May 2014 15:53:26 +0000 (17:53 +0200)
12 files changed:
mcs/mcs/anonymous.cs
mcs/mcs/class.cs
mcs/mcs/expression.cs
mcs/mcs/method.cs
mcs/mcs/property.cs
mcs/tests/test-890.cs [new file with mode: 0644]
mcs/tests/test-debug-10-ref.xml
mcs/tests/test-debug-13-ref.xml
mcs/tests/test-debug-21-ref.xml
mcs/tests/test-debug-22-ref.xml
mcs/tests/test-debug-23-ref.xml
mcs/tests/ver-il-net_4_5.xml

index ee7a821c66d6b8777c668edc382f4f2710e15e8f..9431e499d0c83fea6d33649604e2d2c268211085 100644 (file)
@@ -2174,7 +2174,6 @@ namespace Mono.CSharp {
 
                        equals.Block = equals_block;
                        equals.Define ();
-                       equals.PrepareEmit ();
                        Members.Add (equals);
 
                        //
@@ -2229,7 +2228,6 @@ namespace Mono.CSharp {
                        hashcode_block.AddStatement (new Return (hash_variable, loc));
                        hashcode.Block = hashcode_top;
                        hashcode.Define ();
-                       hashcode.PrepareEmit ();
                        Members.Add (hashcode);
 
                        //
@@ -2240,7 +2238,6 @@ namespace Mono.CSharp {
                        tostring_block.AddStatement (new Return (string_concat, loc));
                        tostring.Block = tostring_block;
                        tostring.Define ();
-                       tostring.PrepareEmit ();
                        Members.Add (tostring);
 
                        return true;
index 0ad524e8c93783f978514ba2437b5831805b889b..0bd37f2c170b10de0dde8a01444f0da747dd766f 100644 (file)
@@ -1684,6 +1684,10 @@ namespace Mono.CSharp
                                return;
 
                        foreach (var member in members) {
+                               var pbm = member as PropertyBasedMember;
+                               if (pbm != null)
+                                       pbm.PrepareEmit ();
+
                                var pm = member as IParametersMember;
                                if (pm != null) {
                                        var mc = member as MethodOrOperator;
@@ -1696,6 +1700,7 @@ namespace Mono.CSharp
                                                continue;
 
                                        ((ParametersCompiled) p).ResolveDefaultValues (member);
+                                       continue;
                                }
 
                                var c = member as Const;
index 738fa9086450bf03d97364104fe15de03cadbac3..28c2a117e15336a6c1e05d12560968f92c4bf84a 100644 (file)
@@ -11176,6 +11176,7 @@ namespace Mono.CSharp
                        type.Define ();
                        if ((ec.Report.Errors - errors) == 0) {
                                parent.Module.AddAnonymousType (type);
+                               type.PrepareEmit ();
                        }
 
                        return type;
index 8cd899b7b27efc4f81abca15c5267a1723fe79da..4eff42e716b64dfcc8459455d0e6cdd3a880273b 100644 (file)
@@ -2468,6 +2468,11 @@ namespace Mono.CSharp {
                        return false;
                }
 
+               public void PrepareEmit ()
+               {
+                       method_data.DefineMethodBuilder (Parent.PartialContainer, ParameterInfo);
+               }
+
                public override void WriteDebugSymbol (MonoSymbolFile file)
                {
                        if (method_data != null)
index fde833054cc6d374f6c1341df5dfef56bf125f64..339d42d8f6753c1fad8a13f00ee0a4f5f1935a5d 100644 (file)
@@ -82,6 +82,8 @@ namespace Mono.CSharp
                        }
                }
 
+               public abstract void PrepareEmit ();
+
                protected override bool VerifyClsCompliance ()
                {
                        if (!base.VerifyClsCompliance ())
@@ -197,7 +199,7 @@ namespace Mono.CSharp
                        {
                        }
 
-                       public override MethodBuilder Define (TypeContainer parent)
+                       public override void Define (TypeContainer parent)
                        {
                                base.Define (parent);
 
@@ -205,12 +207,7 @@ namespace Mono.CSharp
 
                                method_data = new MethodData (method, ModFlags, flags, this);
 
-                               if (!method_data.Define (parent.PartialContainer, method.GetFullName (MemberName)))
-                                       return null;
-
-                               method_data.DefineMethodBuilder (parent.PartialContainer, ParameterInfo);
-
-                               return method_data.MethodBuilder;
+                               method_data.Define (parent.PartialContainer, method.GetFullName (MemberName));
                        }
 
                        public override TypeSpec ReturnType {
@@ -262,7 +259,7 @@ namespace Mono.CSharp
                            }
                        }
 
-                       public override MethodBuilder Define (TypeContainer parent)
+                       public override void Define (TypeContainer parent)
                        {
                                parameters.Resolve (this);
                                
@@ -272,12 +269,7 @@ namespace Mono.CSharp
 
                                method_data = new MethodData (method, ModFlags, flags, this);
 
-                               if (!method_data.Define (parent.PartialContainer, method.GetFullName (MemberName)))
-                                       return null;
-
-                               method_data.DefineMethodBuilder (parent.PartialContainer, ParameterInfo);
-
-                               return method_data.MethodBuilder;
+                               method_data.Define (parent.PartialContainer, method.GetFullName (MemberName));
                        }
 
                        public override TypeSpec ReturnType {
@@ -334,7 +326,7 @@ namespace Mono.CSharp
                                return method.IsClsComplianceRequired ();
                        }
 
-                       public virtual MethodBuilder Define (TypeContainer parent)
+                       public virtual void Define (TypeContainer parent)
                        {
                                var container = parent.PartialContainer;
 
@@ -369,8 +361,6 @@ namespace Mono.CSharp
                                        if (Compiler.Settings.WriteMetadataOnly)
                                                block = null;
                                }
-
-                               return null;
                        }
 
                        public bool HasCustomAccessModifier {
@@ -624,24 +614,14 @@ namespace Mono.CSharp
 
                        if (Get != null) {
                                spec.Get = Get.Spec;
-
-                               var method = Get.Spec.GetMetaInfo () as MethodBuilder;
-                               if (method != null) {
-                                       PropertyBuilder.SetGetMethod (method);
-                                       Parent.MemberCache.AddMember (this, method.Name, Get.Spec);
-                               }
+                               Parent.MemberCache.AddMember (this, Get.Spec.Name, Get.Spec);
                        } else {
                                CheckMissingAccessor (kind, parameters, true);
                        }
 
                        if (Set != null) {
                                spec.Set = Set.Spec;
-
-                               var method = Set.Spec.GetMetaInfo () as MethodBuilder;
-                               if (method != null) {
-                                       PropertyBuilder.SetSetMethod (method);
-                                       Parent.MemberCache.AddMember (this, method.Name, Set.Spec);
-                               }
+                               Parent.MemberCache.AddMember (this, Set.Spec.Name, Set.Spec);
                        } else {
                                CheckMissingAccessor (kind, parameters, false);
                        }
@@ -681,6 +661,25 @@ namespace Mono.CSharp
                        }
                }
 
+               public override void PrepareEmit ()
+               {
+                       AccessorFirst.PrepareEmit ();
+                       if (AccessorSecond != null)
+                               AccessorSecond.PrepareEmit ();
+
+                       if (get != null) {
+                               var method = Get.Spec.GetMetaInfo () as MethodBuilder;
+                               if (method != null)
+                                       PropertyBuilder.SetGetMethod (method);
+                       }
+
+                       if (set != null) {
+                               var method = Set.Spec.GetMetaInfo () as MethodBuilder;
+                               if (method != null)
+                                       PropertyBuilder.SetSetMethod (method);
+                       }
+               }
+
                protected override void SetMemberName (MemberName new_name)
                {
                        base.SetMemberName (new_name);
@@ -859,10 +858,10 @@ namespace Mono.CSharp
                        {
                        }
 
-                       public override MethodBuilder Define (TypeContainer ds)
+                       public override void Define (TypeContainer ds)
                        {
                                CheckAbstractAndExtern (block != null);
-                               return base.Define (ds);
+                               base.Define (ds);
                        }
                        
                        public override string GetSignatureForError ()
@@ -1202,7 +1201,7 @@ namespace Mono.CSharp
                                return method.IsClsComplianceRequired ();
                        }
 
-                       public virtual MethodBuilder Define (TypeContainer parent)
+                       public virtual void Define (TypeContainer parent)
                        {
                                // Fill in already resolved event type to speed things up and
                                // avoid confusing duplicate errors
@@ -1213,17 +1212,13 @@ namespace Mono.CSharp
                                        method.flags | MethodAttributes.HideBySig | MethodAttributes.SpecialName, this);
 
                                if (!method_data.Define (parent.PartialContainer, method.GetFullName (MemberName)))
-                                       return null;
-
-                               method_data.DefineMethodBuilder (parent.PartialContainer, ParameterInfo);
+                                       return;
 
                                if (Compiler.Settings.WriteMetadataOnly)
                                        block = null;
 
                                Spec = new MethodSpec (MemberKind.Method, parent.PartialContainer.Definition, this, ReturnType, ParameterInfo, method.ModFlags);
                                Spec.IsAccessor = true;
-
-                               return method_data.MethodBuilder;
                        }
 
                        public override TypeSpec ReturnType {
@@ -1237,6 +1232,12 @@ namespace Mono.CSharp
                                return method.GetAttributeObsolete ();
                        }
 
+                       public MethodData MethodData {
+                               get {
+                                       return method_data;
+                               }
+                       }
+
                        public override string[] ValidAttributeTargets {
                                get {
                                        return attribute_targets;
@@ -1335,23 +1336,16 @@ namespace Mono.CSharp
                        //
                        // Now define the accessors
                        //
-                       var AddBuilder = Add.Define (Parent);
-                       if (AddBuilder == null)
-                               return false;
-
-                       var RemoveBuilder = remove.Define (Parent);
-                       if (RemoveBuilder == null)
-                               return false;
+                       add.Define (Parent);
+                       remove.Define (Parent);
 
                        EventBuilder = Parent.TypeBuilder.DefineEvent (GetFullName (MemberName), EventAttributes.None, MemberType.GetMetaInfo ());
-                       EventBuilder.SetAddOnMethod (AddBuilder);
-                       EventBuilder.SetRemoveOnMethod (RemoveBuilder);
 
                        spec = new EventSpec (Parent.Definition, this, MemberType, ModFlags, Add.Spec, remove.Spec);
 
                        Parent.MemberCache.AddMember (this, GetFullName (MemberName), spec);
-                       Parent.MemberCache.AddMember (this, AddBuilder.Name, Add.Spec);
-                       Parent.MemberCache.AddMember (this, RemoveBuilder.Name, remove.Spec);
+                       Parent.MemberCache.AddMember (this, Add.Spec.Name, Add.Spec);
+                       Parent.MemberCache.AddMember (this, Remove.Spec.Name, remove.Spec);
 
                        return true;
                }
@@ -1373,6 +1367,15 @@ namespace Mono.CSharp
                        base.Emit ();
                }
 
+               public override void PrepareEmit ()
+               {
+                       add.PrepareEmit ();
+                       remove.PrepareEmit ();
+
+                       EventBuilder.SetAddOnMethod (add.MethodData.MethodBuilder);
+                       EventBuilder.SetRemoveOnMethod (remove.MethodData.MethodBuilder);
+               }
+
                public override void WriteDebugSymbol (MonoSymbolFile file)
                {
                        add.WriteDebugSymbol (file);
@@ -1462,7 +1465,7 @@ namespace Mono.CSharp
                                this.parameters = parameters;
                        }
 
-                       public override MethodBuilder Define (TypeContainer parent)
+                       public override void Define (TypeContainer parent)
                        {
                                // Disable reporting, parameters are resolved twice
                                Report.DisableReporting ();
@@ -1472,7 +1475,7 @@ namespace Mono.CSharp
                                        Report.EnableReporting ();
                                }
 
-                               return base.Define (parent);
+                               base.Define (parent);
                        }
 
                        public override ParametersCompiled ParameterInfo {
diff --git a/mcs/tests/test-890.cs b/mcs/tests/test-890.cs
new file mode 100644 (file)
index 0000000..a27814b
--- /dev/null
@@ -0,0 +1,44 @@
+using System;
+
+interface Iface
+{
+       int A { get; }
+
+       void B ();
+
+       event Action C;
+
+       void D (int a, string b);
+
+       string E { get; }
+}
+
+class X
+{
+       public static int Main ()
+       {
+               var res = typeof(Iface).GetMembers ();
+
+               // Ensure metadata order matches source code order
+
+               if (res [0].Name != "get_A")
+                       return 1;
+
+               if (res [1].Name != "B")
+                       return 2;
+
+               if (res [2].Name != "add_C")
+                       return 3;
+
+               if (res [3].Name != "remove_C")
+                       return 4;
+
+               if (res [4].Name != "D")
+                       return 5;
+
+               if (res [5].Name != "get_E")
+                       return 6;
+
+               return 0;
+       }
+}
\ No newline at end of file
index 031aecb8fac8acf6605b520e591afba5e32cc72c..09fb0d081ab75017777e89c0138f4386981a8d30 100644 (file)
@@ -5,47 +5,47 @@
   </files>
   <methods>
     <method token="0x6000001">
-      <sequencepoints>
-        <entry il="0x0" row="10" col="7" file_ref="1" hidden="false" />
-        <entry il="0x1" row="11" col="4" file_ref="1" hidden="false" />
-        <entry il="0x8" row="12" col="3" file_ref="1" hidden="false" />
-      </sequencepoints>
+      <sequencepoints />
       <locals />
       <scopes />
     </method>
     <method token="0x6000002">
       <sequencepoints>
-        <entry il="0x0" row="14" col="7" file_ref="1" hidden="false" />
-        <entry il="0x1" row="15" col="3" file_ref="1" hidden="false" />
+        <entry il="0x0" row="4" col="2" file_ref="1" hidden="false" />
+        <entry il="0x1" row="5" col="3" file_ref="1" hidden="false" />
+        <entry il="0x2" row="5" col="3" file_ref="1" hidden="false" />
+        <entry il="0x7" row="6" col="2" file_ref="1" hidden="false" />
       </sequencepoints>
       <locals />
       <scopes />
     </method>
     <method token="0x6000003">
       <sequencepoints>
-        <entry il="0x0" row="20" col="3" file_ref="1" hidden="false" />
+        <entry il="0x0" row="10" col="7" file_ref="1" hidden="false" />
+        <entry il="0x1" row="11" col="4" file_ref="1" hidden="false" />
+        <entry il="0x8" row="12" col="3" file_ref="1" hidden="false" />
       </sequencepoints>
       <locals />
       <scopes />
     </method>
     <method token="0x6000004">
       <sequencepoints>
-        <entry il="0x0" row="21" col="3" file_ref="1" hidden="false" />
+        <entry il="0x0" row="14" col="7" file_ref="1" hidden="false" />
+        <entry il="0x1" row="15" col="3" file_ref="1" hidden="false" />
       </sequencepoints>
       <locals />
       <scopes />
     </method>
     <method token="0x6000005">
-      <sequencepoints />
+      <sequencepoints>
+        <entry il="0x0" row="20" col="3" file_ref="1" hidden="false" />
+      </sequencepoints>
       <locals />
       <scopes />
     </method>
     <method token="0x6000006">
       <sequencepoints>
-        <entry il="0x0" row="4" col="2" file_ref="1" hidden="false" />
-        <entry il="0x1" row="5" col="3" file_ref="1" hidden="false" />
-        <entry il="0x2" row="5" col="3" file_ref="1" hidden="false" />
-        <entry il="0x7" row="6" col="2" file_ref="1" hidden="false" />
+        <entry il="0x0" row="21" col="3" file_ref="1" hidden="false" />
       </sequencepoints>
       <locals />
       <scopes />
index 46631e8e15c4f5124f50960f4691ca004d86524b..45006624eb42d4f6b5deb65d149588c686d48b23 100644 (file)
       <scopes />
     </method>
     <method token="0x6000006">
-      <sequencepoints />
+      <sequencepoints>
+        <entry il="0x21" row="12" col="2" file_ref="1" hidden="false" />
+        <entry il="0x22" row="13" col="3" file_ref="1" hidden="false" />
+        <entry il="0x3d" row="14" col="2" file_ref="1" hidden="false" />
+      </sequencepoints>
       <locals />
       <scopes />
     </method>
       <scopes />
     </method>
     <method token="0x6000008">
-      <sequencepoints>
-        <entry il="0x21" row="12" col="2" file_ref="1" hidden="false" />
-        <entry il="0x22" row="13" col="3" file_ref="1" hidden="false" />
-        <entry il="0x3d" row="14" col="2" file_ref="1" hidden="false" />
-      </sequencepoints>
+      <sequencepoints />
       <locals />
       <scopes />
     </method>
       <scopes />
     </method>
     <method token="0x600000e">
-      <sequencepoints />
+      <sequencepoints>
+        <entry il="0x12" row="17" col="2" file_ref="1" hidden="false" />
+        <entry il="0x13" row="18" col="3" file_ref="1" hidden="false" />
+      </sequencepoints>
       <locals />
       <scopes />
     </method>
       <scopes />
     </method>
     <method token="0x6000010">
-      <sequencepoints>
-        <entry il="0x12" row="17" col="2" file_ref="1" hidden="false" />
-        <entry il="0x13" row="18" col="3" file_ref="1" hidden="false" />
-      </sequencepoints>
+      <sequencepoints />
       <locals />
       <scopes />
     </method>
index 287791e7eb28203960a0b2699023ef6fa949b6ba..cf31d3f623b091644716c3cfe035b7917d3770d0 100644 (file)
       <scopes />
     </method>
     <method token="0x6000005">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
-    <method token="0x6000006">
-      <sequencepoints />
-      <locals />
-      <scopes />
-    </method>
-    <method token="0x6000007">
       <sequencepoints>
         <entry il="0x27" row="7" col="2" file_ref="1" hidden="false" />
         <entry il="0x28" row="8" col="3" file_ref="1" hidden="false" />
         <entry index="0" start="0x42" end="0x5f" />
       </scopes>
     </method>
+    <method token="0x6000006">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
+    <method token="0x6000007">
+      <sequencepoints />
+      <locals />
+      <scopes />
+    </method>
     <method token="0x6000008">
       <sequencepoints />
       <locals />
index c380f599bb1c66f931447c41d71fca1a9c3ebd7f..3859701304858abe12d299c52f57f62f6e11db19 100644 (file)
       <scopes />
     </method>
     <method token="0x6000009">
-      <sequencepoints />
+      <sequencepoints>
+        <entry il="0x21" row="15" col="2" file_ref="1" hidden="false" />
+        <entry il="0x22" row="16" col="3" file_ref="1" hidden="false" />
+        <entry il="0x29" row="16" col="21" file_ref="1" hidden="false" />
+        <entry il="0x47" row="17" col="2" file_ref="1" hidden="false" />
+      </sequencepoints>
       <locals />
       <scopes />
     </method>
       <scopes />
     </method>
     <method token="0x600000b">
-      <sequencepoints>
-        <entry il="0x21" row="15" col="2" file_ref="1" hidden="false" />
-        <entry il="0x22" row="16" col="3" file_ref="1" hidden="false" />
-        <entry il="0x29" row="16" col="21" file_ref="1" hidden="false" />
-        <entry il="0x47" row="17" col="2" file_ref="1" hidden="false" />
-      </sequencepoints>
+      <sequencepoints />
       <locals />
       <scopes />
     </method>
index 5c15ce75a8098c82d1b0d0882983cdb2c7b34281..98335656343678c0b42cf8b92c98afc1dca3c71c 100644 (file)
@@ -5,20 +5,11 @@
   </files>
   <methods>
     <method token="0x6000001">
-      <sequencepoints>
-        <entry il="0x0" row="39" col="7" file_ref="1" hidden="false" />
-        <entry il="0x1" row="40" col="4" file_ref="1" hidden="false" />
-        <entry il="0x8" row="41" col="3" file_ref="1" hidden="false" />
-      </sequencepoints>
-      <locals />
-      <scopes />
-    </method>
-    <method token="0x6000002">
       <sequencepoints />
       <locals />
       <scopes />
     </method>
-    <method token="0x6000003">
+    <method token="0x6000002">
       <sequencepoints>
         <entry il="0x0" row="8" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="9" col="3" file_ref="1" hidden="false" />
@@ -29,7 +20,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000004">
+    <method token="0x6000003">
       <sequencepoints>
         <entry il="0x0" row="13" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="14" col="3" file_ref="1" hidden="false" />
@@ -40,7 +31,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000005">
+    <method token="0x6000004">
       <sequencepoints>
         <entry il="0x0" row="18" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="19" col="3" file_ref="1" hidden="false" />
@@ -50,7 +41,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000006">
+    <method token="0x6000005">
       <sequencepoints>
         <entry il="0x0" row="23" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="24" col="3" file_ref="1" hidden="false" />
@@ -64,7 +55,7 @@
       </locals>
       <scopes />
     </method>
-    <method token="0x6000007">
+    <method token="0x6000006">
       <sequencepoints>
         <entry il="0x0" row="29" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="30" col="3" file_ref="1" hidden="false" />
@@ -73,7 +64,7 @@
       <locals />
       <scopes />
     </method>
-    <method token="0x6000008">
+    <method token="0x6000007">
       <sequencepoints>
         <entry il="0x0" row="34" col="2" file_ref="1" hidden="false" />
         <entry il="0x1" row="35" col="3" file_ref="1" hidden="false" />
       <locals />
       <scopes />
     </method>
+    <method token="0x6000008">
+      <sequencepoints>
+        <entry il="0x0" row="39" col="7" file_ref="1" hidden="false" />
+        <entry il="0x1" row="40" col="4" file_ref="1" hidden="false" />
+        <entry il="0x8" row="41" col="3" file_ref="1" hidden="false" />
+      </sequencepoints>
+      <locals />
+      <scopes />
+    </method>
     <method token="0x6000009">
       <sequencepoints>
         <entry il="0x0" row="45" col="2" file_ref="1" hidden="false" />
index bcec52ade53e190db690081cae76ada5dd1da3f1..5782bf10bf56b5af304fe030b7438e1aebdcdee7 100644 (file)
       </method>\r
     </type>\r
   </test>\r
+  <test name="test-890.cs">\r
+    <type name="X">\r
+      <method name="Int32 Main()" attrs="150">\r
+        <size>206</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="test-9.cs">\r
     <type name="X">\r
       <method name="Int32 Main(System.String[])" attrs="150">\r