Merge pull request #1064 from ranma42/fix-config-paths
authorAlexis Christoforides <alexis@thenull.net>
Mon, 14 Jul 2014 16:14:40 +0000 (12:14 -0400)
committerAlexis Christoforides <alexis@thenull.net>
Mon, 14 Jul 2014 16:14:40 +0000 (12:14 -0400)
Improve handling of lib paths for libMonoPosixHelper and libgdiplus. Fixes #18555.

223 files changed:
.gitignore
README.md
configure.ac
eglib/src/glib.h
mcs/build/profiles/basic.make
mcs/class/Facades/System.Runtime.InteropServices/TypeForwarders.cs
mcs/class/Makefile
mcs/class/Managed.Windows.Forms/Test/System.Resources/ResXDataNodeTest.cs
mcs/class/Managed.Windows.Forms/resx.resx [deleted file]
mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/CommandLineBuilder.cs
mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs
mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/InvokeOptions.cs
mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/ObjectMirror.cs
mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/StructMirror.cs
mcs/class/Mono.Debugger.Soft/Test/dtest-app.cs
mcs/class/Mono.Debugger.Soft/Test/dtest.cs
mcs/class/System.Data/System.Data/DataColumn.cs
mcs/class/System.Data/System.Data/DataRow.cs
mcs/class/System.Data/Test/System.Data/DataColumnTest2.cs
mcs/class/System.Data/Test/System.Data/DataRowTest2.cs
mcs/class/System.Drawing/Test/System.Drawing.Drawing2D/TestHatchBrush.cs
mcs/class/System.Drawing/Test/System.Drawing.Imaging/TestImageAttributes.cs
mcs/class/System.IO.Compression/Test/System.IO.Compression/ZipTest.cs
mcs/class/System.Json/System.Json/JsonPrimitive.cs
mcs/class/System.Json/System.Json/JsonValue.cs
mcs/class/System.Json/Test/System.Json/JsonValueTest.cs
mcs/class/System.Numerics/System.Numerics/BigInteger.cs
mcs/class/System.Numerics/Test/System.Numerics/BigIntegerTest.cs
mcs/class/System.ServiceModel.Web/System.Runtime.Serialization.Json/JavaScriptReader.cs
mcs/class/System.ServiceModel/Test/System.ServiceModel.PeerResolvers/CustomPeerResolverServiceTest.cs
mcs/class/System.Web/Test/System.Web.UI.Adapters/PageAdapterTest.cs
mcs/class/System/System.Net.Sockets/SocketAsyncEventArgs.cs
mcs/class/System/System.Net.Sockets/Socket_2_1.cs
mcs/class/System/System.Net.WebSockets/ClientWebSocket.cs
mcs/class/System/System.Net.WebSockets/WebSocketMessageType.cs
mcs/class/System/System_test.dll.sources
mcs/class/System/Test/System.Net.Sockets/SocketConnectAsyncTest.cs [new file with mode: 0644]
mcs/class/System/Test/System.Net.Sockets/SocketTest.cs
mcs/class/System/Test/System.Net/HttpWebRequestTest.cs
mcs/class/WindowsBase/System.IO.Packaging/PackagePart.cs
mcs/class/WindowsBase/System.IO.Packaging/PackagePropertiesPart.cs
mcs/class/corlib/Makefile
mcs/class/corlib/System.Threading/CancellationTokenRegistration.cs
mcs/class/corlib/System/Delegate.cs
mcs/class/corlib/Test/System.Runtime.CompilerServices/ConditionalWeakTableTest.cs
mcs/class/corlib/Test/System.Runtime.CompilerServices/TaskAwaiterTest.cs
mcs/class/corlib/Test/System.Threading.Tasks/TaskTest.cs
mcs/class/corlib/Test/System.Threading/CancellationTokenSourceTest.cs
mcs/class/corlib/Test/System/DelegateTest.cs
mcs/class/monodoc/Monodoc/providers/xhtml-provider.cs
mcs/errors/cs0121-25.cs [new file with mode: 0644]
mcs/errors/cs0138.cs
mcs/errors/cs0151-3.cs [new file with mode: 0644]
mcs/errors/cs0151-4.cs [new file with mode: 0644]
mcs/errors/cs0151-5.cs [new file with mode: 0644]
mcs/errors/cs0457-4.cs [new file with mode: 0644]
mcs/errors/cs0573-2.cs [deleted file]
mcs/errors/cs0573.cs [deleted file]
mcs/errors/cs0837-2.cs
mcs/errors/cs0837-3.cs [new file with mode: 0644]
mcs/errors/cs0837-4.cs [new file with mode: 0644]
mcs/errors/cs0837.cs
mcs/errors/cs0840.cs [deleted file]
mcs/errors/cs1501-17.cs [new file with mode: 0644]
mcs/errors/cs1644-19.cs
mcs/errors/cs1644-36.cs [new file with mode: 0644]
mcs/errors/cs1650-3.cs [new file with mode: 0644]
mcs/errors/cs1953.cs [deleted file]
mcs/errors/cs7007.cs [new file with mode: 0644]
mcs/errors/cs8050.cs [new file with mode: 0644]
mcs/errors/cs8051.cs [new file with mode: 0644]
mcs/errors/cs8052.cs [new file with mode: 0644]
mcs/errors/cs8053.cs [new file with mode: 0644]
mcs/errors/cs8054-2.cs [new file with mode: 0644]
mcs/errors/cs8054-3.cs [new file with mode: 0644]
mcs/errors/cs8054.cs [new file with mode: 0644]
mcs/mcs/anonymous.cs
mcs/mcs/argument.cs
mcs/mcs/async.cs
mcs/mcs/cfold.cs
mcs/mcs/class.cs
mcs/mcs/codegen.cs
mcs/mcs/convert.cs
mcs/mcs/cs-parser.jay
mcs/mcs/cs-tokenizer.cs
mcs/mcs/ecore.cs
mcs/mcs/expression.cs
mcs/mcs/flowanalysis.cs
mcs/mcs/import.cs
mcs/mcs/iterators.cs
mcs/mcs/membercache.cs
mcs/mcs/namespace.cs
mcs/mcs/nullable.cs
mcs/mcs/parameter.cs
mcs/mcs/property.cs
mcs/mcs/statement.cs
mcs/mcs/typemanager.cs
mcs/tests/gtest-409.cs
mcs/tests/gtest-502.cs
mcs/tests/gtest-618.cs [new file with mode: 0644]
mcs/tests/gtest-619.cs [new file with mode: 0644]
mcs/tests/gtest-autoproperty-09.cs [new file with mode: 0644]
mcs/tests/gtest-initialize-13.cs [new file with mode: 0644]
mcs/tests/gtest-named-05.cs [new file with mode: 0644]
mcs/tests/gtest-optional-32.cs [new file with mode: 0644]
mcs/tests/gtest-optional-33.cs [new file with mode: 0644]
mcs/tests/test-640.cs
mcs/tests/test-671.cs
mcs/tests/test-77.cs
mcs/tests/test-899.cs [new file with mode: 0644]
mcs/tests/test-900.cs [new file with mode: 0644]
mcs/tests/test-901.cs [new file with mode: 0644]
mcs/tests/test-async-73.cs [new file with mode: 0644]
mcs/tests/test-ex-filter-06.cs [new file with mode: 0644]
mcs/tests/test-static-using-01.cs [new file with mode: 0644]
mcs/tests/test-static-using-02.cs [new file with mode: 0644]
mcs/tests/test-static-using-03.cs [new file with mode: 0644]
mcs/tests/test-static-using-04.cs [new file with mode: 0644]
mcs/tests/test-static-using-05.cs [new file with mode: 0644]
mcs/tests/test-static-using-06.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_5.xml
mcs/tools/mdoc/.gitignore [new file with mode: 0644]
mcs/tools/mono-shlib-cop/Makefile
mcs/tools/mono-shlib-cop/test.cs
mcs/tools/mono-shlib-cop/test.dll.config
mcs/tools/mono-shlib-cop/test.dll.out
mono/metadata/Makefile.am.in
mono/metadata/abi-details.h [new file with mode: 0644]
mono/metadata/appdomain.c
mono/metadata/appdomain.h
mono/metadata/boehm-gc.c
mono/metadata/cominterop.c
mono/metadata/domain-internals.h
mono/metadata/domain.c
mono/metadata/file-mmap-posix.c
mono/metadata/gc-internal.h
mono/metadata/gc.c
mono/metadata/marshal.c
mono/metadata/metadata-cross-helpers.c [new file with mode: 0644]
mono/metadata/metadata.c
mono/metadata/method-builder.c
mono/metadata/monitor.c
mono/metadata/monitor.h
mono/metadata/mono-hash.c
mono/metadata/null-gc.c
mono/metadata/object-internals.h
mono/metadata/object-offsets.h [new file with mode: 0644]
mono/metadata/object.c
mono/metadata/sgen-alloc.c
mono/metadata/sgen-cardtable.c
mono/metadata/sgen-debug.c
mono/metadata/sgen-gc.c
mono/metadata/sgen-gc.h
mono/metadata/threads.c
mono/mini/Makefile.am.in
mono/mini/aot-compiler.c
mono/mini/aot-runtime.c
mono/mini/cpu-amd64.md
mono/mini/cpu-arm.md
mono/mini/cpu-arm64.md
mono/mini/cpu-ia64.md
mono/mini/cpu-ppc.md
mono/mini/cpu-ppc64.md
mono/mini/cpu-s390x.md
mono/mini/cpu-x86.md
mono/mini/debug-mini.c
mono/mini/debugger-agent.c
mono/mini/decompose.c
mono/mini/driver.c
mono/mini/exceptions-amd64.c
mono/mini/exceptions-arm.c
mono/mini/exceptions-mips.c
mono/mini/exceptions-ppc.c
mono/mini/exceptions-s390x.c
mono/mini/exceptions-x86.c
mono/mini/ir-emit.h
mono/mini/method-to-ir.c
mono/mini/mini-amd64.c
mono/mini/mini-amd64.h
mono/mini/mini-arm.c
mono/mini/mini-arm.h
mono/mini/mini-cross-helpers.c [new file with mode: 0644]
mono/mini/mini-exceptions.c
mono/mini/mini-gc.c
mono/mini/mini-generic-sharing.c
mono/mini/mini-ia64.c
mono/mini/mini-ia64.h
mono/mini/mini-llvm.c
mono/mini/mini-mips.c
mono/mini/mini-mips.h
mono/mini/mini-ops.h
mono/mini/mini-ppc.c
mono/mini/mini-ppc.h
mono/mini/mini-s390x.c
mono/mini/mini-s390x.h
mono/mini/mini-sparc.c
mono/mini/mini-sparc.h
mono/mini/mini-trampolines.c
mono/mini/mini-unwind.h
mono/mini/mini-x86.c
mono/mini/mini-x86.h
mono/mini/mini.c
mono/mini/mini.h
mono/mini/simd-intrinsics.c
mono/mini/ssapre.c
mono/mini/tasklets.c
mono/mini/tramp-amd64.c
mono/mini/tramp-arm.c
mono/mini/tramp-mips.c
mono/mini/tramp-ppc.c
mono/mini/tramp-s390x.c
mono/mini/tramp-x86.c
mono/mini/unwind.c
mono/tests/finalizer-wait.cs
mono/tests/gc-descriptors/Makefile.am
mono/tests/marshal7.cs
mono/unit-tests/.gitignore
mono/utils/atomic.h
mono/utils/mono-threads-posix.c
msvc/libmonoruntime.vcxproj
msvc/mono.def
msvc/monosgen.def
msvc/monosgen64.def

index c5dbc5d7ad8a117f0145cba3a405a2ebe4eca3b0..ea48a9e7fb97074a8d4e78730d00394afbf64e44 100644 (file)
@@ -79,6 +79,7 @@ releases
 stamp-h
 stamp-h1
 stamp-h.in
+/test-driver
 *~
 *.swp
 *.o
index f42e3000815323f0814ed6afce4812291c0f3ee9..d600ce4ad172f638313959ad71f1251861e78f61 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,6 +1,8 @@
 Mono is a software platform designed to allow developers to easily create cross platform applications.
 Mono is an open source implementation of Microsoft's .NET Framework based on the ECMA standards for C# and the Common Language Runtime.
 
+[![Build Status](http://monojenkins.cloudapp.net/job/Mono/badge/icon)](http://monojenkins.cloudapp.net/job/Mono/)
+
 1. [Installation](#compilation-and-installation)
 2. [Using Mono](#using-mono)
 3. [Directory Roadmap](#directory-roadmap)
index 16b9301d511766121b5235bac0536b974b354c95..837f0ddf5b1d77bcb57055d184aeeec3713735c2 100644 (file)
@@ -129,6 +129,7 @@ case "$host" in
                libgc_threads=win32
                gc_default=included
                with_sigaltstack=no
+               with_tls=pthread
                LN_S=cp
                # This forces libgc to use the DllMain based thread registration code on win32
                libgc_configure_args="$libgc_configure_args --enable-win32-dllmain=yes"
@@ -2555,7 +2556,7 @@ case "$host" in
                        sgen_supported=true
                        AOT_SUPPORTED="yes"
                        ;;
-                 darwin*|openbsd*|freebsd*)
+                 openbsd*|freebsd*)
                        sgen_supported=true
                        ;;
                esac
@@ -2573,7 +2574,11 @@ case "$host" in
                        sgen_supported=true
                        AOT_SUPPORTED="yes"
                        ;;
-                 darwin*|openbsd*|freebsd*)
+                 darwin*)
+                       sgen_supported=true
+                       AOT_SUPPORTED="yes"
+                       ;;
+                 openbsd*|freebsd*)
                        sgen_supported=true
                        ;;
                esac
@@ -3687,11 +3692,6 @@ fi
           enable_system_aot=yes
        fi
 
-       if test "x$enable_loadedllvm" = "xyes"; then
-          # This seems to fail on the x86 buildbots
-          enable_system_aot=no
-       fi
-
     if test x$host_win32 = xno -a x$enable_system_aot = xyes; then
       echo "ENABLE_AOT = 1" >> $mcs_topdir/build/config.make
     fi
index 30c2d7adb8f16791039c574f987da4c4c7df0b0c..7cb8e6179c0128b02bdbc0b6d1480d01220f0f3d 100644 (file)
@@ -1010,19 +1010,6 @@ glong     g_utf8_pointer_to_offset (const gchar *str, const gchar *pos);
 #define G_PRIORITY_DEFAULT 0
 #define G_PRIORITY_DEFAULT_IDLE 200
 
-/*
- * Empty thread functions, not used by eglib
- */
-#define g_thread_supported()   TRUE
-#define g_thread_init(x)       G_STMT_START { if (x != NULL) { g_error ("No vtable supported in g_thread_init"); } } G_STMT_END
-
-#define G_LOCK_DEFINE(name)        int name;
-#define G_LOCK_DEFINE_STATIC(name) static int name;
-#define G_LOCK_EXTERN(name)
-#define G_LOCK(name)
-#define G_TRYLOCK(name)
-#define G_UNLOCK(name)
-
 #define GUINT16_SWAP_LE_BE_CONSTANT(x) ((((guint16) x) >> 8) | ((((guint16) x) << 8)))
 
 #define GUINT16_SWAP_LE_BE(x) ((guint16) (((guint16) x) >> 8) | ((((guint16)(x)) & 0xff) << 8))
index c270cc81ccf0f562604f81c10869e5364d426577..12f6c82cff2c8f05c225231d8d3769a19760335d 100644 (file)
@@ -65,7 +65,7 @@ do-profile-check: $(depsdir)/.stamp
                $(MAKE) -s do-profile-check-monolite ; \
            else \
                echo "*** The compiler '$(BOOTSTRAP_MCS)' doesn't appear to be usable." 1>&2; \
-                echo "*** You need Mono version 2.4 or better installed to build MCS" 1>&2 ; \
+                echo "*** You need Mono version 2.10 or better installed to build MCS" 1>&2 ; \
                 echo "*** Check mono README for information on how to bootstrap a Mono installation." 1>&2 ; \
                exit 1; fi; fi
 
index 48a4e24b5f0d59d2a02978e29f9c88df670842d9..060d92922652b2f08b9a97ee7ecb20bd2f5ff145 100644 (file)
@@ -40,6 +40,8 @@
 [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Runtime.InteropServices.COMException))]
 [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Runtime.InteropServices.ComMemberType))]
 [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Runtime.InteropServices.ComSourceInterfacesAttribute))]
+[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Runtime.InteropServices.ComTypes.IStream))]
+[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Runtime.InteropServices.ComTypes.STATSTG))]
 [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Runtime.InteropServices.CriticalHandle))]
 [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Runtime.InteropServices.CurrencyWrapper))]
 //[assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Runtime.InteropServices.CustomQueryInterfaceMode))]
@@ -76,4 +78,3 @@
 [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Runtime.InteropServices.UnmanagedType))]
 [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Runtime.InteropServices.VarEnum))]
 [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.Runtime.InteropServices.VariantWrapper))]
-
index 1e604f9aae12ab8b627f1e16e295e04901d25d5f..b3d367cb2e04d080cd5782ecc11b6e830a2a4343 100644 (file)
@@ -25,7 +25,7 @@ net_1_1_java_SUBDIRS = \
        System.Runtime.Serialization.Formatters.Soap    \
        System.Runtime.Remoting
 
-common_dirs := \
+net_2_0_dirs := \
        corlib                          \
        System                          \
        System.XML                      \
@@ -78,14 +78,11 @@ common_dirs := \
        Mono.Cecil                      \
        Mono.Cecil.Mdb                  \
        Mono.Debugger.Soft              \
-       SystemWebTestShim
-
-net_2_0_dirs := \
+       SystemWebTestShim                       \
        System.Xml.Linq                 \
        System.Runtime.Serialization    \
        System.Data.DataSetExtensions   \
        System.Data.Linq                \
-       System.Web                      \
        System.Web.Abstractions         \
        System.Web.Routing              \
        System.IdentityModel            \
@@ -179,7 +176,6 @@ net_4_0_dirs := \
        System.Xaml \
        WindowsBase \
        System.ServiceModel.Activation \
-       System.ServiceModel \
        System.ServiceModel.Routing \
        System.ServiceModel.Discovery \
        System.Runtime.Caching \
@@ -241,7 +237,7 @@ xbuild_4_0_dirs := \
        $(xbuild_2_0_dirs)      \
        Microsoft.Build
 
-net_2_0_SUBDIRS := $(common_dirs) $(net_2_0_dirs) $(net_2_0_only_dirs) $(xbuild_2_0_dirs) aot-compiler
+net_2_0_SUBDIRS := $(net_2_0_dirs) $(net_2_0_only_dirs) $(xbuild_2_0_dirs) aot-compiler
 monodroid_SUBDIRS := $(mobile_dirs) $(monodroid_dirs)
 monotouch_SUBDIRS := $(mobile_dirs) $(monotouch_dirs)
 monotouch_runtime_SUBDIRS := $(monotouch_runtime_dirs)
@@ -249,13 +245,13 @@ mobile_static_SUBDIRS := $(mobile_dirs)
 mobile_SUBDIRS := $(mobile_dirs)
 xammac_SUBDIRS := $(mobile_dirs) $(xammac_dirs)
 net_3_5_SUBDIRS := $(xbuild_2_0_dirs)
-net_4_0_SUBDIRS := $(common_dirs) $(net_2_0_dirs) $(net_4_0_dirs) $(net_4_0_only_dirs) $(xbuild_4_0_dirs)
-net_4_5_SUBDIRS := $(common_dirs) $(net_2_0_dirs) $(net_4_0_dirs) $(net_4_5_dirs) $(xbuild_4_0_dirs) aot-compiler
+net_4_0_SUBDIRS := $(net_2_0_dirs) $(net_4_0_dirs) $(net_4_0_only_dirs) $(xbuild_4_0_dirs)
+net_4_5_SUBDIRS := $(net_2_0_dirs) $(net_4_0_dirs) $(net_4_5_dirs) $(xbuild_4_0_dirs) aot-compiler
 xbuild_12_SUBDIRS := $(xbuild_4_0_dirs)
 
 include ../build/rules.make
 
-SUBDIRS = $(common_dirs) $(net_2_0_dirs) $(net_2_0_only_dirs) $(mobile_dirs) $(monotouch_dirs) $(net_4_0_dirs) $(net_4_0_only_dirs) $(net_4_5_dirs)
+SUBDIRS = $(net_2_0_dirs) $(net_2_0_only_dirs) $(mobile_dirs) $(monotouch_dirs) $(net_4_0_dirs) $(net_4_0_only_dirs) $(net_4_5_dirs)
 
 DIST_ONLY_SUBDIRS = dlr aot-compiler $(xbuild_4_0_dirs)
 
index fb231e26345b87283d4bd439ea0091e2ecf9f617..4c6ba44c18cfe624bdc793414f489d14d756dda8 100644 (file)
@@ -144,15 +144,14 @@ namespace MonoTests.System.Resources {
                [Test]
                public void WriteRead1 ()
                {
-                       ResXResourceWriter rw = new ResXResourceWriter ("resx.resx");
                        serializable ser = new serializable ("aaaaa", "bbbbb");
                        ResXDataNode dn = new ResXDataNode ("test", ser);
                        dn.Comment = "comment";
-                       rw.AddResource (dn);
-                       rw.Close ();
+
+                       string resXFile = GetResXFileWithNode (dn, "resx.resx");
 
                        bool found = false;
-                       ResXResourceReader rr = new ResXResourceReader ("resx.resx");
+                       ResXResourceReader rr = new ResXResourceReader (resXFile);
                        rr.UseResXDataNodes = true;
                        IDictionaryEnumerator en = rr.GetEnumerator ();
                        while (en.MoveNext ()) {
@@ -224,7 +223,6 @@ namespace MonoTests.System.Resources {
                        ResXDataNode node = ((DictionaryEntry) en.Current).Value as ResXDataNode;
                        rr.Close ();
 
-                       File.Delete ("resx.resx");
                        Assert.IsNotNull (node,"#A1");
 
                        serializable o = node.GetValue ((AssemblyName []) null) as serializable;
@@ -245,7 +243,6 @@ namespace MonoTests.System.Resources {
                        ResXDataNode node = ((DictionaryEntry) en.Current).Value as ResXDataNode;
                        rr.Close ();
 
-                       File.Delete ("resx.resx");
                        Assert.IsNotNull (node, "#A1");
 
                        object o = node.GetValue ((AssemblyName []) null);
diff --git a/mcs/class/Managed.Windows.Forms/resx.resx b/mcs/class/Managed.Windows.Forms/resx.resx
deleted file mode 100644 (file)
index 11d642e..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-<resheader name="resmimetype"><value>text/microsoft-resx</value></resheader><resheader name="version"><value>1.3</value></resheader><resheader name="reader"><value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></resheader><resheader name="writer"><value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></resheader><data name="test" mimetype="application/x-microsoft.net.object.binary.base64"><value>AAEAAAD/////AQAAAAAAAAAMAgAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtc190ZXN0X25ldF8yXzAFAQAAACdNb25vVGVzdHMuU3lzdGVtLlJlc291cmNlcy5zZXJpYWxpemFibGUCAAAAB3Nlcm5hbWUIc2VydmFsdWUBAQIAAAAGAwAAAAVhYWFhYQYEAAAABWJiYmJiCw==</value><comment>comment</comment></data></root>
\ No newline at end of file
index c50ddf774c0c4f5bfba0319c0f217eedf91f8f25..1a8fac12b7c7c396b3dccb87b97ce000c4cb3183 100644 (file)
@@ -328,8 +328,13 @@ namespace Microsoft.Build.Utilities
                                }
                        }
                }
-               
-               protected void AppendTextUnquoted (string textToAppend)
+
+#if NET_4_0
+               public
+#else
+               protected
+#endif
+               void AppendTextUnquoted (string textToAppend)
                {
                        commandLine.Append (textToAppend);
                }
index 29e782c7f146a9036dd9163b59bac0621f2b92a1..14bf701f46fa8cae6f7082e63c161f91e010a553 100644 (file)
@@ -157,7 +157,9 @@ namespace Mono.Debugger.Soft
        enum InvokeFlags {
                NONE = 0x0,
                DISABLE_BREAKPOINTS = 0x1,
-               SINGLE_THREADED = 0x2
+               SINGLE_THREADED = 0x2,
+               OUT_THIS = 0x4,
+               OUT_ARGS = 0x8,
        }
 
        enum ElementType {
@@ -414,7 +416,7 @@ namespace Mono.Debugger.Soft
                 * with newer runtimes, and vice versa.
                 */
                internal const int MAJOR_VERSION = 2;
-               internal const int MINOR_VERSION = 34;
+               internal const int MINOR_VERSION = 35;
 
                enum WPSuspendPolicy {
                        NONE = 0,
@@ -1667,24 +1669,39 @@ namespace Mono.Debugger.Soft
                        }
                }
 
-               internal delegate void InvokeMethodCallback (ValueImpl v, ValueImpl exc, ErrorCode error, object state);
+               internal delegate void InvokeMethodCallback (ValueImpl v, ValueImpl exc, ValueImpl out_this, ValueImpl[] out_args, ErrorCode error, object state);
+
+               void read_invoke_res (PacketReader r, out ValueImpl v, out ValueImpl exc, out ValueImpl out_this, out ValueImpl[] out_args) {
+                       int resflags = r.ReadByte ();
+                       v = null;
+                       exc = null;
+                       out_this = null;
+                       out_args = null;
+                       if (resflags == 0) {
+                               exc = r.ReadValue ();
+                       } else {
+                               v = r.ReadValue ();
+                               if ((resflags & 2) != 0)
+                                       out_this = r.ReadValue ();
+                               if ((resflags & 4) != 0) {
+                                       int nargs = r.ReadInt ();
+                                       out_args = new ValueImpl [nargs];
+                                       for (int i = 0; i < nargs; ++i)
+                                               out_args [i] = r.ReadValue ();
+                               }
+                       }
+               }
 
                internal int VM_BeginInvokeMethod (long thread, long method, ValueImpl this_arg, ValueImpl[] arguments, InvokeFlags flags, InvokeMethodCallback callback, object state) {
                        return Send (CommandSet.VM, (int)CmdVM.INVOKE_METHOD, new PacketWriter ().WriteId (thread).WriteInt ((int)flags).WriteId (method).WriteValue (this_arg).WriteInt (arguments.Length).WriteValues (arguments), delegate (PacketReader r) {
-                                       ValueImpl v, exc;
+                                       ValueImpl v, exc, out_this = null;
+                                       ValueImpl[] out_args = null;
 
                                        if (r.ErrorCode != 0) {
-                                               callback (null, null, (ErrorCode)r.ErrorCode, state);
+                                               callback (null, null, null, null, (ErrorCode)r.ErrorCode, state);
                                        } else {
-                                               if (r.ReadByte () == 0) {
-                                                       exc = r.ReadValue ();
-                                                       v = null;
-                                               } else {
-                                                       v = r.ReadValue ();
-                                                       exc = null;
-                                               }
-
-                                               callback (v, exc, 0, state);
+                                               read_invoke_res (r, out v, out exc, out out_this, out out_args);
+                                               callback (v, exc, out_this, out_args, 0, state);
                                        }
                                }, 1);
                }
@@ -1702,20 +1719,14 @@ namespace Mono.Debugger.Soft
                                w.WriteValues (arguments [i]);
                        }
                        return Send (CommandSet.VM, (int)CmdVM.INVOKE_METHODS, w, delegate (PacketReader r) {
-                                       ValueImpl v, exc;
+                                       ValueImpl v, exc, out_this = null;
+                                       ValueImpl[] out_args = null;
 
                                        if (r.ErrorCode != 0) {
-                                               callback (null, null, (ErrorCode)r.ErrorCode, state);
+                                               callback (null, null, null, null, (ErrorCode)r.ErrorCode, state);
                                        } else {
-                                               if (r.ReadByte () == 0) {
-                                                       exc = r.ReadValue ();
-                                                       v = null;
-                                               } else {
-                                                       v = r.ReadValue ();
-                                                       exc = null;
-                                               }
-
-                                               callback (v, exc, 0, state);
+                                               read_invoke_res (r, out v, out exc, out out_this, out out_args);
+                                               callback (v, exc, out_this, out_args, 0, state);
                                        }
                                }, methods.Length);
                }
index bc064795083b1d1232816253da528760b6a6812a..5ca987ec69495c7d68293c8fdcae1c81ea68d84b 100644 (file)
@@ -13,6 +13,15 @@ namespace Mono.Debugger.Soft
                /*
                 * Only resume the target thread during the invoke
                 */
-               SingleThreaded = 2
+               SingleThreaded = 2,
+               /*
+                * Return the changed receiver when invoking
+                * a valuetype method.
+                */
+               ReturnOutThis = 4,
+               /*
+                * Return the values of out arguments
+                */
+               ReturnOutArgs = 8
        }
 }
index 030fa3e3e4ad431ec00f50e1b45a96451e2d56b2..b24e52f257c6d7f1eec4818b9f6aa39fa24d37d3 100644 (file)
@@ -8,6 +8,22 @@ using System.Threading.Tasks;
 
 namespace Mono.Debugger.Soft
 {
+       public class InvokeResult {
+               public Value Result { get; set; }
+               //
+               // The value of the receiver after the call for calls to valuetype methods or null.
+               // Only set when using the InvokeOptions.ReturnOutThis flag.
+               // Since protocol version 2.35
+               //
+               public Value OutThis { get; set; }
+               //
+               // The value of the arguments after the call
+               // Only set when using the InvokeOptions.ReturnOutArgs flag.
+               // Since protocol version 2.35
+               //
+               public Value[] OutArgs { get; set; }
+       }
+
        public class ObjectMirror : Value {
                TypeMirror type;
                AppDomainMirror domain;
@@ -164,6 +180,21 @@ namespace Mono.Debugger.Soft
                                        }, null);
                        return tcs.Task;
                }
+
+               public Task<InvokeResult> InvokeMethodAsyncWithResult (ThreadMirror thread, MethodMirror method, IList<Value> arguments, InvokeOptions options = InvokeOptions.None) {
+                       var tcs = new TaskCompletionSource<InvokeResult> ();
+                       BeginInvokeMethod (thread, method, arguments, options, iar =>
+                                       {
+                                               try {
+                                                       tcs.SetResult (EndInvokeMethodInternalWithResult (iar));
+                                               } catch (OperationCanceledException) {
+                                                       tcs.TrySetCanceled ();
+                                               } catch (Exception ex) {
+                                                       tcs.TrySetException (ex);
+                                               }
+                                       }, null);
+                       return tcs.Task;
+               }
 #endif
 
                //
@@ -223,6 +254,14 @@ namespace Mono.Debugger.Soft
                                get; set;
                        }
 
+                       public ValueImpl OutThis {
+                               get; set;
+                       }
+
+                       public ValueImpl[] OutArgs {
+                               get; set;
+                       }
+
                        public ValueImpl Exception {
                                get; set;
                        }
@@ -260,6 +299,10 @@ namespace Mono.Debugger.Soft
                                f |= InvokeFlags.DISABLE_BREAKPOINTS;
                        if ((options & InvokeOptions.SingleThreaded) != 0)
                                f |= InvokeFlags.SINGLE_THREADED;
+                       if ((options & InvokeOptions.ReturnOutThis) != 0)
+                               f |= InvokeFlags.OUT_THIS;
+                       if ((options & InvokeOptions.ReturnOutArgs) != 0)
+                               f |= InvokeFlags.OUT_ARGS;
 
                        InvokeAsyncResult r = new InvokeAsyncResult { AsyncState = state, AsyncWaitHandle = new ManualResetEvent (false), VM = vm, Thread = thread, Callback = callback };
                        thread.InvalidateFrames ();
@@ -269,7 +312,7 @@ namespace Mono.Debugger.Soft
                }
 
                // This is called when the result of an invoke is received
-               static void InvokeCB (ValueImpl v, ValueImpl exc, ErrorCode error, object state) {
+               static void InvokeCB (ValueImpl v, ValueImpl exc, ValueImpl out_this, ValueImpl[] out_args, ErrorCode error, object state) {
                        InvokeAsyncResult r = (InvokeAsyncResult)state;
 
                        if (error != 0) {
@@ -279,6 +322,9 @@ namespace Mono.Debugger.Soft
                                r.Exception = exc;
                        }
 
+                       r.OutThis = out_this;
+                       r.OutArgs = out_args;
+
                        r.IsCompleted = true;
                        ((ManualResetEvent)r.AsyncWaitHandle).Set ();
 
@@ -286,7 +332,7 @@ namespace Mono.Debugger.Soft
                                r.Callback.BeginInvoke (r, null, null);
                }
 
-           internal static Value EndInvokeMethodInternal (IAsyncResult asyncResult) {
+           internal static InvokeResult EndInvokeMethodInternalWithResult (IAsyncResult asyncResult) {
                        if (asyncResult == null)
                                throw new ArgumentNullException ("asyncResult");
 
@@ -309,10 +355,22 @@ namespace Mono.Debugger.Soft
                                if (r.Exception != null)
                                        throw new InvocationException ((ObjectMirror)r.VM.DecodeValue (r.Exception));
 
-                               return r.VM.DecodeValue (r.Value);
+                               Value out_this = null;
+                               if (r.OutThis != null)
+                                       out_this = r.VM.DecodeValue (r.OutThis);
+                               Value[] out_args = null;
+                               if (r.OutArgs != null)
+                                       out_args = r.VM.DecodeValues (r.OutArgs);
+
+                               return new InvokeResult () { Result = r.VM.DecodeValue (r.Value), OutThis = out_this, OutArgs = out_args };
                        }
                }
 
+           internal static Value EndInvokeMethodInternal (IAsyncResult asyncResult) {
+                       InvokeResult res = EndInvokeMethodInternalWithResult (asyncResult);
+                       return res.Result;
+               }
+
            internal static void EndInvokeMultipleInternal (IAsyncResult asyncResult) {
                        if (asyncResult == null)
                                throw new ArgumentNullException ("asyncResult");
@@ -377,7 +435,7 @@ namespace Mono.Debugger.Soft
                }
 
                // This is called when the result of an invoke is received
-               static void InvokeMultipleCB (ValueImpl v, ValueImpl exc, ErrorCode error, object state) {
+               static void InvokeMultipleCB (ValueImpl v, ValueImpl exc, ValueImpl out_this, ValueImpl[] out_args, ErrorCode error, object state) {
                        var r = (InvokeAsyncResult)state;
 
                        Interlocked.Decrement (ref r.NumPending);
index b6e43eb4e23b569b6a58ee4df29db52b863a8c2a..a1d2ad62f5319847de2ebdd005b24992ca2af5eb 100644 (file)
@@ -1,5 +1,8 @@
 using System;
 using System.Collections.Generic;
+#if NET_4_5
+using System.Threading.Tasks;
+#endif
 
 namespace Mono.Debugger.Soft
 {
@@ -85,5 +88,37 @@ namespace Mono.Debugger.Soft
                public Value EndInvokeMethod (IAsyncResult asyncResult) {
                        return ObjectMirror.EndInvokeMethodInternal (asyncResult);
                }
+
+#if NET_4_5
+               public Task<Value> InvokeMethodAsync (ThreadMirror thread, MethodMirror method, IList<Value> arguments, InvokeOptions options = InvokeOptions.None) {
+                       var tcs = new TaskCompletionSource<Value> ();
+                       BeginInvokeMethod (thread, method, arguments, options, iar =>
+                                       {
+                                               try {
+                                                       tcs.SetResult (EndInvokeMethod (iar));
+                                               } catch (OperationCanceledException) {
+                                                       tcs.TrySetCanceled ();
+                                               } catch (Exception ex) {
+                                                       tcs.TrySetException (ex);
+                                               }
+                                       }, null);
+                       return tcs.Task;
+               }
+
+               public Task<InvokeResult> InvokeMethodAsyncWithResult (ThreadMirror thread, MethodMirror method, IList<Value> arguments, InvokeOptions options = InvokeOptions.None) {
+                       var tcs = new TaskCompletionSource<InvokeResult> ();
+                       BeginInvokeMethod (thread, method, arguments, options, iar =>
+                                       {
+                                               try {
+                                                       tcs.SetResult (ObjectMirror.EndInvokeMethodInternalWithResult (iar));
+                                               } catch (OperationCanceledException) {
+                                                       tcs.TrySetCanceled ();
+                                               } catch (Exception ex) {
+                                                       tcs.TrySetException (ex);
+                                               }
+                                       }, null);
+                       return tcs.Task;
+               }
+#endif
        }
 }
index a057455538db9b900fb411aaabcd600a2efd1cac..3c9b2877c21c617f2ebb292b48568995923b28b5 100644 (file)
@@ -81,6 +81,7 @@ public struct AStruct {
        public string s;
        public byte k;
        public IntPtr j;
+       public int l;
 
        [MethodImplAttribute (MethodImplOptions.NoInlining)]
        public int foo (int val) {
@@ -106,6 +107,11 @@ public struct AStruct {
        public IntPtr invoke_return_intptr () {
                return j;
        }
+
+       [MethodImplAttribute (MethodImplOptions.NoInlining)]
+       public void invoke_mutate () {
+               l = 5;
+       }
 }
 
 public class GClass<T> {
@@ -953,6 +959,11 @@ public class Tests : TestsBase, ITest2
                return 42;
        }
 
+       public void invoke_out (out int foo, out int[] arr) {
+               foo = 5;
+               arr = new int [10];
+       }
+
        [MethodImplAttribute (MethodImplOptions.NoInlining)]
        public static void exceptions () {
                try {
index 9d6e5c412714d23c76f0a9c839d23212b0bd889e..9a671202a82027cf99d0b9ded34611eb72772d33 100644 (file)
@@ -2110,6 +2110,21 @@ public class DebuggerTests
                        Assert.AreEqual ("Exception", ex.Exception.Type.Name);
                }
 
+#if NET_4_5
+               // out argument
+               m = t.GetMethod ("invoke_out");
+               var out_task = this_obj.InvokeMethodAsyncWithResult (e.Thread, m, new Value [] { vm.CreateValue (1), vm.CreateValue (null) }, InvokeOptions.ReturnOutArgs);
+               var out_args = out_task.Result.OutArgs;
+               AssertValue (5, out_args [0]);
+               Assert.IsTrue (out_args [1] is ArrayMirror);
+               Assert.AreEqual (10, (out_args [1] as ArrayMirror).Length);
+
+               // without ReturnOutArgs flag
+               out_task = this_obj.InvokeMethodAsyncWithResult (e.Thread, m, new Value [] { vm.CreateValue (1), vm.CreateValue (null) });
+               out_args = out_task.Result.OutArgs;
+               Assert.IsNull (out_args);
+#endif
+
                // newobj
                m = t.GetMethod (".ctor");
                v = t.InvokeMethod (e.Thread, m, null);
@@ -2212,6 +2227,24 @@ public class DebuggerTests
                m = t.GetMethod ("invoke_return_int");
                v = s.InvokeMethod (e.Thread, m, null);
                AssertValue (42, v);
+
+#if NET_4_5
+               // Invoke a method which changes state
+               s = frame.GetArgument (1) as StructMirror;
+               t = s.Type;
+               m = t.GetMethod ("invoke_mutate");
+               var task = s.InvokeMethodAsyncWithResult (e.Thread, m, null, InvokeOptions.ReturnOutThis);
+               var out_this = task.Result.OutThis as StructMirror;
+               AssertValue (5, out_this ["l"]);
+
+               // Without the ReturnOutThis flag
+               s = frame.GetArgument (1) as StructMirror;
+               t = s.Type;
+               m = t.GetMethod ("invoke_mutate");
+               task = s.InvokeMethodAsyncWithResult (e.Thread, m, null);
+               out_this = task.Result.OutThis as StructMirror;
+               Assert.AreEqual (null, out_this);
+#endif
        }
 
        [Test]
index 166be8d8f482c2d43a70a053bd28468406ec3e11..7e7cedae6f2c7a2d70205841edcdaf48bdc8304d 100644 (file)
@@ -474,7 +474,7 @@ namespace System.Data {
                public string Expression {\r
                        get { return _expression; }\r
                        set {\r
-                               if (value == null)\r
+                               if (value == null || value.Trim () == string.Empty)\r
                                        value = String.Empty;\r
 \r
                                CompileExpression (value);\r
index 6b6299f41a82c490d4a0e79d244fbc197633cfd9..f3fa2a8e77c18d2c4a9bd50b60a1bb2f62bc8dea 100644 (file)
@@ -134,10 +134,7 @@ namespace System.Data {
                public object this [string columnName] {
                        get { return this [columnName, DataRowVersion.Default]; }
                        set {
-                               DataColumn column = _table.Columns [columnName];
-                               if (column == null)
-                                       throw new ArgumentException ("The column '" + columnName +
-                                               "' does not belong to the table : " + _table.TableName);
+                               DataColumn column = GetColumn (columnName);
                                this [column.Ordinal] = value;
                        }
                }
@@ -202,10 +199,7 @@ namespace System.Data {
                /// </summary>
                public object this [string columnName, DataRowVersion version] {
                        get {
-                               DataColumn column = _table.Columns [columnName];
-                               if (column == null)
-                                       throw new ArgumentException ("The column '" + columnName +
-                                               "' does not belong to the table : " + _table.TableName);
+                               DataColumn column = GetColumn (columnName);
                                return this [column.Ordinal, version];
                        }
                }
@@ -1248,7 +1242,7 @@ namespace System.Data {
                /// </summary>
                public bool IsNull (string columnName)
                {
-                       return IsNull (Table.Columns [columnName]);
+                       return IsNull (GetColumn (columnName));
                }
 
                /// <summary>
@@ -1257,6 +1251,17 @@ namespace System.Data {
                /// </summary>
                public bool IsNull (DataColumn column, DataRowVersion version)
                {
+                       if (column == null)
+                               throw new ArgumentNullException ("column");
+
+                       // use the expresion if there is one
+                       if (column.Expression != String.Empty) {
+                               // FIXME: how does this handle 'version'?
+                               // TODO: Can we avoid the Eval each time by using the cached value?
+                               object o = column.CompiledExpression.Eval (this);
+                               return o == null && o == DBNull.Value;
+                       }
+
                        return column.DataContainer.IsNull (IndexFromVersion (version));
                }
 
@@ -1692,5 +1697,15 @@ namespace System.Data {
                        }
                }
 #endif // NET_2_0
+
+               DataColumn GetColumn (string columnName)
+               {
+                       DataColumn column = _table.Columns [columnName];
+
+                       if (column == null)
+                               throw new ArgumentException ("The column '" + columnName + "' does not belong to the table " + _table.TableName);
+
+                       return column;
+               }
        }
 }
index f0f68c3207c7dc7ca93acbb8fee081136593397a..096c72fd1cff63293bdc026c5de9b94e93688c18 100644 (file)
@@ -542,6 +542,23 @@ namespace MonoTests.System.Data
                        Assert.AreEqual(sExpression,dc.Expression, "dce#2");                            
                }
 
+               [Test]
+               public void Expression_Whitespace ()
+               {
+                       DataColumn dc = new DataColumn ("ColName", typeof(string));
+
+                       string plainWhitespace = "    ";
+                       string surroundWhitespace = "  'abc'  ";
+
+                       Assert.AreEqual (string.Empty, dc.Expression, "dce#1");
+
+                       dc.Expression = plainWhitespace;
+                       Assert.AreEqual (string.Empty, dc.Expression, "dce#2");
+
+                       dc.Expression = surroundWhitespace;
+                       Assert.AreEqual (surroundWhitespace, dc.Expression, "dce#3");
+               }
+
                [Test]
                public void Expression_Exceptions()
                {
index 14333e2201ad4599e3d68507d6cc19c4a6a4b380..4dc0d77495e8178801e83aa7ce4f0c293605bcc5 100644 (file)
@@ -2125,6 +2125,59 @@ namespace MonoTests.System.Data
 #endregion
                }
 
+               [Test]
+               public void IsNull_BeforeGetValue ()
+               {
+                       DataTable table = new DataTable ();
+
+                       // add the row, with the value in the column
+                       DataColumn staticColumn = table.Columns.Add ("static", typeof(string), null); // static
+                       DataRow row = table.Rows.Add ("the value");
+                       Assert.IsFalse (row.IsNull ("static"), "static null check failed");
+                       Assert.AreEqual ("the value", row ["static"], "static value check failed");
+
+                       // add the first derived column
+                       DataColumn firstColumn = table.Columns.Add ("first", typeof(string), "static"); // first -> static
+                       Assert.IsFalse (row.IsNull ("first"), "first level null check failed");
+                       Assert.AreEqual ("the value", row ["first"], "first level value check failed");
+
+                       // add the second level of related
+                       DataColumn secondColumn = table.Columns.Add ("second", typeof(string), "first"); // second -> first -> static
+                       Assert.IsFalse (row.IsNull ("second"), "second level null check failed");
+                       Assert.AreEqual ("the value", row ["second"], "second level value check failed");
+               }
+
+               [Test]
+               public void IsNull_NullValueArguments ()
+               {
+                       DataTable table = new DataTable ();
+
+                       // add the row, with the value in the column
+                       DataColumn staticColumn = table.Columns.Add ("static", typeof(string), null);
+                       DataRow row = table.Rows.Add ("the value");
+
+                       try {
+                               row.IsNull ((string)null);
+                               Assert.Fail ("expected an arg null exception for passing a null string");
+                       } catch (ArgumentNullException) {
+                               // do nothing as null columns aren't allowed
+                       }
+
+                       try {
+                               row.IsNull ("");
+                               Assert.Fail ("expected an arg exception for passing an empty string");
+                       } catch (ArgumentException) {
+                               // do nothing as we can't find a col with no name
+                       }
+
+                       try {
+                               row.IsNull (null, DataRowVersion.Default);
+                               Assert.Fail ("null column with version check failed");
+                       } catch (ArgumentNullException) {
+                               // do nothing as null columns aren't allowed
+                       }
+               }
+
                [Test] public void Item()
                {
                        // init table with columns
index b07e5b9415d05a428c05f907c7834cc2baf7b5ea..444e1e6066e765db76f854651ffc19418122af1d 100644 (file)
@@ -28,6 +28,7 @@
 
 
 using System;
+using System.IO;
 using System.Drawing;
 using System.Drawing.Imaging;
 using System.Drawing.Drawing2D;
@@ -125,6 +126,7 @@ namespace MonoTests.System.Drawing.Drawing2D
                        // save the drawing
                        string file =  "TestHatchBrush" + getOutSufix() + ".png";
                        bmp.Save (file, ImageFormat.Png);
+                       File.Delete (file);
                }
 
                private void Constructors ()
index 784e19b0edebf23ad4f7a3eb890553feaaa021b7..dcca275389db39b44af0396ed25b6aeb85583c75 100644 (file)
@@ -27,6 +27,7 @@
 //
 
 using System;
+using System.IO;
 using System.Drawing;
 using System.Drawing.Imaging;
 using System.Security.Permissions;
@@ -114,6 +115,8 @@ namespace MonoTests.System.Drawing.Imaging {
 
                private void Bug80323 (Color c)
                {
+                       string fileName = String.Format ("80323-{0}.png", c.ToArgb ().ToString ("X"));
+
                        // test case from bug #80323
                        ColorMatrix cm = new ColorMatrix (new float[][] {
                                new float[]     {1,     0,      0,      0,      0}, //R
@@ -138,12 +141,14 @@ namespace MonoTests.System.Drawing.Imaging {
                                                        g.DrawImage (bmp, new Rectangle (0, 0, 100, 100), 0, 0, 100, 100, GraphicsUnit.Pixel, null);
                                                        g.DrawImage (bmp, new Rectangle (100, 0, 100, 100), 0, 0, 100, 100, GraphicsUnit.Pixel, ia);
                                                }
-                                               b.Save (String.Format ("80323-{0}.png", c.ToArgb ().ToString ("X")));
+                                               b.Save (fileName);
                                                Assert.AreEqual (Color.FromArgb (255, 255, 155, 155), b.GetPixel (50, 50), "50,50");
                                                Assert.AreEqual (Color.FromArgb (255, 255, 205, 205), b.GetPixel (150, 50), "150,50");
                                        }
                                }
                        }
+
+                       File.Delete (fileName);
                }
        
                [Test]
index 40d8f15fb631527d1fc0ae7b73752ee4e26bab6b..8158dfd757b5cd2186e391564aea801d97654f6f 100644 (file)
@@ -58,6 +58,8 @@ namespace MonoTests.System.IO.Compression
                                var nullEntry = archive.GetEntry("nonexisting");
                                Assert.IsNull(nullEntry);
                        }
+
+                       File.Delete ("test.zip");
                }
 
                [Test]
@@ -75,6 +77,8 @@ namespace MonoTests.System.IO.Compression
 
                                Assert.Fail();
                        }
+
+                       File.Delete ("test.zip");
                }
 
                [Test]
@@ -90,6 +94,8 @@ namespace MonoTests.System.IO.Compression
                                var nullEntry = archive.GetEntry("nonexisting");
                                Assert.IsNull(nullEntry);
                        }
+
+                       File.Delete ("test.zip");
                }
 
                [Test]
@@ -104,6 +110,8 @@ namespace MonoTests.System.IO.Compression
 
                                var foo = entry.Open();
                        }
+
+                       File.Delete ("test.zip");
                }
 
                [Test]
@@ -125,6 +133,8 @@ namespace MonoTests.System.IO.Compression
                                var entry = archive.GetEntry("foo.txt");
                                Assert.IsNull(entry);
                        }
+
+                       File.Delete ("delete.zip");
                }
 
                [Test]
@@ -146,6 +156,8 @@ namespace MonoTests.System.IO.Compression
                                var entry = archive.GetEntry("foo.txt");
                                Assert.IsNull(entry);
                        }
+
+                       File.Delete ("delete.zip");
                }
 
                [Test]
@@ -173,6 +185,8 @@ namespace MonoTests.System.IO.Compression
 
                                Assert.AreEqual("foo", text);
                        }
+
+                       File.Delete ("create.zip");
                }
 
                [Test]
@@ -191,6 +205,8 @@ namespace MonoTests.System.IO.Compression
                                Assert.AreEqual("foobar/bar.txt", entries[3].FullName);
                                Assert.AreEqual("foobar/foo.txt", entries[4].FullName);
                        }
+
+                       File.Delete ("test.zip");
                }
 
                [Test]
@@ -209,6 +225,8 @@ namespace MonoTests.System.IO.Compression
                                Assert.AreEqual("foobar/bar.txt", entries[3].FullName);
                                Assert.AreEqual("foobar/foo.txt", entries[4].FullName);
                        }
+
+                       File.Delete ("test.zip");
                }
 
                [Test]
@@ -226,6 +244,8 @@ namespace MonoTests.System.IO.Compression
                                
                                Assert.Fail();                          
                        }
+
+                       File.Delete ("test.zip");
                }
        }
 }
index 64518785b87351fa6797c4bdfd8feb170df85a57..5d47eb4a4e6b6875a8cc103d914b56ee10cac2f4 100644 (file)
@@ -163,7 +163,16 @@ namespace System.Json
                                        return (string) value;
                                throw new NotImplementedException ("GetFormattedString from value type " + value.GetType ());
                        case JsonType.Number:
-                               return ((IFormattable) value).ToString ("G", NumberFormatInfo.InvariantInfo);
+                               string s;
+                               if (value is float || value is double)
+                                       // Use "round-trip" format
+                                       s = ((IFormattable) value).ToString ("R", NumberFormatInfo.InvariantInfo);
+                               else
+                                       s = ((IFormattable) value).ToString ("G", NumberFormatInfo.InvariantInfo);
+                               if (s == "NaN" || s == "Infinity" || s == "-Infinity")
+                                       return "\"" + s + "\"";
+                               else
+                                       return s;
                        default:
                                throw new InvalidOperationException ();
                        }
index 1d16b88e3f40407f1994efc04735c38bc269fada..d703edd5512c5c6427f43f78a2975f8600f5edd5 100644 (file)
@@ -1,6 +1,7 @@
 using System;
 using System.Collections;
 using System.Collections.Generic;
+using System.Globalization;
 using System.IO;
 using System.Linq;
 using System.Runtime.Serialization.Json;
@@ -218,8 +219,8 @@ namespace System.Json
                                if (src [i] == '"' || src [i] == '\\') {
                                        sb.Append (src, start, i - start);
                                        sb.Append ('\\');
-                                       sb.Append (src [i++]);
-                                       start = i;
+                                       sb.Append (src [i]);
+                                       start = i + 1;
                                }
                        sb.Append (src, start, src.Length - start);
                        return sb.ToString ();
@@ -328,70 +329,70 @@ namespace System.Json
                {
                        if (value == null)
                                throw new ArgumentNullException ("value");
-                       return Convert.ToBoolean (((JsonPrimitive) value).Value);
+                       return Convert.ToBoolean (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
                }
 
                public static implicit operator byte (JsonValue value)
                {
                        if (value == null)
                                throw new ArgumentNullException ("value");
-                       return Convert.ToByte (((JsonPrimitive) value).Value);
+                       return Convert.ToByte (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
                }
 
                public static implicit operator char (JsonValue value)
                {
                        if (value == null)
                                throw new ArgumentNullException ("value");
-                       return Convert.ToChar (((JsonPrimitive) value).Value);
+                       return Convert.ToChar (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
                }
 
                public static implicit operator decimal (JsonValue value)
                {
                        if (value == null)
                                throw new ArgumentNullException ("value");
-                       return Convert.ToDecimal (((JsonPrimitive) value).Value);
+                       return Convert.ToDecimal (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
                }
 
                public static implicit operator double (JsonValue value)
                {
                        if (value == null)
                                throw new ArgumentNullException ("value");
-                       return Convert.ToDouble (((JsonPrimitive) value).Value);
+                       return Convert.ToDouble (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
                }
 
                public static implicit operator float (JsonValue value)
                {
                        if (value == null)
                                throw new ArgumentNullException ("value");
-                       return Convert.ToSingle (((JsonPrimitive) value).Value);
+                       return Convert.ToSingle (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
                }
 
                public static implicit operator int (JsonValue value)
                {
                        if (value == null)
                                throw new ArgumentNullException ("value");
-                       return Convert.ToInt32 (((JsonPrimitive) value).Value);
+                       return Convert.ToInt32 (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
                }
 
                public static implicit operator long (JsonValue value)
                {
                        if (value == null)
                                throw new ArgumentNullException ("value");
-                       return Convert.ToInt64 (((JsonPrimitive) value).Value);
+                       return Convert.ToInt64 (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
                }
 
                public static implicit operator sbyte (JsonValue value)
                {
                        if (value == null)
                                throw new ArgumentNullException ("value");
-                       return Convert.ToSByte (((JsonPrimitive) value).Value);
+                       return Convert.ToSByte (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
                }
 
                public static implicit operator short (JsonValue value)
                {
                        if (value == null)
                                throw new ArgumentNullException ("value");
-                       return Convert.ToInt16 (((JsonPrimitive) value).Value);
+                       return Convert.ToInt16 (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
                }
 
                public static implicit operator string (JsonValue value)
@@ -405,21 +406,21 @@ namespace System.Json
                {
                        if (value == null)
                                throw new ArgumentNullException ("value");
-                       return Convert.ToUInt16 (((JsonPrimitive) value).Value);
+                       return Convert.ToUInt16 (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
                }
 
                public static implicit operator ulong (JsonValue value)
                {
                        if (value == null)
                                throw new ArgumentNullException ("value");
-                       return Convert.ToUInt64(((JsonPrimitive) value).Value);
+                       return Convert.ToUInt64(((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
                }
 
                public static implicit operator ushort (JsonValue value)
                {
                        if (value == null)
                                throw new ArgumentNullException ("value");
-                       return Convert.ToUInt16 (((JsonPrimitive) value).Value);
+                       return Convert.ToUInt16 (((JsonPrimitive) value).Value, NumberFormatInfo.InvariantInfo);
                }
 
                public static implicit operator DateTime (JsonValue value)
index 2459c1fc3ad0f27478d902ffaccc6f2ec3f0d371..02dd106dfd8b82a5b3f3f9bf2ea71663d7aead57 100644 (file)
@@ -11,6 +11,8 @@ using System;
 using System.IO;
 using System.Text;
 using System.Json;
+using System.Globalization;
+using System.Threading;
 
 namespace MonoTests.System
 {
@@ -24,6 +26,14 @@ namespace MonoTests.System
                        Assert.AreEqual (1, j.Count, "itemcount");
                        Assert.AreEqual (JsonType.String, j ["a"].JsonType, "type");
                        Assert.AreEqual ("b", (string) j ["a"], "value");
+
+                       JsonValue.Parse ("[{ \"a\": \"b\",}]");
+               }
+
+               [Test]
+               public void LoadWithTrailingComma2 ()
+               {
+                       JsonValue.Parse ("[{ \"a\": \"b\",}]");
                }
 
                // Test that we correctly serialize JsonArray with null elements.
@@ -35,5 +45,141 @@ namespace MonoTests.System
                        var str = j.ToString ();
                        Assert.AreEqual (str, "[1, 2, 3, null]");
                }
+
+               [Test]
+               public void QuoteEscapeBug_20869 () 
+               {
+                       Assert.AreEqual ((new JsonPrimitive ("\"\"")).ToString (), "\"\\\"\\\"\"");
+               }
+
+               void ExpectError (string s)
+               {
+                       try {
+                               JsonValue.Parse (s);
+                               Assert.Fail ("Expected ArgumentException for `" + s + "'");
+                       } catch (ArgumentException) {
+                       }
+               }
+
+               // Test whether an exception is thrown for invalid JSON
+               [Test]
+               public void CheckErrors () 
+               {
+                       ExpectError (@"-");
+                       ExpectError (@"- ");
+                       ExpectError (@"1.");
+                       ExpectError (@"1. ");
+                       ExpectError (@"1e+");
+                       ExpectError (@"1 2");
+                       ExpectError (@"077");
+
+                       ExpectError (@"[1,]");
+
+                       //ExpectError (@"{""a"":1,}"); // Not valid JSON, allowed anyway
+               }
+
+               // Parse a json string and compare to the expected value
+               void CheckDouble (double expected, string json)
+               {
+                       double jvalue = (double) JsonValue.Parse (json);
+                       Assert.AreEqual (expected, jvalue);
+               }
+
+               // Convert a number to json and parse the string, then compare the result to the original value
+               void CheckDouble (double number)
+               {
+                       double jvalue = (double) JsonValue.Parse (new JsonPrimitive (number).ToString ());
+                       Assert.AreEqual (number, jvalue); // should be exactly the same
+               }
+
+               [Test]
+               public void CheckNumbers () 
+               {
+                       CheckDouble (0, "0");
+                       CheckDouble (0, "-0");
+                       CheckDouble (0, "0.00");
+                       CheckDouble (0, "-0.00");
+                       CheckDouble (1, "1");
+                       CheckDouble (1.1, "1.1");
+                       CheckDouble (-1, "-1");
+                       CheckDouble (-1.1, "-1.1");
+                       CheckDouble (1e-10, "1e-10");
+                       CheckDouble (1e+10, "1e+10");
+                       CheckDouble (1e-30, "1e-30");
+                       CheckDouble (1e+30, "1e+30");
+
+                       CheckDouble (1, "\"1\"");
+                       CheckDouble (1.1, "\"1.1\"");
+                       CheckDouble (-1, "\"-1\"");
+                       CheckDouble (-1.1, "\"-1.1\"");
+
+                       CheckDouble (double.NaN, "\"NaN\"");
+                       CheckDouble (double.PositiveInfinity, "\"Infinity\"");
+                       CheckDouble (double.NegativeInfinity, "\"-Infinity\"");
+
+                       ExpectError ("NaN");
+                       ExpectError ("Infinity");
+                       ExpectError ("-Infinity");
+
+                       Assert.AreEqual ("1.1", new JsonPrimitive (1.1).ToString ());
+                       Assert.AreEqual ("-1.1", new JsonPrimitive (-1.1).ToString ());
+                       Assert.AreEqual ("1E-20", new JsonPrimitive (1e-20).ToString ());
+                       Assert.AreEqual ("1E+20", new JsonPrimitive (1e+20).ToString ());
+                       Assert.AreEqual ("1E-30", new JsonPrimitive (1e-30).ToString ());
+                       Assert.AreEqual ("1E+30", new JsonPrimitive (1e+30).ToString ());
+                       Assert.AreEqual ("\"NaN\"", new JsonPrimitive (double.NaN).ToString ());
+                       Assert.AreEqual ("\"Infinity\"", new JsonPrimitive (double.PositiveInfinity).ToString ());
+                       Assert.AreEqual ("\"-Infinity\"", new JsonPrimitive (double.NegativeInfinity).ToString ());
+
+                       Assert.AreEqual ("1E-30", JsonValue.Parse ("1e-30").ToString ());
+                       Assert.AreEqual ("1E+30", JsonValue.Parse ("1e+30").ToString ());
+
+                       CheckDouble (1);
+                       CheckDouble (1.1);
+                       CheckDouble (1.25);
+                       CheckDouble (-1);
+                       CheckDouble (-1.1);
+                       CheckDouble (-1.25);
+                       CheckDouble (1e-20);
+                       CheckDouble (1e+20);
+                       CheckDouble (1e-30);
+                       CheckDouble (1e+30);
+                       CheckDouble (3.1415926535897932384626433);
+                       CheckDouble (3.1415926535897932384626433e-20);
+                       CheckDouble (3.1415926535897932384626433e+20);
+                       CheckDouble (double.NaN);
+                       CheckDouble (double.PositiveInfinity);
+                       CheckDouble (double.NegativeInfinity);
+                       CheckDouble (double.MinValue);
+                       CheckDouble (double.MaxValue);
+
+                       // A number which needs 17 digits (see http://stackoverflow.com/questions/6118231/why-do-i-need-17-significant-digits-and-not-16-to-represent-a-double)
+                       CheckDouble (18014398509481982.0);
+
+                       // Values around the smallest positive decimal value
+                       CheckDouble (1.123456789e-29);
+                       CheckDouble (1.123456789e-28);
+
+                       CheckDouble (1.1E-29, "0.000000000000000000000000000011");
+                       // This is being parsed as a decimal and rounded to 1e-28, even though it can be more accurately be represented by a double
+                       //CheckDouble (1.1E-28, "0.00000000000000000000000000011");
+               }
+
+               // Retry the test with different locales
+               [Test]
+               public void CheckNumbersCulture () 
+               {
+                       CultureInfo old = Thread.CurrentThread.CurrentCulture;
+                       try {
+                               Thread.CurrentThread.CurrentCulture = new CultureInfo ("en");
+                               CheckNumbers ();
+                               Thread.CurrentThread.CurrentCulture = new CultureInfo ("fr");
+                               CheckNumbers ();
+                               Thread.CurrentThread.CurrentCulture = new CultureInfo ("de");
+                               CheckNumbers ();
+                       } finally {
+                               Thread.CurrentThread.CurrentCulture = old;
+                       }
+               }
        }
 }
index b067997cb7ca810c88674b9f236cdce8adcc57fd..329f91eed1fc43d8ff8f0f4f52ab16320b22032d 100644 (file)
@@ -315,12 +315,14 @@ namespace System.Numerics {
                                        word = (uint)sub;
                                        borrow = (uint)(sub >> 32) & 0x1u;
 
-                                       data [data.Length - 1] = ~word & store_mask;
+                                       if ((~word & store_mask) == 0)
+                                               data = Resize (data, data.Length - 1);
+                                       else
+                                               data [data.Length - 1] = ~word & store_mask;
                                }
                                if (borrow != 0) //FIXME I believe this can't happen, can someone write a test for it?
                                        throw new Exception ("non zero final carry");
                        }
-
                }
 
                public bool IsEven {
index 4aa0ffbd029d7182e8ce1a137baf1fef4c6ac3b5..817d13e40c18e84b240a9df1a85223468d2d227f 100644 (file)
@@ -550,13 +550,18 @@ namespace MonoTests.System.Numerics
                {
                        long[] values = new long [] {
                                0, long.MinValue, long.MaxValue, -1, 1L + int.MaxValue, -1L + int.MinValue, 0x1234, 0xFFFFFFFFL, 0x1FFFFFFFFL, -0xFFFFFFFFL, -0x1FFFFFFFFL,
-                               0x100000000L, -0x100000000L, 0x100000001L, -0x100000001L };
+                               0x100000000L, -0x100000000L, 0x100000001L, -0x100000001L, 4294967295L, -4294967295L, 4294967296L, -4294967296L };
                        foreach (var val in values) {
-                               var a = new BigInteger (val);
-                               var b = new BigInteger (a.ToByteArray ());
-
-                               Assert.AreEqual (val, (long)a, "#a_" + val);
-                               Assert.AreEqual (val, (long)b, "#b_" + val);
+                               try {
+                                       var a = new BigInteger (val);
+                                       var b = new BigInteger (a.ToByteArray ());
+
+                                       Assert.AreEqual (val, (long)a, "#a_" + val);
+                                       Assert.AreEqual (val, (long)b, "#b_" + val);
+                                       Assert.AreEqual (a, b, "#a  == #b (" + val + ")");
+                               } catch (Exception e) {
+                                       Assert.Fail ("could not roundtrip {0}", val);
+                               }
                        }
                }
 
index 891be5db3ee2b0c44fa287bbad83c4e0e9b6e818..2d11b1727aec81a2f5f1b1296e1b4336c19296f4 100644 (file)
@@ -26,7 +26,7 @@ namespace System.Runtime.Serialization.Json
                {
                        object v = ReadCore ();
                        SkipSpaces ();
-                       if (r.Read () >= 0)
+                       if (ReadChar () >= 0)
                                throw JsonError (String.Format ("extra characters in JSON input"));
                        return v;
                }
@@ -68,8 +68,10 @@ namespace System.Runtime.Serialization.Json
                                }
                                while (true) {
                                        SkipSpaces ();
-                                       if (PeekChar () == '}')
+                                       if (PeekChar () == '}') {
+                                               ReadChar ();
                                                break;
+                                       }
                                        string name = ReadStringLiteral ();
                                        SkipSpaces ();
                                        Expect (':');
@@ -160,98 +162,89 @@ namespace System.Runtime.Serialization.Json
                // It could return either int, long or decimal, depending on the parsed value.
                object ReadNumericLiteral ()
                {
+                       var sb = new StringBuilder ();
+                       
                        bool negative = false;
                        if (PeekChar () == '-') {
                                negative = true;
-                               ReadChar ();
-                               if (PeekChar () < 0)
-                                       throw JsonError ("Invalid JSON numeric literal; extra negation");
+                               sb.Append ((char) ReadChar ());
                        }
 
                        int c;
-                       decimal val = 0;
                        int x = 0;
                        bool zeroStart = PeekChar () == '0';
                        for (; ; x++) {
                                c = PeekChar ();
                                if (c < '0' || '9' < c)
                                        break;
-                               val = val * 10 + (c - '0');
-                               ReadChar ();
-                               if (zeroStart && x == 1 && c == '0')
-                                       throw JsonError ("leading multiple zeros are not allowed");
+                               sb.Append ((char) ReadChar ());
+                               if (zeroStart && x == 1)
+                                       throw JsonError ("leading zeros are not allowed");
                        }
+                       if (x == 0) // Reached e.g. for "- "
+                               throw JsonError ("Invalid JSON numeric literal; no digit found");
 
                        // fraction
-
                        bool hasFrac = false;
-                       decimal frac = 0;
                        int fdigits = 0;
                        if (PeekChar () == '.') {
                                hasFrac = true;
-                               ReadChar ();
+                               sb.Append ((char) ReadChar ());
                                if (PeekChar () < 0)
                                        throw JsonError ("Invalid JSON numeric literal; extra dot");
-                               decimal d = 10;
                                while (true) {
                                        c = PeekChar ();
                                        if (c < '0' || '9' < c)
                                                break;
-                                       ReadChar ();
-                                       frac += (c - '0') / d;
-                                       d *= 10;
+                                       sb.Append ((char) ReadChar ());
                                        fdigits++;
                                }
                                if (fdigits == 0)
                                        throw JsonError ("Invalid JSON numeric literal; extra dot");
                        }
-                       frac = Decimal.Round (frac, fdigits);
 
                        c = PeekChar ();
                        if (c != 'e' && c != 'E') {
                                if (!hasFrac) {
-                                       if (negative && int.MinValue <= -val ||
-                                           !negative && val <= int.MaxValue)
-                                               return (int) (negative ? -val : val);
-                                       if (negative && long.MinValue <= -val ||
-                                           !negative && val <= long.MaxValue)
-                                               return (long) (negative ? -val : val);
+                                       int valueInt;
+                                       if (int.TryParse (sb.ToString (), NumberStyles.Float, CultureInfo.InvariantCulture, out valueInt))
+                                               return valueInt;
+                                       
+                                       long valueLong;
+                                       if (long.TryParse (sb.ToString (), NumberStyles.Float, CultureInfo.InvariantCulture, out valueLong))
+                                               return valueLong;
+                                       
+                                       ulong valueUlong;
+                                       if (ulong.TryParse (sb.ToString (), NumberStyles.Float, CultureInfo.InvariantCulture, out valueUlong))
+                                               return valueUlong;
                                }
-                               var v = val + frac;
-                               return negative ? -v : v;
-                       }
-
-                       // exponent
-
-                       ReadChar ();
-
-                       int exp = 0;
-                       if (PeekChar () < 0)
-                               throw new ArgumentException ("Invalid JSON numeric literal; incomplete exponent");
+                               decimal valueDecimal;
+                               if (decimal.TryParse (sb.ToString (), NumberStyles.Float, CultureInfo.InvariantCulture, out valueDecimal) && valueDecimal != 0)
+                                       return valueDecimal;
+                       } else {
+                               // exponent
+                               sb.Append ((char) ReadChar ());
+                               if (PeekChar () < 0)
+                                       throw new ArgumentException ("Invalid JSON numeric literal; incomplete exponent");
                        
-                       bool negexp = false;
-                       c = PeekChar ();
-                       if (c == '-') {
-                               ReadChar ();
-                               negexp = true;
-                       }
-                       else if (c == '+')
-                               ReadChar ();
-
-                       if (PeekChar () < 0)
-                               throw JsonError ("Invalid JSON numeric literal; incomplete exponent");
-                       while (true) {
                                c = PeekChar ();
-                               if (c < '0' || '9' < c)
-                                       break;
-                               exp = exp * 10 + (c - '0');
-                               ReadChar ();
+                               if (c == '-') {
+                                       sb.Append ((char) ReadChar ());
+                               }
+                               else if (c == '+')
+                                       sb.Append ((char) ReadChar ());
+
+                               if (PeekChar () < 0)
+                                       throw JsonError ("Invalid JSON numeric literal; incomplete exponent");
+                               while (true) {
+                                       c = PeekChar ();
+                                       if (c < '0' || '9' < c)
+                                               break;
+                                       sb.Append ((char) ReadChar ());
+                               }
                        }
-                       // it is messy to handle exponent, so I just use Decimal.Parse() with assured JSON format.
-                       if (negexp)
-                               return new Decimal ((double) (val + frac) / Math.Pow (10, exp));
-                       int [] bits = Decimal.GetBits (val + frac);
-                       return new Decimal (bits [0], bits [1], bits [2], negative, (byte) exp);
+
+                       return double.Parse (sb.ToString (), NumberStyles.Float, CultureInfo.InvariantCulture);
                }
 
                StringBuilder vb = new StringBuilder ();
index a6bc6c5e6fc158c4b49b640646cbccddbb2ac561..593ded1b011ad12caddc022a8e01259000a4d0e3 100644 (file)
@@ -30,6 +30,7 @@ namespace MonoTests.System.ServiceModel.PeerResolvers
                }
 
                [Test]
+               [Category ("NotWorking")]
                public void CloseTest ()
                {
                        cprs.Open ();
@@ -79,6 +80,7 @@ namespace MonoTests.System.ServiceModel.PeerResolvers
 
                [Test]
                [ExpectedException (typeof (InvalidOperationException))]
+               [Category ("NotWorking")]
                public void OpenTest4 ()
                {
                        cprs.Open ();
index db2ea356666c7db136e76e8197b34d47855c4d7e..1990089323b5c5624ea56b797d003398692f1577 100644 (file)
@@ -165,7 +165,6 @@ namespace MonoTests.System.Web.UI.Adapters
                        pd.SaveStateComplete = RenderPostBackEvent_OnSaveStateComplete;
                        t.Invoker = new PageInvoker (pd);
                        string html = t.Run ();
-                       File.WriteAllText("response.html", html);
                }
                
                public static void RenderPostBackEvent_OnSaveStateComplete (Page p)
index 609583a73f2336df00026d379a6d90a0ceb3209d..a7eeb67d883c73ab90fdb7e57a87c096b633c452 100644 (file)
@@ -231,7 +231,7 @@ namespace System.Net.Sockets
                        else if (op == SocketAsyncOperation.Disconnect)
                                args.DisconnectCallback (ares);
                        else if (op == SocketAsyncOperation.Connect)
-                               args.ConnectCallback ();
+                               args.ConnectCallback (ares);
                        /*
                        else if (op == Socket.SocketOperation.ReceiveMessageFrom)
                        else if (op == Socket.SocketOperation.SendPackets)
@@ -254,10 +254,12 @@ namespace System.Net.Sockets
                        }
                }
 
-               void ConnectCallback ()
+               void ConnectCallback (IAsyncResult ares)
                {
                        try {
-                               SocketError = (SocketError) Worker.result.error;
+                               curSocket.EndConnect (ares);
+                       } catch (SocketException se) {
+                               SocketError = se.SocketErrorCode;
                        } finally {
                                OnCompleted (this);
                        }
index 11a7eda8a45ee9b9ae8631201dcf2a76a9313f9a..7616b88c788087763599527518712eaf4a1c3ae0 100644 (file)
@@ -1253,7 +1253,7 @@ namespace System.Net.Sockets {
                                throw new SocketException (error);
                        }
 
-                       if (socket_type == SocketType.Dgram && (ep.Address.Equals (IPAddress.Any) || ep.Address.Equals (IPAddress.IPv6Any)))
+                       if (socket_type == SocketType.Dgram && ep != null && (ep.Address.Equals (IPAddress.Any) || ep.Address.Equals (IPAddress.IPv6Any)))
                                connected = false;
                        else
                                connected = true;
index 3778c740538ffde77005774f0408e68a27f87b69..bfa085885e6228f0c17b30a8f5635b7e7863f32e 100644 (file)
@@ -196,7 +196,30 @@ namespace System.Net.WebSockets
                                underlyingSocket.Send (sendBuffer, 0, buffer.Count + headerLength, SocketFlags.None);
                        });
                }
+               
+               const int messageTypeText = 1;
+               const int messageTypeBinary = 2;
+               const int messageTypeClose = 8;
 
+               static WebSocketMessageType WireToMessageType (byte msgType)
+               {
+                       
+                       if (msgType == messageTypeText)
+                               return WebSocketMessageType.Text;
+                       if (msgType == messageTypeBinary)
+                               return WebSocketMessageType.Binary;
+                       return WebSocketMessageType.Close;
+               }
+
+               static byte MessageTypeToWire (WebSocketMessageType type)
+               {
+                       if (type == WebSocketMessageType.Text)
+                               return messageTypeText;
+                       if (type == WebSocketMessageType.Binary)
+                               return messageTypeBinary;
+                       return messageTypeClose;
+               }
+               
                public override Task<WebSocketReceiveResult> ReceiveAsync (ArraySegment<byte> buffer, CancellationToken cancellationToken)
                {
                        EnsureWebSocketConnected ();
@@ -208,7 +231,7 @@ namespace System.Net.WebSockets
                                var isLast = (headerBuffer[0] >> 7) > 0;
                                var isMasked = (headerBuffer[1] >> 7) > 0;
                                int mask = 0;
-                               var type = (WebSocketMessageType)(headerBuffer[0] & 0xF);
+                               var type = WireToMessageType ((byte)(headerBuffer[0] & 0xF));
                                long length = headerBuffer[1] & 0x7F;
                                int offset = 0;
                                if (length == 126) {
@@ -279,7 +302,7 @@ namespace System.Net.WebSockets
 
                int WriteHeader (WebSocketMessageType type, ArraySegment<byte> buffer, bool endOfMessage)
                {
-                       var opCode = (byte)type;
+                       var opCode = MessageTypeToWire (type);
                        var length = buffer.Count;
 
                        headerBuffer[0] = (byte)(opCode | (endOfMessage ? 0 : 0x80));
index 50cbc003c0f7c254cdcf1506a723ba8530542c91..f6cb2fc2a86d32a40a437aad5e5ff75cb23927eb 100644 (file)
@@ -35,9 +35,9 @@ namespace System.Net.WebSockets
 {
        public enum WebSocketMessageType
        {
-               Text = 1,
-               Binary = 2,
-               Close = 8
+               Text = 0,
+               Binary = 1,
+               Close = 2
        }
 }
 
index 33f8326b2d6e9041d793afd58945e5239378669a..fc7b97836493f36ea00a8608723d484a7c62c2f0 100644 (file)
@@ -246,6 +246,7 @@ System.Net.Sockets/TcpClientTest.cs
 System.Net.Sockets/TcpListenerTest.cs
 System.Net.Sockets/SocketTest.cs
 System.Net.Sockets/SocketAsyncEventArgsTest.cs
+System.Net.Sockets/SocketConnectAsyncTest.cs
 System.Net.Sockets/UdpClientTest.cs
 System.Net.Sockets/SocketAsyncTest.cs
 System.Net.Mail/LinkedResourceTest.cs
diff --git a/mcs/class/System/Test/System.Net.Sockets/SocketConnectAsyncTest.cs b/mcs/class/System/Test/System.Net.Sockets/SocketConnectAsyncTest.cs
new file mode 100644 (file)
index 0000000..99c4804
--- /dev/null
@@ -0,0 +1,133 @@
+using System;
+using System.Collections;
+using System.Threading;
+using System.Net;
+using System.Net.Sockets;
+using NUnit.Framework;
+
+namespace MonoTests.System.Net.Sockets
+{
+       [TestFixture]
+       public class SocketConnectAsyncTest
+       {
+               Socket serverSocket;
+               Socket clientSocket;
+               SocketAsyncEventArgs clientSocketAsyncArgs;
+               ManualResetEvent readyEvent;
+               ManualResetEvent mainEvent;
+               Exception error;
+
+               [TestFixtureSetUp]
+               public void SetUp ()
+               {
+                       readyEvent = new ManualResetEvent (false);
+                       mainEvent = new ManualResetEvent (false);
+               }
+
+               [TestFixtureTearDown]
+               public void TearDown ()
+               {
+                       readyEvent.Close ();
+                       mainEvent.Close ();
+               }
+
+               void StartServer()
+               {
+                       readyEvent.Reset();
+                       mainEvent.Reset();
+                       ThreadPool.QueueUserWorkItem (_ => DoWork ());
+                       readyEvent.WaitOne ();
+               }
+
+               void StopServer()
+               {
+                       if (serverSocket != null)
+                               serverSocket.Close ();
+               }
+
+               void DoWork ()
+               {
+                       serverSocket = new Socket (
+                               AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                       serverSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
+                       serverSocket.Listen (1);
+
+                       var async = new SocketAsyncEventArgs ();
+                       async.Completed += (s,e) => OnAccepted (e);
+
+                       readyEvent.Set ();
+
+                       if (!serverSocket.AcceptAsync (async))
+                               OnAccepted (async);
+               }
+
+               void OnAccepted (SocketAsyncEventArgs e)
+               {
+                       var acceptSocket = e.AcceptSocket;
+                       mainEvent.Set ();
+               }
+
+               [Test]
+               [Category("Test")]
+               public void Connect ()
+               {
+                       StartServer();
+
+                       EndPoint serverEndpoint = serverSocket.LocalEndPoint;
+
+                       var m = new ManualResetEvent (false);
+                       var e = new SocketAsyncEventArgs ();
+
+                       clientSocket = new Socket (
+                               AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                       clientSocketAsyncArgs = new SocketAsyncEventArgs();
+                       clientSocketAsyncArgs.RemoteEndPoint = serverEndpoint;
+                       clientSocketAsyncArgs.Completed += (s,o) => {
+                               if (o.SocketError != SocketError.Success)
+                                       error = new SocketException ((int)o.SocketError);
+                               m.Set ();
+                       };
+                       bool res = clientSocket.ConnectAsync(clientSocketAsyncArgs);
+                       if (res) {
+                               if (!m.WaitOne (1500))
+                                       throw new TimeoutException ();
+                       }
+
+                       if (!mainEvent.WaitOne (1500))
+                               throw new TimeoutException ();
+                       if (error != null)
+                               throw error;
+
+                       m.Reset ();
+                       mainEvent.Reset ();
+
+                       StopServer();
+
+                       // Try again to non-listening endpoint, expect error
+
+                       error = null;
+                       clientSocket = new Socket (
+                               AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                       clientSocketAsyncArgs = new SocketAsyncEventArgs ();
+                       clientSocketAsyncArgs.RemoteEndPoint = serverEndpoint;
+                       clientSocketAsyncArgs.Completed += (s,o) => {
+                               if (o.SocketError != SocketError.Success)
+                                       error = new SocketException ((int)o.SocketError);
+                               m.Set ();
+                       };
+                       res = clientSocket.ConnectAsync (clientSocketAsyncArgs);
+                       if (res) {
+                               if (!m.WaitOne (1500))
+                                       throw new TimeoutException ();
+                       }
+
+                       Assert.IsTrue (error != null, "Connect - no error");
+                       SocketException socketException = (SocketException)error;
+                       Assert.IsTrue(socketException.ErrorCode == (int)SocketError.ConnectionRefused); 
+       
+                       m.Reset ();
+                       mainEvent.Reset ();
+               }
+
+       }
+}
\ No newline at end of file
index e8ab165dd5bf993b71ec4318cf6eb1884a627712..b6ddbf164a5e04ef05fc2d35b59923c2f82abef6 100755 (executable)
@@ -1648,7 +1648,15 @@ namespace MonoTests.System.Net.Sockets
                {
                        Socket sock = (Socket)asyncResult.AsyncState;
                        
-                       sock.EndConnect (asyncResult);
+                       try {
+                               sock.EndConnect (asyncResult);
+                       } catch (Exception e) {
+                               Console.WriteLine ("BCCallback exception:");
+                               Console.WriteLine (e);
+
+                               throw;
+                       }
+
                        BCConnected = true;
                        
                        BCCalledBack.Set ();
@@ -1783,9 +1791,22 @@ namespace MonoTests.System.Net.Sockets
                        /* Longer wait here, because the ms runtime
                         * takes a lot longer to not connect
                         */
+                       /*
                        if (BCCalledBack.WaitOne (30000, false) == false) {
                                Assert.Fail ("BeginConnectMultiple wait failed");
                        }
+                       */
+
+                       var sw = new global::System.Diagnostics.Stopwatch ();
+                       sw.Start ();
+
+                       BCCalledBack.WaitOne ();
+
+                       sw.Stop ();
+                       Console.WriteLine (sw.ElapsedMilliseconds);
+
+                       if (sw.ElapsedMilliseconds > 30000)
+                               Assert.Fail ("BeginConnectMultiple wait failed");
                        
                        Assert.AreEqual (true, BCConnected, "BeginConnectMultiple #1");
                        Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "BeginConnectMultiple #2");
index 37a49de7333310f5581ad231d20f146177048eb9..ccf2484dfdddf2db7e554b5b4176c004fc9f9a94 100644 (file)
@@ -1472,7 +1472,7 @@ namespace MonoTests.System.Net
                        }
                }
 
-               void TestTimeOut (string url)
+               void TestTimeOut (string url, WebExceptionStatus expectedExceptionStatus)
                {
                        var timeoutWorker = new TimeoutTestHelper (url, three_seconds_in_milliseconds);
                        var threadStart = new ThreadStart (timeoutWorker.LaunchWebRequest);
@@ -1492,15 +1492,14 @@ namespace MonoTests.System.Net
                                Assert.Fail ("Should not be reached, timeout exception was not thrown and webrequest managed to retrieve an incorrect body: " + timeoutWorker.Body);
                        }
 
-                       Assert.IsNotNull (timeoutWorker.Exception,
-                                         "Timeout exception was not thrown");
+                       Assert.IsNotNull (timeoutWorker.Exception, "Exception was not thrown");
 
                        var webEx = timeoutWorker.Exception as WebException;
                        Assert.IsNotNull (webEx, "Exception thrown should be WebException, but was: " +
                                          timeoutWorker.Exception.GetType ().FullName);
 
-                       Assert.AreEqual (webEx.Status, WebExceptionStatus.Timeout,
-                                        "WebException was thrown, but with a wrong status (should be timeout): " + webEx.Status);
+                       Assert.AreEqual (expectedExceptionStatus, webEx.Status,
+                                        "WebException was thrown, but with a wrong status (should be " + expectedExceptionStatus + "): " + webEx.Status);
 
                        Assert.IsFalse (timeoutWorker.End > (timeoutWorker.Start + TimeSpan.FromMilliseconds (three_seconds_in_milliseconds + 500)),
                                        "Timeout exception should have been thrown shortly after timeout is reached, however it was at least half-second late");
@@ -1516,18 +1515,19 @@ namespace MonoTests.System.Net
                        {
                                responder.Start ();
 
-                               TestTimeOut (url);
+                               TestTimeOut (url, WebExceptionStatus.Timeout);
 
                                responder.Stop ();
                        }
                }
 
                [Test] // 2nd possible case of https://bugzilla.novell.com/show_bug.cgi?id=MONO74177
-               public void TestTimeoutPropertyWithServerThatDoesntExist ()
+               public void TestTimeoutWithEndpointThatDoesntExistThrowsConnectFailureBeforeTimeout ()
                {
-                       string url = "http://10.128.200.100:8271/"; // some endpoint that is unlikely to exist
+                       string url = "http://127.0.0.1:8271/"; // some endpoint that is unlikely to exist
 
-                       TestTimeOut (url);
+                       // connecting to a non-existing endpoint should throw a ConnectFailure before the timeout is reached
+                       TestTimeOut (url, WebExceptionStatus.ConnectFailure);
                }
 
                const string response_of_timeout_handler = "RESPONSE_OF_TIMEOUT_HANDLER";
index 8e02384f58f00960e473c9c83bf7b90d76f5301b..d6586ab4d5e18d7b349e5e0e04a99fa9d29e7805 100644 (file)
@@ -165,7 +165,7 @@ namespace System.IO.Packaging {
                                if (node.Attributes["TargetMode"] != null)
                                        mode = (TargetMode) Enum.Parse (typeof(TargetMode), node.Attributes ["TargetMode"].Value);
                                
-                               CreateRelationship (new Uri (node.Attributes["Target"].Value.ToString(), UriKind.Relative),
+                               CreateRelationship (new Uri (node.Attributes["Target"].Value.ToString(), UriKind.RelativeOrAbsolute),
                                                    mode,
                                                    node.Attributes["Type"].Value.ToString (),
                                                    node.Attributes["Id"].Value.ToString (),
index a0f2aa67669d8d96794a391ade8c2581f0f70aa8..b9184aac0552aca5a365666f9d6a63d55cd5cd7f 100644 (file)
@@ -257,7 +257,14 @@ namespace System.IO.Packaging
                        if (ContentType != null)
                        coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "contentType", NSPackageProperties)).InnerXml = ContentType;
                        if (Created.HasValue)
-                               coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "dcterms", "created", NSDcTerms)).InnerXml = Created.Value.ToString ();
+                       {
+                               XmlAttribute att = doc.CreateAttribute ("xsi", "type", NSXsi);
+                               att.Value = "dcterms:W3CDTF";
+                               
+                               XmlNode created = coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "dcterms", "created", NSDcTerms));
+                               created.Attributes.Append (att);
+                               created.InnerXml = Created.Value.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss") + "Z";
+                       }
                        if (Creator != null)
                                coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "dc", "creator", NSDc)).InnerXml = Creator;
                        if (Description != null)
@@ -271,7 +278,11 @@ namespace System.IO.Packaging
                        if (LastModifiedBy != null)
                                coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "lastModifiedBy", NSPackageProperties)).InnerXml = LastModifiedBy;
                        if (LastPrinted.HasValue)
-                               coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "lastPrinted", NSPackageProperties)).InnerXml = LastPrinted.Value.ToString ();
+                       {
+                               XmlNode lastPrinted = coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "lastPrinted", NSPackageProperties));
+
+                               lastPrinted.InnerXml = LastPrinted.Value.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss") + "Z"; 
+                       }
                        if (Revision != null)
                                coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "revision", NSPackageProperties)).InnerXml = Revision;
                        if (Subject != null)
@@ -288,7 +299,7 @@ namespace System.IO.Packaging
                                
                                XmlNode modified = coreProperties.AppendChild (doc.CreateNode (XmlNodeType.Element, "dcterms", "modified", NSDcTerms));
                                modified.Attributes.Append (att);
-                               modified.InnerXml = Modified.Value.ToString ();
+                               modified.InnerXml = Modified.Value.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss") + "Z";
                        }
                        
                        doc.WriteContentTo (writer);
index e716ed1a06086eb00e59baf9dc8f9e606cd66200..f3126697a04cb47d362f8ed2af7a02a6a3e6a2fc 100644 (file)
@@ -134,7 +134,7 @@ $(vtsdir)/$(PROFILE)_TestLib/%/Address.dll: $(vtsdir)/VersionTolerantSerializati
        @mkdir -p $(dir $@)
        $(CSCOMPILE) -target:library -r:$(corlib) -warn:0 -out:$@ $^
 
-$(vtsdir)/$(PROFILE)_TestLib/BinarySerializationOverVersions.exe: $(vtsdir)/BinarySerializationOverVersions.cs $(vtsdir)/$(PROFILE)_TestLib/1.0/Address.dll
+$(vtsdir)/$(PROFILE)_TestLib/BinarySerializationOverVersions.exe: $(vtsdir)/BinarySerializationOverVersions.cs $(vtsdir)/$(PROFILE)_TestLib/1.0/Address.dll $(test_nunit_dep)
        $(CSCOMPILE) $(test_nunit_ref) -warn:0 -r:$(corlib) \
                -r:$(vtsdir)/$(PROFILE)_TestLib/1.0/Address.dll \
                $(vtsdir)/BinarySerializationOverVersions.cs -out:$@
index 1c352ff7d3e79b0b42c02b1d07924bec50807f99..54fe237c79383a4c4eb8d9ca65e37d7a5d014b50 100644 (file)
 
 #if NET_4_0
 using System;
-using System.Threading;
 
 namespace System.Threading
 {
        public struct CancellationTokenRegistration: IDisposable, IEquatable<CancellationTokenRegistration>
        {
-               int id;
-               CancellationTokenSource source;
+               readonly int id;
+               readonly CancellationTokenSource source;
                
                internal CancellationTokenRegistration (int id, CancellationTokenSource source)
                {
@@ -52,7 +51,7 @@ namespace System.Threading
                #region IEquatable<CancellationTokenRegistration> implementation
                public bool Equals (CancellationTokenRegistration other)
                {
-                       return this.id == other.id && this.source == other.source;
+                       return id == other.id && source == other.source;
                }
                
                public static bool operator== (CancellationTokenRegistration left, CancellationTokenRegistration right)
@@ -73,7 +72,7 @@ namespace System.Threading
 
                public override bool Equals (object obj)
                {
-                       return (obj is CancellationTokenRegistration) ? Equals ((CancellationTokenRegistration)obj) : false;
+                       return (obj is CancellationTokenRegistration) && Equals ((CancellationTokenRegistration)obj);
                }
        }
 }
index 507153c421aa2432b48f47c7eddacc499c4639ba..8f0b91d7b67294cc74e1ee55f882c21520856f92 100644 (file)
@@ -5,12 +5,11 @@
 //   Miguel de Icaza (miguel@ximian.com)
 //   Daniel Stodden (stodden@in.tum.de)
 //   Dietmar Maurer (dietmar@ximian.com)
+//   Marek Safar (marek.safar@gmail.com)
 //
 // (C) Ximian, Inc.  http://www.ximian.com
-//
-
-//
 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+// Copyright 2014 Xamarin, Inc (http://www.xamarin.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -41,7 +40,10 @@ using System.Runtime.InteropServices;
 namespace System
 {
        /* Contains the rarely used fields of Delegate */
-       class DelegateData {
+       sealed class DelegateData
+       {
+               public static readonly DelegateData ClosedDelegateForStaticMethod = new DelegateData ();
+
                public Type target_type;
                public string method_name;
        }
@@ -230,6 +232,8 @@ namespace System
                                        return null;
 
                        bool argsMatch;
+                       DelegateData delegate_data = null;
+
                        if (target != null) {
                                if (!method.IsStatic) {
                                        argsMatch = arg_type_match_this (target.GetType (), method.DeclaringType, true);
@@ -238,7 +242,9 @@ namespace System
                                } else {
                                        argsMatch = arg_type_match (target.GetType (), args [0].ParameterType);
                                        for (int i = 1; i < args.Length; i++)
-                                               argsMatch &= arg_type_match (delargs [i - 1].ParameterType, args [i].ParameterType);                                    
+                                               argsMatch &= arg_type_match (delargs [i - 1].ParameterType, args [i].ParameterType);
+
+                                       delegate_data = DelegateData.ClosedDelegateForStaticMethod;
                                }
                        } else {
                                if (!method.IsStatic) {
@@ -259,6 +265,8 @@ namespace System
                                                argsMatch = !(args [0].ParameterType.IsValueType || args [0].ParameterType.IsByRef) && allowClosed;
                                                for (int i = 0; i < delargs.Length; i++)
                                                        argsMatch &= arg_type_match (delargs [i].ParameterType, args [i + 1].ParameterType);
+
+                                               delegate_data = DelegateData.ClosedDelegateForStaticMethod;
                                        } else {
                                                argsMatch = true;
                                                for (int i = 0; i < args.Length; i++)
@@ -276,6 +284,8 @@ namespace System
                        Delegate d = CreateDelegate_internal (type, target, method, throwOnBindFailure);
                        if (d != null)
                                d.original_method_info = method;
+                       if (delegate_data != null)
+                               d.data = delegate_data;
                        return d;
                }
 
@@ -408,20 +418,31 @@ namespace System
                                method_info = m_target.GetType ().GetMethod (data.method_name, mtypes);
                        }
 
-                       if (Method.IsStatic && (args != null ? args.Length : 0) == Method.GetParametersCount () - 1) {
+                       var target = m_target;
+                       if (Method.IsStatic) {
+                               //
                                // The delegate is bound to m_target
-                               if (args != null) {
-                                       object[] newArgs = new object [args.Length + 1];
-                                       args.CopyTo (newArgs, 1);
-                                       newArgs [0] = m_target;
-                                       args = newArgs;
-                               } else {
-                                       args = new object [] { m_target };
+                               //
+                               if (data == DelegateData.ClosedDelegateForStaticMethod) {
+                                       if (args == null) {
+                                               args = new [] { target };
+                                       } else {
+                                               Array.Resize (ref args, args.Length + 1);
+                                               Array.Copy (args, 0, args, 1, args.Length - 1);
+                                               args [0] = target;
+                                       }
+
+                                       target = null;
+                               }
+                       } else {
+                               if (m_target == null && args != null && args.Length > 0) {
+                                       target = args [0];
+                                       Array.Copy (args, 1, args, 0, args.Length - 1);
+                                       Array.Resize (ref args, args.Length - 1);
                                }
-                               return Method.Invoke (null, args);
                        }
 
-                       return Method.Invoke (m_target, args);
+                       return Method.Invoke (target, args);
                }
 
                public virtual object Clone ()
index 1b3fc898891626f83e6a790ba587834eb3cab641..92d19fe367eddda5638228faa7783c32bd345114 100644 (file)
@@ -196,9 +196,13 @@ namespace MonoTests.System.Runtime.CompilerServices {
                if (GC.MaxGeneration == 0) /*Boehm doesn't handle ephemerons */
                        Assert.Ignore ("Not working on Boehm.");
                var cwt = new ConditionalWeakTable <object,object> ();
-               List<object> keepAlive;
-               List<WeakReference> keys;
-               FillStuff (cwt, out keepAlive, out keys);
+               List<object> keepAlive = null;
+               List<WeakReference> keys = null;
+               Thread t = new Thread (delegate () {
+                               FillStuff (cwt, out keepAlive, out keys);
+                       });
+               t.Start ();
+               t.Join ();
 
                GC.Collect ();
 
index 74d5c548852556979c82a339d9ada3173ab4f9d9..5237e377e38c80d9a73ce149db5dde8934bdc428 100644 (file)
@@ -178,7 +178,7 @@ namespace MonoTests.System.Runtime.CompilerServices
                        Assert.IsTrue (t.Wait (3000), "#0");
                        Assert.AreEqual (0, t.Result, "#1");
                        Assert.AreEqual (0, b.InlineCalls, "#2b");
-                       Assert.AreEqual (2, a.QueueCalls, "#3a");
+                       Assert.IsTrue (a.QueueCalls == 1 || a.QueueCalls == 2, "#3a");
                        Assert.AreEqual (1, b.QueueCalls, "#3b");
                }
 
@@ -278,7 +278,9 @@ namespace MonoTests.System.Runtime.CompilerServices
                        SynchronizationContext.SetSynchronizationContext (syncContext);
 
                        syncContext.Post (delegate {
-                               Go2 (syncContext);
+                               Task t = new Task (delegate() { });
+                               Go2 (syncContext, t);
+                               t.Start ();
                        }, null);
 
                        // Custom message loop
@@ -289,24 +291,29 @@ namespace MonoTests.System.Runtime.CompilerServices
                                Thread.Sleep (0);
                        }
 
-                       Assert.AreEqual ("132", progress);
+                       Assert.AreEqual ("13xa2", progress);
                }
 
-               async void Go2 (SynchronizationContext ctx)
+               async void Go2 (SynchronizationContext ctx, Task t)
                {
-                       await Wait2 (ctx);
+                       await Wait2 (ctx, t);
+
+                       progress += "a";
 
                        if (mre.WaitOne (5000))
                                progress += "2";
+                       else
+                               progress += "b";
                }
 
-               async Task Wait2 (SynchronizationContext ctx)
+               async Task Wait2 (SynchronizationContext ctx, Task t)
                {
-                       await Task.Delay (10); // Force block suspend/return
+                       await t; // Force block suspend/return
 
                        ctx.Post (l => {
                                progress += "3";
                                mre.Set ();
+                               progress += "x";
                        }, null);
 
                        progress += "1";
index 3f0607bcd605acb29cd04b17f9dc1decddac6dea..4be55ce74ac404b0e3826538398e3cb68dade196 100644 (file)
@@ -904,7 +904,11 @@ namespace MonoTests.System.Threading.Tasks
                                args.SetObserved ();
                        };
                        var inner = new ApplicationException ();
-                       Task.Factory.StartNew (() => { throw inner; });
+                       Thread t = new Thread (delegate () {
+                                       Task.Factory.StartNew (() => { Console.WriteLine ("HIT!"); throw inner; });
+                               });
+                       t.Start ();
+                       t.Join ();
                        Thread.Sleep (1000);
                        GC.Collect ();
                        Thread.Sleep (1000);
index d8c1299efe2a8425734b3449e829e87ec698be85..5bf805aae0b6e0264998d15c63b8d01f5768c77a 100644 (file)
@@ -90,9 +90,9 @@ namespace MonoTests.System.Threading
                        int called = 0;
                        var cts = new CancellationTokenSource ();
                        cts.Token.Register (() => called++);
-                       cts.CancelAfter (20);
+                       cts.CancelAfter (50);
                        cts.Dispose ();
-                       Thread.Sleep (50);
+                       Thread.Sleep (100);
                        Assert.AreEqual (0, called, "#1");
                }
 
index ddfc099b73d747a675834ebb8a185976ad16a201..68bc17eb06a4e0df69228e1a725c655832e0c9b8 100644 (file)
@@ -1116,20 +1116,68 @@ namespace MonoTests.System
                                typeof (Action),
                                this.GetType ().GetMethod ("Banga"));
                }
-#if !MONOTOUCH
+
                [Test] // #664205
-               public void DynamicInvokeNullTarget ()
+               public void DynamicInvokeClosedStatic ()
                {
-                       var method = new DynamicMethod ("test", typeof (int), new [] { typeof (object) }, true);
-                       var il = method.GetILGenerator ();
-                       il.Emit (OpCodes.Ldc_I4, 42);
-                       il.Emit (OpCodes.Ret);
+                       var d1 = Delegate.CreateDelegate (typeof(Func<int>), null, typeof(DelegateTest).GetMethod ("DynamicInvokeClosedStaticDelegate_CB"));
+                       Assert.AreEqual (1, d1.DynamicInvoke (), "#1");
 
-                       var @delegate = method.CreateDelegate (typeof (Func<int>), null);
+                       var d2 = Delegate.CreateDelegate (typeof(Func<int>), "arg", typeof(DelegateTest).GetMethod ("DynamicInvokeClosedStaticDelegate_CB"));
+                       Assert.AreEqual (2, d2.DynamicInvoke (), "#2");
+               }
 
-                       Assert.AreEqual (42, (int) @delegate.DynamicInvoke ());
+               public static int DynamicInvokeClosedStaticDelegate_CB (string instance)
+               {
+                       switch (instance) {
+                       case null:
+                               return 1;
+                       case "arg":
+                               return 2;
+                       default:
+                               Assert.Fail ();
+                               return -1;
+                       }
                }
-#endif
+
+               [Test]
+               public void DynamicInvokeOpenInstanceDelegate ()
+               {
+                       var d1 = Delegate.CreateDelegate (typeof (Func<DelegateTest, int>), typeof(DelegateTest).GetMethod ("DynamicInvokeOpenInstanceDelegate_CB"));
+                       Assert.AreEqual (5, d1.DynamicInvoke (new DelegateTest ()), "#1");
+
+                       var d3 = (Func<DelegateTest, int>) d1;
+                       Assert.AreEqual (5, d3 (null), "#2");
+               }
+
+               public int DynamicInvokeOpenInstanceDelegate_CB ()
+               {
+                       return 5;
+               }
+
+               [Test]
+               public void DynamicInvoke_InvalidArguments ()
+               {
+                       Delegate d = new Func<int, int> (TestMethod);
+
+                       try {
+                               d.DynamicInvoke (null);
+                               Assert.Fail ("#1");
+                       } catch (TargetParameterCountException) {
+                       }
+
+                       try {
+                               d.DynamicInvoke (new object [0]);
+                               Assert.Fail ("#2");
+                       } catch (TargetParameterCountException) {
+                       }
+               }
+
+               public static int TestMethod (int i)
+               {
+                       throw new NotSupportedException ();
+               }
+
 #endif
                public static void CreateDelegateOfStaticMethodBoundToNull_Helper (object[] args) {}
 
@@ -1329,17 +1377,20 @@ namespace MonoTests.System
                        } catch (ArgumentException) {}
                }
 
-        private static Func<Int32, Int32, bool> Int32D = (x, y) => (x & y) == y;
-
                [Test]
                public void EnumBaseTypeConversion () {
+                       Func<int, int, bool> dm = Int32D2;
                        var d =
-                               Delegate.CreateDelegate(typeof (Func<StringComparison,
-                                                                                               StringComparison, bool>), Int32D.Method) as
+                               Delegate.CreateDelegate(typeof (Func<StringComparison, StringComparison, bool>), dm.Method) as
                                Func<StringComparison, StringComparison, bool>; 
                        Assert.IsTrue (d (0, 0));
                }
 
+               static bool Int32D2 (int x, int y)
+               {
+                       return (x & y) == y; 
+               }
+
                public class B {
 
                        public virtual string retarg3 (string s) {
index 23bf89778c8ec9afabbda5da38e7bc280361b05a..7a866432d63f96cc93c8f9c0028671ea0075bbbb 100644 (file)
@@ -49,7 +49,7 @@ namespace Monodoc.Providers
                                ObjectEntryToParams (inner, out caption, out element);
                                // Don't add if the backing file doesn't exist
                                if (!File.Exists (element)) {
-                                       Console.Error.WriteLine ("File `{0}' referenced in TOC but it doesn't exist.", element);
+                                       Console.Error.WriteLine ("Warning: File `{0}' referenced in TOC but it doesn't exist. It will be ignored.", element);
                                        continue;
                                }
                                using (var file = File.OpenRead (element))
diff --git a/mcs/errors/cs0121-25.cs b/mcs/errors/cs0121-25.cs
new file mode 100644 (file)
index 0000000..4461673
--- /dev/null
@@ -0,0 +1,33 @@
+// CS0121: The call is ambiguous between the following methods or properties: `A.B.X.Test(int)' and `A.C.X.Test(int)'
+// Line: 31
+
+using A.B.X;
+using A.C.X;
+
+namespace A.B
+{
+       static class X
+       {
+               public static void Test (int o)
+               {
+               }
+       }
+}
+
+namespace A.C
+{
+       static class X
+       {
+               public static int Test (int o)
+               {
+               }
+       }
+}
+
+class M
+{
+       public static void Main ()
+       {
+               Test (0);
+       }
+}
\ No newline at end of file
index ea0010ea51301fac2a3495d8082a18363eaf395c..8264e8dbf297cf66fce084e0393766a264e6447c 100644 (file)
@@ -1,5 +1,6 @@
 // CS0138: `System.Console' is a type not a namespace. A using namespace directive can only be applied to namespaces
 // Line: 5
+// Compiler options: -langversion:5
 
 using System;
 using System.Console;
diff --git a/mcs/errors/cs0151-3.cs b/mcs/errors/cs0151-3.cs
new file mode 100644 (file)
index 0000000..7644373
--- /dev/null
@@ -0,0 +1,19 @@
+// CS0151: A switch expression of type `X?' cannot be converted to an integral type, bool, char, string, enum or nullable type
+// Line: 15
+
+struct X 
+{
+    public static implicit operator int (X x)
+    {
+        return 1;
+    }
+
+       static void Main ()
+       {
+               X? x = null;
+               switch (x) {
+               default:
+                       break;
+               }
+       }
+}
diff --git a/mcs/errors/cs0151-4.cs b/mcs/errors/cs0151-4.cs
new file mode 100644 (file)
index 0000000..0e45b1a
--- /dev/null
@@ -0,0 +1,30 @@
+// CS0151: A switch expression of type `S1?' cannot be converted to an integral type, bool, char, string, enum or nullable type
+// Line: 24
+
+using System;
+
+struct S1
+{
+       public static implicit operator int? (S1? s)
+       {
+               throw new ApplicationException ();
+       }
+
+       public static implicit operator int (S1? s)
+       {
+               throw new ApplicationException ();
+       }
+}
+
+class C
+{
+       public static int Main ()
+       {
+               S1? s1 = new S1 ();
+               switch (s1)
+               {
+                       default:
+                               return 1;
+               }
+       }
+}
\ No newline at end of file
diff --git a/mcs/errors/cs0151-5.cs b/mcs/errors/cs0151-5.cs
new file mode 100644 (file)
index 0000000..3995a28
--- /dev/null
@@ -0,0 +1,19 @@
+// CS0151: A switch expression of type `X?' cannot be converted to an integral type, bool, char, string, enum or nullable type
+// Line: 19
+
+struct X 
+{
+       public static implicit operator int? (X x)
+       {
+               return 1;
+       }
+
+       static void Main ()
+       {
+               X? x = null;
+               switch (x) {
+               default:
+                       break;
+               }
+       }
+}
diff --git a/mcs/errors/cs0457-4.cs b/mcs/errors/cs0457-4.cs
new file mode 100644 (file)
index 0000000..787db3a
--- /dev/null
@@ -0,0 +1,27 @@
+// CS0457: Ambiguous user defined operators `D.implicit operator D(System.Action)' and `D.explicit operator D(Foo)' when converting from `method group' to `D'
+// Line: 25
+
+using System;
+
+public delegate void Foo ();
+
+class D
+{
+       public static implicit operator D (Action d)
+       {
+               return new D ();
+       }
+
+       public static explicit operator D (Foo d)
+       {
+               return new D ();
+       }
+}
+
+class Program
+{
+       static void Main()
+       {
+               D d = (D) Main;
+       }
+}
diff --git a/mcs/errors/cs0573-2.cs b/mcs/errors/cs0573-2.cs
deleted file mode 100644 (file)
index 50836de..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-// CS0573: `A.a': Structs cannot have instance field initializers
-// Line: 5
-
-partial struct A {
-       int a = 1;
-}
diff --git a/mcs/errors/cs0573.cs b/mcs/errors/cs0573.cs
deleted file mode 100644 (file)
index deec3ea..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// CS0573: `A.a': Structs cannot have instance field initializers
-// Line: 5
-struct A {
-       int a = 1;
-}
-
-class D {
-       static void Main ()
-       {
-               A [] a = new A [10];
-
-       }
-}
index 94c1f8510b9e0a78215697af9170e55777e8b4d5..eea4c130ea12f84ecf8d1f8ab3c658af097503b6 100644 (file)
@@ -1,6 +1,5 @@
-// CS0837: The `as' operator cannot be applied to a lambda expression or anonymous method
-// Line: 15
-
+// CS0837: The `as' operator cannot be applied to a lambda expression, anonymous method, or method group
+// Line: 14
 
 class X
 {
diff --git a/mcs/errors/cs0837-3.cs b/mcs/errors/cs0837-3.cs
new file mode 100644 (file)
index 0000000..de7ffd2
--- /dev/null
@@ -0,0 +1,12 @@
+// CS0837: The `is' operator cannot be applied to a lambda expression, anonymous method, or method group
+// Line: 10
+
+using System;
+class Test
+{
+       static void Main ()
+       {
+               var res = Main is object;
+       }
+}
\ No newline at end of file
diff --git a/mcs/errors/cs0837-4.cs b/mcs/errors/cs0837-4.cs
new file mode 100644 (file)
index 0000000..bc11afa
--- /dev/null
@@ -0,0 +1,13 @@
+// CS0837: The `is' operator cannot be applied to a lambda expression, anonymous method, or method group
+// Line: 11
+
+using System;
+using System.Linq.Expressions;
+
+class C
+{
+       public static void Main ()
+       {
+               Expression<Func<bool>> e = () => "1".ToString is string;
+       }
+}
\ No newline at end of file
index 7c56fd1addd7876801dc13bdd621c41075eedbde..c2ca9b8732a39a51df24cbb41c5f52ba217fa2c1 100644 (file)
@@ -1,4 +1,4 @@
-// CS0837: The `is' operator cannot be applied to a lambda expression or anonymous method
+// CS0837: The `is' operator cannot be applied to a lambda expression, anonymous method, or method group
 // Line: 8
 
 class X
diff --git a/mcs/errors/cs0840.cs b/mcs/errors/cs0840.cs
deleted file mode 100644 (file)
index bc4ee41..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-// CS0840: `Test.Property.get' must have a body because it is not marked abstract or extern. The property can be automatically implemented when you define both accessors
-// Line: 7
-
-
-public abstract class Test
-{
-       public string Property { get; }
-}
diff --git a/mcs/errors/cs1501-17.cs b/mcs/errors/cs1501-17.cs
new file mode 100644 (file)
index 0000000..ac57564
--- /dev/null
@@ -0,0 +1,14 @@
+// CS1501: No overload for method `Foo' takes `0' arguments
+// Line: 12
+
+class C
+{
+    static void Foo (string foo, params object [] moreFoo)
+    {
+    }
+
+    static void Main ()
+    {
+        Foo ();
+    }
+}
\ No newline at end of file
index ce867d1e71cdb59574562de4f94ffd663c657e8f..fe4e494dd375f2c7fd5d60a6c2e82e5578d0d7c8 100644 (file)
@@ -1,4 +1,4 @@
-// CS1644: Feature `automatically implemented properties' cannot be used because it is not part of the C# 2.0 language specification
+// CS1644: Feature `auto-implemented properties' cannot be used because it is not part of the C# 2.0 language specification
 // Line: 7
 // Compiler options: -langversion:ISO-2
 
diff --git a/mcs/errors/cs1644-36.cs b/mcs/errors/cs1644-36.cs
new file mode 100644 (file)
index 0000000..df2d30b
--- /dev/null
@@ -0,0 +1,8 @@
+// CS1644: Feature `auto-implemented property initializer' cannot be used because it is not part of the C# 5.0 language specification
+// Line: 7
+// Compiler options: -langversion:5
+
+class C
+{
+       public static int P { get; } = 4;
+}
\ No newline at end of file
diff --git a/mcs/errors/cs1650-3.cs b/mcs/errors/cs1650-3.cs
new file mode 100644 (file)
index 0000000..e0cfa0c
--- /dev/null
@@ -0,0 +1,19 @@
+// CS1650: Fields of static readonly field `C<T>.t' cannot be assigned to (except in a static constructor or a variable initializer)
+// Line: 17
+
+using System;
+
+interface I
+{
+       int X { get; set; }
+}
+
+class C<T> where T : struct, I
+{
+       static readonly T t;
+
+       public static void Foo ()
+       {
+               t.X = 42;
+       }
+}
diff --git a/mcs/errors/cs1953.cs b/mcs/errors/cs1953.cs
deleted file mode 100644 (file)
index ba5dbad..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// CS1953: An expression tree cannot contain an expression with method group
-// Line: 11
-
-using System;
-using System.Linq.Expressions;
-
-class C
-{
-       public static void Main ()
-       {
-               Expression<Func<bool>> e = () => "1".ToString is string;
-       }
-}
\ No newline at end of file
diff --git a/mcs/errors/cs7007.cs b/mcs/errors/cs7007.cs
new file mode 100644 (file)
index 0000000..a343757
--- /dev/null
@@ -0,0 +1,9 @@
+// CS7007: `X' is not a static class. A using namespace directive can only be applied to static classes or namespace
+// Line: 5
+// Compiler options: -langversion:6
+
+using X;
+
+class X
+{
+}
\ No newline at end of file
diff --git a/mcs/errors/cs8050.cs b/mcs/errors/cs8050.cs
new file mode 100644 (file)
index 0000000..2f4b88b
--- /dev/null
@@ -0,0 +1,7 @@
+// CS8050: `C.P': Only auto-implemented properties can have initializers
+// Line: 6
+
+abstract class C
+{
+       public abstract int P { get; } = 4;
+}
\ No newline at end of file
diff --git a/mcs/errors/cs8051.cs b/mcs/errors/cs8051.cs
new file mode 100644 (file)
index 0000000..7935efb
--- /dev/null
@@ -0,0 +1,7 @@
+// CS8051: Auto-implemented property `Test.Property' must have set accessor or initializer
+// Line: 6
+
+public abstract class Test
+{
+       public string Property { get; }
+}
diff --git a/mcs/errors/cs8052.cs b/mcs/errors/cs8052.cs
new file mode 100644 (file)
index 0000000..bccf015
--- /dev/null
@@ -0,0 +1,7 @@
+// CS8052: Auto-implemented property `V.P' must have get accessor
+// Line: 6
+
+class V
+{
+       public object P { set; } = 1;
+}
\ No newline at end of file
diff --git a/mcs/errors/cs8053.cs b/mcs/errors/cs8053.cs
new file mode 100644 (file)
index 0000000..319835f
--- /dev/null
@@ -0,0 +1,7 @@
+// CS8053: `I.P': Properties inside interfaces cannot have initializers
+// Line: 6
+
+interface I
+{
+       int P { get; } = 4;
+}
\ No newline at end of file
diff --git a/mcs/errors/cs8054-2.cs b/mcs/errors/cs8054-2.cs
new file mode 100644 (file)
index 0000000..e633f17
--- /dev/null
@@ -0,0 +1,6 @@
+// CS0573: `A.a': Structs without explicit constructors cannot contain members with initializers
+// Line: 5
+
+partial struct A {
+       int a = 1;
+}
diff --git a/mcs/errors/cs8054-3.cs b/mcs/errors/cs8054-3.cs
new file mode 100644 (file)
index 0000000..b06047f
--- /dev/null
@@ -0,0 +1,6 @@
+// CS0573: `A.a': Structs without explicit constructors cannot contain members with initializers
+// Line: 5
+
+struct A {
+       int a = 1;
+}
diff --git a/mcs/errors/cs8054.cs b/mcs/errors/cs8054.cs
new file mode 100644 (file)
index 0000000..4b8fc2e
--- /dev/null
@@ -0,0 +1,7 @@
+// CS8054: `S.P': Structs without explicit constructors cannot contain members with initializers
+// Line: 6
+
+struct S
+{
+       public decimal P { get; } = -3;
+}
\ No newline at end of file
index 6ff0a4a8fb5163b9a3603d92a81ec2100d4f36ff..6c6acacf683dac66fbd883661c13883bd60cb83e 100644 (file)
@@ -1726,6 +1726,7 @@ namespace Mono.CSharp {
                        Modifiers modifiers;
                        TypeDefinition parent = null;
                        TypeParameters hoisted_tparams = null;
+                       ParametersCompiled method_parameters = parameters;
 
                        var src_block = Block.Original.Explicit;
                        if (src_block.HasCapturedVariable || src_block.HasCapturedThis) {
@@ -1773,6 +1774,18 @@ namespace Mono.CSharp {
                                        parent = storey = ec.CurrentAnonymousMethod.Storey;
 
                                modifiers = Modifiers.STATIC | Modifiers.PRIVATE;
+
+                               //
+                               // Convert generated method to closed delegate method where unused
+                               // this argument is generated during compilation which speeds up dispatch
+                               // by about 25%
+                               //
+
+                               //
+                               // Disabled for now due to JIT bug
+                               //
+                               //method_parameters = ParametersCompiled.Prefix (method_parameters,
+                               //      new Parameter (null, null, 0, null, loc), ec.Module.Compiler.BuiltinTypes.Object);
                        }
 
                        if (storey == null && hoisted_tparams == null)
@@ -1798,7 +1811,7 @@ namespace Mono.CSharp {
 
                        return new AnonymousMethodMethod (parent,
                                this, storey, new TypeExpression (ReturnType, Location), modifiers,
-                               member_name, parameters);
+                               member_name, method_parameters);
                }
 
                protected override Expression DoResolve (ResolveContext ec)
@@ -1827,7 +1840,7 @@ namespace Mono.CSharp {
                        }
 
                        bool is_static = (method.ModFlags & Modifiers.STATIC) != 0;
-                       if (is_static && am_cache == null) {
+                       if (is_static && am_cache == null && !ec.IsStaticConstructor) {
                                //
                                // Creates a field cache to store delegate instance if it's not generic
                                //
index 13d0526cc2cd9c5a47e422bbdc2b9c763c2de9b4..f546a62adfcccb117ad10f37ef45c84e4d18d399 100644 (file)
@@ -276,6 +276,16 @@ namespace Mono.CSharp
                                ordered.Add (arg);
                        }
 
+                       public override void FlowAnalysis (FlowAnalysisContext fc, List<MovableArgument> movable = null)
+                       {
+                               foreach (var arg in ordered) {
+                                       if (arg.ArgType != Argument.AType.Out)
+                                               arg.FlowAnalysis (fc);
+                               }
+
+                               base.FlowAnalysis (fc, ordered);
+                       }
+
                        public override Arguments Emit (EmitContext ec, bool dup_args, bool prepareAwait)
                        {
                                foreach (var a in ordered) {
@@ -497,7 +507,7 @@ namespace Mono.CSharp
                        return null;
                }
 
-               public void FlowAnalysis (FlowAnalysisContext fc)
+               public virtual void FlowAnalysis (FlowAnalysisContext fc, List<MovableArgument> movable = null)
                {
                        bool has_out = false;
                        foreach (var arg in args) {
@@ -506,7 +516,14 @@ namespace Mono.CSharp
                                        continue;
                                }
 
-                               arg.FlowAnalysis (fc);
+                               if (movable == null) {
+                                       arg.FlowAnalysis (fc);
+                                       continue;
+                               }
+
+                               var ma = arg as MovableArgument;
+                               if (ma != null && !movable.Contains (ma))
+                                       arg.FlowAnalysis (fc);
                        }
 
                        if (!has_out)
index c11216d9bae5a435698471e5861927c7862c4b73..0029cf894067c2e7c6bb3fa2537aa52c132fa9a5 100644 (file)
@@ -474,6 +474,24 @@ namespace Mono.CSharp
                        throw new NotImplementedException ();
                }
 
+               public void EmitCatchBlock (EmitContext ec)
+               {
+                       var catch_value = LocalVariable.CreateCompilerGenerated (ec.Module.Compiler.BuiltinTypes.Exception, block, Location);
+
+                       ec.BeginCatchBlock (catch_value.Type);
+                       catch_value.EmitAssign (ec);
+
+                       ec.EmitThis ();
+                       ec.EmitInt ((int) IteratorStorey.State.After);
+                       ec.Emit (OpCodes.Stfld, storey.PC.Spec);
+
+                       ((AsyncTaskStorey) Storey).EmitSetException (ec, new LocalVariableReference (catch_value, Location));
+
+                       ec.Emit (OpCodes.Leave, move_next_ok);
+                       ec.EndExceptionBlock ();
+
+               }
+
                protected override void EmitMoveNextEpilogue (EmitContext ec)
                {
                        var storey = (AsyncTaskStorey) Storey;
index 72f3a9c3620eb72e7c9a3e6c11afda7fd69c922d..befa0dbdbe3b93322cd155a48ccd30e56fe8bcdd 100644 (file)
@@ -309,10 +309,10 @@ namespace Mono.CSharp {
                                                return new StringConstant (ec.BuiltinTypes, (string)left.GetValue () + (string)right.GetValue (),
                                                        left.Location);
 
-                                       if (lt == InternalType.NullLiteral)
+                                       if (lt == InternalType.NullLiteral || left.IsNull)
                                                return new StringConstant (ec.BuiltinTypes, "" + right.GetValue (), left.Location);
 
-                                       if (rt == InternalType.NullLiteral)
+                                       if (rt == InternalType.NullLiteral || right.IsNull)
                                                return new StringConstant (ec.BuiltinTypes, left.GetValue () + "", left.Location);
 
                                        return null;
index 96f9188898788e19b823cbf611ae418e948d5408..289dc5fe2cac434faf054d4b5f78573f0a4aee35 100644 (file)
@@ -3049,6 +3049,20 @@ namespace Mono.CSharp
                        base.Emit ();
                }
 
+               bool HasExplicitConstructor ()
+               {
+                       foreach (var m in Members) {
+                               var c = m as Constructor;
+                               if (c == null)
+                                       continue;
+
+                               if (!c.ParameterInfo.IsEmpty)
+                                       return true;
+                       }
+
+                       return false;
+               }
+
                public override bool IsUnmanagedType ()
                {
                        if (has_unmanaged_check_done)
@@ -3104,14 +3118,15 @@ namespace Mono.CSharp
 
                public override void RegisterFieldForInitialization (MemberCore field, FieldInitializer expression)
                {
-                       if ((field.ModFlags & Modifiers.STATIC) == 0) {
-                               Report.Error (573, field.Location, "`{0}': Structs cannot have instance field initializers",
+                       if ((field.ModFlags & Modifiers.STATIC) == 0 && !HasExplicitConstructor ()) {
+                               Report.Error (8054, field.Location, "`{0}': Structs without explicit constructors cannot contain members with initializers",
                                        field.GetSignatureForError ());
+
                                return;
                        }
+
                        base.RegisterFieldForInitialization (field, expression);
                }
-
        }
 
        /// <summary>
index 7f7ccb33239d45025f1e4edc84d87abea34be057..0b3eb43807af4be467fb07ede3f2ab3fd5d369d4 100644 (file)
@@ -155,6 +155,12 @@ namespace Mono.CSharp
                        get { return member_context.IsStatic; }
                }
 
+               public bool IsStaticConstructor {
+                       get {
+                               return member_context.IsStatic && (flags & Options.ConstructorScope) != 0;
+                       }
+               }
+
                public bool IsAnonymousStoreyMutateRequired {
                        get {
                                return CurrentAnonymousMethod != null &&
index 00be96b40a2d03c5bec51f020e2b51f8c087942b..df21c11d11b84a0a5c281f85d7c2fef69dc6fc6a 100644 (file)
@@ -27,6 +27,15 @@ namespace Mono.CSharp {
        //
        static class Convert
        {
+               [Flags]
+               public enum UserConversionRestriction
+               {
+                       None = 0,
+                       ImplicitOnly = 1,
+                       ProbingOnly = 1 << 1,
+                       NullableSourceOnly = 1 << 2
+
+               }
                //
                // From a one-dimensional array-type S[] to System.Collections.IList<T> and base
                // interfaces of this interface, provided there is an implicit reference conversion
@@ -675,7 +684,7 @@ namespace Mono.CSharp {
                //
                public static bool ImplicitConversionExists (ResolveContext ec, Expression expr, TypeSpec target_type)
                {
-                       if (ImplicitStandardConversionExists (expr, target_type))
+                       if (ImplicitStandardConversionExists (ec, expr, target_type))
                                return true;
 
                        if (expr.Type == InternalType.AnonymousMethod) {
@@ -686,21 +695,27 @@ namespace Mono.CSharp {
                                return ame.ImplicitStandardConversionExists (ec, target_type);
                        }
                        
+                       // Conversion from __arglist to System.ArgIterator
+                       if (expr.Type == InternalType.Arglist)
+                               return target_type == ec.Module.PredefinedTypes.ArgIterator.TypeSpec;
+
+                       return UserDefinedConversion (ec, expr, target_type,
+                               UserConversionRestriction.ImplicitOnly | UserConversionRestriction.ProbingOnly, Location.Null) != null;
+               }
+
+               public static bool ImplicitStandardConversionExists (ResolveContext rc, Expression expr, TypeSpec target_type)
+               {
                        if (expr.eclass == ExprClass.MethodGroup) {
-                               if (target_type.IsDelegate && ec.Module.Compiler.Settings.Version != LanguageVersion.ISO_1) {
+                               if (target_type.IsDelegate && rc.Module.Compiler.Settings.Version != LanguageVersion.ISO_1) {
                                        MethodGroupExpr mg = expr as MethodGroupExpr;
                                        if (mg != null)
-                                               return DelegateCreation.ImplicitStandardConversionExists (ec, mg, target_type);
+                                               return DelegateCreation.ImplicitStandardConversionExists (rc, mg, target_type);
                                }
 
                                return false;
                        }
 
-                       // Conversion from __arglist to System.ArgIterator
-                       if (expr.Type == InternalType.Arglist)
-                               return target_type == ec.Module.PredefinedTypes.ArgIterator.TypeSpec;
-
-                       return UserDefinedConversion (ec, expr, target_type, true, true, Location.Null) != null;
+                       return ImplicitStandardConversionExists (expr, target_type);
                }
 
                //
@@ -911,7 +926,7 @@ namespace Mono.CSharp {
                // by making use of FindMostEncomp* methods. Applies the correct rules separately
                // for explicit and implicit conversion operators.
                //
-               static TypeSpec FindMostSpecificSource (List<MethodSpec> list, TypeSpec sourceType, Expression source, bool apply_explicit_conv_rules)
+               static TypeSpec FindMostSpecificSource (ResolveContext rc, List<MethodSpec> list, TypeSpec sourceType, Expression source, bool apply_explicit_conv_rules)
                {
                        TypeSpec[] src_types_set = null;
 
@@ -937,12 +952,16 @@ namespace Mono.CSharp {
                                var candidate_set = new List<TypeSpec> ();
 
                                foreach (TypeSpec param_type in src_types_set){
-                                       if (ImplicitStandardConversionExists (source, param_type))
+                                       if (ImplicitStandardConversionExists (rc, source, param_type))
                                                candidate_set.Add (param_type);
                                }
 
-                               if (candidate_set.Count != 0)
+                               if (candidate_set.Count != 0) {
+                                       if (source.eclass == ExprClass.MethodGroup)
+                                               return InternalType.FakeInternalType;
+
                                        return FindMostEncompassedType (candidate_set);
+                               }
                        }
 
                        //
@@ -1010,7 +1029,7 @@ namespace Mono.CSharp {
                /// </summary>
                static public Expression ImplicitUserConversion (ResolveContext ec, Expression source, TypeSpec target, Location loc)
                {
-                       return UserDefinedConversion (ec, source, target, true, false, loc);
+                       return UserDefinedConversion (ec, source, target, UserConversionRestriction.ImplicitOnly, loc);
                }
 
                /// <summary>
@@ -1018,10 +1037,10 @@ namespace Mono.CSharp {
                /// </summary>
                static Expression ExplicitUserConversion (ResolveContext ec, Expression source, TypeSpec target, Location loc)
                {
-                       return UserDefinedConversion (ec, source, target, false, false, loc);
+                       return UserDefinedConversion (ec, source, target, 0, loc);
                }
 
-               static void FindApplicableUserDefinedConversionOperators (IList<MemberSpec> operators, Expression source, TypeSpec target, bool implicitOnly, ref List<MethodSpec> candidates)
+               static void FindApplicableUserDefinedConversionOperators (ResolveContext rc, IList<MemberSpec> operators, Expression source, TypeSpec target, UserConversionRestriction restr, ref List<MethodSpec> candidates)
                {
                        if (source.Type.IsInterface) {
                                // Neither A nor B are interface-types
@@ -1043,14 +1062,17 @@ namespace Mono.CSharp {
                                        continue;
 
                                var t = op.Parameters.Types[0];
-                               if (source.Type != t && !ImplicitStandardConversionExists (source, t)) {
-                                       if (implicitOnly)
+                               if (source.Type != t && !ImplicitStandardConversionExists (rc, source, t)) {
+                                       if ((restr & UserConversionRestriction.ImplicitOnly) != 0)
                                                continue;
 
                                        if (!ImplicitStandardConversionExists (new EmptyExpression (t), source.Type))
-                                               continue;
+                                                       continue;
                                }
 
+                               if ((restr & UserConversionRestriction.NullableSourceOnly) != 0 && !t.IsNullableType)
+                                       continue;
+
                                t = op.ReturnType;
 
                                if (t.IsInterface)
@@ -1061,7 +1083,7 @@ namespace Mono.CSharp {
                                                t = Nullable.NullableInfo.GetUnderlyingType (t);
 
                                        if (!ImplicitStandardConversionExists (new EmptyExpression (t), target)) {
-                                               if (implicitOnly)
+                                               if ((restr & UserConversionRestriction.ImplicitOnly) != 0)
                                                        continue;
 
                                                if (texpr == null)
@@ -1082,7 +1104,7 @@ namespace Mono.CSharp {
                //
                // User-defined conversions
                //
-               static Expression UserDefinedConversion (ResolveContext ec, Expression source, TypeSpec target, bool implicitOnly, bool probingOnly, Location loc)
+               public static Expression UserDefinedConversion (ResolveContext rc, Expression source, TypeSpec target, UserConversionRestriction restr, Location loc)
                {
                        List<MethodSpec> candidates = null;
 
@@ -1094,6 +1116,7 @@ namespace Mono.CSharp {
                        TypeSpec target_type = target;
                        Expression source_type_expr;
                        bool nullable_source = false;
+                       var implicitOnly = (restr & UserConversionRestriction.ImplicitOnly) != 0;
 
                        if (source_type.IsNullableType) {
                                // No unwrapping conversion S? -> T for non-reference types
@@ -1119,13 +1142,13 @@ namespace Mono.CSharp {
 
                                var operators = MemberCache.GetUserOperator (source_type, Operator.OpType.Implicit, declared_only);
                                if (operators != null) {
-                                       FindApplicableUserDefinedConversionOperators (operators, source_type_expr, target_type, implicitOnly, ref candidates);
+                                       FindApplicableUserDefinedConversionOperators (rc, operators, source_type_expr, target_type, restr, ref candidates);
                                }
 
                                if (!implicitOnly) {
                                        operators = MemberCache.GetUserOperator (source_type, Operator.OpType.Explicit, declared_only);
                                        if (operators != null) {
-                                               FindApplicableUserDefinedConversionOperators (operators, source_type_expr, target_type, false, ref candidates);
+                                               FindApplicableUserDefinedConversionOperators (rc, operators, source_type_expr, target_type, restr, ref candidates);
                                        }
                                }
                        }
@@ -1135,13 +1158,13 @@ namespace Mono.CSharp {
 
                                var operators = MemberCache.GetUserOperator (target_type, Operator.OpType.Implicit, declared_only);
                                if (operators != null) {
-                                       FindApplicableUserDefinedConversionOperators (operators, source_type_expr, target_type, implicitOnly, ref candidates);
+                                       FindApplicableUserDefinedConversionOperators (rc, operators, source_type_expr, target_type, restr, ref candidates);
                                }
 
                                if (!implicitOnly) {
                                        operators = MemberCache.GetUserOperator (target_type, Operator.OpType.Explicit, declared_only);
                                        if (operators != null) {
-                                               FindApplicableUserDefinedConversionOperators (operators, source_type_expr, target_type, false, ref candidates);
+                                               FindApplicableUserDefinedConversionOperators (rc, operators, source_type_expr, target_type, restr, ref candidates);
                                        }
                                }
                        }
@@ -1163,7 +1186,7 @@ namespace Mono.CSharp {
                                // Pass original source type to find the best match against input type and
                                // not the unwrapped expression
                                //
-                               s_x = FindMostSpecificSource (candidates, source.Type, source_type_expr, !implicitOnly);
+                               s_x = FindMostSpecificSource (rc, candidates, source.Type, source_type_expr, !implicitOnly);
                                if (s_x == null)
                                        return null;
 
@@ -1183,16 +1206,18 @@ namespace Mono.CSharp {
                                        //
                                        // Unless running in probing more
                                        //
-                                       if (!probingOnly) {
-                                               MethodSpec ambig_arg = null;
+                                       if ((restr & UserConversionRestriction.ProbingOnly) == 0) {
+                                               MethodSpec ambig_arg = candidates [0];
+                                               most_specific_operator = candidates [1];
+                                               /*
                                                foreach (var candidate in candidates) {
                                                        if (candidate.ReturnType == t_x)
                                                                most_specific_operator = candidate;
                                                        else if (candidate.Parameters.Types[0] == s_x)
                                                                ambig_arg = candidate;
                                                }
-
-                                               ec.Report.Error (457, loc,
+                                               */
+                                               rc.Report.Error (457, loc,
                                                        "Ambiguous user defined operators `{0}' and `{1}' when converting from `{2}' to `{3}'",
                                                        ambig_arg.GetSignatureForError (), most_specific_operator.GetSignatureForError (),
                                                        source.Type.GetSignatureForError (), target.GetSignatureForError ());
@@ -1208,21 +1233,21 @@ namespace Mono.CSharp {
                        if (s_x != source_type) {
                                var c = source as Constant;
                                if (c != null) {
-                                       source = c.Reduce (ec, s_x);
+                                       source = c.Reduce (rc, s_x);
                                        if (source == null)
                                                c = null;
                                }
 
                                if (c == null) {
                                        source = implicitOnly ?
-                                               ImplicitConversionStandard (ec, source_type_expr, s_x, loc) :
-                                               ExplicitConversionStandard (ec, source_type_expr, s_x, loc);
+                                               ImplicitConversionStandard (rc, source_type_expr, s_x, loc) :
+                                               ExplicitConversionStandard (rc, source_type_expr, s_x, loc);
                                }
                        } else {
                                source = source_type_expr;
                        }
 
-                       source = new UserCast (most_specific_operator, source, loc).Resolve (ec);
+                       source = new UserCast (most_specific_operator, source, loc).Resolve (rc);
 
                        //
                        // Convert result type when it's different to best operator return type
@@ -1241,19 +1266,19 @@ namespace Mono.CSharp {
                                                var unwrap = Nullable.Unwrap.CreateUnwrapped (source);
 
                                                source = implicitOnly ?
-                                                       ImplicitConversionStandard (ec, unwrap, target_type, loc) :
-                                                       ExplicitConversionStandard (ec, unwrap, target_type, loc);
+                                                       ImplicitConversionStandard (rc, unwrap, target_type, loc) :
+                                                       ExplicitConversionStandard (rc, unwrap, target_type, loc);
 
                                                if (source == null)
                                                        return null;
 
                                                if (target.IsNullableType)
-                                                       source = new Nullable.LiftedConversion (source, unwrap, target).Resolve (ec);
+                                                       source = new Nullable.LiftedConversion (source, unwrap, target).Resolve (rc);
                                        }
                                } else {
                                        source = implicitOnly ?
-                                               ImplicitConversionStandard (ec, source, target_type, loc) :
-                                               ExplicitConversionStandard (ec, source, target_type, loc);
+                                               ImplicitConversionStandard (rc, source, target_type, loc) :
+                                               ExplicitConversionStandard (rc, source, target_type, loc);
 
                                        if (source == null)
                                                return null;
@@ -1266,7 +1291,7 @@ namespace Mono.CSharp {
                        // only non-nullable type we need to lift it manually
                        //
                        if (nullable_source && !s_x.IsNullableType)
-                               return new Nullable.LiftedConversion (source, source_type_expr, target).Resolve (ec);
+                               return new Nullable.LiftedConversion (source, source_type_expr, target).Resolve (rc);
 
                        //
                        // Target is of nullable type but source type is not, wrap the result expression
@@ -2230,6 +2255,7 @@ namespace Mono.CSharp {
                        }
                        
                        e = ExplicitUserConversion (ec, expr, target_type, loc);
+
                        if (e != null)
                                return e;                       
 
index e81ba26d18c5a98e8e07b13ecbd264c13d462b98..34d4cd33bec2d824ba51f9326f3cc2501e606d04 100644 (file)
@@ -1708,13 +1708,14 @@ arglist_modifier
                        report.Error (1669, GetLocation ($1), "__arglist is not valid in this context");
          }
        ;
-       
+
 property_declaration
        : opt_attributes
          opt_modifiers
          member_type
          member_declaration_name
          {
+               lexer.parsing_generic_declaration = false;
                if (doc_support)
                        tmpComment = Lexer.consume_doc_comment ();
          }
@@ -1742,10 +1743,31 @@ property_declaration
          CLOSE_BRACE
          {
                lbag.AppendToMember (current_property, GetLocation ($10));
+               lexer.parsing_modifiers = true;
+         }
+         opt_property_initializer
+         {
                current_property = null;
          }
        ;
 
+opt_property_initializer
+       : /* empty */
+       | ASSIGN
+         {
+               ++lexer.parsing_block;
+               current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters;
+               start_block (GetLocation ($1));
+         }
+         expression SEMICOLON
+         {
+               --lexer.parsing_block;
+               ((Property)current_property).Initializer = (Expression) $3;
+               lbag.AppendToMember (current_property, GetLocation ($1), GetLocation ($4));
+               end_block (GetLocation ($4));
+               current_local_parameters = null;
+         }
+       ;
 
 indexer_declaration
        : opt_attributes opt_modifiers
index 68ddff9873ce1a9c31e1993ab87e9899853c5948..23adf2073a2e3b40afb8c7d3001f942ff167645c 100644 (file)
@@ -1279,6 +1279,8 @@ namespace Mono.CSharp
                        PushPosition ();
                        current_token = Token.NONE;
                        int next_token;
+                       int parens = 0;
+
                        switch (xtoken ()) {
                        case Token.LITERAL:
                        case Token.TRUE:
@@ -1299,6 +1301,13 @@ namespace Mono.CSharp
                        case Token.COLON:
                                next_token = Token.INTERR_NULLABLE;
                                break;
+
+                       case Token.OPEN_PARENS:
+                       case Token.OPEN_PARENS_CAST:
+                       case Token.OPEN_PARENS_LAMBDA:
+                               next_token = -1;
+                               ++parens;
+                               break;
                                
                        default:
                                next_token = -1;
@@ -1317,14 +1326,19 @@ namespace Mono.CSharp
                                        
                                case Token.COLON:
                                        next_token = Token.INTERR;
-                                       break;                                                  
-                                       
+                                       break;
+
+                               case Token.OPEN_PARENS:
+                               case Token.OPEN_PARENS_CAST:
+                               case Token.OPEN_PARENS_LAMBDA:
+                                       ++parens;
+                                       goto default;
+
                                default:
                                        int ntoken;
                                        int interrs = 1;
                                        int colons = 0;
                                        int braces = 0;
-                                       int parens = 0;
                                        //
                                        // All shorcuts failed, do it hard way
                                        //
@@ -1342,9 +1356,13 @@ namespace Mono.CSharp
                                                        --braces;
                                                        continue;
                                                case Token.CLOSE_PARENS:
-                                                       if (parens > 0)
+                                                       if (parens > 0) {
                                                                --parens;
-                                                       continue;
+                                                               continue;
+                                                       }
+
+                                                       PopPosition ();
+                                                       return Token.INTERR_NULLABLE;
                                                }
 
                                                if (braces != 0)
index 8b0034a9f9b6ae7dd97b8c3f356c570cb2f12bdb..0e7fbd2eee69fc414d69349c9b4484c217031551 100644 (file)
@@ -2760,6 +2760,15 @@ namespace Mono.CSharp {
                                        }
                                }
 
+                               var mg = NamespaceContainer.LookupStaticUsings (rc, Name, Arity, loc);
+                               if (mg != null) {
+                                       if (Arity > 0) {
+                                               targs.Resolve (rc);
+                                               mg.SetTypeArguments (rc, targs);
+                                       }
+                                       return mg;
+                               }
+
                                if (errorMode) {
                                        if (variable_found) {
                                                rc.Report.Error (841, loc, "A local variable `{0}' cannot be used before it is declared", Name);
@@ -3358,7 +3367,7 @@ namespace Mono.CSharp {
                        //
                        // Check intermediate value modification which won't have any effect
                        //
-                       if (rhs != null && InstanceExpression.Type.IsStruct) {
+                       if (rhs != null && TypeSpec.IsValueType (InstanceExpression.Type)) {
                                var fexpr = InstanceExpression as FieldExpr;
                                if (fexpr != null) {
                                        if (!fexpr.Spec.IsReadOnly || rc.HasAny (ResolveContext.Options.FieldInitializerScope | ResolveContext.Options.ConstructorScope))
@@ -4609,7 +4618,7 @@ namespace Mono.CSharp {
                // 0 = the best, int.MaxValue = the worst
                // -1 = fatal error
                //
-               int IsApplicable (ResolveContext ec, ref Arguments arguments, int arg_count, ref MemberSpec candidate, IParametersMember pm, ref bool params_expanded_form, ref bool dynamicArgument, ref TypeSpec returnType)
+               int IsApplicable (ResolveContext ec, ref Arguments arguments, int arg_count, ref MemberSpec candidate, IParametersMember pm, ref bool params_expanded_form, ref bool dynamicArgument, ref TypeSpec returnType, bool errorMode)
                {
                        // Parameters of most-derived type used mainly for named and optional parameters
                        var pd = pm.Parameters;
@@ -4802,6 +4811,13 @@ namespace Mono.CSharp {
                                                lambda_conv_msgs.ClearSession ();
 
                                        if (i_args.Length != 0) {
+                                               if (!errorMode) {
+                                                       foreach (var ta in i_args) {
+                                                               if (!ta.IsAccessible (ec))
+                                                                       return ti.InferenceScore - 10000;
+                                                       }
+                                               }
+
                                                ms = ms.MakeGenericMethod (ec, i_args);
                                        }
                                }
@@ -5155,7 +5171,7 @@ namespace Mono.CSharp {
                                                bool params_expanded_form = false;
                                                bool dynamic_argument = false;
                                                TypeSpec rt = pm.MemberType;
-                                               int candidate_rate = IsApplicable (rc, ref candidate_args, args_count, ref member, pm, ref params_expanded_form, ref dynamic_argument, ref rt);
+                                               int candidate_rate = IsApplicable (rc, ref candidate_args, args_count, ref member, pm, ref params_expanded_form, ref dynamic_argument, ref rt, error_mode);
 
                                                if (lambda_conv_msgs != null)
                                                        lambda_conv_msgs.EndSession ();
@@ -5533,6 +5549,9 @@ namespace Mono.CSharp {
                                break;
                        }
 
+                       if (args == null)
+                               return false;
+
                        foreach (var arg in args) {
                                var na = arg as NamedArgument;
                                if (na == null)
@@ -5670,7 +5689,7 @@ namespace Mono.CSharp {
                        //
                        // Fill not provided arguments required by params modifier
                        //
-                       if (params_initializers == null && pd.HasParams && arg_count + 1 == pd.Count) {
+                       if (params_initializers == null && arg_count + 1 == pd.Count) {
                                if (args == null)
                                        args = new Arguments (1);
 
index dc99a228aad6de04378d695ddaa7f66628ee56a7..3c454aa1f14c2c5964aa3c66ceaa50081c75bb87 100644 (file)
@@ -139,7 +139,7 @@ namespace Mono.CSharp
 
                public readonly Operator Oper;
                public Expression Expr;
-               Expression enum_conversion;
+               ConvCast.Mode enum_conversion;
 
                public Unary (Operator op, Expression expr, Location loc)
                {
@@ -373,7 +373,7 @@ namespace Mono.CSharp
                                return null;
 
                        Expr = best_expr;
-                       enum_conversion = Convert.ExplicitNumericConversion (ec, new EmptyExpression (best_expr.Type), underlying_type);
+                       enum_conversion = Binary.GetEnumResultCast (underlying_type);
                        type = expr.Type;
                        return EmptyCast.Create (this, type);
                }
@@ -583,8 +583,11 @@ namespace Mono.CSharp
                        //
                        // Same trick as in Binary expression
                        //
-                       if (enum_conversion != null)
-                               enum_conversion.Emit (ec);
+                       if (enum_conversion != 0) {
+                               using (ec.With (BuilderContext.Options.CheckedScope, false)) {
+                                       ConvCast.Emit (ec, enum_conversion);
+                               }
+                       }
                }
 
                public override void EmitBranchable (EmitContext ec, Label target, bool on_true)
@@ -1440,8 +1443,8 @@ namespace Mono.CSharp
                                return null;
                        }
 
-                       if (expr.Type == InternalType.AnonymousMethod) {
-                               ec.Report.Error (837, loc, "The `{0}' operator cannot be applied to a lambda expression or anonymous method",
+                       if (expr.Type == InternalType.AnonymousMethod || expr.Type == InternalType.MethodGroup) {
+                               ec.Report.Error (837, loc, "The `{0}' operator cannot be applied to a lambda expression, anonymous method, or method group",
                                        OperatorName);
                                return null;
                        }
@@ -2966,7 +2969,7 @@ namespace Mono.CSharp
 
                                                if ((oper & Operator.BitwiseMask) != 0) {
                                                        expr = EmptyCast.Create (expr, type);
-                                                       AddEnumResultCast (type);
+                                                       enum_conversion = GetEnumResultCast (type);
 
                                                        if (oper == Operator.BitwiseAnd && left.Type.IsEnum && right.Type.IsEnum) {
                                                                expr = OptimizeAndOperation (expr);
@@ -3168,11 +3171,21 @@ namespace Mono.CSharp
                }
                public static PredefinedOperator[] CreateStandardLiftedOperatorsTable (ModuleContainer module)
                {
+                       var types = module.Compiler.BuiltinTypes;
+
+                       //
+                       // Not strictly lifted but need to be in second group otherwise expressions like
+                       // int + null would resolve to +(object, string) instead of +(int?, int?)
+                       //
+                       var string_operators = new [] {
+                               new PredefinedStringOperator (types.String, types.Object, Operator.AdditionMask, types.String),
+                               new PredefinedStringOperator (types.Object, types.String, Operator.AdditionMask, types.String),
+                       };
+
                        var nullable = module.PredefinedTypes.Nullable.TypeSpec;
                        if (nullable == null)
-                               return new PredefinedOperator [0];
+                               return string_operators;
 
-                       var types = module.Compiler.BuiltinTypes;
                        var bool_type = types.Bool;
 
                        var nullable_bool = nullable.MakeGenericType (module, new[] { bool_type });
@@ -3207,13 +3220,8 @@ namespace Mono.CSharp
                                new PredefinedOperator (nullable_long, nullable_int, Operator.NullableMask | Operator.ShiftMask),
                                new PredefinedOperator (nullable_ulong, nullable_int, Operator.NullableMask | Operator.ShiftMask),
 
-                               //
-                               // Not strictly lifted but need to be in second group otherwise expressions like
-                               // int + null would resolve to +(object, string) instead of +(int?, int?)
-                               //
-                               new PredefinedStringOperator (types.String, types.Object, Operator.AdditionMask, types.String),
-                               new PredefinedStringOperator (types.Object, types.String, Operator.AdditionMask, types.String),
-
+                               string_operators [0],
+                               string_operators [1]
                        };
                }
 
@@ -3864,7 +3872,7 @@ namespace Mono.CSharp
                                        else
                                                expr = ConvertEnumAdditionalResult (expr, enum_type);
 
-                                       AddEnumResultCast (expr.Type);
+                                       enum_conversion = GetEnumResultCast (expr.Type);
 
                                        return expr;
                                }
@@ -3879,7 +3887,7 @@ namespace Mono.CSharp
                                else
                                        expr = ConvertEnumAdditionalResult (expr, enum_type);
 
-                               AddEnumResultCast (expr.Type);
+                               enum_conversion = GetEnumResultCast (expr.Type);
                        }
 
                        return expr;
@@ -3924,7 +3932,7 @@ namespace Mono.CSharp
                        return EmptyCast.Create (expr, result_type);
                }
 
-               void AddEnumResultCast (TypeSpec type)
+               public static ConvCast.Mode GetEnumResultCast (TypeSpec type)
                {
                        if (type.IsNullableType)
                                type = Nullable.NullableInfo.GetUnderlyingType (type);
@@ -3934,18 +3942,16 @@ namespace Mono.CSharp
 
                        switch (type.BuiltinType) {
                        case BuiltinTypeSpec.Type.SByte:
-                               enum_conversion = ConvCast.Mode.I4_I1;
-                               break;
+                               return ConvCast.Mode.I4_I1;
                        case BuiltinTypeSpec.Type.Byte:
-                               enum_conversion = ConvCast.Mode.I4_U1;
-                               break;
+                               return ConvCast.Mode.I4_U1;
                        case BuiltinTypeSpec.Type.Short:
-                               enum_conversion = ConvCast.Mode.I4_I2;
-                               break;
+                               return ConvCast.Mode.I4_I2;
                        case BuiltinTypeSpec.Type.UShort:
-                               enum_conversion = ConvCast.Mode.I4_U2;
-                               break;
+                               return ConvCast.Mode.I4_U2;
                        }
+
+                       return 0;
                }
 
                //
@@ -9067,6 +9073,8 @@ namespace Mono.CSharp
                                } else {
                                        texpr = new GenericOpenTypeExpr (nested, loc);
                                }
+                       } else if (expr_resolved is GenericOpenTypeExpr) {
+                               texpr = new GenericOpenTypeExpr (nested, loc);
                        } else {
                                texpr = new TypeExpression (nested, loc);
                        }
@@ -10686,7 +10694,10 @@ namespace Mono.CSharp
                                        return null;
                                }
 
-                               if (!(member is PropertyExpr || member is FieldExpr)) {
+                               var me = member as MemberExpr;
+                               if (me is EventExpr) {
+                                       me = me.ResolveMemberAccess (ec, null, null);
+                               } else if (!(member is PropertyExpr || member is FieldExpr)) {
                                        ec.Report.Error (1913, loc,
                                                "Member `{0}' cannot be initialized. An object initializer may only be used for fields, or properties",
                                                member.GetSignatureForError ());
@@ -10694,7 +10705,6 @@ namespace Mono.CSharp
                                        return null;
                                }
 
-                               var me = member as MemberExpr;
                                if (me.IsStatic) {
                                        ec.Report.Error (1914, loc,
                                                "Static field or property `{0}' cannot be assigned in an object initializer",
index 4f54f268d29295abe4a7cdb611a95bb264cdce15..dbb74a7515a0d930a37c4832521afe6acb04c247 100644 (file)
@@ -139,15 +139,22 @@ namespace Mono.CSharp
                                var field = struct_info.Fields[i];
 
                                if (!fc.IsStructFieldDefinitelyAssigned (vi, field.Name)) {
-                                       if (field.MemberDefinition is Property.BackingField) {
+                                       var bf = field.MemberDefinition as Property.BackingField;
+                                       if (bf != null) {
+                                               if (bf.Initializer != null)
+                                                       continue;
+
                                                fc.Report.Error (843, loc,
                                                        "An automatically implemented property `{0}' must be fully assigned before control leaves the constructor. Consider calling the default struct contructor from a constructor initializer",
                                                        field.GetSignatureForError ());
-                                       } else {
-                                               fc.Report.Error (171, loc,
-                                                       "Field `{0}' must be fully assigned before control leaves the constructor",
-                                                       field.GetSignatureForError ());
+
+                                               ok = false;
+                                               continue;
                                        }
+
+                                       fc.Report.Error (171, loc,
+                                               "Field `{0}' must be fully assigned before control leaves the constructor",
+                                               field.GetSignatureForError ());
                                        ok = false;
                                }
                        }
index 0d7e9e5ad5fec0c693e3b56fedbd3c0c448aed16..b8c5832d21d8088f5e88c294d25cdf3a5449ea55 100644 (file)
@@ -434,6 +434,8 @@ namespace Mono.CSharp
                                                else
                                                        mod |= Modifiers.VIRTUAL;
                                        }
+                               } else if (parameters.HasExtensionMethodType) {
+                                       mod |= Modifiers.METHOD_EXTENSION;
                                }
                        }
 
index 8b45f88a911a054c4156b8d13f545f430d2e707a..202438dc03ef9d5c440ae32c2f4774ce221a4560 100644 (file)
@@ -723,7 +723,7 @@ namespace Mono.CSharp
                //
                // The state as we generate the machine
                //
-               Label move_next_ok;
+               protected Label move_next_ok;
                protected Label move_next_error;
                LocalBuilder skip_finally;
                protected LocalBuilder current_pc;
@@ -827,8 +827,15 @@ namespace Mono.CSharp
 
                        BodyEnd = ec.DefineLabel ();
 
+                       var async_init = this as AsyncInitializer;
+                       if (async_init != null)
+                               ec.BeginExceptionBlock ();
+
                        block.EmitEmbedded (ec);
 
+                       if (async_init != null)
+                               async_init.EmitCatchBlock (ec);
+
                        ec.MarkLabel (BodyEnd);
 
                        EmitMoveNextEpilogue (ec);
@@ -839,6 +846,8 @@ namespace Mono.CSharp
                                ec.EmitInt (0);
                                ec.Emit (OpCodes.Ret);
                        }
+
+                       ec.MarkLabel (move_next_ok);
                }
 
                void EmitMoveNext (EmitContext ec)
@@ -895,19 +904,7 @@ namespace Mono.CSharp
                        ec.MarkLabel (BodyEnd);
 
                        if (async_init != null) {
-                               var catch_value = LocalVariable.CreateCompilerGenerated (ec.Module.Compiler.BuiltinTypes.Exception, block, Location);
-
-                               ec.BeginCatchBlock (catch_value.Type);
-                               catch_value.EmitAssign (ec);
-
-                               ec.EmitThis ();
-                               ec.EmitInt ((int) IteratorStorey.State.After);
-                               ec.Emit (OpCodes.Stfld, storey.PC.Spec);
-
-                               ((AsyncTaskStorey) async_init.Storey).EmitSetException (ec, new LocalVariableReference (catch_value, Location));
-
-                               ec.Emit (OpCodes.Leave, move_next_ok);
-                               ec.EndExceptionBlock ();
+                               async_init.EmitCatchBlock (ec);
                        }
 
                        ec.Mark (Block.Original.EndLocation);
index 82acb67b164cd6ea51492d227ebbc34aa600f314..7336f1dbf858ade6e732cba67fd63fba724eb364 100644 (file)
@@ -721,6 +721,9 @@ namespace Mono.CSharp {
                                        if (!fs.IsPublic && container.MemberDefinition.IsImported && (!fs.MemberType.IsArray && TypeSpec.IsReferenceType (fs.MemberType)))
                                                continue;
 
+                                       //if ((fs.Modifiers & (Modifiers.BACKING_FIELD) != 0)
+                                       //      continue;
+
                                        if (fields == null)
                                                fields = new List<FieldSpec> ();
 
index f6031a534d39c5b1a48b228a1b71ca625ce5c881..5a368ee05b1a39e73e7708a247bde5c331ad4fa8 100644 (file)
@@ -683,6 +683,7 @@ namespace Mono.CSharp {
                public bool DeclarationFound;
 
                Namespace[] namespace_using_table;
+               TypeSpec[] types_using_table;
                Dictionary<string, UsingAliasNamespace> aliases;
 
                public NamespaceContainer (MemberName name, NamespaceContainer parent)
@@ -935,6 +936,24 @@ namespace Mono.CSharp {
                                        return new ExtensionMethodCandidates (invocationContext, candidates, this, position);
                        }
 
+                       // LAMESPEC: TODO no spec about priority over normal extension methods yet
+                       if (types_using_table != null) {
+                               foreach (var t in types_using_table) {
+
+                                       var res = t.MemberCache.FindExtensionMethods (invocationContext, name, arity);
+                                       if (res == null)
+                                               continue;
+
+                                       if (candidates == null)
+                                               candidates = res;
+                                       else
+                                               candidates.AddRange (res);
+                               }
+
+                               if (candidates != null)
+                                       return new ExtensionMethodCandidates (invocationContext, candidates, this, position);
+                       }
+
                        return null;
                }
 
@@ -1116,6 +1135,42 @@ namespace Mono.CSharp {
                        return match;
                }
 
+               public static MethodGroupExpr LookupStaticUsings (IMemberContext mc, string name, int arity, Location loc)
+               {
+                       for (var m = mc.CurrentMemberDefinition; m != null; m = m.Parent) {
+
+                               var nc = m as NamespaceContainer;
+                               if (nc == null)
+                                       continue;
+
+                               List<MemberSpec> candidates = null;
+                               if (nc.types_using_table != null) {
+                                       foreach (var using_type in nc.types_using_table) {
+                                               var members = MemberCache.FindMembers (using_type, name, true);
+                                               if (members != null) {
+                                                       foreach (var member in members) {
+                                                               if ((member.Modifiers & Modifiers.METHOD_EXTENSION) != 0)
+                                                                       continue;
+
+                                                               if (arity > 0 && member.Arity != arity)
+                                                                       continue;
+
+                                                               if (candidates == null)
+                                                                       candidates = new List<MemberSpec> ();
+
+                                                               candidates.Add (member);
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               if (candidates != null)
+                                       return new MethodGroupExpr (candidates, null, loc);
+                       }
+
+                       return null;
+               }
+
                protected override void DefineNamespace ()
                {
                        if (namespace_using_table == null)
@@ -1129,7 +1184,9 @@ namespace Mono.CSharp {
                        namespace_using_table = empty_namespaces;
 
                        if (clauses != null) {
-                               var list = new List<Namespace> (clauses.Count);
+                               List<Namespace> namespaces = null;
+                               List<TypeSpec> types = null;
+
                                bool post_process_using_aliases = false;
 
                                for (int i = 0; i < clauses.Count; ++i) {
@@ -1168,21 +1225,36 @@ namespace Mono.CSharp {
                                        }
 
                                        var using_ns = entry.ResolvedExpression as NamespaceExpression;
-                                       if (using_ns == null)
-                                               continue;
+                                       if (using_ns == null) {
 
-                                       if (list.Contains (using_ns.Namespace)) {
-                                               // Ensure we don't report the warning multiple times in repl
-                                               clauses.RemoveAt (i--);
+                                               var type = ((TypeExpr)entry.ResolvedExpression).Type;
 
-                                               Compiler.Report.Warning (105, 3, entry.Location,
-                                                       "The using directive for `{0}' appeared previously in this namespace", using_ns.GetSignatureForError ());
+                                               if (types == null)
+                                                       types = new List<TypeSpec> ();
+
+                                               if (types.Contains (type)) {
+                                                       Warning_DuplicateEntry (entry);
+                                               } else {
+                                                       types.Add (type);
+                                               }
                                        } else {
-                                               list.Add (using_ns.Namespace);
+                                               if (namespaces == null)
+                                                       namespaces = new List<Namespace> ();
+
+                                               if (namespaces.Contains (using_ns.Namespace)) {
+                                                       // Ensure we don't report the warning multiple times in repl
+                                                       clauses.RemoveAt (i--);
+
+                                                       Warning_DuplicateEntry (entry);
+                                               } else {
+                                                       namespaces.Add (using_ns.Namespace);
+                                               }
                                        }
                                }
 
-                               namespace_using_table = list.ToArray ();
+                               namespace_using_table = namespaces == null ? new Namespace [0] : namespaces.ToArray ();
+                               if (types != null)
+                                       types_using_table = types.ToArray ();
 
                                if (post_process_using_aliases) {
                                        for (int i = 0; i < clauses.Count; ++i) {
@@ -1239,6 +1311,13 @@ namespace Mono.CSharp {
                        return false;
                }
 
+               void Warning_DuplicateEntry (UsingNamespace entry)
+               {
+                       Compiler.Report.Warning (105, 3, entry.Location,
+                               "The using directive for `{0}' appeared previously in this namespace",
+                               entry.ResolvedExpression.GetSignatureForError ());
+               }
+
                public override void Accept (StructuralVisitor visitor)
                {
                        visitor.Visit (this);
@@ -1294,13 +1373,27 @@ namespace Mono.CSharp {
                {
                        resolved = expr.ResolveAsTypeOrNamespace (ctx);
                        var ns = resolved as NamespaceExpression;
-                       if (ns == null) {
-                               if (resolved != null) {
-                                       ctx.Module.Compiler.Report.SymbolRelatedToPreviousError (resolved.Type);
-                                       ctx.Module.Compiler.Report.Error (138, Location,
-                                               "`{0}' is a type not a namespace. A using namespace directive can only be applied to namespaces",
-                                               GetSignatureForError ());
+                       if (ns != null)
+                               return;
+
+                       if (resolved != null) {
+                               var compiler = ctx.Module.Compiler;
+                               var type = resolved.Type;
+                               if (compiler.Settings.Version >= LanguageVersion.V_6) {
+                                       if (!type.IsClass || !type.IsStatic) {
+                                               compiler.Report.SymbolRelatedToPreviousError (type);
+                                               compiler.Report.Error (7007, Location,
+                                                       "`{0}' is not a static class. A using namespace directive can only be applied to static classes or namespace",
+                                                       GetSignatureForError ());
+                                       }
+
+                                       return;
                                }
+
+                               compiler.Report.SymbolRelatedToPreviousError (type);
+                               compiler.Report.Error (138, Location,
+                                       "`{0}' is a type not a namespace. A using namespace directive can only be applied to namespaces",
+                                       GetSignatureForError ());
                        }
                }
 
index 566c62af3aa0a6fe708354d6eb0d6f1129d6ee0a..dd36b88aef1aaeeb79f41ed26d8b86efb025e515 100644 (file)
@@ -187,6 +187,11 @@ namespace Mono.CSharp.Nullable
                        call.EmitPredefined (ec, NullableInfo.GetHasValue (expr.Type), null);
                }
 
+               public override void EmitSideEffect (EmitContext ec)
+               {
+                       expr.EmitSideEffect (ec);
+               }
+
                public override Expression EmitToField (EmitContext ec)
                {
                        if (temp_field == null)
index f1215173cb255a34c9c645bd0ff5540d53cc9ad9..a3f29def9bbe0c7d5b01f5003b803c9f0f617b71 100644 (file)
@@ -465,7 +465,7 @@ namespace Mono.CSharp {
 
                                if (atype == pa.CallerLineNumberAttribute) {
                                        caller_type = rc.BuiltinTypes.Int;
-                                       if (caller_type != parameter_type && !Convert.ImplicitNumericConversionExists (caller_type, parameter_type)) {
+                                       if (caller_type != parameter_type && !Convert.ImplicitStandardConversionExists (new IntConstant (caller_type, int.MaxValue, Location.Null), parameter_type)) {
                                                rc.Report.Error (4017, attr.Location,
                                                        "The CallerLineNumberAttribute attribute cannot be applied because there is no standard conversion from `{0}' to `{1}'",
                                                        caller_type.GetSignatureForError (), parameter_type.GetSignatureForError ());
@@ -789,6 +789,11 @@ namespace Mono.CSharp {
                        return new TypeExpression (p_type, location);
                }
 
+               public void SetIndex (int index)
+               {
+                       idx = index;
+               }
+
                public void Warning_UselessOptionalParameter (Report Report)
                {
                        Report.Warning (1066, 1, Location,
@@ -1151,6 +1156,23 @@ namespace Mono.CSharp {
                        return new ParametersCompiled (parameters, types);
                }
 
+               public static ParametersCompiled Prefix (ParametersCompiled parameters, Parameter p, TypeSpec type)
+               {
+                       var ptypes = new TypeSpec [parameters.Count + 1];
+                       ptypes [0] = type;
+                       Array.Copy (parameters.Types, 0, ptypes, 1, parameters.Count);
+
+                       var param = new Parameter [ptypes.Length];
+                       param [0] = p;
+                       for (int i = 0; i < parameters.Count; ++i) {
+                               var pi = parameters [i];
+                               param [i + 1] = pi;
+                               pi.SetIndex (i + 1);
+                       }
+
+                       return ParametersCompiled.CreateFullyResolved (param, ptypes);
+               }
+
                //
                // TODO: This does not fit here, it should go to different version of AParametersCollection
                // as the underlying type is not Parameter and some methods will fail to cast
index e8b3879f05afb10598cf8d54e3f1d093015910c2..8c59db158bbef3448a73a468d448c23f22a930fc 100644 (file)
@@ -732,12 +732,14 @@ namespace Mono.CSharp
                {
                        readonly Property property;
 
-                       public BackingField (Property p)
+                       public BackingField (Property p, bool readOnly)
                                : base (p.Parent, p.type_expr,
                                Modifiers.BACKING_FIELD | Modifiers.COMPILER_GENERATED | Modifiers.PRIVATE | (p.ModFlags & (Modifiers.STATIC | Modifiers.UNSAFE)),
                                new MemberName ("<" + p.GetFullName (p.MemberName) + ">k__BackingField", p.Location), null)
                        {
                                this.property = p;
+                               if (readOnly)
+                                       ModFlags |= Modifiers.READONLY;
                        }
 
                        public Property OriginalProperty {
@@ -766,6 +768,8 @@ namespace Mono.CSharp
                {
                }
 
+               public Expression Initializer { get; set; }
+
                public override void Accept (StructuralVisitor visitor)
                {
                        visitor.Visit (this);
@@ -784,10 +788,16 @@ namespace Mono.CSharp
                void CreateAutomaticProperty ()
                {
                        // Create backing field
-                       backing_field = new BackingField (this);
+                       backing_field = new BackingField (this, Initializer != null && Set == null);
                        if (!backing_field.Define ())
                                return;
 
+                       if (Initializer != null) {
+                               backing_field.Initializer = Initializer;
+                               Parent.RegisterFieldForInitialization (backing_field, new FieldInitializer (backing_field, Initializer, Location));
+                               backing_field.ModFlags |= Modifiers.READONLY;
+                       }
+
                        Parent.PartialContainer.Members.Add (backing_field);
 
                        FieldExpr fe = new FieldExpr (backing_field, Location);
@@ -802,11 +812,15 @@ namespace Mono.CSharp
                        Get.Block = new ToplevelBlock (Compiler, ParametersCompiled.EmptyReadOnlyParameters, Location.Null);
                        Return r = new Return (fe, Get.Location);
                        Get.Block.AddStatement (r);
+                       Get.ModFlags |= Modifiers.COMPILER_GENERATED;
 
                        // Create set block
-                       Set.Block = new ToplevelBlock (Compiler, Set.ParameterInfo, Location.Null);
-                       Assign a = new SimpleAssign (fe, new SimpleName ("value", Location.Null), Location.Null);
-                       Set.Block.AddStatement (new StatementExpression (a, Set.Location));
+                       if (Set != null) {
+                               Set.Block = new ToplevelBlock (Compiler, Set.ParameterInfo, Location.Null);
+                               Assign a = new SimpleAssign (fe, new SimpleName ("value", Location.Null), Location.Null);
+                               Set.Block.AddStatement (new StatementExpression (a, Set.Location));
+                               Set.ModFlags |= Modifiers.COMPILER_GENERATED;
+                       }
                }
 
                public override bool Define ()
@@ -816,13 +830,37 @@ namespace Mono.CSharp
 
                        flags |= MethodAttributes.HideBySig | MethodAttributes.SpecialName;
 
-                       if (!IsInterface && (ModFlags & (Modifiers.ABSTRACT | Modifiers.EXTERN)) == 0 &&
-                               AccessorSecond != null && Get.Block == null && Set.Block == null) {
-                               if (Compiler.Settings.Version <= LanguageVersion.ISO_2)
-                                       Report.FeatureIsNotAvailable (Compiler, Location, "automatically implemented properties");
+                       bool auto = AccessorFirst.Block == null && (AccessorSecond == null || AccessorSecond.Block == null) &&
+                               (ModFlags & (Modifiers.ABSTRACT | Modifiers.EXTERN)) == 0;
+
+                       if (Initializer != null) {
+                               if (!auto)
+                                       Report.Error (8050, Location, "`{0}': Only auto-implemented properties can have initializers",
+                                               GetSignatureForError ());
+
+                               if (IsInterface)
+                                       Report.Error (8053, Location, "`{0}': Properties inside interfaces cannot have initializers",
+                                               GetSignatureForError ());
+
+                               if (Compiler.Settings.Version < LanguageVersion.V_6)
+                                       Report.FeatureIsNotAvailable (Compiler, Location, "auto-implemented property initializer");
+                       }
+
+                       if (auto) {
+                               if (Get == null) {
+                                       Report.Error (8052, Location, "Auto-implemented property `{0}' must have get accessor",
+                                               GetSignatureForError ());
+                                       return false;
+                               }
+
+                               if (Initializer == null && AccessorSecond == null) {
+                                       Report.Error (8051, Location, "Auto-implemented property `{0}' must have set accessor or initializer",
+                                               GetSignatureForError ());
+                               }
+
+                               if (Compiler.Settings.Version < LanguageVersion.V_3 && Initializer == null)
+                                       Report.FeatureIsNotAvailable (Compiler, Location, "auto-implemented properties");
 
-                               Get.ModFlags |= Modifiers.COMPILER_GENERATED;
-                               Set.ModFlags |= Modifiers.COMPILER_GENERATED;
                                CreateAutomaticProperty ();
                        }
 
index e015b143da8ddaf5640997fce03aa048e58db3be..91b71ef1074557e627c386f136879c1d209341cf 100644 (file)
@@ -278,6 +278,10 @@ namespace Mono.CSharp {
                        var res = TrueStatement.FlowAnalysis (fc);
 
                        if (FalseStatement == null) {
+                               var c = expr as Constant;
+                               if (c != null && !c.IsDefaultValue)
+                                       return true_returns;
+
                                if (true_returns)
                                        fc.DefiniteAssignment = da_false;
                                else
@@ -4719,7 +4723,7 @@ namespace Mono.CSharp {
                // expression might be the expression from the switch, or an
                // expression that includes any potential conversions to
                //
-               Expression SwitchGoverningType (ResolveContext ec, Expression expr)
+               static Expression SwitchGoverningType (ResolveContext rc, Expression expr, bool unwrapExpr)
                {
                        switch (expr.Type.BuiltinType) {
                        case BuiltinTypeSpec.Type.Byte:
@@ -4746,10 +4750,18 @@ namespace Mono.CSharp {
                        // conversions, we have to report an error
                        //
                        Expression converted = null;
-                       foreach (TypeSpec tt in ec.BuiltinTypes.SwitchUserTypes) {
-                               Expression e;
-                               
-                               e = Convert.ImplicitUserConversion (ec, expr, tt, loc);
+                       foreach (TypeSpec tt in rc.Module.PredefinedTypes.SwitchUserTypes) {
+
+                               if (!unwrapExpr && tt.IsNullableType && expr.Type.IsNullableType)
+                                       break;
+
+                               var restr = Convert.UserConversionRestriction.ImplicitOnly |
+                                       Convert.UserConversionRestriction.ProbingOnly;
+
+                               if (unwrapExpr)
+                                       restr |= Convert.UserConversionRestriction.NullableSourceOnly;
+
+                               var e = Convert.UserDefinedConversion (rc, expr, tt, restr, Location.Null);
                                if (e == null)
                                        continue;
 
@@ -4757,11 +4769,12 @@ namespace Mono.CSharp {
                                // Ignore over-worked ImplicitUserConversions that do
                                // an implicit conversion in addition to the user conversion.
                                // 
-                               if (!(e is UserCast))
+                               var uc = e as UserCast;
+                               if (uc == null)
                                        continue;
 
                                if (converted != null){
-                                       ec.Report.ExtraInformation (loc, "(Ambiguous implicit user defined conversion in previous ");
+//                                     rc.Report.ExtraInformation (loc, "(Ambiguous implicit user defined conversion in previous ");
                                        return null;
                                }
 
@@ -4770,10 +4783,12 @@ namespace Mono.CSharp {
                        return converted;
                }
 
-               public static TypeSpec[] CreateSwitchUserTypes (BuiltinTypes types)
+               public static TypeSpec[] CreateSwitchUserTypes (ModuleContainer module, TypeSpec nullable)
                {
+                       var types = module.Compiler.BuiltinTypes;
+
                        // LAMESPEC: For some reason it does not contain bool which looks like csc bug
-                       return new[] {
+                       TypeSpec[] stypes = new[] {
                                types.SByte,
                                types.Byte,
                                types.Short,
@@ -4785,6 +4800,17 @@ namespace Mono.CSharp {
                                types.Char,
                                types.String
                        };
+
+                       if (nullable != null) {
+
+                               Array.Resize (ref stypes, stypes.Length + 9);
+
+                               for (int i = 0; i < 9; ++i) {
+                                       stypes [10 + i] = nullable.MakeGenericType (module, new [] { stypes [i] });
+                               }
+                       }
+
+                       return stypes;
                }
 
                public void RegisterLabel (BlockContext rc, SwitchLabel sl)
@@ -5005,14 +5031,23 @@ namespace Mono.CSharp {
                        if (Expr == null)
                                return false;
 
-                       new_expr = SwitchGoverningType (ec, Expr);
+                       //
+                       // LAMESPEC: User conversion from non-nullable governing type has a priority
+                       //
+                       new_expr = SwitchGoverningType (ec, Expr, false);
 
-                       if (new_expr == null && Expr.Type.IsNullableType) {
-                               unwrap = Nullable.Unwrap.Create (Expr, false);
-                               if (unwrap == null)
-                                       return false;
+                       if (new_expr == null) {
+                               if (Expr.Type.IsNullableType) {
+                                       unwrap = Nullable.Unwrap.Create (Expr, false);
+                                       if (unwrap == null)
+                                               return false;
 
-                               new_expr = SwitchGoverningType (ec, unwrap);
+                                       //
+                                       // Unwrap + user conversion using non-nullable type is not allowed but user operator
+                                       // involving nullable Expr and nullable governing type is
+                                       //
+                                       new_expr = SwitchGoverningType (ec, unwrap, true);
+                               }
                        }
 
                        if (new_expr == null) {
@@ -5025,8 +5060,11 @@ namespace Mono.CSharp {
                                return false;
                        }
 
-                       // Validate switch.
                        SwitchType = new_expr.Type;
+                       if (SwitchType.IsNullableType) {
+                               new_expr = unwrap = Nullable.Unwrap.Create (new_expr, true);
+                               SwitchType = Nullable.NullableInfo.GetUnderlyingType (SwitchType);
+                       }
 
                        if (SwitchType.BuiltinType == BuiltinTypeSpec.Type.Bool && ec.Module.Compiler.Settings.Version == LanguageVersion.ISO_1) {
                                ec.Report.FeatureIsNotAvailable (ec.Module.Compiler, loc, "switch expression of boolean type");
@@ -5442,6 +5480,8 @@ namespace Mono.CSharp {
                                //
                                ec.Mark (block.StartLocation);
                                block.IsCompilerGenerated = true;
+                       } else {
+                               new_expr.EmitSideEffect (ec);
                        }
 
                        block.Emit (ec);
@@ -5781,6 +5821,12 @@ namespace Mono.CSharp {
                        }
                }
 
+               protected override bool DoFlowAnalysis (FlowAnalysisContext fc)
+               {
+                       expr.FlowAnalysis (fc);
+                       return base.DoFlowAnalysis (fc);
+               }
+
                public override bool Resolve (BlockContext ec)
                {
                        expr = expr.Resolve (ec);
@@ -6384,6 +6430,9 @@ namespace Mono.CSharp {
                                                ctch.hoisted_temp.Emit (ec);
                                        else
                                                ctch.li.Emit (ec);
+
+                                       if (!ctch.IsGeneral && ctch.type.Kind == MemberKind.TypeParameter)
+                                               ec.Emit (OpCodes.Box, ctch.type);
                                }
 
                                var expr_start = ec.DefineLabel ();
index 870b7be2a754773b25c721b29e0fb28b38d4315c..6e785dfc097e7e8b082cbd15a0c79cbaab201adb 100644 (file)
@@ -73,7 +73,6 @@ namespace Mono.CSharp
                public readonly TypeSpec[] OperatorsUnaryMutator;
 
                public readonly TypeSpec[] BinaryPromotionsTypes;
-               public readonly TypeSpec[] SwitchUserTypes;
 
                readonly BuiltinTypeSpec[] types;
 
@@ -125,7 +124,6 @@ namespace Mono.CSharp
                        OperatorsUnaryMutator = UnaryMutator.CreatePredefinedOperatorsTable (this);
 
                        BinaryPromotionsTypes = ConstantFold.CreateBinaryPromotionsTypes (this);
-                       SwitchUserTypes = Switch.CreateSwitchUserTypes (this);
 
                        types = new BuiltinTypeSpec[] {
                                Object, ValueType, Attribute,
@@ -200,6 +198,7 @@ namespace Mono.CSharp
                public readonly PredefinedType SecurityAction;
                public readonly PredefinedType Dictionary;
                public readonly PredefinedType Hashtable;
+               public readonly TypeSpec[] SwitchUserTypes;
 
                //
                // C# 3.0
@@ -321,6 +320,8 @@ namespace Mono.CSharp
                        Task.Define ();
                        if (TaskGeneric.Define ())
                                TaskGeneric.TypeSpec.IsGenericTask = true;
+
+                       SwitchUserTypes = Switch.CreateSwitchUserTypes (module, Nullable.TypeSpec);
                }
        }
 
index 96aff7aa3397e94ad0ed6f53ab768504ac1fb1b9..1d2a5ad00fa628e21febda28d8547cff4713be55 100644 (file)
@@ -1,7 +1,7 @@
 using System;
 
 //
-// Parser conditional and cast expression tests
+// parser conditional and cast expression tests
 //
 
 class A<T>
@@ -31,6 +31,18 @@ public class ConditionalParsing
        struct S
        {
        }
+
+       struct MyTestStruct : IDisposable
+       {
+               public void Dispose ()
+               {
+               }
+
+               public static implicit operator MyTestStruct (int i)
+               {
+                       return new MyTestStruct ();
+               }
+       }
        
        void Test_1 (bool a)
        {
@@ -129,6 +141,15 @@ public class ConditionalParsing
                bool? b = Test (1, arg:2);
        }
 
+       void Test_17 ()
+       {
+               {
+                       using (MyTestStruct? mts = (int?) 1)
+                       {
+                       }
+               }
+       }
+
        static void Helper<T> (T arg)
        {
        }
index dce8e68b55abc216ae45f809d81b6edf8c75525d..6789ff87568c8b7856b25b169255f97c416122bb 100644 (file)
@@ -15,6 +15,10 @@ class C<T>
        static Type simple = typeof (Simple);
 }
 
+class D<U> : C<U>
+{
+}
+
 class A
 {
        public class N<T>
@@ -30,6 +34,9 @@ class M
                
                if (typeof (TestAlias).ToString () != "A+N`1[System.Double]")
                        return 1;
+
+               if (typeof (D<>.Simple).ToString () != "C`1+Simple[T]")
+                       return 2;
                
                return 0;
        }
diff --git a/mcs/tests/gtest-618.cs b/mcs/tests/gtest-618.cs
new file mode 100644 (file)
index 0000000..d92fa12
--- /dev/null
@@ -0,0 +1,73 @@
+using System;
+
+struct S1
+{
+       public static implicit operator int (S1? s)
+       {
+               return 1;
+       }
+}
+
+struct S2
+{
+       public static implicit operator int? (S2? s)
+       {
+               return null;
+       }
+}
+
+struct S3
+{
+       public static implicit operator int? (S3? s)
+       {
+               return 2;
+       }
+}
+
+struct S4
+{
+       public static implicit operator int? (S4 s)
+       {
+               return 3;
+       }
+}
+
+class C
+{
+       public static int Main ()
+       {
+               S1? s1 = new S1 ();
+               switch (s1) {
+               case 1:
+                       break;
+               default:
+                       return 1;
+               }
+
+               S2? s2 = new S2 ();
+               switch (s2) {
+               case null:
+                       break;
+               default:
+                       return 2;
+               }
+
+               S3? s3 = new S3 ();
+               switch (s3) {
+               case 2:
+                       break;
+               default:
+                       return 3;
+               }
+
+               S4 s4 = new S4 ();
+               switch (s4) {
+               case 3:
+                       break;
+               default:
+                       return 4;
+               }
+
+               return 0;
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/gtest-619.cs b/mcs/tests/gtest-619.cs
new file mode 100644 (file)
index 0000000..63bc79c
--- /dev/null
@@ -0,0 +1,35 @@
+interface I<T>
+{
+}
+
+interface IB<T> : I<string>
+{
+       
+}
+
+struct S
+{
+       class P
+       {
+       }
+       
+       public class C : IB<P>
+       {
+       }
+}
+
+class M
+{
+       static void Test<T> (I<T> iface)
+       {
+       }
+
+       static void Test<T> (IB<T> iface)
+       {
+       }
+
+       static void Main ()
+       {
+               Test (new S.C ());
+       }
+}
diff --git a/mcs/tests/gtest-autoproperty-09.cs b/mcs/tests/gtest-autoproperty-09.cs
new file mode 100644 (file)
index 0000000..e018015
--- /dev/null
@@ -0,0 +1,52 @@
+using System;
+
+struct S
+{
+       public static int P { get; } = 4;
+
+       public static int Main ()
+       {
+               if (P != 4)
+                       return 1;
+
+               var c = new C ();
+               if (c.P != -3)
+                       return 2;
+
+               if (c.P2 != 1)
+                       return 3;
+
+               c.P2 = 9;
+               if (c.P2 != 9)
+                       return 4;
+
+               var s = new S2 (null);
+               if (s.P != 4)
+                       return 12;
+
+               if (s.P2 != 1)
+                       return 13;
+
+               s.P2 = 9;
+               if (s.P2 != 9)
+                       return 14;
+
+               return 0;
+       }
+}
+
+class C
+{
+       public decimal P { get; } = -3;
+       public int P2 { get; set; } = 1;
+}
+
+struct S2
+{
+       public int P { get; } = 4;
+       public int P2 { get; set; } = 1;
+
+       public S2 (object o)
+       {
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/gtest-initialize-13.cs b/mcs/tests/gtest-initialize-13.cs
new file mode 100644 (file)
index 0000000..7c213e4
--- /dev/null
@@ -0,0 +1,18 @@
+using System;
+
+public struct EventInitializerTest
+{
+       public event Action a;
+       public event Action b;
+       public event Action c;
+
+       public static void Main()
+       {
+               Action d = null;
+               var eit = new EventInitializerTest() {
+                       a = null,
+                       b = delegate {},
+                       c = d
+               };
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/gtest-named-05.cs b/mcs/tests/gtest-named-05.cs
new file mode 100644 (file)
index 0000000..125e60d
--- /dev/null
@@ -0,0 +1,26 @@
+class Test
+{
+       public static void Main ()
+       {
+               string p;
+               M (y: p = F (), x: p);
+
+               int i;
+               string p2;
+               M2 (out i, c: p2 = F (), b : p2);
+       }
+
+       public static void M (string x, string y)
+       {
+       }
+
+       static void M2 (out int a, string b, string c)
+       {
+               a = 2;
+       }
+
+       public static string F ()
+       {
+               return null;
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/gtest-optional-32.cs b/mcs/tests/gtest-optional-32.cs
new file mode 100644 (file)
index 0000000..4ca3a60
--- /dev/null
@@ -0,0 +1,23 @@
+using System;
+
+abstract class A
+{
+       public abstract int[] Foo (params int[] args);
+}
+
+class B : A
+{
+       public override int[] Foo (int[] args = null)
+       {
+               return args;
+       }
+
+       static int Main ()
+       {
+               var b = new B();
+               if (b.Foo().Length != 0)
+                       return 1;
+
+               return 0;
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/gtest-optional-33.cs b/mcs/tests/gtest-optional-33.cs
new file mode 100644 (file)
index 0000000..0a0d311
--- /dev/null
@@ -0,0 +1,72 @@
+using System.Runtime.CompilerServices;
+using System;
+
+class TestCallerLineNumber
+{
+    static void Test ([CallerLineNumber] object  line = null)
+    {
+    }
+
+    static void Test ([CallerLineNumber] decimal line = 1)
+    {
+    }
+
+    static void Test ([CallerLineNumber] double  line = 1)
+    {
+    }
+
+    static void Test ([CallerLineNumber] float   line = 1)
+    {
+    }
+
+    static void Test ([CallerLineNumber] int     line = 1)
+    {
+    }
+
+    static void Test ([CallerLineNumber] uint    line = uint.MaxValue)
+    {
+    }
+
+    static void Test ([CallerLineNumber] long    line = 1)
+    {
+    }
+
+    static void Test ([CallerLineNumber] ulong   line = 1)
+    {
+    }
+
+    static void Test ([CallerLineNumber] decimal? line = 1)
+    {
+    }
+
+    static void Test ([CallerLineNumber] double?  line = 1)
+    {
+    }
+
+    static void Test ([CallerLineNumber] float?   line = 1)
+    {
+    }
+
+    static void Test ([CallerLineNumber] int?    line = 1)
+    {
+    }
+
+    static void Test ([CallerLineNumber] uint?    line = uint.MaxValue)
+    {
+    }
+
+    static void Test ([CallerLineNumber] long?    line = 1)
+    {
+    }
+
+    static void Test ([CallerLineNumber] ulong?   line = 1)
+    {
+    }
+}
+
+class D
+{
+    public static void Main ()
+    {
+    }
+}
\ No newline at end of file
index 705149a365c3b83b0980de48230f8b4c04fb7778..c85253596cbc7af4eca4ebcb4a31db2e15db2562 100644 (file)
@@ -3,6 +3,11 @@ enum MyEnum : byte
        Value_1 = 1
 }
 
+enum E : ushort
+{
+       V = 1
+}
+
 public class C
 {
        public static int Main ()
@@ -28,6 +33,11 @@ public class C
                if (b != (MyEnum)254)
                        return 4;
 
+               var e = E.V;
+               checked {
+                       var res = ~e;
+               }
+
                System.Console.WriteLine ("OK");
                return 0;
        }
index f6b992f384ebb1a5bea510c9e84c1a165c093fa6..87395cdeb3e6c33033b6d8b3c24a9d86763feca0 100644 (file)
@@ -9,7 +9,7 @@ class C
 
        static bool Bar (object t)
        {
-               return Bar is object;
+               return t is object;
        }
 }
 
index c4525d7b34d016c345dccae8cb57bb01bc6be522..7da6a379d434d5dea00cece92cc1bd7e8ccf2396 100644 (file)
@@ -57,7 +57,15 @@ class XX {
                s = (object)1 + null;
                if (s != "1")
                        return 12;
-       
+
+               s = (string)null + (object)null;
+               if (s.Length != 0)
+                       return 13;
+
+               s = (object)null + (string)null;
+               if (s.Length != 0)
+                       return 14;
+
                System.Console.WriteLine ("test ok");
                return 0;
        }
diff --git a/mcs/tests/test-899.cs b/mcs/tests/test-899.cs
new file mode 100644 (file)
index 0000000..2f8c9e5
--- /dev/null
@@ -0,0 +1,15 @@
+using System;
+
+class Test
+{
+       public static void Main()
+       {
+               object o;
+               lock (o = new object())
+               {
+                       Console.WriteLine (o);
+               }
+
+               Console.WriteLine (o);
+       }
+}
diff --git a/mcs/tests/test-900.cs b/mcs/tests/test-900.cs
new file mode 100644 (file)
index 0000000..b0e4b0a
--- /dev/null
@@ -0,0 +1,17 @@
+using System;
+
+class D
+{
+       public static implicit operator D (Action d)
+       {
+               return new D ();
+       }
+}
+
+class Program
+{
+       static void Main()
+       {
+               D d = (D) Main;
+       }
+}
diff --git a/mcs/tests/test-901.cs b/mcs/tests/test-901.cs
new file mode 100644 (file)
index 0000000..bdd7d07
--- /dev/null
@@ -0,0 +1,23 @@
+using System;
+
+class X
+{
+       public static void Main ()
+       {
+               int i;
+               if (true) {
+                       i = 3;
+               }
+
+               Console.WriteLine (i);
+
+               int i2;
+               if (false) {
+                       throw new ApplicationException ();
+               } else {
+                       i2 = 4;
+               }
+
+               Console.WriteLine (i2);
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/test-async-73.cs b/mcs/tests/test-async-73.cs
new file mode 100644 (file)
index 0000000..dc1935f
--- /dev/null
@@ -0,0 +1,31 @@
+using System.Threading.Tasks;
+using System;
+
+class X
+{
+       static async Task<int> Foo ()
+       {
+               var v = Throws ();
+
+               try {
+                       await v;   
+               } catch (Exception e) {
+                       return 0;
+               }
+
+               return 1;
+       }
+
+       static async Task<int> Throws ()
+       {
+               throw new Exception ();
+       }
+
+       static int Main ()
+       {
+               if (Foo ().Result != 0)
+                       return 1;
+
+               return 0;
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/test-ex-filter-06.cs b/mcs/tests/test-ex-filter-06.cs
new file mode 100644 (file)
index 0000000..86bbf0e
--- /dev/null
@@ -0,0 +1,29 @@
+using System;
+using System.IO;
+using System.Collections.Generic;
+
+class C
+{
+       static int Test<T> () where T : Exception
+       {
+               try {
+                       throw null;
+               } catch (T t) if (t.Message != null) {
+                       return 0;
+               }
+       }
+       static int Main()
+       {
+               try {
+                       Test<ApplicationException> ();
+                       return 1;
+               } catch {
+               }
+
+               if (Test<NullReferenceException> () != 0)
+                       return 2;
+
+               return 0;
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/test-static-using-01.cs b/mcs/tests/test-static-using-01.cs
new file mode 100644 (file)
index 0000000..88358aa
--- /dev/null
@@ -0,0 +1,28 @@
+// Compiler options: -langversion:6
+
+using A.B.X;
+
+namespace A.B
+{
+       static class X
+       {
+               public static int Test ()
+               {
+                       return 5;
+               }
+       }
+}
+
+namespace C
+{
+       class M
+       {
+               public static int Main ()
+               {
+                       if (Test () != 5)
+                               return 1;
+
+                       return 0;
+               }
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/test-static-using-02.cs b/mcs/tests/test-static-using-02.cs
new file mode 100644 (file)
index 0000000..db11121
--- /dev/null
@@ -0,0 +1,42 @@
+// Compiler options: -langversion:6
+
+using System;
+
+namespace A.B
+{
+       static class X
+       {
+               public static int Test (object o)
+               {
+                       return 1;
+               }
+       }
+}
+
+namespace A.C
+{
+       static class X
+       {
+               public static int Test (int o)
+               {
+                       return 2;
+               }
+       }
+}
+
+namespace C
+{
+       using A.B.X;
+       using A.C.X;
+
+       class M
+       {
+               public static int Main ()
+               {
+                       if (Test (3) != 2)
+                               return 1;
+
+                       return 0;
+               }
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/test-static-using-03.cs b/mcs/tests/test-static-using-03.cs
new file mode 100644 (file)
index 0000000..870643f
--- /dev/null
@@ -0,0 +1,42 @@
+// Compiler options: -langversion:6
+
+using System;
+using A.B.X;
+
+namespace A.B
+{
+       static class X
+       {
+               public static int Test (int o)
+               {
+                       return 1;
+               }
+       }
+}
+
+namespace A.C
+{
+       static class X
+       {
+               public static int Test (int o)
+               {
+                       return 2;
+               }
+       }
+}
+
+namespace C
+{
+       using A.C.X;
+
+       class M
+       {
+               public static int Main ()
+               {
+                       if (Test (3) != 2)
+                               return 1;
+
+                       return 0;
+               }
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/test-static-using-04.cs b/mcs/tests/test-static-using-04.cs
new file mode 100644 (file)
index 0000000..fe18b97
--- /dev/null
@@ -0,0 +1,42 @@
+// Compiler options: -langversion:6
+
+using System;
+
+namespace A.B
+{
+       static class X
+       {
+               public static int Test (object o)
+               {
+                       return 1;
+               }
+       }
+}
+
+namespace A.C
+{
+       static class X
+       {
+               private static int Test (int o)
+               {
+                       return 2;
+               }
+       }
+}
+
+namespace C
+{
+       using A.B.X;
+       using A.C.X;
+
+       class M
+       {
+               public static int Main ()
+               {
+                       if (Test (3) != 1)
+                               return 1;
+
+                       return 0;
+               }
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/test-static-using-05.cs b/mcs/tests/test-static-using-05.cs
new file mode 100644 (file)
index 0000000..0ddabc0
--- /dev/null
@@ -0,0 +1,11 @@
+using System.Console;
+using System.Linq.Enumerable;
+
+class Test
+{
+       static void Main() 
+       {
+               var range = Range (5, 17);
+               WriteLine (range.Where (i => i % 2 == 0).Count ());
+       }
+}
\ No newline at end of file
diff --git a/mcs/tests/test-static-using-06.cs b/mcs/tests/test-static-using-06.cs
new file mode 100644 (file)
index 0000000..fe259c8
--- /dev/null
@@ -0,0 +1,44 @@
+// Compiler options: -langversion:6
+
+using System;
+using A.B.X;
+using A.C.X;
+
+namespace A.B
+{
+       static class X
+       {
+               public static int Test (object o)
+               {
+                       return 1;
+               }
+       }
+}
+
+namespace A.C
+{
+       static class X
+       {
+               public static int Test<T> (T o)
+               {
+                       if (typeof (T) != typeof (object))
+                               return -1;
+
+                       return 2;
+               }
+       }
+}
+
+namespace C
+{
+       class M
+       {
+               public static int Main ()
+               {
+                       if (Test<object> ("") != 2)
+                               return 1;
+
+                       return 0;
+               }
+       }
+}
\ No newline at end of file
index 9eec8ff192bbb13113c8c94039c10b45d50a5c9d..70fd4e54d6cc3d5e45e328c3873da9e80dda1647 100644 (file)
       <method name="System.Dynamic.DynamicMetaObject BindUnaryOperation(System.Dynamic.UnaryOperationBinder)" attrs="198">\r
         <size>61</size>\r
       </method>\r
-      <method name="System.Object &lt;BindGetIndex&gt;m__0(System.Dynamic.DynamicMetaObject)" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
-      <method name="System.Object &lt;BindInvoke&gt;m__1(System.Dynamic.DynamicMetaObject)" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
-      <method name="System.Object &lt;BindInvokeMember&gt;m__2(System.Dynamic.DynamicMetaObject)" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
-      <method name="System.Object &lt;BindSetIndex&gt;m__3(System.Dynamic.DynamicMetaObject)" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
       <method name="Void .ctor(DynamicObjectMock, Expression)" attrs="6278">\r
         <size>22</size>\r
       </method>\r
       <method name="Void Assert[T](System.Collections.Generic.IList`1[T], System.Collections.Generic.IList`1[T], System.String)" attrs="145">\r
         <size>257</size>\r
       </method>\r
+    </type>\r
+    <type name="Tester+&lt;BinaryAddChecked_2&gt;c__AnonStorey0">\r
+      <method name="System.Object &lt;&gt;m__0()" attrs="131">\r
+        <size>98</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;GetIndex_3&gt;c__AnonStorey1">\r
+      <method name="Void &lt;&gt;m__0(System.Dynamic.GetIndexBinder, System.Object[])" attrs="131">\r
+        <size>93</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;InvokeMember_2&gt;c__AnonStorey2">\r
+      <method name="Void &lt;&gt;m__0(System.Dynamic.InvokeMemberBinder, System.Object[])" attrs="131">\r
+        <size>110</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;InvokeMember_6&gt;c__AnonStorey3">\r
+      <method name="Void &lt;&gt;m__0(System.Dynamic.InvokeMemberBinder, System.Object[])" attrs="131">\r
+        <size>120</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;SetIndex_3&gt;c__AnonStorey4">\r
+      <method name="Void &lt;&gt;m__0(System.Dynamic.SetIndexBinder, System.Object[], System.Object)" attrs="131">\r
+        <size>120</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;SetMember_2&gt;c__AnonStorey5">\r
+      <method name="System.Object &lt;&gt;m__0(System.Dynamic.GetMemberBinder)" attrs="131">\r
+        <size>80</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="AssertDynamicObject">\r
+      <method name="System.Object &lt;BindGetIndex&gt;m__0(System.Dynamic.DynamicMetaObject)" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="System.Object &lt;BindInvoke&gt;m__1(System.Dynamic.DynamicMetaObject)" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="System.Object &lt;BindInvokeMember&gt;m__2(System.Dynamic.DynamicMetaObject)" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="System.Object &lt;BindSetIndex&gt;m__3(System.Dynamic.DynamicMetaObject)" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester">\r
       <method name="Void &lt;BinaryAdd_1&gt;m__0(System.Dynamic.BinaryOperationBinder, System.Object)" attrs="145">\r
         <size>73</size>\r
       </method>\r
         <size>12</size>\r
       </method>\r
     </type>\r
-    <type name="Tester+&lt;BinaryAddChecked_2&gt;c__AnonStorey0">\r
-      <method name="System.Object &lt;&gt;m__0()" attrs="131">\r
-        <size>98</size>\r
-      </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;GetIndex_3&gt;c__AnonStorey1">\r
-      <method name="Void &lt;&gt;m__0(System.Dynamic.GetIndexBinder, System.Object[])" attrs="131">\r
-        <size>93</size>\r
-      </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;InvokeMember_2&gt;c__AnonStorey2">\r
-      <method name="Void &lt;&gt;m__0(System.Dynamic.InvokeMemberBinder, System.Object[])" attrs="131">\r
-        <size>110</size>\r
-      </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;InvokeMember_6&gt;c__AnonStorey3">\r
-      <method name="Void &lt;&gt;m__0(System.Dynamic.InvokeMemberBinder, System.Object[])" attrs="131">\r
-        <size>120</size>\r
-      </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;SetIndex_3&gt;c__AnonStorey4">\r
-      <method name="Void &lt;&gt;m__0(System.Dynamic.SetIndexBinder, System.Object[], System.Object)" attrs="131">\r
-        <size>120</size>\r
-      </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;SetMember_2&gt;c__AnonStorey5">\r
-      <method name="System.Object &lt;&gt;m__0(System.Dynamic.GetMemberBinder)" attrs="131">\r
-        <size>80</size>\r
-      </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
-    </type>\r
   </test>\r
   <test name="dtest-004.cs">\r
     <type name="G`1[T]">\r
         <size>26</size>\r
       </method>\r
     </type>\r
-    <type name="Tester">\r
-      <method name="Void &lt;SubtractAssignEvent&gt;m__0()" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__1(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>20</size>\r
-      </method>\r
-      <method name="System.String &lt;Main&gt;m__2(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__3(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__4(Boolean)" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
-    </type>\r
     <type name="Tester+&lt;AddAssignCheckedTest&gt;c__AnonStorey2">\r
       <method name="Void &lt;&gt;m__0()" attrs="131">\r
         <size>234</size>\r
       <method name="Void IsTest()" attrs="129">\r
         <size>69</size>\r
       </method>\r
+      <method name="Void &lt;SubtractAssignEvent&gt;m__0()" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__1(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>20</size>\r
+      </method>\r
+      <method name="System.String &lt;Main&gt;m__2(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__3(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__4(Boolean)" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="dtest-007.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>187</size>\r
       </method>\r
-      <method name="Int32 &lt;IsEvent&gt;m__4()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>7</size>\r
       </method>\r
     </type>\r
-    <type name="Tester">\r
-      <method name="Int32 &lt;InvokeTest&gt;m__0(System.String)" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Void &lt;InvokeMember_Error&gt;m__1()" attrs="145">\r
-        <size>112</size>\r
-      </method>\r
-      <method name="Int32 &lt;IsEvent&gt;m__3()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__5(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>20</size>\r
-      </method>\r
-      <method name="System.String &lt;Main&gt;m__6(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__7(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__8(Boolean)" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
-    </type>\r
     <type name="Tester+&lt;MemberGetError_Null&gt;c__AnonStorey1">\r
       <method name="Void &lt;&gt;m__0()" attrs="131">\r
         <size>86</size>\r
       </method>\r
     </type>\r
     <type name="Tester">\r
+      <method name="Int32 &lt;InvokeTest&gt;m__0(System.String)" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Void &lt;InvokeMember_Error&gt;m__1()" attrs="145">\r
+        <size>112</size>\r
+      </method>\r
       <method name="Void &lt;InvokeConstructor&gt;m__2(System.Decimal)" attrs="145">\r
         <size>2</size>\r
       </method>\r
+      <method name="Int32 &lt;IsEvent&gt;m__3()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;IsEvent&gt;m__4()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__5(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>20</size>\r
+      </method>\r
+      <method name="System.String &lt;Main&gt;m__6(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__7(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__8(Boolean)" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="dtest-008.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>192</size>\r
       </method>\r
-      <method name="System.Object &lt;Main&gt;m__0(System.Object)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="DynamicAssignments">\r
+      <method name="System.Object &lt;Main&gt;m__0(System.Object)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="dtest-018.cs">\r
     <type name="XValue">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>542</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>15</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Int32 &lt;Main&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="dtest-025.cs">\r
     <type name="S">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>1101</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>11</size>\r
-      </method>\r
-      <method name="Void &lt;Main&gt;m__1()" attrs="145">\r
-        <size>11</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__2(Int32 ByRef)" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>11</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__1()" attrs="145">\r
+        <size>11</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__2(Int32 ByRef)" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="dtest-047.cs">\r
     <type name="C`1[T]">\r
       <method name="Int32 Test(Int32)" attrs="150">\r
         <size>171</size>\r
       </method>\r
-      <method name="Int32 &lt;E&gt;m__0(Int32)" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>42</size>\r
       </method>\r
         <size>7</size>\r
       </method>\r
     </type>\r
+    <type name="C`1[T]">\r
+      <method name="Int32 &lt;E&gt;m__0(Int32)" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="dtest-048.cs">\r
     <type name="A">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>72</size>\r
       </method>\r
-      <method name="Void &lt;Test`1&gt;m__0[T](T)" attrs="145">\r
-        <size>103</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>7</size>\r
       </method>\r
     </type>\r
-    <type name="C">\r
-      <method name="Void &lt;Test3`1&gt;m__1[T](T)" attrs="145">\r
-        <size>105</size>\r
-      </method>\r
-    </type>\r
     <type name="C+&lt;Test2&gt;c__AnonStorey0`1[T]">\r
       <method name="Void &lt;&gt;m__0()" attrs="131">\r
         <size>46</size>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Void &lt;Test`1&gt;m__0[T](T)" attrs="145">\r
+        <size>103</size>\r
+      </method>\r
+      <method name="Void &lt;Test3`1&gt;m__1[T](T)" attrs="145">\r
+        <size>105</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="dtest-055.cs">\r
     <type name="B`2[T1,T2]">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>57</size>\r
       </method>\r
-      <method name="System.Object &lt;Main&gt;m__0()" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="System.Object &lt;Main&gt;m__0()" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="dtest-058.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>187</size>\r
       </method>\r
-      <method name="Void &lt;NonInvocable&gt;m__0()" attrs="145">\r
-        <size>86</size>\r
-      </method>\r
-      <method name="Void &lt;Using_1&gt;m__1()" attrs="145">\r
-        <size>92</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Void &lt;&gt;m__0()" attrs="131">\r
+        <size>110</size>\r
+      </method>\r
     </type>\r
     <type name="Tester">\r
+      <method name="Void &lt;NonInvocable&gt;m__0()" attrs="145">\r
+        <size>86</size>\r
+      </method>\r
+      <method name="Void &lt;Using_1&gt;m__1()" attrs="145">\r
+        <size>92</size>\r
+      </method>\r
       <method name="Void &lt;NullableConversion&gt;m__2()" attrs="145">\r
         <size>106</size>\r
       </method>\r
         <size>12</size>\r
       </method>\r
     </type>\r
-    <type name="Tester+&lt;Unsafe_1&gt;c__AnonStorey0">\r
-      <method name="Void &lt;&gt;m__0()" attrs="131">\r
-        <size>110</size>\r
-      </method>\r
-    </type>\r
   </test>\r
   <test name="dtest-error-02.cs">\r
     <type name="A">\r
       <method name="Void Main()" attrs="150">\r
         <size>84</size>\r
       </method>\r
-      <method name="System.String &lt;Main&gt;m__0(Double)" attrs="145">\r
-        <size>25</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="System.String &lt;Main&gt;m__0(Double)" attrs="145">\r
+        <size>25</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-062.cs">\r
     <type name="X">\r
       <method name="Void Main()" attrs="150">\r
         <size>43</size>\r
       </method>\r
-      <method name="Double &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>21</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="Double &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>21</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-114.cs">\r
     <type name="NaturalComparer`1[T]">\r
       <method name="Void Main(System.String[])" attrs="150">\r
         <size>472</size>\r
       </method>\r
-      <method name="System.String &lt;Main&gt;m__0(Double)" attrs="145">\r
-        <size>25</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>15</size>\r
       </method>\r
     </type>\r
+    <type name="MyTest">\r
+      <method name="System.String &lt;Main&gt;m__0(Double)" attrs="145">\r
+        <size>25</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-116.cs">\r
     <type name="Slow.Test">\r
       <method name="T`1[System.Int64] N()" attrs="150">\r
         <size>38</size>\r
       </method>\r
-      <method name="Int32 &lt;M`1&gt;m__0[X](X)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;N&gt;m__1(Int64)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="B">\r
+      <method name="Int32 &lt;M`1&gt;m__0[X](X)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;N&gt;m__1(Int64)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-155.cs">\r
     <type name="MyClass`1[T]">\r
       <method name="Void Main()" attrs="150">\r
         <size>74</size>\r
       </method>\r
-      <method name="System.String &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>22</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="U apply[T,U](T, Mapping`2)" attrs="145">\r
         <size>16</size>\r
       </method>\r
+      <method name="System.String &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>22</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-162.cs">\r
       <method name="Void Main()" attrs="150">\r
         <size>69</size>\r
       </method>\r
-      <method name="Boolean &lt;Main&gt;m__0(System.String)" attrs="145">\r
-        <size>20</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Boolean &lt;Main&gt;m__0(System.String)" attrs="145">\r
+        <size>20</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-185.cs">\r
       <method name="Void Main(System.String[])" attrs="150">\r
         <size>70</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-281.cs">\r
     <type name="List">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>14</size>\r
       </method>\r
-      <method name="Void &lt;a&gt;m__0(Int32)" attrs="145">\r
-        <size>8</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="Void .cctor()" attrs="6289">\r
-        <size>46</size>\r
+        <size>29</size>\r
       </method>\r
     </type>\r
     <type name="TestFunc`1[T]">\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="TestClass">\r
+      <method name="Void &lt;a&gt;m__0(Int32)" attrs="145">\r
+        <size>8</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-299.cs">\r
     <type name="N.A">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>189</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;Main&gt;m__1()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Thing">\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__1()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-362.cs">\r
     <type name="C">\r
       <method name="Void Main()" attrs="150">\r
         <size>2</size>\r
       </method>\r
-      <method name="Boolean &lt;GetMethodGroup&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Boolean &lt;GetMethodGroup&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-395.cs">\r
     <type name="RuleBuilder`1[T]">\r
       </method>\r
     </type>\r
     <type name="C`2[A,B]">\r
-      <method name="B &lt;C&gt;m__0(B)" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor(IEnumerable`1)" attrs="6278">\r
         <size>47</size>\r
       </method>\r
         <size>7</size>\r
       </method>\r
     </type>\r
+    <type name="C`2[A,B]">\r
+      <method name="B &lt;C&gt;m__0(B)" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-407.cs">\r
     <type name="MyColor">\r
       <method name="Int32 Foo(System.Func`1[System.Int32])" attrs="145">\r
         <size>10</size>\r
       </method>\r
-      <method name="Int32 &lt;Test_12&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void Test_13(System.Object)" attrs="129">\r
         <size>53</size>\r
       </method>\r
       <method name="Boolean Test(System.Object, Int32)" attrs="145">\r
         <size>10</size>\r
       </method>\r
+      <method name="Void Test_17()" attrs="129">\r
+        <size>52</size>\r
+      </method>\r
+    </type>\r
+    <type name="ConditionalParsing+MyTestStruct">\r
+      <method name="Void Dispose()" attrs="486">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="MyTestStruct op_Implicit(Int32)" attrs="2198">\r
+        <size>18</size>\r
+      </method>\r
+    </type>\r
+    <type name="ConditionalParsing">\r
+      <method name="Int32 &lt;Test_12&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-410.cs">\r
       <method name="Void Main()" attrs="150">\r
         <size>132</size>\r
       </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
       <method name="Maybe`1[System.String] &lt;Main&gt;m__0(System.String)" attrs="145">\r
         <size>14</size>\r
       </method>\r
       <method name="Maybe`1[System.String] &lt;Main&gt;m__2(System.String)" attrs="145">\r
         <size>18</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-412.cs">\r
     </type>\r
     <type name="M">\r
       <method name="Int32 Main()" attrs="150">\r
-        <size>53</size>\r
+        <size>90</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
     </type>\r
+    <type name="D`1[U]">\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-503.cs">\r
     <type name="TestAttribute">\r
         <size>7</size>\r
       </method>\r
     </type>\r
-    <type name="Combinator">\r
-      <method name="System.Tuple`2[System.Int32,System.Int32] &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-    </type>\r
     <type name="Parser`2[D1,DR1]">\r
       <method name="System.IAsyncResult BeginInvoke(D1, System.AsyncCallback, System.Object)" attrs="454">\r
         <size>0</size>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Combinator">\r
+      <method name="System.Tuple`2[System.Int32,System.Int32] &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-594.cs">\r
     <type name="C">\r
       </method>\r
     </type>\r
   </test>\r
-  <test name="gtest-anontype-01.cs">\r
-    <type name="Test">\r
-      <method name="Int32 Main()" attrs="150">\r
-        <size>71</size>\r
-      </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
+  <test name="gtest-618.cs">\r
+    <type name="S1">\r
+      <method name="Int32 op_Implicit(System.Nullable`1[S1])" attrs="2198">\r
+        <size>10</size>\r
       </method>\r
     </type>\r
-    <type name="&lt;&gt;__AnonType0`2[&lt;Foo&gt;__T,&lt;Baz&gt;__T]">\r
-      <method name="&lt;Foo&gt;__T get_Foo()" attrs="2182">\r
-        <size>7</size>\r
-      </method>\r
-      <method name="&lt;Baz&gt;__T get_Baz()" attrs="2182">\r
-        <size>7</size>\r
-      </method>\r
-      <method name="Boolean Equals(System.Object)" attrs="198">\r
-        <size>69</size>\r
-      </method>\r
-      <method name="Int32 GetHashCode()" attrs="198">\r
-        <size>86</size>\r
-      </method>\r
-      <method name="System.String ToString()" attrs="198">\r
-        <size>142</size>\r
+    <type name="S2">\r
+      <method name="System.Nullable`1[System.Int32] op_Implicit(System.Nullable`1[S2])" attrs="2198">\r
+        <size>18</size>\r
       </method>\r
-      <method name="Void .ctor(&lt;Foo&gt;__T, &lt;Baz&gt;__T)" attrs="6278">\r
-        <size>21</size>\r
+    </type>\r
+    <type name="S3">\r
+      <method name="System.Nullable`1[System.Int32] op_Implicit(System.Nullable`1[S3])" attrs="2198">\r
+        <size>15</size>\r
       </method>\r
     </type>\r
-  </test>\r
-  <test name="gtest-anontype-02.cs">\r
-    <type name="Test">\r
-      <method name="System.Object TestA(System.String)" attrs="145">\r
+    <type name="S4">\r
+      <method name="System.Nullable`1[System.Int32] op_Implicit(S4)" attrs="2198">\r
         <size>15</size>\r
       </method>\r
+    </type>\r
+    <type name="C">\r
       <method name="Int32 Main()" attrs="150">\r
-        <size>122</size>\r
+        <size>267</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
     </type>\r
-    <type name="&lt;&gt;__AnonType0`1[&lt;s&gt;__T]">\r
-      <method name="&lt;s&gt;__T get_s()" attrs="2182">\r
+  </test>\r
+  <test name="gtest-619.cs">\r
+    <type name="S+P">\r
+      <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
-      <method name="Boolean Equals(System.Object)" attrs="198">\r
-        <size>39</size>\r
-      </method>\r
-      <method name="Int32 GetHashCode()" attrs="198">\r
-        <size>63</size>\r
-      </method>\r
-      <method name="System.String ToString()" attrs="198">\r
-        <size>67</size>\r
-      </method>\r
-      <method name="Void .ctor(&lt;s&gt;__T)" attrs="6278">\r
-        <size>14</size>\r
-      </method>\r
     </type>\r
-    <type name="&lt;&gt;__AnonType1`2[&lt;Foo&gt;__T,&lt;Baz&gt;__T]">\r
-      <method name="&lt;Foo&gt;__T get_Foo()" attrs="2182">\r
-        <size>7</size>\r
-      </method>\r
-      <method name="&lt;Baz&gt;__T get_Baz()" attrs="2182">\r
+    <type name="S+C">\r
+      <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
-      <method name="Boolean Equals(System.Object)" attrs="198">\r
-        <size>69</size>\r
-      </method>\r
-      <method name="Int32 GetHashCode()" attrs="198">\r
-        <size>86</size>\r
-      </method>\r
-      <method name="System.String ToString()" attrs="198">\r
-        <size>142</size>\r
+    </type>\r
+    <type name="M">\r
+      <method name="Void Test[T](I`1[T])" attrs="145">\r
+        <size>2</size>\r
       </method>\r
-      <method name="Void .ctor(&lt;Foo&gt;__T, &lt;Baz&gt;__T)" attrs="6278">\r
-        <size>21</size>\r
+      <method name="Void Test[T](IB`1[T])" attrs="145">\r
+        <size>2</size>\r
       </method>\r
-    </type>\r
-  </test>\r
-  <test name="gtest-anontype-03.cs">\r
-    <type name="MyClass">\r
-      <method name="Int32 get_Baz()" attrs="2182">\r
-        <size>11</size>\r
+      <method name="Void Main()" attrs="145">\r
+        <size>12</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
-        <size>18</size>\r
+        <size>7</size>\r
       </method>\r
     </type>\r
+  </test>\r
+  <test name="gtest-anontype-01.cs">\r
     <type name="Test">\r
       <method name="Int32 Main()" attrs="150">\r
-        <size>82</size>\r
+        <size>71</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="&lt;&gt;__AnonType0`2[&lt;Foo&gt;__T,&lt;Baz&gt;__T]">\r
+      <method name="&lt;Foo&gt;__T get_Foo()" attrs="2182">\r
+        <size>7</size>\r
+      </method>\r
+      <method name="&lt;Baz&gt;__T get_Baz()" attrs="2182">\r
+        <size>7</size>\r
+      </method>\r
+      <method name="Boolean Equals(System.Object)" attrs="198">\r
+        <size>69</size>\r
+      </method>\r
+      <method name="Int32 GetHashCode()" attrs="198">\r
+        <size>86</size>\r
+      </method>\r
+      <method name="System.String ToString()" attrs="198">\r
+        <size>142</size>\r
+      </method>\r
+      <method name="Void .ctor(&lt;Foo&gt;__T, &lt;Baz&gt;__T)" attrs="6278">\r
+        <size>21</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
+  <test name="gtest-anontype-02.cs">\r
+    <type name="Test">\r
+      <method name="System.Object TestA(System.String)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Int32 Main()" attrs="150">\r
+        <size>122</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="&lt;&gt;__AnonType0`1[&lt;s&gt;__T]">\r
+      <method name="&lt;s&gt;__T get_s()" attrs="2182">\r
+        <size>7</size>\r
+      </method>\r
+      <method name="Boolean Equals(System.Object)" attrs="198">\r
+        <size>39</size>\r
+      </method>\r
+      <method name="Int32 GetHashCode()" attrs="198">\r
+        <size>63</size>\r
+      </method>\r
+      <method name="System.String ToString()" attrs="198">\r
+        <size>67</size>\r
+      </method>\r
+      <method name="Void .ctor(&lt;s&gt;__T)" attrs="6278">\r
+        <size>14</size>\r
+      </method>\r
+    </type>\r
+    <type name="&lt;&gt;__AnonType1`2[&lt;Foo&gt;__T,&lt;Baz&gt;__T]">\r
+      <method name="&lt;Foo&gt;__T get_Foo()" attrs="2182">\r
+        <size>7</size>\r
+      </method>\r
+      <method name="&lt;Baz&gt;__T get_Baz()" attrs="2182">\r
+        <size>7</size>\r
+      </method>\r
+      <method name="Boolean Equals(System.Object)" attrs="198">\r
+        <size>69</size>\r
+      </method>\r
+      <method name="Int32 GetHashCode()" attrs="198">\r
+        <size>86</size>\r
+      </method>\r
+      <method name="System.String ToString()" attrs="198">\r
+        <size>142</size>\r
+      </method>\r
+      <method name="Void .ctor(&lt;Foo&gt;__T, &lt;Baz&gt;__T)" attrs="6278">\r
+        <size>21</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
+  <test name="gtest-anontype-03.cs">\r
+    <type name="MyClass">\r
+      <method name="Int32 get_Baz()" attrs="2182">\r
+        <size>11</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>18</size>\r
+      </method>\r
+    </type>\r
+    <type name="Test">\r
+      <method name="Int32 Main()" attrs="150">\r
+        <size>82</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       <method name="System.Collections.Generic.IEnumerator`1[T] System.Collections.Generic.IEnumerable&lt;T&gt;.GetEnumerator()" attrs="481">\r
         <size>52</size>\r
       </method>\r
+      <method name="System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()" attrs="481">\r
+        <size>14</size>\r
+      </method>\r
     </type>\r
     <type name="Test">\r
       <method name="Boolean &lt;Main&gt;m__0(&lt;&gt;__AnonType0`2[System.String,System.Reflection.PropertyInfo])" attrs="145">\r
         <size>15</size>\r
       </method>\r
     </type>\r
-    <type name="Test+&lt;Select&gt;c__Iterator0`1[T]">\r
-      <method name="System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()" attrs="481">\r
-        <size>14</size>\r
-      </method>\r
-    </type>\r
   </test>\r
   <test name="gtest-autoproperty-01.cs">\r
     <type name="Test">\r
       </method>\r
     </type>\r
   </test>\r
+  <test name="gtest-autoproperty-09.cs">\r
+    <type name="S">\r
+      <method name="Int32 get_P()" attrs="2198">\r
+        <size>13</size>\r
+      </method>\r
+      <method name="Int32 Main()" attrs="150">\r
+        <size>192</size>\r
+      </method>\r
+      <method name="Void .cctor()" attrs="6289">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="C">\r
+      <method name="System.Decimal get_P()" attrs="2182">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>27</size>\r
+      </method>\r
+    </type>\r
+    <type name="S2">\r
+      <method name="Int32 get_P()" attrs="2182">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="Void .ctor(Object)" attrs="6278">\r
+        <size>16</size>\r
+      </method>\r
+    </type>\r
+    <type name="C">\r
+      <method name="Int32 get_P2()" attrs="2182">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="Void set_P2(Int32)" attrs="2182">\r
+        <size>8</size>\r
+      </method>\r
+    </type>\r
+    <type name="S2">\r
+      <method name="Int32 get_P2()" attrs="2182">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="Void set_P2(Int32)" attrs="2182">\r
+        <size>8</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="gtest-collectioninit-01.cs">\r
     <type name="Test">\r
       <method name="Void TestList(System.Collections.Generic.List`1[System.Int32], Int32)" attrs="145">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>187</size>\r
       </method>\r
-      <method name="Void &lt;EqualTestDelegate_2&gt;m__0()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;EqualTestDelegate_2&gt;m__1()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;EqualTestDelegate_2&gt;m__2()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;EqualTestDelegate_2&gt;m__3()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;EqualTestDelegate_2&gt;m__4()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="System.String &lt;InvokeTest_2&gt;m__5(Int32)" attrs="145">\r
-        <size>25</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__6(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>20</size>\r
-      </method>\r
-      <method name="System.String &lt;Main&gt;m__7(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__8(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__9(Boolean)" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="Void EqualTest_16()" attrs="129">\r
         <size>185</size>\r
       </method>\r
+      <method name="Void &lt;EqualTestDelegate_2&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;EqualTestDelegate_2&gt;m__1()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;EqualTestDelegate_2&gt;m__2()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;EqualTestDelegate_2&gt;m__3()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;EqualTestDelegate_2&gt;m__4()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="System.String &lt;InvokeTest_2&gt;m__5(Int32)" attrs="145">\r
+        <size>25</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__6(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>20</size>\r
+      </method>\r
+      <method name="System.String &lt;Main&gt;m__7(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__8(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__9(Boolean)" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-etree-02.cs">\r
       <method name="Void Main()" attrs="150">\r
         <size>2</size>\r
       </method>\r
-      <method name="System.Object &lt;CreateDependent_DependentsNull&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>7</size>\r
       </method>\r
     </type>\r
+    <type name="NotifyingPropertyTest">\r
+      <method name="System.Object &lt;CreateDependent_DependentsNull&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-etree-25.cs">\r
     <type name="Foo">\r
       <method name="Void Test[U](U)" attrs="150">\r
         <size>25</size>\r
       </method>\r
-      <method name="Boolean &lt;Test`1&gt;m__0[U](System.String)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
     </type>\r
     <type name="A">\r
       <method name="Void Main()" attrs="150">\r
       <method name="Void Method[T](System.Collections.Generic.IEnumerable`1[T], System.Func`2[T,System.Boolean])" attrs="145">\r
         <size>2</size>\r
       </method>\r
+      <method name="Boolean &lt;Test`1&gt;m__0[U](System.String)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-exmethod-42.cs">\r
       </method>\r
     </type>\r
   </test>\r
+  <test name="gtest-initialize-13.cs">\r
+    <type name="EventInitializerTest">\r
+      <method name="Void add_a(System.Action)" attrs="2182">\r
+        <size>42</size>\r
+      </method>\r
+      <method name="Void remove_a(System.Action)" attrs="2182">\r
+        <size>42</size>\r
+      </method>\r
+      <method name="Void add_b(System.Action)" attrs="2182">\r
+        <size>42</size>\r
+      </method>\r
+      <method name="Void remove_b(System.Action)" attrs="2182">\r
+        <size>42</size>\r
+      </method>\r
+      <method name="Void add_c(System.Action)" attrs="2182">\r
+        <size>42</size>\r
+      </method>\r
+      <method name="Void remove_c(System.Action)" attrs="2182">\r
+        <size>42</size>\r
+      </method>\r
+      <method name="Void Main()" attrs="150">\r
+        <size>68</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="gtest-iter-01.cs">\r
     <type name="C">\r
       <method name="Void Main()" attrs="150">\r
         <size>44</size>\r
       </method>\r
     </type>\r
-    <type name="Mono.Rocks.Test">\r
-      <method name="System.Nullable`1[System.Collections.Generic.KeyValuePair`2[System.Int32,System.Int32]] &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>37</size>\r
-      </method>\r
-    </type>\r
     <type name="Mono.Rocks.Sequence+&lt;CreateUnfoldrIterator&gt;c__Iterator0`2[TSource,TResult]">\r
       <method name="System.Collections.Generic.IEnumerator`1[TResult] System.Collections.Generic.IEnumerable&lt;TResult&gt;.GetEnumerator()" attrs="481">\r
         <size>52</size>\r
         <size>14</size>\r
       </method>\r
     </type>\r
+    <type name="Mono.Rocks.Test">\r
+      <method name="System.Nullable`1[System.Collections.Generic.KeyValuePair`2[System.Int32,System.Int32]] &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>37</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-iter-07.cs">\r
     <type name="Test">\r
       <method name="Void Reset()" attrs="486">\r
         <size>6</size>\r
       </method>\r
-      <method name="Void &lt;&gt;m__0()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()" attrs="481">\r
         <size>14</size>\r
       </method>\r
+      <method name="Void &lt;&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-iter-28.cs">\r
       <method name="System.Collections.Generic.IEnumerable`1[System.Int32] FromTo(Int32, Int32)" attrs="150">\r
         <size>37</size>\r
       </method>\r
-      <method name="System.String &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>22</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>14</size>\r
       </method>\r
     </type>\r
+    <type name="MyTest">\r
+      <method name="System.String &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>22</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-lambda-01.cs">\r
     <type name="IntFunc">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>328</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__1(Int32)" attrs="145">\r
-        <size>11</size>\r
-      </method>\r
       <method name="Void .ctor(Int32)" attrs="6273">\r
         <size>14</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
-    </type>\r
-    <type name="X">\r
-      <method name="Void &lt;Main&gt;m__2(Int32)" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-    </type>\r
-    <type name="X+&lt;Main&gt;c__AnonStorey0">\r
       <method name="Void &lt;&gt;m__0(Int32)" attrs="131">\r
         <size>9</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__1(Int32)" attrs="145">\r
+        <size>11</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__2(Int32)" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-lambda-02.cs">\r
     <type name="funcs">\r
       <method name="Void Main()" attrs="150">\r
         <size>36</size>\r
       </method>\r
-      <method name="System.String &lt;Main&gt;m__0(System.String)" attrs="145">\r
-        <size>19</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="System.String &lt;Main&gt;m__0(System.String)" attrs="145">\r
+        <size>19</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-lambda-03.cs">\r
     <type name="Func`2[TArg0,TResult]">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>147</size>\r
       </method>\r
-      <method name="System.String &lt;Main&gt;m__0(System.String)" attrs="145">\r
-        <size>38</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__1(Int32)" attrs="145">\r
-        <size>38</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="System.String &lt;Main&gt;m__0(System.String)" attrs="145">\r
+        <size>38</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__1(Int32)" attrs="145">\r
+        <size>38</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-lambda-06.cs">\r
     <type name="TestClass">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>44</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0(F)" attrs="145">\r
-        <size>31</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="TestClass">\r
+      <method name="Void &lt;Main&gt;m__0(F)" attrs="145">\r
+        <size>31</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-lambda-07.cs">\r
     <type name="D">\r
       <method name="Void Main()" attrs="150">\r
         <size>208</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;Main&gt;m__1()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;Main&gt;m__2()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;Main&gt;m__3()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;Main&gt;m__4()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;Main&gt;m__5(Boolean)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__1()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__2()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__3()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__4()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__5(Boolean)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-lambda-08.cs">\r
     <type name="C">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>344</size>\r
       </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
       <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
         <size>12</size>\r
       </method>\r
       <method name="Int32 &lt;Main&gt;m__6(Int32)" attrs="145">\r
         <size>12</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-lambda-09.cs">\r
       <method name="Void Main()" attrs="150">\r
         <size>114</size>\r
       </method>\r
-      <method name="System.String &lt;Main&gt;m__0()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
-      <method name="System.String &lt;Main&gt;m__1()" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
-      <method name="System.String &lt;Main&gt;m__2(System.String)" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="System.String &lt;Main&gt;m__0()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+      <method name="System.String &lt;Main&gt;m__1()" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="System.String &lt;Main&gt;m__2(System.String)" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-lambda-10.cs">\r
     <type name="C">\r
       <method name="Void Bar()" attrs="145">\r
         <size>36</size>\r
       </method>\r
-      <method name="Void &lt;Bar&gt;m__0(Int32)" attrs="145">\r
-        <size>6</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+    </type>\r
+    <type name="TestUnary">\r
+      <method name="Void &lt;Bar&gt;m__0(Int32)" attrs="145">\r
+        <size>6</size>\r
+      </method>\r
+    </type>\r
+    <type name="Program">\r
       <method name="System.String &lt;Bar&gt;m__0(System.String)" attrs="145">\r
         <size>14</size>\r
       </method>\r
       <method name="Void Foo[T]()" attrs="145">\r
         <size>15</size>\r
       </method>\r
-      <method name="T &lt;Foo`1&gt;m__0[T](T)" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="T &lt;Foo`1&gt;m__0[T](T)" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-lambda-15.cs">\r
   </test>\r
   <test name="gtest-lambda-20.cs">\r
     <type name="Z">\r
-      <method name="Void &lt;Z&gt;m__0()" attrs="145">\r
-        <size>7</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>38</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Z">\r
+      <method name="Void &lt;Z&gt;m__0()" attrs="145">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-lambda-21.cs">\r
     <type name="Program">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>108</size>\r
       </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
       <method name="System.String &lt;Bar&gt;m__0(System.String)" attrs="145">\r
         <size>14</size>\r
       </method>\r
       <method name="Void &lt;Main&gt;m__2(System.String)" attrs="145">\r
         <size>7</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-lambda-22.cs">\r
       <method name="Void Main()" attrs="150">\r
         <size>137</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0(Product)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Product &lt;Main&gt;m__1(Product)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Boolean &lt;&gt;m__0(Product)" attrs="131">\r
+        <size>60</size>\r
+      </method>\r
     </type>\r
     <type name="MainClass">\r
+      <method name="Int32 &lt;Main&gt;m__0(Product)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Product &lt;Main&gt;m__1(Product)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
       <method name="&lt;&gt;__AnonType0`2[System.Linq.IGrouping`2[System.Int32,Product],System.Collections.Generic.IEnumerable`1[Product]] &lt;Main&gt;m__2(System.Linq.IGrouping`2[System.Int32,Product])" attrs="145">\r
         <size>56</size>\r
       </method>\r
     </type>\r
     <type name="MainClass+&lt;Main&gt;c__AnonStorey0">\r
-      <method name="Boolean &lt;&gt;m__0(Product)" attrs="131">\r
-        <size>60</size>\r
-      </method>\r
       <method name="System.Decimal &lt;&gt;m__1(Product)" attrs="145">\r
         <size>14</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>90</size>\r
       </method>\r
-      <method name="System.String &lt;Main&gt;m__0(System.String)" attrs="145">\r
-        <size>20</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="System.String &lt;Main&gt;m__0(System.String)" attrs="145">\r
+        <size>20</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-lambda-24.cs">\r
       <method name="Void &lt;&gt;m__1(System.String)" attrs="131">\r
         <size>47</size>\r
       </method>\r
-      <method name="System.String &lt;&gt;m__2()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="System.String &lt;&gt;m__2()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-lambda-25.cs">\r
       <method name="Void Execute(System.Action)" attrs="150">\r
         <size>2</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-lambda-27.cs">\r
       <method name="IA`1[T][] Test2[T](System.Func`2[IB,IA`1[T][]])" attrs="145">\r
         <size>10</size>\r
       </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
       <method name="System.String[] &lt;Main&gt;m__0(IB)" attrs="145">\r
         <size>14</size>\r
       </method>\r
       <method name="IA`1[System.String][] &lt;Main&gt;m__1(IB)" attrs="145">\r
         <size>14</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-lambda-28.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>53</size>\r
       </method>\r
-      <method name="G`1[System.Int32][] &lt;Main&gt;m__0(G`1[System.Int32][])" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="G`1[System.Int32][] &lt;Main&gt;m__0(G`1[System.Int32][])" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-lambda-29.cs">\r
       <method name="Void M3[T](System.Action`1[C`1[T[]][]])" attrs="145">\r
         <size>2</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__1(C`1[System.Int16][])" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;Main&gt;m__2(C`1[System.Int16[]][])" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="Void &lt;Main&gt;m__0(Int32[][])" attrs="145">\r
         <size>2</size>\r
       </method>\r
+      <method name="Void &lt;Main&gt;m__1(C`1[System.Int16][])" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__2(C`1[System.Int16[]][])" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-lambda-30.cs">\r
       <method name="Void Main()" attrs="150">\r
         <size>38</size>\r
       </method>\r
-      <method name="System.Func`2[T,System.Object] &lt;Method`1&gt;m__0[T](System.Object)" attrs="145">\r
-        <size>33</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>14</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="System.Func`2[T,System.Object] &lt;Method`1&gt;m__0[T](System.Object)" attrs="145">\r
+        <size>33</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-lambda-31.cs">\r
     <type name="Test">\r
       <method name="Void Main()" attrs="145">\r
         <size>34</size>\r
       </method>\r
-      <method name="Byte &lt;Main&gt;m__0()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Byte &lt;Main&gt;m__0()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-lambda-33.cs">\r
       <method name="Void Do(System.String[])" attrs="129">\r
         <size>17</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__1(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__3(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__7(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__8(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__9(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__A(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__B(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__C(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__D(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__1A(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__1D(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__20(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__21(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__22(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__2A(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__2F(&lt;&gt;__AnonType3`2[System.Linq.IGrouping`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__32(&lt;&gt;__AnonType3`2[System.Linq.IGrouping`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__33(&lt;&gt;__AnonType3`2[System.Linq.IGrouping`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>7</size>\r
       </method>\r
     </type>\r
+    <type name="from.C+&lt;Main&gt;c__AnonStorey0">\r
+      <method name="System.Collections.Generic.IEnumerable`1[System.Int32] &lt;&gt;m__0(Int32)" attrs="131">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="System.Collections.Generic.IEnumerable`1[System.Int32] &lt;&gt;m__1(System.Linq.IGrouping`2[System.Int32,System.Int32])" attrs="131">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="System.Collections.Generic.IEnumerable`1[System.Int32] &lt;&gt;m__2(System.Linq.IGrouping`2[System.Int32,System.Int32])" attrs="131">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="System.Collections.Generic.IEnumerable`1[System.Int32] &lt;&gt;m__3(System.Linq.IGrouping`2[System.Int32,System.Int32])" attrs="131">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="&lt;&gt;__AnonType1`2[System.Int32,System.Collections.Generic.IEnumerable`1[System.Int32]] &lt;&gt;m__4(Int32)" attrs="131">\r
+        <size>55</size>\r
+      </method>\r
+    </type>\r
     <type name="from.C">\r
+      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__1(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
       <method name="System.Nullable`1[System.Boolean] &lt;Main&gt;m__2(System.Nullable`1[System.Boolean])" attrs="145">\r
         <size>10</size>\r
       </method>\r
-      <method name="&lt;&gt;__AnonType3`2[System.Linq.IGrouping`2[System.Int32,System.Int32],System.Int32] &lt;Main&gt;m__31(System.Linq.IGrouping`2[System.Int32,System.Int32], Int32)" attrs="145">\r
-        <size>16</size>\r
+      <method name="Int32 &lt;Main&gt;m__3(Int32)" attrs="145">\r
+        <size>10</size>\r
       </method>\r
       <method name="Int32 &lt;Main&gt;m__4(Int32, Int32)" attrs="145">\r
         <size>10</size>\r
       <method name="Int32 &lt;Main&gt;m__6(Int32)" attrs="145">\r
         <size>10</size>\r
       </method>\r
+      <method name="Int32 &lt;Main&gt;m__7(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__8(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__9(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__A(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__B(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__C(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__D(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__E(from.ITest)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__F(Int32, from.ITest)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
       <method name="Int32 &lt;Main&gt;m__10(Int32)" attrs="145">\r
         <size>10</size>\r
       </method>\r
+      <method name="Int32 &lt;Main&gt;m__11(from.ITest)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__12(Int32, from.ITest)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
       <method name="Int32 &lt;Main&gt;m__13(Int32)" attrs="145">\r
         <size>10</size>\r
       </method>\r
+      <method name="Int32 &lt;Main&gt;m__14(from.ITest)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="&lt;&gt;__AnonType0`2[System.Int32,from.ITest] &lt;Main&gt;m__15(Int32, from.ITest)" attrs="145">\r
+        <size>16</size>\r
+      </method>\r
       <method name="Int32 &lt;Main&gt;m__16(&lt;&gt;__AnonType0`2[System.Int32,from.ITest])" attrs="145">\r
         <size>15</size>\r
       </method>\r
+      <method name="Int32 &lt;Main&gt;m__17(from.ITest)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__18(&lt;&gt;__AnonType0`2[System.Int32,from.ITest], from.ITest)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
       <method name="Int32 &lt;Main&gt;m__19(Int32)" attrs="145">\r
         <size>10</size>\r
       </method>\r
+      <method name="Int32 &lt;Main&gt;m__1A(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
       <method name="Int32 &lt;Main&gt;m__1B(Int32, System.Collections.Generic.IEnumerable`1[System.Int32])" attrs="145">\r
         <size>10</size>\r
       </method>\r
       <method name="Int32 &lt;Main&gt;m__1C(Int32)" attrs="145">\r
         <size>10</size>\r
       </method>\r
+      <method name="Int32 &lt;Main&gt;m__1D(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
       <method name="Int32 &lt;Main&gt;m__1E(Int32, System.Collections.Generic.IEnumerable`1[System.Int32])" attrs="145">\r
         <size>10</size>\r
       </method>\r
       <method name="Int32 &lt;Main&gt;m__1F(Int32)" attrs="145">\r
         <size>10</size>\r
       </method>\r
+      <method name="Int32 &lt;Main&gt;m__20(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__21(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__22(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
       <method name="System.Linq.IGrouping`2[System.Int32,System.Int32] &lt;Main&gt;m__23(System.Linq.IGrouping`2[System.Int32,System.Int32])" attrs="145">\r
         <size>10</size>\r
       </method>\r
       <method name="Int32 &lt;Main&gt;m__29(Int32)" attrs="145">\r
         <size>10</size>\r
       </method>\r
+      <method name="Int32 &lt;Main&gt;m__2A(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
       <method name="&lt;&gt;__AnonType3`2[System.Linq.IGrouping`2[System.Int32,System.Int32],System.Int32] &lt;Main&gt;m__2B(System.Linq.IGrouping`2[System.Int32,System.Int32], Int32)" attrs="145">\r
         <size>16</size>\r
       </method>\r
       <method name="&lt;&gt;__AnonType3`2[System.Linq.IGrouping`2[System.Int32,System.Int32],System.Int32] &lt;Main&gt;m__2E(System.Linq.IGrouping`2[System.Int32,System.Int32], Int32)" attrs="145">\r
         <size>16</size>\r
       </method>\r
+      <method name="Int32 &lt;Main&gt;m__2F(&lt;&gt;__AnonType3`2[System.Linq.IGrouping`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
       <method name="Int32 &lt;Main&gt;m__30(&lt;&gt;__AnonType3`2[System.Linq.IGrouping`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
         <size>15</size>\r
       </method>\r
+      <method name="&lt;&gt;__AnonType3`2[System.Linq.IGrouping`2[System.Int32,System.Int32],System.Int32] &lt;Main&gt;m__31(System.Linq.IGrouping`2[System.Int32,System.Int32], Int32)" attrs="145">\r
+        <size>16</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__32(&lt;&gt;__AnonType3`2[System.Linq.IGrouping`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__33(&lt;&gt;__AnonType3`2[System.Linq.IGrouping`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
       <method name="System.Linq.IGrouping`2[System.Int32,System.Int32] &lt;Main&gt;m__34(System.Linq.IGrouping`2[System.Int32,System.Int32])" attrs="145">\r
         <size>10</size>\r
       </method>\r
       </method>\r
     </type>\r
     <type name="from.C+&lt;Main&gt;c__AnonStorey0">\r
-      <method name="System.Collections.Generic.IEnumerable`1[System.Int32] &lt;&gt;m__0(Int32)" attrs="131">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="System.Collections.Generic.IEnumerable`1[System.Int32] &lt;&gt;m__1(System.Linq.IGrouping`2[System.Int32,System.Int32])" attrs="131">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="System.Collections.Generic.IEnumerable`1[System.Int32] &lt;&gt;m__2(System.Linq.IGrouping`2[System.Int32,System.Int32])" attrs="131">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="System.Collections.Generic.IEnumerable`1[System.Int32] &lt;&gt;m__3(System.Linq.IGrouping`2[System.Int32,System.Int32])" attrs="131">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="&lt;&gt;__AnonType1`2[System.Int32,System.Collections.Generic.IEnumerable`1[System.Int32]] &lt;&gt;m__4(Int32)" attrs="131">\r
-        <size>55</size>\r
-      </method>\r
       <method name="Int32 &lt;&gt;m__5(Int32)" attrs="145">\r
         <size>10</size>\r
       </method>\r
     </type>\r
-    <type name="from.C">\r
-      <method name="Int32 &lt;Main&gt;m__E(from.ITest)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__F(Int32, from.ITest)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__11(from.ITest)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__12(Int32, from.ITest)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__14(from.ITest)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="&lt;&gt;__AnonType0`2[System.Int32,from.ITest] &lt;Main&gt;m__15(Int32, from.ITest)" attrs="145">\r
-        <size>16</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__17(from.ITest)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__18(&lt;&gt;__AnonType0`2[System.Int32,from.ITest], from.ITest)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-    </type>\r
   </test>\r
   <test name="gtest-linq-02.cs">\r
     <type name="Test">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>528</size>\r
       </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
       <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
         <size>10</size>\r
       </method>\r
       <method name="Int32 &lt;Main&gt;m__3(Int32)" attrs="145">\r
         <size>11</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-linq-03.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>197</size>\r
       </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
       <method name="Boolean &lt;Main&gt;m__0(Int32)" attrs="145">\r
         <size>13</size>\r
       </method>\r
       <method name="Int32 &lt;Main&gt;m__2(Int32)" attrs="145">\r
         <size>12</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-linq-04.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>589</size>\r
       </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
       <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
         <size>12</size>\r
       </method>\r
       <method name="Int32 &lt;Main&gt;m__3(Int32)" attrs="145">\r
         <size>10</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-linq-05.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>1354</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__1(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__2(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__3(Int32)" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
-      <method name="System.String &lt;Main&gt;m__4(System.String)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__5(System.String)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       </method>\r
     </type>\r
     <type name="OrderByTests">\r
+      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__1(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__2(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__3(Int32)" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
+      <method name="System.String &lt;Main&gt;m__4(System.String)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__5(System.String)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
       <method name="Int32 &lt;Main&gt;m__6(Data)" attrs="145">\r
         <size>15</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>423</size>\r
       </method>\r
-      <method name="&lt;&gt;__AnonType0`2[System.Int32,System.Int32] &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>18</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__1(&lt;&gt;__AnonType0`2[System.Int32,System.Int32])" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="&lt;&gt;__AnonType0`2[System.Int32,System.Int32] &lt;Main&gt;m__2(Int32)" attrs="145">\r
-        <size>18</size>\r
-      </method>\r
-      <method name="&lt;&gt;__AnonType1`2[&lt;&gt;__AnonType0`2[System.Int32,System.Int32],System.Int32] &lt;Main&gt;m__3(&lt;&gt;__AnonType0`2[System.Int32,System.Int32])" attrs="145">\r
-        <size>23</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__4(&lt;&gt;__AnonType1`2[&lt;&gt;__AnonType0`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
-        <size>26</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__5(&lt;&gt;__AnonType1`2[&lt;&gt;__AnonType0`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>21</size>\r
       </method>\r
     </type>\r
+    <type name="Let">\r
+      <method name="&lt;&gt;__AnonType0`2[System.Int32,System.Int32] &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>18</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__1(&lt;&gt;__AnonType0`2[System.Int32,System.Int32])" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="&lt;&gt;__AnonType0`2[System.Int32,System.Int32] &lt;Main&gt;m__2(Int32)" attrs="145">\r
+        <size>18</size>\r
+      </method>\r
+      <method name="&lt;&gt;__AnonType1`2[&lt;&gt;__AnonType0`2[System.Int32,System.Int32],System.Int32] &lt;Main&gt;m__3(&lt;&gt;__AnonType0`2[System.Int32,System.Int32])" attrs="145">\r
+        <size>23</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__4(&lt;&gt;__AnonType1`2[&lt;&gt;__AnonType0`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
+        <size>26</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__5(&lt;&gt;__AnonType1`2[&lt;&gt;__AnonType0`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-linq-07.cs">\r
     <type name="SelectMany">\r
       <method name="System.Collections.Generic.IEnumerable`1[System.String] &lt;&gt;m__3(Int32)" attrs="131">\r
         <size>15</size>\r
       </method>\r
+      <method name="System.Collections.Generic.IEnumerable`1[System.String] &lt;&gt;m__1(Int32)" attrs="131">\r
+        <size>20</size>\r
+      </method>\r
+      <method name="System.Collections.Generic.IEnumerable`1[System.Int32] &lt;&gt;m__2(&lt;&gt;__AnonType0`2[System.Int32,System.String])" attrs="131">\r
+        <size>20</size>\r
+      </method>\r
     </type>\r
     <type name="SelectMany">\r
       <method name="&lt;&gt;__AnonType0`2[System.Int32,System.String] &lt;Main&gt;m__0(Int32, System.String)" attrs="145">\r
         <size>16</size>\r
       </method>\r
     </type>\r
-    <type name="SelectMany+&lt;Main&gt;c__AnonStorey0">\r
-      <method name="System.Collections.Generic.IEnumerable`1[System.String] &lt;&gt;m__1(Int32)" attrs="131">\r
-        <size>20</size>\r
-      </method>\r
-      <method name="System.Collections.Generic.IEnumerable`1[System.Int32] &lt;&gt;m__2(&lt;&gt;__AnonType0`2[System.Int32,System.String])" attrs="131">\r
-        <size>20</size>\r
-      </method>\r
-    </type>\r
   </test>\r
   <test name="gtest-linq-08.cs">\r
     <type name="TestA">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>171</size>\r
       </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
       <method name="TestA &lt;Main&gt;m__0(TestA)" attrs="145">\r
         <size>10</size>\r
       </method>\r
       <method name="Boolean &lt;Main&gt;m__1(TestA)" attrs="145">\r
         <size>25</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-linq-09.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>981</size>\r
       </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="&lt;&gt;__AnonType0`1[&lt;Result&gt;__T]">\r
+      <method name="&lt;Result&gt;__T get_Result()" attrs="2182">\r
+        <size>7</size>\r
+      </method>\r
+      <method name="Boolean Equals(System.Object)" attrs="198">\r
+        <size>39</size>\r
+      </method>\r
+      <method name="Int32 GetHashCode()" attrs="198">\r
+        <size>63</size>\r
+      </method>\r
+      <method name="System.String ToString()" attrs="198">\r
+        <size>67</size>\r
+      </method>\r
+      <method name="Void .ctor(&lt;Result&gt;__T)" attrs="6278">\r
+        <size>14</size>\r
+      </method>\r
+    </type>\r
+    <type name="&lt;&gt;__AnonType1`2[&lt;a&gt;__T,&lt;b&gt;__T]">\r
+      <method name="&lt;a&gt;__T get_a()" attrs="2182">\r
+        <size>7</size>\r
+      </method>\r
+      <method name="&lt;b&gt;__T get_b()" attrs="2182">\r
+        <size>7</size>\r
+      </method>\r
+      <method name="Boolean Equals(System.Object)" attrs="198">\r
+        <size>69</size>\r
+      </method>\r
+      <method name="Int32 GetHashCode()" attrs="198">\r
+        <size>86</size>\r
+      </method>\r
+      <method name="System.String ToString()" attrs="198">\r
+        <size>142</size>\r
+      </method>\r
+      <method name="Void .ctor(&lt;a&gt;__T, &lt;b&gt;__T)" attrs="6278">\r
+        <size>21</size>\r
+      </method>\r
+    </type>\r
+    <type name="Join">\r
       <method name="Int32 &lt;Main&gt;m__0(Data)" attrs="145">\r
         <size>15</size>\r
       </method>\r
       <method name="Data &lt;Main&gt;m__F(&lt;&gt;__AnonType1`2[Data,Data])" attrs="145">\r
         <size>15</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
-    </type>\r
-    <type name="&lt;&gt;__AnonType0`1[&lt;Result&gt;__T]">\r
-      <method name="&lt;Result&gt;__T get_Result()" attrs="2182">\r
-        <size>7</size>\r
-      </method>\r
-      <method name="Boolean Equals(System.Object)" attrs="198">\r
-        <size>39</size>\r
-      </method>\r
-      <method name="Int32 GetHashCode()" attrs="198">\r
-        <size>63</size>\r
-      </method>\r
-      <method name="System.String ToString()" attrs="198">\r
-        <size>67</size>\r
-      </method>\r
-      <method name="Void .ctor(&lt;Result&gt;__T)" attrs="6278">\r
-        <size>14</size>\r
-      </method>\r
-    </type>\r
-    <type name="&lt;&gt;__AnonType1`2[&lt;a&gt;__T,&lt;b&gt;__T]">\r
-      <method name="&lt;a&gt;__T get_a()" attrs="2182">\r
-        <size>7</size>\r
-      </method>\r
-      <method name="&lt;b&gt;__T get_b()" attrs="2182">\r
-        <size>7</size>\r
-      </method>\r
-      <method name="Boolean Equals(System.Object)" attrs="198">\r
-        <size>69</size>\r
-      </method>\r
-      <method name="Int32 GetHashCode()" attrs="198">\r
-        <size>86</size>\r
-      </method>\r
-      <method name="System.String ToString()" attrs="198">\r
-        <size>142</size>\r
-      </method>\r
-      <method name="Void .ctor(&lt;a&gt;__T, &lt;b&gt;__T)" attrs="6278">\r
-        <size>21</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-linq-10.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>781</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0(DataA)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__1(DataB)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="&lt;&gt;__AnonType1`2[System.String,System.String] &lt;Main&gt;m__4(&lt;&gt;__AnonType0`2[DataA,System.Collections.Generic.IEnumerable`1[DataB]], DataB)" attrs="145">\r
-        <size>47</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__5(DataA)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__6(DataB)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="&lt;&gt;__AnonType1`2[System.String,System.String] &lt;Main&gt;m__9(&lt;&gt;__AnonType0`2[DataA,System.Collections.Generic.IEnumerable`1[DataB]], DataB)" attrs="145">\r
-        <size>47</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__A(DataA)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__B(DataB)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       </method>\r
     </type>\r
     <type name="GroupJoin">\r
+      <method name="Int32 &lt;Main&gt;m__0(DataA)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__1(DataB)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
       <method name="&lt;&gt;__AnonType0`2[DataA,System.Collections.Generic.IEnumerable`1[DataB]] &lt;Main&gt;m__2(DataA, System.Collections.Generic.IEnumerable`1[DataB])" attrs="145">\r
         <size>16</size>\r
       </method>\r
       <method name="System.Collections.Generic.IEnumerable`1[DataB] &lt;Main&gt;m__3(&lt;&gt;__AnonType0`2[DataA,System.Collections.Generic.IEnumerable`1[DataB]])" attrs="145">\r
         <size>20</size>\r
       </method>\r
+      <method name="&lt;&gt;__AnonType1`2[System.String,System.String] &lt;Main&gt;m__4(&lt;&gt;__AnonType0`2[DataA,System.Collections.Generic.IEnumerable`1[DataB]], DataB)" attrs="145">\r
+        <size>47</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__5(DataA)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__6(DataB)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
       <method name="&lt;&gt;__AnonType0`2[DataA,System.Collections.Generic.IEnumerable`1[DataB]] &lt;Main&gt;m__7(DataA, System.Collections.Generic.IEnumerable`1[DataB])" attrs="145">\r
         <size>16</size>\r
       </method>\r
       <method name="System.Collections.Generic.IEnumerable`1[DataB] &lt;Main&gt;m__8(&lt;&gt;__AnonType0`2[DataA,System.Collections.Generic.IEnumerable`1[DataB]])" attrs="145">\r
         <size>20</size>\r
       </method>\r
+      <method name="&lt;&gt;__AnonType1`2[System.String,System.String] &lt;Main&gt;m__9(&lt;&gt;__AnonType0`2[DataA,System.Collections.Generic.IEnumerable`1[DataB]], DataB)" attrs="145">\r
+        <size>47</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__A(DataA)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__B(DataB)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
       <method name="DataA &lt;Main&gt;m__C(DataA, System.Collections.Generic.IEnumerable`1[DataB])" attrs="145">\r
         <size>10</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>303</size>\r
       </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
       <method name="Boolean &lt;Main&gt;m__0(Int32)" attrs="145">\r
         <size>13</size>\r
       </method>\r
       <method name="Int32 &lt;Main&gt;m__4(Int32)" attrs="145">\r
         <size>12</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-linq-12.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>502</size>\r
       </method>\r
-      <method name="&lt;&gt;__AnonType0`2[System.String,System.Int32] &lt;XX&gt;m__0(System.String)" attrs="145">\r
-        <size>20</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__2(System.String)" attrs="145">\r
-        <size>18</size>\r
-      </method>\r
-      <method name="&lt;&gt;__AnonType0`2[System.String,System.Int32] &lt;Main&gt;m__4(System.String)" attrs="145">\r
-        <size>21</size>\r
-      </method>\r
-      <method name="&lt;&gt;__AnonType1`2[System.Char,System.Int32] &lt;XX&gt;m__6(Char)" attrs="145">\r
-        <size>16</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>7</size>\r
       </method>\r
     </type>\r
+    <type name="NestedQuery+&lt;XX&gt;c__AnonStorey0">\r
+      <method name="Boolean &lt;&gt;m__0(&lt;&gt;__AnonType1`2[System.Char,System.Int32])" attrs="131">\r
+        <size>22</size>\r
+      </method>\r
+    </type>\r
+    <type name="NestedQuery+&lt;Main&gt;c__AnonStorey1">\r
+      <method name="Boolean &lt;&gt;m__0(&lt;&gt;__AnonType1`2[System.Char,System.Int32])" attrs="131">\r
+        <size>23</size>\r
+      </method>\r
+    </type>\r
     <type name="NestedQuery">\r
+      <method name="&lt;&gt;__AnonType0`2[System.String,System.Int32] &lt;XX&gt;m__0(System.String)" attrs="145">\r
+        <size>20</size>\r
+      </method>\r
       <method name="System.Collections.Generic.IEnumerable`1[System.Char] &lt;XX&gt;m__1(&lt;&gt;__AnonType0`2[System.String,System.Int32])" attrs="145">\r
         <size>117</size>\r
       </method>\r
+      <method name="Boolean &lt;Main&gt;m__2(System.String)" attrs="145">\r
+        <size>18</size>\r
+      </method>\r
       <method name="System.Collections.Generic.IEnumerable`1[System.Char] &lt;Main&gt;m__3(System.String)" attrs="145">\r
         <size>44</size>\r
       </method>\r
+      <method name="&lt;&gt;__AnonType0`2[System.String,System.Int32] &lt;Main&gt;m__4(System.String)" attrs="145">\r
+        <size>21</size>\r
+      </method>\r
       <method name="System.Collections.Generic.IEnumerable`1[System.Char] &lt;Main&gt;m__5(&lt;&gt;__AnonType0`2[System.String,System.Int32])" attrs="145">\r
         <size>118</size>\r
       </method>\r
+      <method name="&lt;&gt;__AnonType1`2[System.Char,System.Int32] &lt;XX&gt;m__6(Char)" attrs="145">\r
+        <size>16</size>\r
+      </method>\r
       <method name="Char &lt;XX&gt;m__7(&lt;&gt;__AnonType1`2[System.Char,System.Int32])" attrs="145">\r
         <size>14</size>\r
       </method>\r
         <size>15</size>\r
       </method>\r
     </type>\r
-    <type name="NestedQuery+&lt;XX&gt;c__AnonStorey0">\r
-      <method name="Boolean &lt;&gt;m__0(&lt;&gt;__AnonType1`2[System.Char,System.Int32])" attrs="131">\r
-        <size>22</size>\r
-      </method>\r
-    </type>\r
-    <type name="NestedQuery+&lt;Main&gt;c__AnonStorey1">\r
-      <method name="Boolean &lt;&gt;m__0(&lt;&gt;__AnonType1`2[System.Char,System.Int32])" attrs="131">\r
-        <size>23</size>\r
-      </method>\r
-    </type>\r
   </test>\r
   <test name="gtest-linq-13.cs">\r
     <type name="Program">\r
       <method name="Void Foo(TypeDefinition)" attrs="145">\r
         <size>48</size>\r
       </method>\r
-      <method name="MethodDefinition &lt;Foo&gt;m__0(MethodDefinition)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>10</size>\r
       </method>\r
     </type>\r
+    <type name="Program">\r
+      <method name="MethodDefinition &lt;Foo&gt;m__0(MethodDefinition)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-linq-14.cs">\r
     <type name="Person">\r
       <method name="Void Main()" attrs="150">\r
         <size>79</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0(NameCollisionTest.Data)" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__1(Int32)" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>14</size>\r
       </method>\r
     </type>\r
+    <type name="NameCollisionTest.C">\r
+      <method name="Int32 &lt;Main&gt;m__0(NameCollisionTest.Data)" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__1(Int32)" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-linq-16.cs">\r
     <type name="C">\r
       <method name="System.Collections.Generic.IEnumerable`1[System.Int32] &lt;&gt;m__0()" attrs="131">\r
         <size>74</size>\r
       </method>\r
+      <method name="Int32 &lt;&gt;m__2(&lt;&gt;__AnonType0`2[System.Int32,System.Int32])" attrs="131">\r
+        <size>22</size>\r
+      </method>\r
+    </type>\r
+    <type name="C+&lt;Test_2&gt;c__AnonStorey1">\r
+      <method name="System.Collections.Generic.IEnumerable`1[System.Int32] &lt;&gt;m__0()" attrs="131">\r
+        <size>74</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__2(&lt;&gt;__AnonType0`2[System.Int32,System.Int32])" attrs="131">\r
+        <size>22</size>\r
+      </method>\r
     </type>\r
     <type name="C">\r
       <method name="System.Func`1[System.Collections.Generic.IEnumerable`1[System.Int32]] &lt;Test_2&gt;m__0(Int32)" attrs="145">\r
       <method name="&lt;&gt;__AnonType0`2[System.Int32,System.Int32] &lt;&gt;m__1(Int32)" attrs="145">\r
         <size>16</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__2(&lt;&gt;__AnonType0`2[System.Int32,System.Int32])" attrs="131">\r
-        <size>22</size>\r
-      </method>\r
     </type>\r
     <type name="C+&lt;Test_2&gt;c__AnonStorey1">\r
-      <method name="System.Collections.Generic.IEnumerable`1[System.Int32] &lt;&gt;m__0()" attrs="131">\r
-        <size>74</size>\r
-      </method>\r
       <method name="&lt;&gt;__AnonType0`2[System.Int32,System.Int32] &lt;&gt;m__1(Int32)" attrs="145">\r
         <size>16</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__2(&lt;&gt;__AnonType0`2[System.Int32,System.Int32])" attrs="131">\r
-        <size>22</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-linq-17.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>169</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-linq-18.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>658</size>\r
       </method>\r
-      <method name="&lt;&gt;__AnonType0`2[System.Int32,System.Boolean] &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>50</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__1(&lt;&gt;__AnonType0`2[System.Int32,System.Boolean])" attrs="145">\r
-        <size>19</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__2(&lt;&gt;__AnonType0`2[System.Int32,System.Boolean])" attrs="145">\r
-        <size>39</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__3(Int32)" attrs="145">\r
-        <size>39</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__4(Int32)" attrs="145">\r
-        <size>39</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__5(Int32)" attrs="145">\r
-        <size>39</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__6(Int32)" attrs="145">\r
-        <size>39</size>\r
-      </method>\r
-      <method name="&lt;&gt;__AnonType1`2[System.Int32,System.Int32] &lt;Main&gt;m__7(Int32)" attrs="145">\r
-        <size>18</size>\r
-      </method>\r
-      <method name="&lt;&gt;__AnonType2`2[&lt;&gt;__AnonType1`2[System.Int32,System.Int32],System.Int32] &lt;Main&gt;m__8(&lt;&gt;__AnonType1`2[System.Int32,System.Int32])" attrs="145">\r
-        <size>23</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__9(&lt;&gt;__AnonType2`2[&lt;&gt;__AnonType1`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
-        <size>39</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__A(&lt;&gt;__AnonType2`2[&lt;&gt;__AnonType1`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
-        <size>23</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__B(&lt;&gt;__AnonType2`2[&lt;&gt;__AnonType1`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
-        <size>20</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__C(Int32)" attrs="145">\r
-        <size>39</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__D(Int32)" attrs="145">\r
-        <size>39</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__E(Int32, Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__F(Int32)" attrs="145">\r
-        <size>39</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__10(Int32)" attrs="145">\r
-        <size>39</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>7</size>\r
       </method>\r
     </type>\r
-    <type name="C">\r
-      <method name="Int32 &lt;Main&gt;m__11(Int32, System.Collections.Generic.IEnumerable`1[System.Int32])" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-    </type>\r
     <type name="C+&lt;Main&gt;c__AnonStorey0">\r
       <method name="Boolean &lt;&gt;m__0(Int32)" attrs="131">\r
         <size>17</size>\r
         <size>17</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="&lt;&gt;__AnonType0`2[System.Int32,System.Boolean] &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>50</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__1(&lt;&gt;__AnonType0`2[System.Int32,System.Boolean])" attrs="145">\r
+        <size>19</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__2(&lt;&gt;__AnonType0`2[System.Int32,System.Boolean])" attrs="145">\r
+        <size>39</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__3(Int32)" attrs="145">\r
+        <size>39</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__4(Int32)" attrs="145">\r
+        <size>39</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__5(Int32)" attrs="145">\r
+        <size>39</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__6(Int32)" attrs="145">\r
+        <size>39</size>\r
+      </method>\r
+      <method name="&lt;&gt;__AnonType1`2[System.Int32,System.Int32] &lt;Main&gt;m__7(Int32)" attrs="145">\r
+        <size>18</size>\r
+      </method>\r
+      <method name="&lt;&gt;__AnonType2`2[&lt;&gt;__AnonType1`2[System.Int32,System.Int32],System.Int32] &lt;Main&gt;m__8(&lt;&gt;__AnonType1`2[System.Int32,System.Int32])" attrs="145">\r
+        <size>23</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__9(&lt;&gt;__AnonType2`2[&lt;&gt;__AnonType1`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
+        <size>39</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__A(&lt;&gt;__AnonType2`2[&lt;&gt;__AnonType1`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
+        <size>23</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__B(&lt;&gt;__AnonType2`2[&lt;&gt;__AnonType1`2[System.Int32,System.Int32],System.Int32])" attrs="145">\r
+        <size>20</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__C(Int32)" attrs="145">\r
+        <size>39</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__D(Int32)" attrs="145">\r
+        <size>39</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__E(Int32, Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__F(Int32)" attrs="145">\r
+        <size>39</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__10(Int32)" attrs="145">\r
+        <size>39</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__11(Int32, System.Collections.Generic.IEnumerable`1[System.Int32])" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-linq-19.cs">\r
     <type name="Test">\r
       <method name="Void Main()" attrs="150">\r
         <size>2</size>\r
       </method>\r
-      <method name="Char &lt;E&gt;m__0(Char)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="Void .cctor()" attrs="6289">\r
-        <size>45</size>\r
+        <size>28</size>\r
+      </method>\r
+      <method name="Char &lt;E&gt;m__0(Char)" attrs="145">\r
+        <size>10</size>\r
       </method>\r
     </type>\r
   </test>\r
       <method name="Void Main()" attrs="150">\r
         <size>139</size>\r
       </method>\r
-      <method name="Maybe`1[System.Int32] &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="&lt;&gt;__AnonType0`2[System.Int32,System.Int32] &lt;Main&gt;m__1(Int32, Int32)" attrs="145">\r
-        <size>16</size>\r
-      </method>\r
-      <method name="Maybe`1[System.Int32] &lt;Main&gt;m__2(&lt;&gt;__AnonType0`2[System.Int32,System.Int32])" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__3(&lt;&gt;__AnonType0`2[System.Int32,System.Int32], Int32)" attrs="145">\r
-        <size>24</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>21</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Maybe`1[System.Int32] &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="&lt;&gt;__AnonType0`2[System.Int32,System.Int32] &lt;Main&gt;m__1(Int32, Int32)" attrs="145">\r
+        <size>16</size>\r
+      </method>\r
+      <method name="Maybe`1[System.Int32] &lt;Main&gt;m__2(&lt;&gt;__AnonType0`2[System.Int32,System.Int32])" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__3(&lt;&gt;__AnonType0`2[System.Int32,System.Int32], Int32)" attrs="145">\r
+        <size>24</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-linq-21.cs">\r
     <type name="Program">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>20</size>\r
       </method>\r
-      <method name="Int32 &lt;Test&gt;m__0(A)" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Int32 &lt;Test&gt;m__0(A)" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-linq-25.cs">\r
       <method name="Void Test(System.Action)" attrs="145">\r
         <size>8</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
-        <size>162</size>\r
-      </method>\r
-      <method name="&lt;&gt;__AnonType0`2[A,B] &lt;Main&gt;m__2(A, B)" attrs="145">\r
-        <size>16</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__3(&lt;&gt;__AnonType0`2[A,B])" attrs="145">\r
-        <size>75</size>\r
-      </method>\r
-      <method name="&lt;&gt;__AnonType1`2[A,B] &lt;Main&gt;m__4(&lt;&gt;__AnonType0`2[A,B])" attrs="145">\r
-        <size>26</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       </method>\r
     </type>\r
     <type name="C">\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+        <size>162</size>\r
+      </method>\r
       <method name="System.Collections.Generic.IEnumerable`1[B] &lt;Main&gt;m__1(A)" attrs="145">\r
         <size>15</size>\r
       </method>\r
+      <method name="&lt;&gt;__AnonType0`2[A,B] &lt;Main&gt;m__2(A, B)" attrs="145">\r
+        <size>16</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__3(&lt;&gt;__AnonType0`2[A,B])" attrs="145">\r
+        <size>75</size>\r
+      </method>\r
+      <method name="&lt;&gt;__AnonType1`2[A,B] &lt;Main&gt;m__4(&lt;&gt;__AnonType0`2[A,B])" attrs="145">\r
+        <size>26</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-linq-26.cs">\r
       <method name="Void Main()" attrs="150">\r
         <size>80</size>\r
       </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
       <method name="System.String &lt;Main&gt;m__0(Test.C)" attrs="145">\r
         <size>15</size>\r
       </method>\r
       <method name="System.String &lt;Main&gt;m__1(Test.C)" attrs="145">\r
         <size>14</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-linq-27.cs">\r
       <method name="Void Main()" attrs="150">\r
         <size>152</size>\r
       </method>\r
-      <method name="System.String &lt;Main&gt;m__0(System.String)" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="System.Collections.Generic.IEnumerable`1[System.Boolean] &lt;&gt;m__0(System.String)" attrs="131">\r
         <size>82</size>\r
       </method>\r
+    </type>\r
+    <type name="C+&lt;Main&gt;c__AnonStorey0+&lt;Main&gt;c__AnonStorey1">\r
+      <method name="Boolean &lt;&gt;m__0(Char)" attrs="131">\r
+        <size>24</size>\r
+      </method>\r
+    </type>\r
+    <type name="C">\r
+      <method name="System.String &lt;Main&gt;m__0(System.String)" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="C+&lt;Main&gt;c__AnonStorey0">\r
       <method name="&lt;&gt;__AnonType0`2[System.String,System.Boolean] &lt;&gt;m__1(System.String)" attrs="145">\r
         <size>55</size>\r
       </method>\r
         <size>15</size>\r
       </method>\r
     </type>\r
-    <type name="C+&lt;Main&gt;c__AnonStorey0+&lt;Main&gt;c__AnonStorey1">\r
-      <method name="Boolean &lt;&gt;m__0(Char)" attrs="131">\r
-        <size>24</size>\r
-      </method>\r
-    </type>\r
   </test>\r
   <test name="gtest-linq-28.cs">\r
     <type name="C">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>222</size>\r
       </method>\r
-      <method name="&lt;&gt;__AnonType0`2[System.Char,System.Collections.Generic.IEnumerable`1[System.Char]] &lt;Main&gt;m__0(Char)" attrs="145">\r
-        <size>54</size>\r
-      </method>\r
-      <method name="Char &lt;Main&gt;m__2(Char)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       </method>\r
     </type>\r
     <type name="C">\r
+      <method name="&lt;&gt;__AnonType0`2[System.Char,System.Collections.Generic.IEnumerable`1[System.Char]] &lt;Main&gt;m__0(Char)" attrs="145">\r
+        <size>54</size>\r
+      </method>\r
       <method name="System.Collections.Generic.IEnumerable`1[System.Char] &lt;Main&gt;m__1(&lt;&gt;__AnonType0`2[System.Char,System.Collections.Generic.IEnumerable`1[System.Char]])" attrs="145">\r
         <size>15</size>\r
       </method>\r
+      <method name="Char &lt;Main&gt;m__2(Char)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-named-01.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>201</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="C+&lt;Main&gt;c__AnonStorey0">\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>14</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-named-02.cs">\r
     <type name="D">\r
       </method>\r
     </type>\r
   </test>\r
+  <test name="gtest-named-05.cs">\r
+    <type name="Test">\r
+      <method name="Void Main()" attrs="150">\r
+        <size>38</size>\r
+      </method>\r
+      <method name="Void M(System.String, System.String)" attrs="150">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void M2(Int32 ByRef, System.String, System.String)" attrs="145">\r
+        <size>5</size>\r
+      </method>\r
+      <method name="System.String F()" attrs="150">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="gtest-optional-01.cs">\r
     <type name="C">\r
       <method name="Void TestA(Int32)" attrs="150">\r
       <method name="Void Main()" attrs="145">\r
         <size>45</size>\r
       </method>\r
-      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-optional-15.cs">\r
       <method name="Void Wrap[T](System.Func`2[IPackageRepository,T], T)" attrs="145">\r
         <size>2</size>\r
       </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
       <method name="IPackage &lt;Main&gt;m__0(IPackageRepository)" attrs="145">\r
         <size>14</size>\r
       </method>\r
       <method name="IPackage &lt;Main&gt;m__1(IPackageRepository)" attrs="145">\r
         <size>14</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-optional-20.cs">\r
       <method name="System.Collections.Generic.IEnumerator`1[System.Int32] System.Collections.Generic.IEnumerable&lt;int&gt;.GetEnumerator()" attrs="481">\r
         <size>26</size>\r
       </method>\r
+      <method name="System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()" attrs="481">\r
+        <size>14</size>\r
+      </method>\r
     </type>\r
     <type name="CallerMemberTest">\r
       <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
         <size>24</size>\r
       </method>\r
     </type>\r
-    <type name="CallerMemberTest+&lt;Enumerator&gt;c__Iterator0">\r
-      <method name="System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()" attrs="481">\r
-        <size>14</size>\r
-      </method>\r
-    </type>\r
   </test>\r
   <test name="gtest-optional-23.cs">\r
     <type name="CallerLineNumberTest">\r
       <method name="Void Main()" attrs="150">\r
         <size>75</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
-        <size>11</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6273">\r
         <size>17</size>\r
       </method>\r
       <method name="Void TraceStatic2(Double, System.Decimal)" attrs="145">\r
         <size>2</size>\r
       </method>\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+        <size>11</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-optional-24.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>148</size>\r
       </method>\r
-      <method name="Boolean &lt;Main&gt;m__0(System.String)" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Boolean &lt;Main&gt;m__0(System.String)" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="gtest-optional-29.cs">\r
       </method>\r
     </type>\r
   </test>\r
+  <test name="gtest-optional-32.cs">\r
+    <type name="A">\r
+      <method name="Int32[] Foo(Int32[])" attrs="1478">\r
+        <size>0</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6276">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="B">\r
+      <method name="Int32[] Foo(Int32[])" attrs="198">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 Main()" attrs="145">\r
+        <size>42</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
+  <test name="gtest-optional-33.cs">\r
+    <type name="TestCallerLineNumber">\r
+      <method name="Void Test(System.Object)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void Test(System.Decimal)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void Test(Double)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void Test(Single)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void Test(Int32)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void Test(UInt32)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void Test(Int64)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void Test(UInt64)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void Test(System.Nullable`1[System.Decimal])" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void Test(System.Nullable`1[System.Double])" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void Test(System.Nullable`1[System.Single])" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void Test(System.Nullable`1[System.Int32])" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void Test(System.Nullable`1[System.UInt32])" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void Test(System.Nullable`1[System.Int64])" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void Test(System.Nullable`1[System.UInt64])" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="D">\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="gtest-partial-01.cs">\r
     <type name="B`1[U]">\r
       <method name="Void .ctor()" attrs="6278">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>64</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="D">\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-variance-13.cs">\r
     <type name="A">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>61</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0(System.Object)" attrs="145">\r
-        <size>7</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Void &lt;Main&gt;m__0(System.Object)" attrs="145">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-variance-16.cs">\r
     <type name="S">\r
       <method name="Int32 Bar(Foo`1[System.String], System.String)" attrs="145">\r
         <size>16</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0(System.Object)" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Int32 &lt;Main&gt;m__0(System.Object)" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="gtest-variance-5.cs">\r
     <type name="BothVariants`2[T1,T2]">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>129</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0()" attrs="145">\r
-        <size>11</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__1()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Int32 &lt;Main&gt;m__0()" attrs="145">\r
+        <size>11</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__1()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-276.cs">\r
     <type name="EventTestClass">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>68</size>\r
       </method>\r
-      <method name="Double &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="Double &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-327.cs">\r
     <type name="X2">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>21</size>\r
       </method>\r
-      <method name="Void &lt;Test&gt;m__0(Int32)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Void &lt;Test&gt;m__0(Int32)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-481.cs">\r
     <type name="TestDelegate">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>50</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0(Int32 ByRef)" attrs="145">\r
-        <size>5</size>\r
-      </method>\r
     </type>\r
     <type name="TestDelegate">\r
       <method name="System.IAsyncResult BeginInvoke(Int32 ByRef, System.AsyncCallback, System.Object)" attrs="454">\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="TestClass">\r
+      <method name="Void &lt;Main&gt;m__0(Int32 ByRef)" attrs="145">\r
+        <size>5</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-482.cs">\r
     <type name="X">\r
       <method name="Void Main(System.String[])" attrs="150">\r
         <size>9</size>\r
       </method>\r
-      <method name="Boolean &lt;foo&gt;m__0(System.Object)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Tests">\r
+      <method name="Boolean &lt;foo&gt;m__0(System.Object)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-502.cs">\r
     <type name="Base">\r
       <method name="Void Main()" attrs="150">\r
         <size>32</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
-        <size>36</size>\r
-      </method>\r
     </type>\r
     <type name="FooHandler">\r
       <method name="System.IAsyncResult BeginInvoke(System.AsyncCallback, System.Object)" attrs="454">\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+        <size>36</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-537.cs">\r
     <type name="Base">\r
       <method name="Void set_test(Boolean)" attrs="2193">\r
         <size>2</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="ClassMain">\r
+      <method name="Void &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-542.cs">\r
     <type name="ARec">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>70</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Test1.CC">\r
+      <method name="Int32 &lt;Main&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-579.cs">\r
     <type name="TestCase">\r
   <test name="test-640.cs">\r
     <type name="C">\r
       <method name="Int32 Main()" attrs="150">\r
-        <size>128</size>\r
+        <size>139</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
     </type>\r
     <type name="C">\r
       <method name="Void Main()" attrs="150">\r
-        <size>8</size>\r
+        <size>19</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
         <size>27</size>\r
       </method>\r
       <method name="Boolean Bar(System.Object)" attrs="145">\r
-        <size>10</size>\r
+        <size>16</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>64</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-675.cs">\r
     <type name="B">\r
   <test name="test-77.cs">\r
     <type name="XX">\r
       <method name="Int32 Main()" attrs="150">\r
-        <size>393</size>\r
+        <size>443</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       <method name="Void Main()" attrs="150">\r
         <size>14</size>\r
       </method>\r
-      <method name="Void &lt;Test&gt;m__0()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="A">\r
+      <method name="Void &lt;Test&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-782.cs">\r
     <type name="Test">\r
       <method name="Void Main()" attrs="150">\r
         <size>77</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+      <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
         <size>7</size>\r
       </method>\r
     </type>\r
       <method name="Void Main()" attrs="150">\r
         <size>39</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0(System.Object, System.String)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Void &lt;Main&gt;m__0(System.Object, System.String)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-849.cs">\r
       </method>\r
     </type>\r
   </test>\r
+  <test name="test-899.cs">\r
+    <type name="Test">\r
+      <method name="Void Main()" attrs="150">\r
+        <size>49</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
       </method>\r
     </type>\r
   </test>\r
+  <test name="test-900.cs">\r
+    <type name="D">\r
+      <method name="D op_Implicit(System.Action)" attrs="2198">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="Program">\r
+      <method name="Void Main()" attrs="145">\r
+        <size>37</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
+  <test name="test-901.cs">\r
+    <type name="X">\r
+      <method name="Void Main()" attrs="150">\r
+        <size>22</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="test-91.cs">\r
     <type name="Abstract">\r
       <method name="Void .ctor()" attrs="6276">\r
       <method name="Void Main()" attrs="150">\r
         <size>2</size>\r
       </method>\r
-      <method name="Void &lt;f&gt;m__0()" attrs="145">\r
-        <size>27</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="Void .cctor()" attrs="6289">\r
-        <size>35</size>\r
+        <size>18</size>\r
+      </method>\r
+      <method name="Void &lt;f&gt;m__0()" attrs="145">\r
+        <size>27</size>\r
       </method>\r
     </type>\r
   </test>\r
       <method name="Void Main()" attrs="150">\r
         <size>82</size>\r
       </method>\r
-      <method name="Void &lt;op_Implicit&gt;m__0()" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>14</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Void &lt;op_Implicit&gt;m__0()" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-11.cs">\r
     <type name="D">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>132</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;Main&gt;m__1(Int32)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       </method>\r
     </type>\r
     <type name="X">\r
+      <method name="Void &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__1(Int32)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
       <method name="Void &lt;Main&gt;m__2(Int32[])" attrs="145">\r
         <size>2</size>\r
       </method>\r
       <method name="Void Main()" attrs="150">\r
         <size>2</size>\r
       </method>\r
-      <method name="TDelegate &lt;CreateMethodUnscoped`1&gt;m__0[TDelegate](System.Object)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="TDelegate &lt;CreateMethodUnscoped`1&gt;m__0[TDelegate](System.Object)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-114.cs">\r
     <type name="T">\r
       <method name="Void Main()" attrs="150">\r
         <size>2</size>\r
       </method>\r
-      <method name="Int32 &lt;SomeCaller&gt;m__0(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Int32 &lt;SomeCaller&gt;m__0(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-anon-115.cs">\r
       <method name="Void Func[T](TestFunc`1[T])" attrs="145">\r
         <size>2</size>\r
       </method>\r
-      <method name="Void &lt;a&gt;m__0(Int32)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>47</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="TestClass">\r
+      <method name="Void &lt;a&gt;m__0(Int32)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-117.cs">\r
     <type name="C">\r
       <method name="Void Main()" attrs="150">\r
         <size>76</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__1(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__1(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-118.cs">\r
     <type name="C">\r
       <method name="Void Main()" attrs="150">\r
         <size>101</size>\r
       </method>\r
-      <method name="T &lt;Test2`1&gt;m__0[T](T)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__1(Int32)" attrs="145">\r
-        <size>24</size>\r
-      </method>\r
-      <method name="System.String &lt;Main&gt;m__2(Int32)" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
-      <method name="System.String &lt;Main&gt;m__3(Int32)" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="T &lt;Test2`1&gt;m__0[T](T)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__1(Int32)" attrs="145">\r
+        <size>24</size>\r
+      </method>\r
+      <method name="System.String &lt;Main&gt;m__2(Int32)" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="System.String &lt;Main&gt;m__3(Int32)" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-119.cs">\r
     <type name="Test">\r
       <method name="Void Main()" attrs="150">\r
         <size>7</size>\r
       </method>\r
-      <method name="Int32 &lt;TestNaturalSort&gt;m__0(System.String, System.String)" attrs="145">\r
-        <size>114</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>120</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Int32 &lt;TestNaturalSort&gt;m__0(System.String, System.String)" attrs="145">\r
+        <size>114</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-12.cs">\r
     <type name="predicate">\r
       <method name="System.Collections.ArrayList Find(predicate, System.Collections.ArrayList)" attrs="145">\r
         <size>96</size>\r
       </method>\r
-      <method name="Boolean &lt;Main&gt;m__0(System.Object)" attrs="145">\r
-        <size>20</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="Boolean &lt;Main&gt;m__0(System.Object)" attrs="145">\r
+        <size>20</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-120.cs">\r
     <type name="C`1[T]">\r
       <method name="Void Run()" attrs="145">\r
         <size>2</size>\r
       </method>\r
-      <method name="Void &lt;Foo`1&gt;m__0[U]()" attrs="145">\r
-        <size>6</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>7</size>\r
       </method>\r
     </type>\r
+    <type name="C`1[T]">\r
+      <method name="Void &lt;Foo`1&gt;m__0[U]()" attrs="145">\r
+        <size>6</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-121.cs">\r
     <type name="EmptyDelegate">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>95</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Int32 &lt;Main&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-123.cs">\r
     <type name="MemberAccessData">\r
       <method name="Void &lt;InstanceTests&gt;m__0()" attrs="129">\r
         <size>7</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__3()" attrs="145">\r
-        <size>62</size>\r
-      </method>\r
-      <method name="Void &lt;Main&gt;m__4()" attrs="145">\r
-        <size>54</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>15</size>\r
       </method>\r
     </type>\r
-    <type name="C">\r
-      <method name="Void &lt;Main&gt;m__1()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
-      <method name="Void &lt;Main&gt;m__2()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
-      <method name="Void &lt;Main&gt;m__5(E)" attrs="145">\r
-        <size>35</size>\r
-      </method>\r
-    </type>\r
     <type name="C+&lt;Main&gt;c__AnonStorey0">\r
       <method name="Void &lt;&gt;m__0()" attrs="131">\r
         <size>49</size>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Void &lt;Main&gt;m__1()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__2()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__3()" attrs="145">\r
+        <size>62</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__4()" attrs="145">\r
+        <size>54</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__5(E)" attrs="145">\r
+        <size>35</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-124.cs">\r
     <type name="Disposable`1[T]">\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
       <method name="TDest &lt;GetUpcaster`2&gt;m__0[TSource,TDest](TSource)" attrs="145">\r
         <size>20</size>\r
       </method>\r
       <method name="TDest &lt;GetDowncaster`2&gt;m__1[TSource,TDest](TSource)" attrs="145">\r
         <size>20</size>\r
       </method>\r
-      <method name="Void .ctor()" attrs="6278">\r
-        <size>7</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="test-anon-127.cs">\r
       <method name="Void &lt;&gt;m__0(System.Object, System.EventArgs)" attrs="131">\r
         <size>37</size>\r
       </method>\r
-      <method name="Void &lt;&gt;m__1(System.Object, System.EventArgs)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Void &lt;&gt;m__1(System.Object, System.EventArgs)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-anon-132.cs">\r
       <method name="System.Func`1[T] XX()" attrs="145">\r
         <size>40</size>\r
       </method>\r
-      <method name="T &lt;XX&gt;m__0()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>7</size>\r
       </method>\r
     </type>\r
+    <type name="C`1[T]">\r
+      <method name="T &lt;XX&gt;m__0()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+    </type>\r
     <type name="C2`1[T]">\r
       <method name="C`1[T] &lt;XX&gt;m__0()" attrs="145">\r
         <size>9</size>\r
       <method name="Void Test_3[T]()" attrs="134">\r
         <size>21</size>\r
       </method>\r
-      <method name="Void &lt;Test_3`1&gt;m__0[T]()" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Void &lt;Test_3`1&gt;m__0[T]()" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-143.cs">\r
     <type name="TestC">\r
       <method name="System.Func`1[System.Type] Test[T]()" attrs="150">\r
         <size>21</size>\r
       </method>\r
-      <method name="System.Type &lt;Test`1&gt;m__0[T]()" attrs="145">\r
-        <size>18</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="System.Type &lt;Test`1&gt;m__0[T]()" attrs="145">\r
+        <size>18</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-anon-144.cs">\r
       <method name="Void Main()" attrs="150">\r
         <size>2</size>\r
       </method>\r
-      <method name="Void &lt;ThisCausesACrash`1&gt;m__0[I](System.Object, System.EventArgs)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Void &lt;ThisCausesACrash`1&gt;m__0[I](System.Object, System.EventArgs)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-anon-145.cs">\r
       <method name="Void AnyMethod[T]()" attrs="134">\r
         <size>21</size>\r
       </method>\r
-      <method name="Void &lt;AnyMethod`1&gt;m__0[T]()" attrs="145">\r
-        <size>32</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>14</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Void &lt;AnyMethod`1&gt;m__0[T]()" attrs="145">\r
+        <size>32</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-146.cs">\r
     <type name="TheClass">\r
         <size>7</size>\r
       </method>\r
     </type>\r
-    <type name="Test">\r
-      <method name="Void &lt;Main&gt;m__0(Int32, Int32, Int32)" attrs="145">\r
-        <size>24</size>\r
-      </method>\r
-    </type>\r
     <type name="C+&lt;Curry&gt;c__AnonStorey0`3+&lt;Curry&gt;c__AnonStorey1`3[T1,T2,T3]">\r
       <method name="System.Action`1[T3] &lt;&gt;m__0(T2)" attrs="131">\r
         <size>52</size>\r
         <size>35</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Void &lt;Main&gt;m__0(Int32, Int32, Int32)" attrs="145">\r
+        <size>24</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-148.cs">\r
     <type name="Func`1[TResult]">\r
         <size>8</size>\r
       </method>\r
     </type>\r
-    <type name="Foo">\r
-      <method name="Inner &lt;Main&gt;m__0(System.String)" attrs="145">\r
-        <size>21</size>\r
-      </method>\r
-    </type>\r
     <type name="Foo+foo_fn">\r
       <method name="Inner Invoke(System.String)" attrs="454">\r
         <size>0</size>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Foo">\r
+      <method name="Inner &lt;Main&gt;m__0(System.String)" attrs="145">\r
+        <size>21</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-150.cs">\r
     <type name="M">\r
       <method name="Void UseATemplate()" attrs="134">\r
         <size>37</size>\r
       </method>\r
-      <method name="Void &lt;UseATemplate&gt;m__0(System.Collections.Generic.List`1[System.Int32] ByRef)" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="TestComp.Program+MyClass">\r
+      <method name="Void &lt;UseATemplate&gt;m__0(System.Collections.Generic.List`1[System.Int32] ByRef)" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-154.cs">\r
     <type name="Class">\r
       <method name="Void IFoo&lt;T&gt;.Test()" attrs="481">\r
         <size>38</size>\r
       </method>\r
-      <method name="Void &lt;Test&gt;m__0()" attrs="145">\r
-        <size>8</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="X`1[T]">\r
+      <method name="Void &lt;Test&gt;m__0()" attrs="145">\r
+        <size>8</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-158.cs">\r
     <type name="Test">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>22</size>\r
       </method>\r
-      <method name="T &lt;Foo`1&gt;m__0[T](T)" attrs="145">\r
-        <size>77</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>14</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="T &lt;Foo`1&gt;m__0[T](T)" attrs="145">\r
+        <size>77</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-166.cs">\r
     <type name="A">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>22</size>\r
       </method>\r
-      <method name="Void &lt;Test`2&gt;m__0[T,U]()" attrs="145">\r
-        <size>39</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>14</size>\r
       </method>\r
     </type>\r
+    <type name="A">\r
+      <method name="Void &lt;Test`2&gt;m__0[T,U]()" attrs="145">\r
+        <size>39</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-167.cs">\r
     <type name="Foo">\r
       <method name="Void Main()" attrs="150">\r
         <size>36</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
-        <size>89</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+        <size>89</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-anon-168.cs">\r
       <method name="Void Main()" attrs="150">\r
         <size>113</size>\r
       </method>\r
-      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>51</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__1(Int32)" attrs="145">\r
-        <size>46</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__2(Int32)" attrs="145">\r
-        <size>42</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Program">\r
+      <method name="Int32 &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>51</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__1(Int32)" attrs="145">\r
+        <size>46</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__2(Int32)" attrs="145">\r
+        <size>42</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-169.cs">\r
     <type name="Test">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>74</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
-        <size>18</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+        <size>18</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-170.cs">\r
     <type name="MyClass">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>44</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="TestGotoLabels.GotoLabelsTest">\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-27.cs">\r
     <type name="D">\r
       <method name="System.String &lt;Hello&gt;m__0()" attrs="129">\r
         <size>217</size>\r
       </method>\r
-      <method name="Void &lt;Hello&gt;m__1(System.String)" attrs="145">\r
-        <size>8</size>\r
-      </method>\r
-      <method name="Void &lt;Hello&gt;m__2(System.String)" attrs="145">\r
-        <size>8</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>108</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="Void &lt;Hello&gt;m__1(System.String)" attrs="145">\r
+        <size>8</size>\r
+      </method>\r
+      <method name="Void &lt;Hello&gt;m__2(System.String)" attrs="145">\r
+        <size>8</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-30.cs">\r
     <type name="X">\r
       <method name="Void Main()" attrs="150">\r
         <size>36</size>\r
       </method>\r
-      <method name="System.Object &lt;Main&gt;m__0(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>26</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="System.Object &lt;Main&gt;m__0(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>26</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-32.cs">\r
     <type name="StringSender">\r
       <method name="Void Main()" attrs="150">\r
         <size>37</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor(TestMethod)" attrs="6278">\r
         <size>8</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-37.cs">\r
     <type name="DelegateInit">\r
       <method name="Void Main(System.String[])" attrs="150">\r
         <size>12</size>\r
       </method>\r
-      <method name="Void &lt;_print&gt;m__0()" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="Void .cctor()" attrs="6289">\r
-        <size>35</size>\r
+        <size>18</size>\r
       </method>\r
     </type>\r
     <type name="DelegateInit+FooDelegate">\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="DelegateInit">\r
+      <method name="Void &lt;_print&gt;m__0()" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-38.cs">\r
     <type name="Simple">\r
       <method name="Void Main()" attrs="150">\r
         <size>14</size>\r
       </method>\r
-      <method name="Simple &lt;Test&gt;m__0()" attrs="145">\r
-        <size>45</size>\r
-      </method>\r
-      <method name="Void &lt;Test&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="Simple &lt;Test&gt;m__0()" attrs="145">\r
+        <size>45</size>\r
+      </method>\r
+      <method name="Void &lt;Test&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-43.cs">\r
     <type name="Simple">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>14</size>\r
       </method>\r
-      <method name="Void &lt;a&gt;m__0(Int32)" attrs="145">\r
-        <size>8</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="Void .cctor()" attrs="6289">\r
-        <size>46</size>\r
+        <size>29</size>\r
       </method>\r
     </type>\r
     <type name="TestFunc">\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="TestClass">\r
+      <method name="Void &lt;a&gt;m__0(Int32)" attrs="145">\r
+        <size>8</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-46.cs">\r
     <type name="Foo">\r
       <method name="Void Main()" attrs="150">\r
         <size>12</size>\r
       </method>\r
-      <method name="Void &lt;Print&gt;m__0()" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="Void .cctor()" attrs="6289">\r
-        <size>35</size>\r
+        <size>18</size>\r
       </method>\r
     </type>\r
     <type name="FooDelegate">\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="Void &lt;Print&gt;m__0()" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-52.cs">\r
     <type name="X">\r
       <method name="Void Main(System.String[])" attrs="150">\r
         <size>51</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0(Observable)" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Observable">\r
+      <method name="Void &lt;Main&gt;m__0(Observable)" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-57.cs">\r
     <type name="X">\r
       <method name="Void Main()" attrs="150">\r
         <size>70</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;Main&gt;m__1(System.String ByRef)" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Void &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;Main&gt;m__1(System.String ByRef)" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-69.cs">\r
     <type name="TargetAccessDelegate">\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
-    </type>\r
-    <type name="C">\r
-      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
-    </type>\r
-    <type name="C+&lt;Main&gt;c__AnonStorey1">\r
       <method name="Void &lt;&gt;m__0()" attrs="131">\r
         <size>49</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-71.cs">\r
     <type name="Program">\r
       <method name="Void Test_1()" attrs="145">\r
         <size>37</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0(System.Object)" attrs="145">\r
-        <size>16</size>\r
-      </method>\r
-      <method name="Void &lt;Test_1&gt;m__1(System.Object)" attrs="145">\r
-        <size>32</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="T">\r
+      <method name="Void &lt;Main&gt;m__0(System.Object)" attrs="145">\r
+        <size>16</size>\r
+      </method>\r
+      <method name="Void &lt;Test_1&gt;m__1(System.Object)" attrs="145">\r
+        <size>32</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-74.cs">\r
     <type name="Foo">\r
       <method name="Void Main(System.String[])" attrs="150">\r
         <size>36</size>\r
       </method>\r
-      <method name="System.String[,] &lt;Main&gt;m__0()" attrs="145">\r
-        <size>42</size>\r
-      </method>\r
     </type>\r
     <type name="Foo+SimpleDelegate">\r
       <method name="System.String[,] Invoke()" attrs="454">\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Foo">\r
+      <method name="System.String[,] &lt;Main&gt;m__0()" attrs="145">\r
+        <size>42</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-75.cs">\r
     <type name="D">\r
       <method name="Void TestMe()" attrs="129">\r
         <size>152</size>\r
       </method>\r
-      <method name="Boolean &lt;TestMe&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="Boolean &lt;TestMe&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-76.cs">\r
     <type name="FactoryDelegate">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>63</size>\r
       </method>\r
-      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
-        <size>19</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="DelegateTest">\r
+      <method name="Void &lt;Main&gt;m__0()" attrs="145">\r
+        <size>19</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-79.cs">\r
     <type name="Test">\r
       <method name="Void set_Handler(System.EventHandler)" attrs="2182">\r
         <size>9</size>\r
       </method>\r
-      <method name="Void &lt;get_DoNothingEventHandler&gt;m__0(System.Object, System.EventArgs)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void &lt;get_DoSomethingEventHandler&gt;m__1(System.Object, System.EventArgs)" attrs="129">\r
         <size>16</size>\r
       </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>18</size>\r
       </method>\r
+      <method name="Void &lt;get_DoNothingEventHandler&gt;m__0(System.Object, System.EventArgs)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-anon-81.cs">\r
         <size>7</size>\r
       </method>\r
     </type>\r
-    <type name="MainClass">\r
-      <method name="Void &lt;Test2&gt;m__0(System.String)" attrs="145">\r
-        <size>28</size>\r
-      </method>\r
-      <method name="Void &lt;Test3&gt;m__1()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;Test4&gt;m__2()" attrs="145">\r
-        <size>32</size>\r
-      </method>\r
-      <method name="Void &lt;Test4&gt;m__3()" attrs="145">\r
-        <size>29</size>\r
-      </method>\r
-    </type>\r
     <type name="MainClass+&lt;Main&gt;c__AnonStorey0">\r
       <method name="Void &lt;&gt;m__1(System.String)" attrs="131">\r
         <size>14</size>\r
       <method name="Int32 &lt;&gt;m__0(Int32)" attrs="131">\r
         <size>54</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__1(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
     </type>\r
     <type name="MainClass+&lt;Test2&gt;c__AnonStorey1">\r
       <method name="Void &lt;&gt;m__0()" attrs="131">\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="MainClass">\r
+      <method name="Void &lt;Test2&gt;m__0(System.String)" attrs="145">\r
+        <size>28</size>\r
+      </method>\r
+      <method name="Void &lt;Test3&gt;m__1()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;Test4&gt;m__2()" attrs="145">\r
+        <size>32</size>\r
+      </method>\r
+      <method name="Void &lt;Test4&gt;m__3()" attrs="145">\r
+        <size>29</size>\r
+      </method>\r
+    </type>\r
+    <type name="MainClass+&lt;Test5&gt;c__AnonStorey4">\r
+      <method name="Int32 &lt;&gt;m__1(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-83.cs">\r
     <type name="C">\r
       <method name="Void Main()" attrs="150">\r
         <size>2</size>\r
       </method>\r
-      <method name="Void &lt;MyDelegate&gt;m__0(System.Object, System.EventArgs)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>42</size>\r
       </method>\r
+      <method name="Void &lt;MyDelegate&gt;m__0(System.Object, System.EventArgs)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-anon-84.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>27</size>\r
       </method>\r
-      <method name="C &lt;field&gt;m__0(Int32)" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>43</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="C &lt;field&gt;m__0(Int32)" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-85.cs">\r
     <type name="X">\r
         <size>9</size>\r
       </method>\r
     </type>\r
-    <type name="C+&lt;Test&gt;c__AnonStorey2">\r
-      <method name="Void &lt;&gt;m__2()" attrs="145">\r
-        <size>4</size>\r
-      </method>\r
-    </type>\r
     <type name="C+&lt;Test&gt;c__AnonStorey2+&lt;Test&gt;c__AnonStorey1">\r
       <method name="Void &lt;&gt;m__0()" attrs="131">\r
         <size>21</size>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C+&lt;Test&gt;c__AnonStorey2">\r
+      <method name="Void &lt;&gt;m__2()" attrs="145">\r
+        <size>4</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-anon-89.cs">\r
     <type name="C">\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Void &lt;&gt;m__0(System.Object, System.EventArgs)" attrs="131">\r
+        <size>24</size>\r
+      </method>\r
     </type>\r
     <type name="BaseTest.MainClass">\r
       <method name="Void &lt;Main&gt;m__0(System.Object, System.EventArgs)" attrs="145">\r
         <size>13</size>\r
       </method>\r
     </type>\r
-    <type name="BaseTest.MainClass+&lt;&gt;c__AnonStorey1">\r
-      <method name="Void &lt;&gt;m__0(System.Object, System.EventArgs)" attrs="131">\r
-        <size>24</size>\r
-      </method>\r
-    </type>\r
   </test>\r
   <test name="test-anon-94.cs">\r
     <type name="Program">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>20</size>\r
       </method>\r
-      <method name="Void &lt;Test&gt;m__0()" attrs="145">\r
-        <size>63</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>25</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Void &lt;Test&gt;m__0()" attrs="145">\r
+        <size>63</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-01.cs">\r
     <type name="Program">\r
       <method name="System.Threading.Tasks.Task RunAsync()" attrs="145">\r
         <size>48</size>\r
       </method>\r
-      <method name="Void &lt;RunAsync&gt;m__0()" attrs="145">\r
-        <size>62</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>13</size>\r
       </method>\r
     </type>\r
+    <type name="Program">\r
+      <method name="Void &lt;RunAsync&gt;m__0()" attrs="145">\r
+        <size>62</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-02.cs">\r
     <type name="C">\r
     </type>\r
     <type name="C+&lt;SynchronousCall&gt;c__async0">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>49</size>\r
+        <size>79</size>\r
       </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
     </type>\r
     <type name="Program+&lt;Main&gt;c__async7">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>44</size>\r
+        <size>69</size>\r
       </method>\r
     </type>\r
     <type name="Program+&lt;Main&gt;c__AnonStorey1">\r
         <size>52</size>\r
       </method>\r
     </type>\r
-    <type name="Program">\r
-      <method name="System.Threading.Tasks.Task`1[System.Decimal] &lt;Main&gt;m__0(System.Decimal)" attrs="145">\r
-        <size>41</size>\r
-      </method>\r
-    </type>\r
     <type name="Program+&lt;Main&gt;c__AnonStorey1">\r
       <method name="System.Threading.Tasks.Task`1[System.Decimal] &lt;&gt;m__3(System.Decimal)" attrs="131">\r
         <size>49</size>\r
         <size>13</size>\r
       </method>\r
     </type>\r
+    <type name="Program">\r
+      <method name="System.Threading.Tasks.Task`1[System.Decimal] &lt;Main&gt;m__0(System.Decimal)" attrs="145">\r
+        <size>41</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-07.cs">\r
     <type name="Program">\r
     </type>\r
     <type name="Program+&lt;Main&gt;c__async4">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>43</size>\r
-      </method>\r
-    </type>\r
-    <type name="Program">\r
-      <method name="System.Threading.Tasks.Task`1[System.Int16] &lt;Main&gt;m__0(Int16)" attrs="145">\r
-        <size>41</size>\r
+        <size>68</size>\r
       </method>\r
     </type>\r
     <type name="Program+&lt;Main&gt;c__AnonStorey1">\r
         <size>13</size>\r
       </method>\r
     </type>\r
+    <type name="Program">\r
+      <method name="System.Threading.Tasks.Task`1[System.Int16] &lt;Main&gt;m__0(Int16)" attrs="145">\r
+        <size>41</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-08.cs">\r
     <type name="AsyncTypeInference">\r
       <method name="Void Test2[T](System.Func`2[System.Int32,T])" attrs="145">\r
         <size>10</size>\r
       </method>\r
-      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__0(Int32)" attrs="145">\r
-        <size>33</size>\r
-      </method>\r
-      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__1(Int32)" attrs="145">\r
-        <size>33</size>\r
-      </method>\r
-      <method name="System.Threading.Tasks.Task &lt;Main&gt;m__2(Int32)" attrs="145">\r
-        <size>33</size>\r
-      </method>\r
-      <method name="System.Threading.Tasks.Task &lt;Main&gt;m__3(Int32)" attrs="145">\r
-        <size>33</size>\r
-      </method>\r
-      <method name="Int32 &lt;TT&gt;m__4()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
     </type>\r
     <type name="AsyncTypeInference+&lt;Main&gt;c__asyncB">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>37</size>\r
-      </method>\r
-    </type>\r
-    <type name="AsyncTypeInference+&lt;Main&gt;c__async2">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-    </type>\r
-    <type name="AsyncTypeInference+&lt;Main&gt;c__async5">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
+        <size>67</size>\r
       </method>\r
     </type>\r
     <type name="AsyncTypeInference+&lt;Main&gt;c__async2">\r
         <size>13</size>\r
       </method>\r
     </type>\r
+    <type name="AsyncTypeInference">\r
+      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>33</size>\r
+      </method>\r
+      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__1(Int32)" attrs="145">\r
+        <size>33</size>\r
+      </method>\r
+      <method name="System.Threading.Tasks.Task &lt;Main&gt;m__2(Int32)" attrs="145">\r
+        <size>33</size>\r
+      </method>\r
+      <method name="System.Threading.Tasks.Task &lt;Main&gt;m__3(Int32)" attrs="145">\r
+        <size>33</size>\r
+      </method>\r
+      <method name="Int32 &lt;TT&gt;m__4()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="AsyncTypeInference+&lt;Main&gt;c__async2">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="AsyncTypeInference+&lt;Main&gt;c__async5">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-09.cs">\r
     <type name="Test">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>57</size>\r
       </method>\r
-      <method name="System.Threading.Tasks.Task`1[System.Int16] &lt;Main&gt;m__0(System.String)" attrs="145">\r
-        <size>33</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
     </type>\r
     <type name="Test+&lt;Main&gt;c__async2">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>38</size>\r
+        <size>63</size>\r
       </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
     </type>\r
+    <type name="Test">\r
+      <method name="System.Threading.Tasks.Task`1[System.Int16] &lt;Main&gt;m__0(System.String)" attrs="145">\r
+        <size>33</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-10.cs">\r
     <type name="C">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>338</size>\r
       </method>\r
-      <method name="System.String &lt;&gt;m__1()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionCall_2&gt;c__async1">\r
       <method name="Void MoveNext()" attrs="486">\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionCall_1&gt;c__async0">\r
-      <method name="System.String &lt;&gt;m__0()" attrs="145">\r
-        <size>21</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionCall_2&gt;c__async1">\r
-      <method name="System.String &lt;&gt;m__0()" attrs="145">\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionCall_3&gt;c__async2">\r
-      <method name="Byte &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionPair_1&gt;c__async3">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionPair_2&gt;c__async4">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionPair_3&gt;c__async5">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionPair_4&gt;c__async6">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
-        <size>9</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionCall_1&gt;c__async0">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+      <method name="System.String &lt;&gt;m__0()" attrs="145">\r
+        <size>21</size>\r
+      </method>\r
+      <method name="System.String &lt;&gt;m__1()" attrs="145">\r
         <size>13</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionCall_2&gt;c__async1">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+      <method name="System.String &lt;&gt;m__0()" attrs="145">\r
         <size>13</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionCall_3&gt;c__async2">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Byte &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionPair_1&gt;c__async3">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionPair_2&gt;c__async4">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionPair_3&gt;c__async5">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestCompositionPair_4&gt;c__async6">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
+        <size>9</size>\r
       </method>\r
     </type>\r
   </test>\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>266</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="C+&lt;TestStack_1&gt;c__async0">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>327</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="C+&lt;TestStack_2&gt;c__async1">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>302</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="C+&lt;TestStack_3&gt;c__async2">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>467</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="C+&lt;TestStack_4&gt;c__async3">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>323</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="C+&lt;TestStack_5&gt;c__async4">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>13</size>\r
       </method>\r
     </type>\r
+    <type name="G`1+&lt;TestStack_1&gt;c__async0[T]">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="C+&lt;TestStack_1&gt;c__async0">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="C+&lt;TestStack_2&gt;c__async1">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="C+&lt;TestStack_3&gt;c__async2">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="C+&lt;TestStack_4&gt;c__async3">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-12.cs">\r
     <type name="C">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>455</size>\r
       </method>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
+      </method>\r
       <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
         <size>17</size>\r
       </method>\r
       <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
         <size>9</size>\r
       </method>\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
-      </method>\r
     </type>\r
   </test>\r
   <test name="test-async-13.cs">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>187</size>\r
       </method>\r
-      <method name="Boolean &lt;Main&gt;m__0(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>45</size>\r
-      </method>\r
-      <method name="System.String &lt;Main&gt;m__1(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__2(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__3(Boolean)" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="Tester &lt;CastTest_2&gt;m__4()" attrs="129">\r
         <size>9</size>\r
       </method>\r
-    </type>\r
-    <type name="Tester+&lt;ArrayAccessTest_1&gt;c__async0">\r
-      <method name="Boolean &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;ArrayAccessTest_2&gt;c__async1">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Double &lt;&gt;m__3()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;ArrayAccessTest_3&gt;c__async2">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__3()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;ArrayAccessTest_4&gt;c__async3">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="System.String &lt;&gt;m__1()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;ArrayAccessTest_5&gt;c__async4">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;ArrayAccessTest_6&gt;c__async5">\r
-      <method name="Int64 &lt;&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;ArrayAccessTest_7&gt;c__async6">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;ArrayAccessTest_8&gt;c__async7">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Byte &lt;&gt;m__1()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;ArrayAccessTest_9&gt;c__async8">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__3()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__4()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__5()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="S &lt;&gt;m__6()" attrs="145">\r
-        <size>25</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester">\r
       <method name="System.Threading.Tasks.Task`1[System.Boolean] NewArrayInitTest_7()" attrs="129">\r
         <size>33</size>\r
       </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="System.Decimal &lt;&gt;m__2()" attrs="145">\r
-        <size>19</size>\r
-      </method>\r
-      <method name="System.Decimal &lt;&gt;m__4()" attrs="145">\r
-        <size>19</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;ArrayAccessTest_4&gt;c__async3">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester">\r
       <method name="System.Threading.Tasks.Task`1[System.Boolean] ArrayAccessTest_11()" attrs="129">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;AssignTest_1&gt;c__asyncB">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;AssignTest_2&gt;c__asyncC">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="System.Nullable`1[System.SByte] &lt;&gt;m__0()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;AssignTest_3&gt;c__asyncD">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;BinaryTest_1&gt;c__asyncE">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;BinaryTest_2&gt;c__asyncF">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="System.Nullable`1[System.Boolean] &lt;&gt;m__0()" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
-      <method name="System.Nullable`1[System.Boolean] &lt;&gt;m__1()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
-      <method name="System.Nullable`1[System.Boolean] &lt;&gt;m__2()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
-      <method name="System.Nullable`1[System.Boolean] &lt;&gt;m__3()" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
-      <method name="System.Nullable`1[System.Boolean] &lt;&gt;m__4()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
-      <method name="System.Nullable`1[System.Boolean] &lt;&gt;m__5()" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;BinaryTest_4&gt;c__async11">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="System.Nullable`1[System.Int16] &lt;&gt;m__0()" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
-      <method name="System.Nullable`1[System.Byte] &lt;&gt;m__1()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
-      <method name="System.Nullable`1[System.Decimal] &lt;&gt;m__2()" attrs="145">\r
-        <size>20</size>\r
-      </method>\r
-      <method name="System.Nullable`1[System.Decimal] &lt;&gt;m__3()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;BinaryTest_5&gt;c__async12">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;CallTest_2&gt;c__async15">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;CallTest_3&gt;c__async16">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;CallTest_4&gt;c__async17">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="E &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;CallTest_5&gt;c__async18">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="System.Decimal &lt;&gt;m__0()" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;CastTest_2&gt;c__async1A">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="System.String &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="System.String &lt;&gt;m__1()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;CoalescingTest_2&gt;c__async1C">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="System.Nullable`1[System.Int16] &lt;&gt;m__0()" attrs="145">\r
-        <size>17</size>\r
-      </method>\r
-      <method name="Byte &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;ConditionalTest_1&gt;c__async1D">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;ConditionalTest_2&gt;c__async1E">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;ConditionalTest_3&gt;c__async1F">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Boolean &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;ConditionalTest_4&gt;c__async20">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;DelegateInvoke_4&gt;c__async21">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0(Int32)" attrs="145">\r
-        <size>11</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;EventInvoke_1&gt;c__async22">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;IndexerTest_1&gt;c__async24">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;IndexerTest_2&gt;c__async25">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;IndexerTest_3&gt;c__async26">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;IndexerTest_4&gt;c__async27">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;IndexerTest_5&gt;c__async28">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;IndexerTest_6&gt;c__async29">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;IndexerTest_7&gt;c__async2A">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Tester &lt;&gt;m__0()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;IsTest_2&gt;c__async2C">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="System.Nullable`1[System.UInt32] &lt;&gt;m__0()" attrs="145">\r
-        <size>14</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;LogicalUserOperator_1&gt;c__async2D">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Base &lt;&gt;m__0()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
-      <method name="Base &lt;&gt;m__1()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;LogicalUserOperator_2&gt;c__async2E">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Base &lt;&gt;m__0()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;LogicalUserOperator_3&gt;c__async2F">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Base &lt;&gt;m__0()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
-      <method name="Base &lt;&gt;m__1()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;NewTest_1&gt;c__async30">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;NewTest_2&gt;c__async31">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="System.String &lt;&gt;m__1()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;NewDelegate_1&gt;c__async32">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Void &lt;&gt;m__0()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;NewInitTest_1&gt;c__async34">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__3()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__4()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__5()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;NewInitTest_2&gt;c__async35">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="System.String &lt;&gt;m__0()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
-      <method name="System.String &lt;&gt;m__1()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__3()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;NewArrayInitTest_1&gt;c__async36">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;NewArrayInitTest_2&gt;c__async37">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;NewArrayInitTest_3&gt;c__async38">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Byte &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;NewArrayInitTest_4&gt;c__async39">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="UInt16 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="UInt16 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;NewArrayInitTest_5&gt;c__async3A">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="S &lt;&gt;m__0()" attrs="145">\r
-        <size>25</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;NewArrayInitTest_6&gt;c__async3B">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;NewArrayInitTest_7&gt;c__async3C">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;PropertyTest_2&gt;c__async3E">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;PropertyTest_3&gt;c__async3F">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;StringConcatTest_1&gt;c__async40">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="System.String &lt;&gt;m__0()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
-      <method name="System.String &lt;&gt;m__1()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
-      <method name="System.String &lt;&gt;m__2()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;UnaryTest_1&gt;c__async41">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;UnaryTest_2&gt;c__async42">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;VariableInitializer_1&gt;c__async44">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
-      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="Tester+&lt;ArrayAccessTest_5&gt;c__async4+&lt;ArrayAccessTest_5&gt;c__AnonStorey45">\r
       <method name="Int32 &lt;&gt;m__0()" attrs="131">\r
         <size>7</size>\r
       </method>\r
     </type>\r
+    <type name="Tester">\r
+      <method name="Boolean &lt;Main&gt;m__0(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>45</size>\r
+      </method>\r
+      <method name="System.String &lt;Main&gt;m__1(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__2(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__3(Boolean)" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ArrayAccessTest_1&gt;c__async0">\r
+      <method name="Boolean &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ArrayAccessTest_2&gt;c__async1">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Double &lt;&gt;m__3()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ArrayAccessTest_3&gt;c__async2">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="System.Decimal &lt;&gt;m__2()" attrs="145">\r
+        <size>19</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__3()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="System.Decimal &lt;&gt;m__4()" attrs="145">\r
+        <size>19</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ArrayAccessTest_4&gt;c__async3">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="System.String &lt;&gt;m__1()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ArrayAccessTest_5&gt;c__async4">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ArrayAccessTest_6&gt;c__async5">\r
+      <method name="Int64 &lt;&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ArrayAccessTest_7&gt;c__async6">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ArrayAccessTest_8&gt;c__async7">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Byte &lt;&gt;m__1()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ArrayAccessTest_9&gt;c__async8">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__3()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__4()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__5()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="S &lt;&gt;m__6()" attrs="145">\r
+        <size>25</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ArrayAccessTest_10&gt;c__async9">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ArrayAccessTest_11&gt;c__asyncA">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;AssignTest_1&gt;c__asyncB">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;AssignTest_2&gt;c__asyncC">\r
+      <method name="System.Nullable`1[System.SByte] &lt;&gt;m__0()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;AssignTest_3&gt;c__asyncD">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;BinaryTest_1&gt;c__asyncE">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;BinaryTest_3&gt;c__async10">\r
+      <method name="System.Nullable`1[System.Boolean] &lt;&gt;m__0()" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="System.Nullable`1[System.Boolean] &lt;&gt;m__1()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+      <method name="System.Nullable`1[System.Boolean] &lt;&gt;m__2()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+      <method name="System.Nullable`1[System.Boolean] &lt;&gt;m__3()" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="System.Nullable`1[System.Boolean] &lt;&gt;m__4()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+      <method name="System.Nullable`1[System.Boolean] &lt;&gt;m__5()" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;BinaryTest_4&gt;c__async11">\r
+      <method name="System.Nullable`1[System.Int16] &lt;&gt;m__0()" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="System.Nullable`1[System.Byte] &lt;&gt;m__1()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+      <method name="System.Nullable`1[System.Decimal] &lt;&gt;m__2()" attrs="145">\r
+        <size>20</size>\r
+      </method>\r
+      <method name="System.Nullable`1[System.Decimal] &lt;&gt;m__3()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;CallTest_1&gt;c__async14">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;CallTest_2&gt;c__async15">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;CallTest_3&gt;c__async16">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;CallTest_4&gt;c__async17">\r
+      <method name="E &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;CastTest_1&gt;c__async19">\r
+      <method name="System.Decimal &lt;&gt;m__0()" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;CoalescingTest_1&gt;c__async1B">\r
+      <method name="System.String &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="System.String &lt;&gt;m__1()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;CoalescingTest_2&gt;c__async1C">\r
+      <method name="System.Nullable`1[System.Int16] &lt;&gt;m__0()" attrs="145">\r
+        <size>17</size>\r
+      </method>\r
+      <method name="Byte &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ConditionalTest_1&gt;c__async1D">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ConditionalTest_2&gt;c__async1E">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ConditionalTest_3&gt;c__async1F">\r
+      <method name="Boolean &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;ConditionalTest_4&gt;c__async20">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;DelegateInvoke_4&gt;c__async21">\r
+      <method name="Int32 &lt;&gt;m__0(Int32)" attrs="145">\r
+        <size>11</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;FieldTest_1&gt;c__async23">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;IndexerTest_1&gt;c__async24">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;IndexerTest_2&gt;c__async25">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;IndexerTest_3&gt;c__async26">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;IndexerTest_4&gt;c__async27">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;IndexerTest_5&gt;c__async28">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;IndexerTest_6&gt;c__async29">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;IsTest_1&gt;c__async2B">\r
+      <method name="Tester &lt;&gt;m__0()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;IsTest_2&gt;c__async2C">\r
+      <method name="System.Nullable`1[System.UInt32] &lt;&gt;m__0()" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;LogicalUserOperator_1&gt;c__async2D">\r
+      <method name="Base &lt;&gt;m__0()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+      <method name="Base &lt;&gt;m__1()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;LogicalUserOperator_2&gt;c__async2E">\r
+      <method name="Base &lt;&gt;m__0()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;LogicalUserOperator_3&gt;c__async2F">\r
+      <method name="Base &lt;&gt;m__0()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+      <method name="Base &lt;&gt;m__1()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;NewTest_1&gt;c__async30">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;NewTest_2&gt;c__async31">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="System.String &lt;&gt;m__1()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;NewDelegate_1_0&gt;c__async33">\r
+      <method name="Void &lt;&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;NewInitTest_1&gt;c__async34">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__3()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__4()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__5()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;NewInitTest_2&gt;c__async35">\r
+      <method name="System.String &lt;&gt;m__0()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+      <method name="System.String &lt;&gt;m__1()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__3()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;NewArrayInitTest_1&gt;c__async36">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;NewArrayInitTest_2&gt;c__async37">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;NewArrayInitTest_3&gt;c__async38">\r
+      <method name="Byte &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;NewArrayInitTest_4&gt;c__async39">\r
+      <method name="UInt16 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="UInt16 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;NewArrayInitTest_5&gt;c__async3A">\r
+      <method name="S &lt;&gt;m__0()" attrs="145">\r
+        <size>25</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;NewArrayInitTest_6&gt;c__async3B">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;PropertyTest_1&gt;c__async3D">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;PropertyTest_2&gt;c__async3E">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;PropertyTest_3&gt;c__async3F">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__2()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;StringConcatTest_1&gt;c__async40">\r
+      <method name="System.String &lt;&gt;m__0()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+      <method name="System.String &lt;&gt;m__1()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
+      <method name="System.String &lt;&gt;m__2()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;UnaryTest_1&gt;c__async41">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;UnaryTest_3&gt;c__async43">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;VariableInitializer_1&gt;c__async44">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+      <method name="Int32 &lt;&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-14.cs">\r
     <type name="C">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>214</size>\r
       </method>\r
-      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__0()" attrs="145">\r
-        <size>33</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestResult&gt;c__async0">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;Main&gt;c__async1">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+    <type name="C">\r
+      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__0()" attrs="145">\r
+        <size>33</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;TestResult&gt;c__async0">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;Main&gt;c__async1">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
       </method>\r
     </type>\r
   </test>\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>295</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
+    </type>\r
+    <type name="Tester+&lt;NewInitTestGen&gt;c__async0`1[T]">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;NewInitCol&gt;c__async1">\r
       <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
         <size>9</size>\r
       </method>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>187</size>\r
       </method>\r
-      <method name="Boolean &lt;Main&gt;m__0(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>20</size>\r
-      </method>\r
-      <method name="System.String &lt;Main&gt;m__1(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__2(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__3(Boolean)" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>331</size>\r
       </method>\r
     </type>\r
+    <type name="Tester+&lt;SwitchTest_1&gt;c__async0">\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;Using_1&gt;c__async1">\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester+&lt;Foreach_1&gt;c__async2">\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester">\r
+      <method name="Boolean &lt;Main&gt;m__0(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>20</size>\r
+      </method>\r
+      <method name="System.String &lt;Main&gt;m__1(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__2(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__3(Boolean)" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
+    </type>\r
     <type name="Tester+&lt;SwitchTest_1&gt;c__async0">\r
       <method name="System.String &lt;&gt;m__0()" attrs="145">\r
         <size>13</size>\r
         <size>36</size>\r
       </method>\r
     </type>\r
-    <type name="Tester+&lt;SwitchTest_1&gt;c__async0">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;Using_1&gt;c__async1">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
-      </method>\r
-    </type>\r
-    <type name="Tester+&lt;Foreach_1&gt;c__async2">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
-      </method>\r
-    </type>\r
   </test>\r
   <test name="test-async-17.cs">\r
     <type name="Tester">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>187</size>\r
       </method>\r
-      <method name="Boolean &lt;Main&gt;m__0(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>20</size>\r
-      </method>\r
-      <method name="System.String &lt;Main&gt;m__1(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__2(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__3(Boolean)" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_1&gt;c__async0">\r
-      <method name="Void &lt;&gt;m__0()" attrs="145">\r
-        <size>7</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_2&gt;c__async1">\r
-      <method name="Void &lt;&gt;m__0()" attrs="145">\r
-        <size>7</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_3&gt;c__async2">\r
-      <method name="System.Threading.Tasks.Task &lt;&gt;m__0()" attrs="145">\r
-        <size>33</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_4&gt;c__async3">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_5&gt;c__async4">\r
-      <method name="Void &lt;&gt;m__0()" attrs="145">\r
-        <size>7</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_6&gt;c__async5">\r
-      <method name="Void &lt;&gt;m__0()" attrs="145">\r
-        <size>7</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_7&gt;c__async6">\r
-      <method name="Void &lt;&gt;m__0()" attrs="145">\r
-        <size>7</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_3&gt;c__async2+&lt;TestException_3&gt;c__async7">\r
-      <method name="Void &lt;&gt;m__0()" attrs="145">\r
-        <size>7</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+    <type name="Tester">\r
+      <method name="Boolean &lt;Main&gt;m__0(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>20</size>\r
+      </method>\r
+      <method name="System.String &lt;Main&gt;m__1(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__2(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__3(Boolean)" attrs="145">\r
+        <size>12</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_1&gt;c__async0">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Void &lt;&gt;m__0()" attrs="145">\r
+        <size>7</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_2&gt;c__async1">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Void &lt;&gt;m__0()" attrs="145">\r
+        <size>7</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_3&gt;c__async2">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="System.Threading.Tasks.Task &lt;&gt;m__0()" attrs="145">\r
+        <size>33</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_4&gt;c__async3">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_5&gt;c__async4">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Void &lt;&gt;m__0()" attrs="145">\r
+        <size>7</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_6&gt;c__async5">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Void &lt;&gt;m__0()" attrs="145">\r
+        <size>7</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_7&gt;c__async6">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Void &lt;&gt;m__0()" attrs="145">\r
+        <size>7</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;TestException_3&gt;c__async2+&lt;TestException_3&gt;c__async7">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Void &lt;&gt;m__0()" attrs="145">\r
+        <size>7</size>\r
       </method>\r
     </type>\r
   </test>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>187</size>\r
       </method>\r
-      <method name="Boolean &lt;Main&gt;m__0(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>20</size>\r
-      </method>\r
-      <method name="System.String &lt;Main&gt;m__1(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__2(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>15</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__3(Boolean)" attrs="145">\r
-        <size>12</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;Add_1&gt;c__async0">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;AssignCompound_1&gt;c__async1">\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;Convert_1&gt;c__async2">\r
-      <method name="System.Object &lt;&gt;m__0()" attrs="145">\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;Invocation_1&gt;c__async3">\r
-      <method name="System.Object &lt;&gt;m__0()" attrs="145">\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
     </type>\r
+    <type name="Tester">\r
+      <method name="Boolean &lt;Main&gt;m__0(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>20</size>\r
+      </method>\r
+      <method name="System.String &lt;Main&gt;m__1(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__2(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__3(Boolean)" attrs="145">\r
+        <size>12</size>\r
+      </method>\r
+    </type>\r
     <type name="Tester+&lt;Add_1&gt;c__async0">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;AssignCompound_1&gt;c__async1">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;Convert_1&gt;c__async2">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+      <method name="System.Object &lt;&gt;m__0()" attrs="145">\r
         <size>13</size>\r
       </method>\r
     </type>\r
     <type name="Tester+&lt;Invocation_1&gt;c__async3">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+      <method name="System.Object &lt;&gt;m__0()" attrs="145">\r
         <size>13</size>\r
       </method>\r
     </type>\r
     </type>\r
     <type name="A+&lt;async&gt;c__async1">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>38</size>\r
+        <size>63</size>\r
       </method>\r
     </type>\r
     <type name="A">\r
       <method name="Void M1()" attrs="145">\r
         <size>92</size>\r
       </method>\r
-      <method name="Void &lt;M1&gt;m__0(Int32)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;M1&gt;m__1(Int32)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Void &lt;M1&gt;m__2(Int32)" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
     </type>\r
     <type name="A+&lt;async&gt;c__async2">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>37</size>\r
+        <size>62</size>\r
       </method>\r
     </type>\r
     <type name="A+&lt;CastTest&gt;c__async3">\r
     </type>\r
     <type name="A+async&gt;c__async0">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>31</size>\r
+        <size>61</size>\r
       </method>\r
     </type>\r
     <type name="D">\r
     </type>\r
     <type name="D+&lt;M&gt;c__async0">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>31</size>\r
+        <size>61</size>\r
       </method>\r
     </type>\r
     <type name="asyncAttribute+async">\r
         <size>7</size>\r
       </method>\r
     </type>\r
+    <type name="AwaitNS.Formals">\r
+      <method name="Void &lt;M1&gt;m__0(Int32)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;M1&gt;m__1(Int32)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void &lt;M1&gt;m__2(Int32)" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-23.cs">\r
     <type name="MyContext">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>197</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>21</size>\r
-      </method>\r
     </type>\r
     <type name="MyContext">\r
       <method name="Void .ctor(ManualResetEvent)" attrs="6278">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>21</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-async-24.cs">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>275</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-async-25.cs">\r
       <method name="Void Main()" attrs="150">\r
         <size>2</size>\r
       </method>\r
-      <method name="Int32 &lt;CompilationTestOnly&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>15</size>\r
       </method>\r
     </type>\r
+    <type name="Program">\r
+      <method name="Int32 &lt;CompilationTestOnly&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-26.cs">\r
     <type name="ConsoleApplication1.Program">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>95</size>\r
       </method>\r
-      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__0()" attrs="145">\r
-        <size>47</size>\r
-      </method>\r
-      <method name="Int32 &lt;Main&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>13</size>\r
       </method>\r
     </type>\r
+    <type name="ConsoleApplication1.Program">\r
+      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__0()" attrs="145">\r
+        <size>47</size>\r
+      </method>\r
+      <method name="Int32 &lt;Main&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-27.cs">\r
     <type name="MainClass">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>196</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-async-28.cs">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>282</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0(Int32)" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
+      <method name="Int32 &lt;&gt;m__0(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-async-29.cs">\r
     </type>\r
     <type name="C+&lt;Test2&gt;c__async1">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>59</size>\r
+        <size>89</size>\r
       </method>\r
     </type>\r
     <type name="C+&lt;Test&gt;c__async0">\r
       <method name="Int32 Main()" attrs="150">\r
         <size>409</size>\r
       </method>\r
-      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__0()" attrs="145">\r
-        <size>33</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__1(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>24</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="System.Threading.Tasks.Task NestedAsyncAnonymousMethod()" attrs="150">\r
         <size>33</size>\r
       </method>\r
-      <method name="Boolean &lt;Main&gt;m__2(System.Type)" attrs="145">\r
-        <size>24</size>\r
-      </method>\r
-      <method name="Boolean &lt;Main&gt;m__3(System.Reflection.MethodInfo)" attrs="145">\r
-        <size>24</size>\r
-      </method>\r
     </type>\r
     <type name="N.M.C+&lt;NestedAsyncAnonymousMethod&gt;c__async1">\r
       <method name="Void MoveNext()" attrs="486">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
-      <method name="Void &lt;&gt;m__0()" attrs="145">\r
-        <size>27</size>\r
-      </method>\r
     </type>\r
     <type name="N.M.C+&lt;NestedAsyncAnonymousMethod&gt;c__async1+&lt;NestedAsyncAnonymousMethod&gt;c__async2">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>13</size>\r
       </method>\r
     </type>\r
+    <type name="N.M.C">\r
+      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__0()" attrs="145">\r
+        <size>33</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__1(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>24</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__2(System.Type)" attrs="145">\r
+        <size>24</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__3(System.Reflection.MethodInfo)" attrs="145">\r
+        <size>24</size>\r
+      </method>\r
+    </type>\r
+    <type name="N.M.C+&lt;NestedAsyncAnonymousMethod&gt;c__async1">\r
+      <method name="Void &lt;&gt;m__0()" attrs="145">\r
+        <size>27</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-36.cs">\r
     <type name="X">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>272</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>7</size>\r
-      </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>7</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-async-38.cs">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>220</size>\r
       </method>\r
-      <method name="Void &lt;&gt;m__0()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
+      <method name="Void &lt;&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-async-40.cs">\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>196</size>\r
       </method>\r
-      <method name="Void &lt;&gt;m__0()" attrs="145">\r
-        <size>2</size>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
       </method>\r
     </type>\r
     <type name="Program">\r
       </method>\r
     </type>\r
     <type name="Program+&lt;Main&gt;c__async1">\r
-      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
-        <size>13</size>\r
+      <method name="Void &lt;&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
       </method>\r
     </type>\r
   </test>\r
       <method name="Void Main()" attrs="150">\r
         <size>2</size>\r
       </method>\r
-      <method name="Int32 &lt;ReturnOne&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       </method>\r
     </type>\r
     <type name="AmbiguousGeneric+&lt;NestedVoidTestSuccess&gt;c__async0">\r
-      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;&gt;m__0()" attrs="145">\r
-        <size>33</size>\r
-      </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
         <size>13</size>\r
       </method>\r
     </type>\r
+    <type name="AmbiguousGeneric">\r
+      <method name="Int32 &lt;ReturnOne&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="AmbiguousGeneric+&lt;NestedVoidTestSuccess&gt;c__async0">\r
+      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;&gt;m__0()" attrs="145">\r
+        <size>33</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-42.cs">\r
     <type name="A">\r
     </type>\r
     <type name="C+&lt;Test&gt;c__async0">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>60</size>\r
+        <size>90</size>\r
       </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
     </type>\r
     <type name="App+&lt;Test&gt;c__async1">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>51</size>\r
+        <size>76</size>\r
       </method>\r
     </type>\r
     <type name="App+&lt;Test&gt;c__async0">\r
     </type>\r
     <type name="Program+&lt;LoadPlayers&gt;c__async0">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>87</size>\r
+        <size>117</size>\r
       </method>\r
     </type>\r
     <type name="Program">\r
       <method name="System.Threading.Tasks.Task Throw()" attrs="145">\r
         <size>33</size>\r
       </method>\r
-      <method name="System.Threading.Tasks.Task &lt;Main&gt;m__0()" attrs="145">\r
-        <size>33</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>13</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="System.Threading.Tasks.Task &lt;Main&gt;m__0()" attrs="145">\r
+        <size>33</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-53.cs">\r
     <type name="Y">\r
     </type>\r
     <type name="X+&lt;Foo&gt;c__AnonStorey1+&lt;Foo&gt;c__async0">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>43</size>\r
+        <size>73</size>\r
       </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
     </type>\r
     <type name="B+&lt;GetAsync&gt;c__async0">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>49</size>\r
+        <size>74</size>\r
       </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
     </type>\r
     <type name="X+&lt;AddItemAt&gt;c__async1">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>43</size>\r
+        <size>68</size>\r
       </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
     </type>\r
     <type name="X+&lt;Foo&gt;c__async6">\r
       <method name="Void MoveNext()" attrs="486">\r
-        <size>100</size>\r
+        <size>130</size>\r
       </method>\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       <method name="Int32 Main()" attrs="150">\r
         <size>152</size>\r
       </method>\r
-      <method name="Boolean &lt;Call&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>13</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Boolean &lt;Call&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-64.cs">\r
     <type name="X">\r
       <method name="T Invoke[T](System.Func`1[System.Threading.Tasks.Task`1[T]])" attrs="145">\r
         <size>18</size>\r
       </method>\r
-      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__0()" attrs="145">\r
-        <size>33</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>13</size>\r
       </method>\r
     </type>\r
+    <type name="X">\r
+      <method name="System.Threading.Tasks.Task`1[System.Int32] &lt;Main&gt;m__0()" attrs="145">\r
+        <size>33</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-async-65.cs">\r
     <type name="C">\r
       </method>\r
     </type>\r
   </test>\r
+  <test name="test-async-73.cs">\r
+    <type name="X">\r
+      <method name="System.Threading.Tasks.Task`1[System.Int32] Foo()" attrs="145">\r
+        <size>33</size>\r
+      </method>\r
+      <method name="System.Threading.Tasks.Task`1[System.Int32] Throws()" attrs="145">\r
+        <size>33</size>\r
+      </method>\r
+      <method name="Int32 Main()" attrs="145">\r
+        <size>32</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="X+&lt;Foo&gt;c__async0">\r
+      <method name="Void MoveNext()" attrs="486">\r
+        <size>214</size>\r
+      </method>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+    <type name="X+&lt;Throws&gt;c__async1">\r
+      <method name="Void MoveNext()" attrs="486">\r
+        <size>63</size>\r
+      </method>\r
+      <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="test-cls-00.cs">\r
     <type name="CLSCLass_6">\r
       <method name="Void add_Disposed(Delegate)" attrs="2182">\r
       <method name="Void Test_Capturing_1(Int32)" attrs="129">\r
         <size>28</size>\r
       </method>\r
-      <method name="Void &lt;Test_1&gt;m__0()" attrs="145">\r
-        <size>6</size>\r
-      </method>\r
-      <method name="Void &lt;Test_2&gt;m__1()" attrs="145">\r
-        <size>7</size>\r
-      </method>\r
-      <method name="Void &lt;Test_3&gt;m__2()" attrs="145">\r
-        <size>7</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>14</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Void &lt;Test_1&gt;m__0()" attrs="145">\r
+        <size>6</size>\r
+      </method>\r
+      <method name="Void &lt;Test_2&gt;m__1()" attrs="145">\r
+        <size>7</size>\r
+      </method>\r
+      <method name="Void &lt;Test_3&gt;m__2()" attrs="145">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-debug-15.cs">\r
     <type name="Foo">\r
       <method name="Void Test_4()" attrs="129">\r
         <size>485</size>\r
       </method>\r
-      <method name="Int32 &lt;Test_4&gt;m__0()" attrs="145">\r
-        <size>10</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Int32 &lt;Test_4&gt;m__0()" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-debug-19.cs">\r
     <type name="C">\r
       <method name="System.Threading.Tasks.Task`1[System.Boolean] Test_3()" attrs="129">\r
         <size>33</size>\r
       </method>\r
-      <method name="Void &lt;RunAsync&gt;m__0()" attrs="145">\r
-        <size>2</size>\r
-      </method>\r
-      <method name="Int32 &lt;RunAsync_2&gt;m__1()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
       <method name="Void MoveNext()" attrs="486">\r
         <size>1229</size>\r
       </method>\r
-      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
-        <size>9</size>\r
-      </method>\r
     </type>\r
     <type name="C+&lt;Test_1&gt;c__async0">\r
       <method name="Void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine)" attrs="486">\r
         <size>13</size>\r
       </method>\r
     </type>\r
+    <type name="C">\r
+      <method name="Void &lt;RunAsync&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Int32 &lt;RunAsync_2&gt;m__1()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
+    <type name="C+&lt;Test_3&gt;c__async2">\r
+      <method name="Int32 &lt;&gt;m__0()" attrs="145">\r
+        <size>9</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-debug-20.cs">\r
     <type name="S`1[T]">\r
       <method name="Void Main()" attrs="150">\r
         <size>2</size>\r
       </method>\r
-      <method name="Program &lt;Test_4&gt;m__0()" attrs="145">\r
-        <size>13</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
+      <method name="Program &lt;Test_4&gt;m__0()" attrs="145">\r
+        <size>13</size>\r
+      </method>\r
     </type>\r
   </test>\r
   <test name="test-debug-24.cs">\r
       </method>\r
     </type>\r
   </test>\r
+  <test name="test-ex-filter-06.cs">\r
+    <type name="C">\r
+      <method name="Int32 Test[T]()" attrs="145">\r
+        <size>61</size>\r
+      </method>\r
+      <method name="Int32 Main()" attrs="145">\r
+        <size>49</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="test-externalias-01.cs">\r
     <type name="Test">\r
       <method name="Int32 Main()" attrs="150">\r
       <method name="Void Test()" attrs="134">\r
         <size>43</size>\r
       </method>\r
-      <method name="Void &lt;Test&gt;m__0()" attrs="145">\r
-        <size>7</size>\r
-      </method>\r
       <method name="Void .ctor()" attrs="6278">\r
         <size>7</size>\r
       </method>\r
         <size>0</size>\r
       </method>\r
     </type>\r
+    <type name="Mono.Sms.Main">\r
+      <method name="Void &lt;Test&gt;m__0()" attrs="145">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
   </test>\r
   <test name="test-partial-22.cs">\r
     <type name="C">\r
       </method>\r
     </type>\r
   </test>\r
+  <test name="test-static-using-01.cs">\r
+    <type name="A.B.X">\r
+      <method name="Int32 Test()" attrs="150">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="C.M">\r
+      <method name="Int32 Main()" attrs="150">\r
+        <size>28</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
+  <test name="test-static-using-02.cs">\r
+    <type name="A.B.X">\r
+      <method name="Int32 Test(System.Object)" attrs="150">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="A.C.X">\r
+      <method name="Int32 Test(Int32)" attrs="150">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="C.M">\r
+      <method name="Int32 Main()" attrs="150">\r
+        <size>29</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
+  <test name="test-static-using-03.cs">\r
+    <type name="A.B.X">\r
+      <method name="Int32 Test(Int32)" attrs="150">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="A.C.X">\r
+      <method name="Int32 Test(Int32)" attrs="150">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="C.M">\r
+      <method name="Int32 Main()" attrs="150">\r
+        <size>29</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
+  <test name="test-static-using-04.cs">\r
+    <type name="A.B.X">\r
+      <method name="Int32 Test(System.Object)" attrs="150">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="A.C.X">\r
+      <method name="Int32 Test(Int32)" attrs="145">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="C.M">\r
+      <method name="Int32 Main()" attrs="150">\r
+        <size>34</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
+  <test name="test-static-using-05.cs">\r
+    <type name="Test">\r
+      <method name="Void Main()" attrs="145">\r
+        <size>56</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+      <method name="Boolean &lt;Main&gt;m__0(Int32)" attrs="145">\r
+        <size>14</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
+  <test name="test-static-using-06.cs">\r
+    <type name="A.B.X">\r
+      <method name="Int32 Test(System.Object)" attrs="150">\r
+        <size>10</size>\r
+      </method>\r
+    </type>\r
+    <type name="A.C.X">\r
+      <method name="Int32 Test[T](T)" attrs="150">\r
+        <size>47</size>\r
+      </method>\r
+    </type>\r
+    <type name="C.M">\r
+      <method name="Int32 Main()" attrs="150">\r
+        <size>33</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="test-var-01.cs">\r
     <type name="Test">\r
       <method name="Int32 Main()" attrs="150">\r
diff --git a/mcs/tools/mdoc/.gitignore b/mcs/tools/mdoc/.gitignore
new file mode 100644 (file)
index 0000000..a1077aa
--- /dev/null
@@ -0,0 +1,5 @@
+/Test/en.*/
+/Test/html.*/
+/Test/DocTest.*
+/.v2.txt
+/.v0.txt
index ec9d5a2a87d37a997decf3aa5b6dd288b4957cf5..f63dafc218f7deeb502104fff212fc2f549293a1 100644 (file)
@@ -20,7 +20,7 @@ cleanup:
 run-test-local: run-mono-shlib-cop-test
 
 run-mono-shlib-cop-test: $(the_lib) $(TEST_INPUT)
-       $(RUNTIME) $(the_lib) $(TEST_INPUT) | diff - test.dll.out
+       MONO_PATH="$(topdir)/class/lib/$(PROFILE)$(PLATFORM_PATH_SEPARATOR)$$MONO_PATH" $(RUNTIME) $(the_lib) $(TEST_INPUT) | diff - test.dll.out
 
 $(TEST_INPUT) : test.cs
        $(CSCOMPILE) -target:library $< -out:$@
index d67d7b778c252d7b4c1627543fe39ac13fdc08f7..bfd106b7504d443bab109c1405a6b7fc5eb2a0fd 100644 (file)
@@ -42,8 +42,8 @@ namespace Mono.Unmanaged.Check {
                private static extern int g_module_close (IntPtr handle);
 
                // Warning
-               [DllImport ("libglib-2.0.so")]
-               private static extern void g_free (IntPtr mem);
+               [DllImport ("libMonoPosixHelper.so")]
+               private static extern int Mono_Posix_Stdlib_TMP_MAX ();
 
                // Error: no such library
                [DllImport ("does-not-exist")]
@@ -60,7 +60,7 @@ namespace Mono.Unmanaged.Check {
                Test ()
                {
                        g_module_close (IntPtr.Zero);
-                       g_free (IntPtr.Zero);
+                       Mono_Posix_Stdlib_TMP_MAX ();
                        Foo ();
                        RenameMe ();
                        DoesNotExist ();
index 61206632ce70172e459aa02a56a09da47e2bea64..26300cfe18efbbacf9a236a00ab6b06a4ba607a7 100644 (file)
@@ -1,4 +1,5 @@
 <configuration>
+       <dllmap dll="libMonoPosixHelper.so" target="../../../support/.libs/libMonoPosixHelper.so" />
        <dllmap dll="libgmodule-2.0.so" target="libgmodule-2.0.so.0"/>
        <dllmap dll="renamed-lib" target="libc.so.6"/>
 </configuration>
index d5698c3ef1bcef0b2acc12a604d9a3dd037c31ee..0700423d4dbf2baeb10018c47f95371198d9069d 100644 (file)
@@ -1,4 +1,4 @@
 error: in Mono.Unmanaged.Check.Test.Foo: Could not load library `does-not-exist': ./libdoes-not-exist.so: cannot open shared object file: No such file or directory
 error: in Mono.Unmanaged.Check.Test.RenameMe: library `libc.so.6' is missing symbol `RenameMe'
 error: in Mono.Unmanaged.Check.Test.DoesNotExist: library `libc.so.6' is missing symbol `DoesNotExist'
-warning: in Mono.Unmanaged.Check.Test.g_free: Library `libglib-2.0.so' might be a development library
+warning: in Mono.Unmanaged.Check.Test.Mono_Posix_Stdlib_TMP_MAX: Library `../../../support/.libs/libMonoPosixHelper.so' might be a development library
index 70591c7ba41ec3bbd4b9f07e72e13656eb59f79f..731c05c976702d05172e78beca13204cf0fff45f 100644 (file)
@@ -196,7 +196,10 @@ common_sources = \
        reflection-internals.h  \
        file-mmap-posix.c       \
        file-mmap-windows.c     \
-       file-mmap.h
+       file-mmap.h     \
+       object-offsets.h        \
+       abi-details.h   \
+       metadata-cross-helpers.c
 
 
 # These source files have compile time dependencies on GC code
diff --git a/mono/metadata/abi-details.h b/mono/metadata/abi-details.h
new file mode 100644 (file)
index 0000000..01c741b
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2014 Xamarin Inc
+ */
+#ifndef __MONO_METADATA_ABI_DETAILS_H__
+#define __MONO_METADATA_ABI_DETAILS_H__
+
+#include <config.h>
+#include <glib.h>
+
+#define MONO_ABI_ALIGNOF(type) MONO_ALIGN_ ## type
+#define MONO_CURRENT_ABI_ALIGNOF(type) ((int)G_STRUCT_OFFSET(struct { char c; type x; }, x))
+
+
+#undef DECL_OFFSET
+#undef DECL_OFFSET2
+#define DECL_OFFSET(struct,field) MONO_OFFSET_ ## struct ## _ ## field = -1,
+#define DECL_OFFSET2(struct,field,offset) MONO_OFFSET_ ## struct ## _ ## field = offset,
+#define DECL_ALIGN(type) MONO_ALIGN_ ##type = MONO_CURRENT_ABI_ALIGNOF (type),
+#define DECL_ALIGN2(type,size) MONO_ALIGN_ ##type = size,
+
+enum {
+#include "object-offsets.h"
+};
+
+#ifdef USED_CROSS_COMPILER_OFFSETS
+#define MONO_STRUCT_OFFSET(struct,field) MONO_OFFSET_ ## struct ## _ ## field
+#else
+#define MONO_STRUCT_OFFSET(struct,field) (MONO_OFFSET_ ## struct ## _ ## field == -1, G_STRUCT_OFFSET (struct,field))
+#endif
+
+#endif
index 5b3294aa6b65d316cbc37847ead35ca1783b5909..3dfae0da5a86a2dedebb3289b1de1bf64d83489c 100644 (file)
@@ -403,6 +403,25 @@ mono_domain_create_appdomain (char *friendly_name, char *configuration_file)
        return mono_domain_from_appdomain (ad);
 }
 
+/**
+ * mono_domain_set_config:
+ * @domain: MonoDomain initialized with the appdomain we want to change
+ * @base_dir: new base directory for the appdomain
+ * @config_file_name: path to the new configuration for the app domain
+ *
+ * Used to set the system configuration for an appdomain
+ *
+ * Without using this, embedded builds will get 'System.Configuration.ConfigurationErrorsException: 
+ * Error Initializing the configuration system. ---> System.ArgumentException: 
+ * The 'ExeConfigFilename' argument cannot be null.' for some managed calls.
+ */
+void
+mono_domain_set_config (MonoDomain *domain, const char *base_dir, const char *config_file_name)
+{
+       MONO_OBJECT_SETREF (domain->setup, application_base, mono_string_new (domain, base_dir));
+       MONO_OBJECT_SETREF (domain->setup, configuration_file, mono_string_new (domain, config_file_name));
+}
+
 static MonoAppDomainSetup*
 copy_app_domain_setup (MonoDomain *domain, MonoAppDomainSetup *setup)
 {
index 3b3884330f903df3a395e3275f7548dbdd9b98af..e0c2f671c2e839e8cc2a90515587741ac7cd27c7 100644 (file)
@@ -66,6 +66,9 @@ mono_domain_create         (void);
 MONO_API MonoDomain *
 mono_domain_create_appdomain (char *friendly_name, char *configuration_file);
 
+MONO_API void
+mono_domain_set_config (MonoDomain *domain, const char *base_dir, const char *config_file_name);
+
 MONO_API MonoDomain *
 mono_domain_get            (void);
 
index ef498c60760c6621d4e46a994f49dc89fcbc7c3d..af9eff4780f5f1010bce7bb812fc7d90fa5061f1 100644 (file)
@@ -1177,7 +1177,7 @@ mono_gc_conservatively_scan_area (void *start, void *end)
 }
 
 void *
-mono_gc_scan_object (void *obj)
+mono_gc_scan_object (void *obj, void *gc_data)
 {
        g_assert_not_reached ();
        return NULL;
index 19b624c3fb52087e312002b20826ea4208b8c02c..f722716d1e6f80c2defff89c66e0395d25f37b88 100644 (file)
@@ -14,6 +14,7 @@
 #include "object.h"
 #include "loader.h"
 #include "cil-coff.h"
+#include "metadata/abi-details.h"
 #include "metadata/cominterop.h"
 #include "metadata/marshal.h"
 #include "metadata/method-builder.h"
@@ -695,11 +696,11 @@ mono_cominterop_emit_object_to_ptr_conv (MonoMethodBuilder *mb, MonoType *type,
                // load src
                mono_mb_emit_ldloc (mb, 0);     
                mono_mb_emit_byte (mb, CEE_LDIND_REF);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoTransparentProxy, rp));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp));
                mono_mb_emit_byte (mb, CEE_LDIND_REF);
 
                /* load the RCW from the ComInteropProxy*/
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoComInteropProxy, com_object));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoComInteropProxy, com_object));
                mono_mb_emit_byte (mb, CEE_LDIND_REF);
 
                if (conv == MONO_MARSHAL_CONV_OBJECT_INTERFACE) {
@@ -1002,11 +1003,11 @@ mono_cominterop_get_invoke (MonoMethod *method)
        /* get real proxy object, which is a ComInteropProxy in this case*/
        temp_obj = mono_mb_add_local (mb, &mono_defaults.object_class->byval_arg);
        mono_mb_emit_ldarg (mb, 0);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoTransparentProxy, rp));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
 
        /* load the RCW from the ComInteropProxy*/
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoComInteropProxy, com_object));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoComInteropProxy, com_object));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
 
        /* load args and make the call on the RCW */
@@ -1034,7 +1035,7 @@ mono_cominterop_get_invoke (MonoMethod *method)
                        cache_proxy = mono_class_get_method_from_name (com_interop_proxy_class, "CacheProxy", 0);
 
                mono_mb_emit_ldarg (mb, 0);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoTransparentProxy, rp));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp));
                mono_mb_emit_byte (mb, CEE_LDIND_REF);
                mono_mb_emit_managed_call (mb, cache_proxy, NULL);
        }
index 09c6479c03d3805e5e1f6f12a43ba7f530168154..a9031eb97eaaa2fd7ac1acb48cc0dccb81befc4c 100644 (file)
@@ -197,8 +197,7 @@ struct _MonoJitInfo {
        } d;
        struct _MonoJitInfo *next_jit_code_hash;
        gpointer    code_start;
-       /* This might contain an id for the unwind info instead of a register mask */
-       guint32     used_regs;
+       guint32     unwind_info;
        int         code_size;
        guint32     num_clauses:15;
        /* Whenever the code is domain neutral or 'shared' */
index a9bf81b5cd8382f699141b17d8fed153917581cb..cd4bc0c8a89573afef975c2e0deb5e0ed268e0ef 100644 (file)
@@ -856,13 +856,13 @@ mono_jit_info_add_aot_module (MonoImage *image, gpointer start, gpointer end)
 {
        MonoJitInfo *ji;
 
-       mono_appdomains_lock ();
+       g_assert (mono_root_domain);
+       mono_domain_lock (mono_root_domain);
 
        /*
         * We reuse MonoJitInfoTable to store AOT module info,
         * this gives us async-safe lookup.
         */
-       g_assert (mono_root_domain);
        if (!mono_root_domain->aot_modules) {
                mono_root_domain->num_jit_info_tables ++;
                mono_root_domain->aot_modules = jit_info_table_new (mono_root_domain);
@@ -874,7 +874,7 @@ mono_jit_info_add_aot_module (MonoImage *image, gpointer start, gpointer end)
        ji->code_size = (guint8*)end - (guint8*)start;
        jit_info_table_add (mono_root_domain, &mono_root_domain->aot_modules, ji);
 
-       mono_appdomains_unlock ();
+       mono_domain_unlock (mono_root_domain);
 }
 
 void
index a1a30a0737cd660da37a01339df4764ec19b5abb..32f555ae7b5a9832ef88622ebf225f5c47c97c10 100644 (file)
@@ -81,8 +81,10 @@ enum {
        MMAP_FILE_ACCESS_READ_WRITE_EXECUTE = 5,
 };
 
-#ifndef DEFFILEMODE
-#define DEFFILEMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
+#ifdef PLATFORM_ANDROID
+#define DEFAULT_FILEMODE 0666
+#else
+#define DEFAULT_FILEMODE DEFFILEMODE
 #endif
 
 static int mmap_init_state;
@@ -269,7 +271,7 @@ open_file_map (MonoString *path, int input_fd, int mode, gint64 *capacity, int a
        }
 
        if (path) //FIXME use io portability?
-               fd = open (c_path, file_mode_to_unix (mode) | access_mode_to_unix (access), DEFFILEMODE);
+               fd = open (c_path, file_mode_to_unix (mode) | access_mode_to_unix (access), DEFAULT_FILEMODE);
        else
                fd = dup (input_fd);
 
@@ -294,7 +296,7 @@ done:
        return (void*)handle;
 }
 
-#define MONO_ANON_FILE_TEMPLATE "/tmp/mono.anonmap.XXXXXXXXX"
+#define MONO_ANON_FILE_TEMPLATE "/mono.anonmap.XXXXXXXXX"
 static void*
 open_memory_map (MonoString *mapName, int mode, gint64 *capacity, int access, int options, int *error)
 {
@@ -324,8 +326,9 @@ open_memory_map (MonoString *mapName, int mode, gint64 *capacity, int access, in
                //XXX should we ftruncate if the file is smaller than capacity?
        } else {
                int fd;
-               char file_name [sizeof (MONO_ANON_FILE_TEMPLATE) + 1];
-               int unused G_GNUC_UNUSED;
+               char *file_name;
+               const char *tmp_dir;
+               int unused G_GNUC_UNUSED, alloc_size;
 
                if (mode == FILE_MODE_OPEN) {
                        *error = FILE_NOT_FOUND;
@@ -333,7 +336,16 @@ open_memory_map (MonoString *mapName, int mode, gint64 *capacity, int access, in
                }
                *capacity = align_up_to_page_size (*capacity);
 
-               strcpy (file_name, MONO_ANON_FILE_TEMPLATE);
+               tmp_dir = g_get_tmp_dir ();
+               alloc_size = strlen (tmp_dir) + strlen (MONO_ANON_FILE_TEMPLATE) + 1;
+               if (alloc_size > 1024) {//rather fail that stack overflow
+                       *error = COULD_NOT_MAP_MEMORY;
+                       goto done;
+               }
+               file_name = alloca (alloc_size);
+               strcpy (file_name, tmp_dir);
+               strcat (file_name, MONO_ANON_FILE_TEMPLATE);
+
                fd = mkstemp (file_name);
                if (fd == -1) {
                        *error = COULD_NOT_MAP_MEMORY;
index 4731dc1b6b85b69576df377735980cb37ddf4562..62fdb109d45310a18a6b159053726093d1d9a5c9 100644 (file)
@@ -151,8 +151,8 @@ void* mono_gc_make_root_descr_all_refs (int numbits) MONO_INTERNAL;
  * foreach (ref in GC references in the are structure pointed to by ADDR)
  *    mark_func (ref)
  */
-typedef void (*MonoGCMarkFunc)     (void **addr);
-typedef void (*MonoGCRootMarkFunc) (void *addr, MonoGCMarkFunc mark_func);
+typedef void (*MonoGCMarkFunc)     (void **addr, void *gc_data);
+typedef void (*MonoGCRootMarkFunc) (void *addr, MonoGCMarkFunc mark_func, void *gc_data);
 
 /* Create a descriptor with a user defined marking function */
 MONO_API void *mono_gc_make_root_descr_user (MonoGCRootMarkFunc marker);
@@ -276,7 +276,7 @@ typedef struct {
         * - in the second pass, it should mark the remaining areas of the stack
         *   using precise marking by calling mono_gc_scan_object ().
         */
-       void (*thread_mark_func) (gpointer user_data, guint8 *stack_start, guint8 *stack_end, gboolean precise);
+       void (*thread_mark_func) (gpointer user_data, guint8 *stack_start, guint8 *stack_end, gboolean precise, void *gc_data);
 } MonoGCCallbacks;
 
 /* Set the callback functions callable by the GC */
@@ -289,7 +289,7 @@ MonoGCCallbacks *mono_gc_get_gc_callbacks (void) MONO_INTERNAL;
 void mono_gc_conservatively_scan_area (void *start, void *end) MONO_INTERNAL;
 
 /* Scan OBJ, returning its new address */
-void *mono_gc_scan_object (void *obj) MONO_INTERNAL;
+void *mono_gc_scan_object (void *obj, void *gc_data) MONO_INTERNAL;
 
 /* Return the bitmap encoded by a descriptor */
 gsize* mono_gc_get_bitmap_for_descr (void *descr, int *numbits) MONO_INTERNAL;
index 2e244b815964a63a1622254a85caa691fb41c6a3..3d4532648a78e9e44ada94531dce8ca4b1498ab3 100644 (file)
@@ -1062,6 +1062,8 @@ finalize_domain_objects (DomainFinalizationReq *req)
 static guint32
 finalizer_thread (gpointer unused)
 {
+       gboolean wait = TRUE;
+
        while (!finished) {
                /* Wait to be notified that there's at least one
                 * finaliser to run
@@ -1069,12 +1071,15 @@ finalizer_thread (gpointer unused)
 
                g_assert (mono_domain_get () == mono_get_root_domain ());
 
+               if (wait) {
                /* An alertable wait is required so this thread can be suspended on windows */
 #ifdef MONO_HAS_SEMAPHORES
-               MONO_SEM_WAIT_ALERTABLE (&finalizer_sem, TRUE);
+                       MONO_SEM_WAIT_ALERTABLE (&finalizer_sem, TRUE);
 #else
-               WaitForSingleObjectEx (finalizer_event, INFINITE, TRUE);
+                       WaitForSingleObjectEx (finalizer_event, INFINITE, TRUE);
 #endif
+               }
+               wait = TRUE;
 
                mono_threads_perform_thread_dump ();
 
@@ -1106,7 +1111,16 @@ finalizer_thread (gpointer unused)
 
                reference_queue_proccess_all ();
 
-               SetEvent (pending_done_event);
+#ifdef MONO_HAS_SEMAPHORES
+               /* Avoid posting the pending done event until there are pending finalizers */
+               if (MONO_SEM_TIMEDWAIT (&finalizer_sem, 0) == 0)
+                       /* Don't wait again at the start of the loop */
+                       wait = FALSE;
+               else
+                       SetEvent (pending_done_event);
+#else
+                       SetEvent (pending_done_event);
+#endif
        }
 
        SetEvent (shutdown_event);
index 0271adff53a78dadb01ae622c9b8e0adf647971f..0d40f550a264bf996422f3cc846bb22e2ab15047 100644 (file)
@@ -23,6 +23,7 @@
 #include "metadata/tabledefs.h"
 #include "metadata/exception.h"
 #include "metadata/appdomain.h"
+#include "mono/metadata/abi-details.h"
 #include "mono/metadata/debug-helpers.h"
 #include "mono/metadata/threadpool.h"
 #include "mono/metadata/threads.h"
@@ -1086,9 +1087,9 @@ static int
 mono_mb_emit_proxy_check (MonoMethodBuilder *mb, int branch_code)
 {
        int pos;
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoObject, vtable));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoObject, vtable));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
-       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoVTable, klass));
+       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoVTable, klass));
        mono_mb_emit_byte (mb, CEE_ADD);
        mono_mb_emit_byte (mb, CEE_LDIND_I);
        mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
@@ -1102,9 +1103,9 @@ static int
 mono_mb_emit_xdomain_check (MonoMethodBuilder *mb, int branch_code)
 {
        int pos;
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoTransparentProxy, rp));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoRealProxy, target_domain_id));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRealProxy, target_domain_id));
        mono_mb_emit_byte (mb, CEE_LDIND_I4);
        mono_mb_emit_icon (mb, -1);
        pos = mono_mb_emit_branch (mb, branch_code);
@@ -1120,9 +1121,9 @@ mono_mb_emit_contextbound_check (MonoMethodBuilder *mb, int branch_code)
        if (offset < 0)
                mono_marshal_find_bitfield_offset (MonoClass, contextbound, &offset, &mask);
 
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoTransparentProxy, remote_class));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, remote_class));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoRemoteClass, proxy_class));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRemoteClass, proxy_class));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
        mono_mb_emit_ldflda (mb, offset);
        mono_mb_emit_byte (mb, CEE_LDIND_U1);
@@ -1317,7 +1318,7 @@ emit_ptr_to_object_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv
                        /* copy the elements */
                        mono_mb_emit_ldloc (mb, 1);
                        mono_mb_emit_byte (mb, CEE_LDIND_I);
-                       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoArray, vector));
+                       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoArray, vector));
                        mono_mb_emit_byte (mb, CEE_ADD);
                        mono_mb_emit_ldloc (mb, 0);
                        mono_mb_emit_icon (mb, mspec->data.array_data.num_elem * esize);
@@ -1703,7 +1704,7 @@ emit_object_to_ptr_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv
                        mono_mb_emit_ldloc (mb, 1);
                        mono_mb_emit_ldloc (mb, 0);     
                        mono_mb_emit_byte (mb, CEE_LDIND_REF);  
-                       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoArray, vector));
+                       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoArray, vector));
                        mono_mb_emit_icon (mb, mspec->data.array_data.num_elem * esize);
                        mono_mb_emit_byte (mb, CEE_PREFIX1);
                        mono_mb_emit_byte (mb, CEE_CPBLK);                      
@@ -1858,7 +1859,7 @@ emit_object_to_ptr_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv
                mono_mb_emit_ldloc (mb, 1);
                mono_mb_emit_ldloc (mb, 0);
                mono_mb_emit_byte (mb, CEE_LDIND_I);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoSafeHandle, handle));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoSafeHandle, handle));
                mono_mb_emit_byte (mb, CEE_LDIND_I);
                mono_mb_emit_byte (mb, CEE_STIND_I);
                break;
@@ -1867,7 +1868,7 @@ emit_object_to_ptr_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv
        case MONO_MARSHAL_CONV_HANDLEREF: {
                mono_mb_emit_ldloc (mb, 1);
                mono_mb_emit_ldloc (mb, 0);
-               mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoHandleRef, handle));
+               mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoHandleRef, handle));
                mono_mb_emit_byte (mb, CEE_ADD);
                mono_mb_emit_byte (mb, CEE_LDIND_I);
                mono_mb_emit_byte (mb, CEE_STIND_I);
@@ -3867,12 +3868,12 @@ mono_marshal_get_xappdomain_invoke (MonoMethod *method)
        /* Get the target domain id */
 
        mono_mb_emit_ldarg (mb, 0);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoTransparentProxy, rp));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
        mono_mb_emit_byte (mb, CEE_DUP);
        mono_mb_emit_stloc (mb, loc_real_proxy);
 
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoRealProxy, target_domain_id));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRealProxy, target_domain_id));
        mono_mb_emit_byte (mb, CEE_LDIND_I4);
        mono_mb_emit_stloc (mb, loc_domainid);
 
@@ -4370,7 +4371,7 @@ mono_marshal_get_delegate_invoke_internal (MonoMethod *method, gboolean callvirt
        
        /* get this->prev */
        mono_mb_emit_ldarg (mb, 0);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoMulticastDelegate, prev));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoMulticastDelegate, prev));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
        mono_mb_emit_stloc (mb, local_prev);
        mono_mb_emit_ldloc (mb, local_prev);
@@ -4398,7 +4399,7 @@ mono_marshal_get_delegate_invoke_internal (MonoMethod *method, gboolean callvirt
 
        /* get this->target */
        mono_mb_emit_ldarg (mb, 0);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoDelegate, target));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoDelegate, target));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
        mono_mb_emit_stloc (mb, local_target);
 
@@ -4417,7 +4418,7 @@ mono_marshal_get_delegate_invoke_internal (MonoMethod *method, gboolean callvirt
                        for (i = 0; i < sig->param_count; ++i)
                                mono_mb_emit_ldarg (mb, i + 1);
                        mono_mb_emit_ldarg (mb, 0);
-                       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoDelegate, method_ptr));
+                       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr));
                        mono_mb_emit_byte (mb, CEE_LDIND_I );
                        mono_mb_emit_op (mb, CEE_CALLI, sig);
 
@@ -4450,7 +4451,7 @@ mono_marshal_get_delegate_invoke_internal (MonoMethod *method, gboolean callvirt
                for (i = 0; i < sig->param_count; ++i)
                        mono_mb_emit_ldarg (mb, i + 1);
                mono_mb_emit_ldarg (mb, 0);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoDelegate, method_ptr));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr));
                mono_mb_emit_byte (mb, CEE_LDIND_I );
                mono_mb_emit_op (mb, CEE_CALLI, invoke_sig);
        }
@@ -5598,9 +5599,9 @@ mono_marshal_get_ldflda_wrapper (MonoType *type)
 
        /* if this->rp->context == mono_context_get goto pos3 */
        mono_mb_emit_ldarg (mb, 0);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoTransparentProxy, rp));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoRealProxy, context));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRealProxy, context));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
        mono_mb_emit_icall (mb, mono_context_get);
        pos3 = mono_mb_emit_branch (mb, CEE_BEQ);
@@ -5612,9 +5613,9 @@ mono_marshal_get_ldflda_wrapper (MonoType *type)
 
        /* return the address of the field from this->rp->unwrapped_server */
        mono_mb_emit_ldarg (mb, 0);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoTransparentProxy, rp));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoRealProxy, unwrapped_server));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoRealProxy, unwrapped_server));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
        mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
        mono_mb_emit_byte (mb, CEE_MONO_OBJADDR);
@@ -6784,7 +6785,7 @@ emit_marshal_safehandle (EmitMarshalContext *m, int argnum, MonoType *t,
 
                /* Pull the handle field from SafeHandle */
                mono_mb_emit_ldarg (mb, argnum);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoSafeHandle, handle));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoSafeHandle, handle));
                mono_mb_emit_byte (mb, CEE_LDIND_I);
                mono_mb_emit_stloc (mb, conv_arg);
 
@@ -6831,7 +6832,7 @@ emit_marshal_safehandle (EmitMarshalContext *m, int argnum, MonoType *t,
                        /* refval.handle = returned_handle */
                        mono_mb_emit_ldarg (mb, argnum);
                        mono_mb_emit_byte (mb, CEE_LDIND_REF);
-                       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoSafeHandle, handle));
+                       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoSafeHandle, handle));
                        mono_mb_emit_ldloc (mb, conv_arg);
                        mono_mb_emit_byte (mb, CEE_STIND_I);
                } else {
@@ -6870,7 +6871,7 @@ emit_marshal_safehandle (EmitMarshalContext *m, int argnum, MonoType *t,
 
                /* Set the return.handle to the value, am using ldflda, not sure if thats a good idea */
                mono_mb_emit_ldloc (mb, 3);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoSafeHandle, handle));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoSafeHandle, handle));
                mono_mb_emit_ldloc (mb, intptr_handle_slot);
                mono_mb_emit_byte (mb, CEE_STIND_I);
                break;
@@ -6920,7 +6921,7 @@ emit_marshal_handleref (EmitMarshalContext *m, int argnum, MonoType *t,
                        break;
                } 
                mono_mb_emit_ldarg_addr (mb, argnum);
-               mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoHandleRef, handle));
+               mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoHandleRef, handle));
                mono_mb_emit_byte (mb, CEE_ADD);
                mono_mb_emit_byte (mb, CEE_LDIND_I);
                mono_mb_emit_stloc (mb, conv_arg);
@@ -8005,7 +8006,7 @@ emit_marshal_array (EmitMarshalContext *m, int argnum, MonoType *t,
                if (eklass->blittable) {
                        mono_mb_emit_ldloc (mb, conv_arg);
                        mono_mb_emit_byte (mb, CEE_CONV_I);
-                       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoArray, vector));
+                       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoArray, vector));
                        mono_mb_emit_byte (mb, CEE_ADD);
                        mono_mb_emit_ldarg (mb, argnum);
                        mono_mb_emit_ldloc (mb, conv_arg);
@@ -8122,7 +8123,7 @@ emit_marshal_array (EmitMarshalContext *m, int argnum, MonoType *t,
                        /* src */
                        mono_mb_emit_ldloc (mb, conv_arg);
                        mono_mb_emit_byte (mb, CEE_CONV_I);
-                       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoArray, vector));
+                       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoArray, vector));
                        mono_mb_emit_byte (mb, CEE_ADD);
                        /* length */
                        mono_mb_emit_ldloc (mb, conv_arg);
@@ -9779,7 +9780,7 @@ mono_marshal_get_castclass_with_cache (void)
 
        /*obj_vtable = obj->vtable;*/
        mono_mb_emit_ldarg (mb, 0);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoObject, vtable));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoObject, vtable));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
        mono_mb_emit_stloc (mb, 0);
 
@@ -9872,7 +9873,7 @@ mono_marshal_get_isinst_with_cache (void)
 
        /*obj_vtable = obj->vtable;*/
        mono_mb_emit_ldarg (mb, 0);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoObject, vtable));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoObject, vtable));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
        mono_mb_emit_stloc (mb, 0);
 
@@ -10183,7 +10184,7 @@ mono_marshal_get_proxy_cancast (MonoClass *klass)
 #ifndef DISABLE_JIT
        /* get the real proxy from the transparent proxy*/
        mono_mb_emit_ldarg (mb, 0);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoTransparentProxy, rp));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoTransparentProxy, rp));
        mono_mb_emit_byte (mb, CEE_LDIND_REF);
        
        /* get the reflection type from the type handle */
@@ -10710,11 +10711,11 @@ static void
 load_array_class (MonoMethodBuilder *mb, int aklass)
 {
        mono_mb_emit_ldarg (mb, 0);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoObject, vtable));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoObject, vtable));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoVTable, klass));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoVTable, klass));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoClass, element_class));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoClass, element_class));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
        mono_mb_emit_stloc (mb, aklass);
 }
@@ -10723,9 +10724,9 @@ static void
 load_value_class (MonoMethodBuilder *mb, int vklass)
 {
        mono_mb_emit_ldarg (mb, 2);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoObject, vtable));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoObject, vtable));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoVTable, klass));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoVTable, klass));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
        mono_mb_emit_stloc (mb, vklass);
 }
@@ -10965,22 +10966,22 @@ get_virtual_stelemref_wrapper (int kind)
 
                /* if (vklass->idepth < aklass->idepth) goto failue */
                mono_mb_emit_ldloc (mb, vklass);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoClass, idepth));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoClass, idepth));
                mono_mb_emit_byte (mb, CEE_LDIND_U2);
 
                mono_mb_emit_ldloc (mb, aklass);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoClass, idepth));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoClass, idepth));
                mono_mb_emit_byte (mb, CEE_LDIND_U2);
 
                b2 = mono_mb_emit_branch (mb, CEE_BLT_UN);
 
                /* if (vklass->supertypes [aklass->idepth - 1] != aklass) goto failure */
                mono_mb_emit_ldloc (mb, vklass);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoClass, supertypes));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoClass, supertypes));
                mono_mb_emit_byte (mb, CEE_LDIND_I);
 
                mono_mb_emit_ldloc (mb, aklass);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoClass, idepth));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoClass, idepth));
                mono_mb_emit_byte (mb, CEE_LDIND_U2);
                mono_mb_emit_icon (mb, 1);
                mono_mb_emit_byte (mb, CEE_SUB);
@@ -11044,20 +11045,20 @@ get_virtual_stelemref_wrapper (int kind)
 
                /* vt = value->vtable */
                mono_mb_emit_ldarg (mb, 2);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoObject, vtable));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoObject, vtable));
                mono_mb_emit_byte (mb, CEE_LDIND_I);
                mono_mb_emit_stloc (mb, vtable);
 
                /* uiid = klass->interface_id; */
                mono_mb_emit_ldloc (mb, aklass);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoClass, interface_id));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoClass, interface_id));
                mono_mb_emit_byte (mb, CEE_LDIND_U2);
                mono_mb_emit_stloc (mb, uiid);
 
                /*if (uiid > vt->max_interface_id)*/
                mono_mb_emit_ldloc (mb, uiid);
                mono_mb_emit_ldloc (mb, vtable);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoVTable, max_interface_id));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoVTable, max_interface_id));
                mono_mb_emit_byte (mb, CEE_LDIND_U2);
                b2 = mono_mb_emit_branch (mb, CEE_BGT_UN);
 
@@ -11065,7 +11066,7 @@ get_virtual_stelemref_wrapper (int kind)
 
                /*vt->interface_bitmap*/
                mono_mb_emit_ldloc (mb, vtable);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoVTable, interface_bitmap));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoVTable, interface_bitmap));
                mono_mb_emit_byte (mb, CEE_LDIND_I);
 
                /*uiid >> 3*/
@@ -11228,40 +11229,40 @@ mono_marshal_get_stelemref ()
        
        /* aklass = array->vtable->klass->element_class */
        mono_mb_emit_ldarg (mb, 0);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoObject, vtable));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoObject, vtable));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoVTable, klass));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoVTable, klass));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoClass, element_class));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoClass, element_class));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
        mono_mb_emit_stloc (mb, aklass);
        
        /* vklass = value->vtable->klass */
        mono_mb_emit_ldarg (mb, 2);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoObject, vtable));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoObject, vtable));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoVTable, klass));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoVTable, klass));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
        mono_mb_emit_stloc (mb, vklass);
        
        /* if (vklass->idepth < aklass->idepth) goto failue */
        mono_mb_emit_ldloc (mb, vklass);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoClass, idepth));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoClass, idepth));
        mono_mb_emit_byte (mb, CEE_LDIND_U2);
        
        mono_mb_emit_ldloc (mb, aklass);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoClass, idepth));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoClass, idepth));
        mono_mb_emit_byte (mb, CEE_LDIND_U2);
        
        b2 = mono_mb_emit_branch (mb, CEE_BLT_UN);
        
        /* if (vklass->supertypes [aklass->idepth - 1] != aklass) goto failure */
        mono_mb_emit_ldloc (mb, vklass);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoClass, supertypes));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoClass, supertypes));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
        
        mono_mb_emit_ldloc (mb, aklass);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoClass, idepth));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoClass, idepth));
        mono_mb_emit_byte (mb, CEE_LDIND_U2);
        mono_mb_emit_icon (mb, 1);
        mono_mb_emit_byte (mb, CEE_SUB);
@@ -11448,7 +11449,7 @@ mono_marshal_get_array_address (int rank, int elem_size)
 
        /* bounds = array->bounds; */
        mono_mb_emit_ldarg (mb, 0);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoArray, bounds));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoArray, bounds));
        mono_mb_emit_byte (mb, CEE_LDIND_I);
        mono_mb_emit_stloc (mb, bounds);
 
@@ -11456,7 +11457,7 @@ mono_marshal_get_array_address (int rank, int elem_size)
        /* ind = idx0 - bounds [0].lower_bound */
        mono_mb_emit_ldarg (mb, 1);
        mono_mb_emit_ldloc (mb, bounds);
-       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoArrayBounds, lower_bound));
+       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoArrayBounds, lower_bound));
        mono_mb_emit_byte (mb, CEE_ADD);
        mono_mb_emit_byte (mb, CEE_LDIND_I4);
        mono_mb_emit_byte (mb, CEE_SUB);
@@ -11464,7 +11465,7 @@ mono_marshal_get_array_address (int rank, int elem_size)
        /* if (ind >= bounds [0].length) goto exeception; */
        mono_mb_emit_ldloc (mb, ind);
        mono_mb_emit_ldloc (mb, bounds);
-       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoArrayBounds, length));
+       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoArrayBounds, length));
        mono_mb_emit_byte (mb, CEE_ADD);
        mono_mb_emit_byte (mb, CEE_LDIND_I4);
        /* note that we use unsigned comparison */
@@ -11479,7 +11480,7 @@ mono_marshal_get_array_address (int rank, int elem_size)
                /* realidx = idxi - bounds [i].lower_bound */
                mono_mb_emit_ldarg (mb, 1 + i);
                mono_mb_emit_ldloc (mb, bounds);
-               mono_mb_emit_icon (mb, (i * sizeof (MonoArrayBounds)) + G_STRUCT_OFFSET (MonoArrayBounds, lower_bound));
+               mono_mb_emit_icon (mb, (i * sizeof (MonoArrayBounds)) + MONO_STRUCT_OFFSET (MonoArrayBounds, lower_bound));
                mono_mb_emit_byte (mb, CEE_ADD);
                mono_mb_emit_byte (mb, CEE_LDIND_I4);
                mono_mb_emit_byte (mb, CEE_SUB);
@@ -11487,14 +11488,14 @@ mono_marshal_get_array_address (int rank, int elem_size)
                /* if (realidx >= bounds [i].length) goto exeception; */
                mono_mb_emit_ldloc (mb, realidx);
                mono_mb_emit_ldloc (mb, bounds);
-               mono_mb_emit_icon (mb, (i * sizeof (MonoArrayBounds)) + G_STRUCT_OFFSET (MonoArrayBounds, length));
+               mono_mb_emit_icon (mb, (i * sizeof (MonoArrayBounds)) + MONO_STRUCT_OFFSET (MonoArrayBounds, length));
                mono_mb_emit_byte (mb, CEE_ADD);
                mono_mb_emit_byte (mb, CEE_LDIND_I4);
                branch_positions [i] = mono_mb_emit_branch (mb, CEE_BGE_UN);
                /* ind = ind * bounds [i].length + realidx */
                mono_mb_emit_ldloc (mb, ind);
                mono_mb_emit_ldloc (mb, bounds);
-               mono_mb_emit_icon (mb, (i * sizeof (MonoArrayBounds)) + G_STRUCT_OFFSET (MonoArrayBounds, length));
+               mono_mb_emit_icon (mb, (i * sizeof (MonoArrayBounds)) + MONO_STRUCT_OFFSET (MonoArrayBounds, length));
                mono_mb_emit_byte (mb, CEE_ADD);
                mono_mb_emit_byte (mb, CEE_LDIND_I4);
                mono_mb_emit_byte (mb, CEE_MUL);
@@ -11505,7 +11506,7 @@ mono_marshal_get_array_address (int rank, int elem_size)
 
        /* return array->vector + ind * element_size */
        mono_mb_emit_ldarg (mb, 0);
-       mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoArray, vector));
+       mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoArray, vector));
        mono_mb_emit_ldloc (mb, ind);
        mono_mb_emit_icon (mb, elem_size);
        mono_mb_emit_byte (mb, CEE_MUL);
@@ -12427,11 +12428,6 @@ mono_class_native_size (MonoClass *klass, guint32 *align)
        return klass->marshal_info->native_size;
 }
 
-/* __alignof__ returns the preferred alignment of values not the actual alignment used by
-   the compiler so is wrong e.g. for Linux where doubles are aligned on a 4 byte boundary
-   but __alignof__ returns 8 - using G_STRUCT_OFFSET works better */
-#define ALIGNMENT(type) G_STRUCT_OFFSET(struct { char c; type x; }, x)
-
 /*
  * mono_type_native_stack_size:
  * @t: the type to return the size it uses on the stack
@@ -12480,11 +12476,11 @@ mono_type_native_stack_size (MonoType *t, guint32 *align)
                *align = 4;
                return 4;
        case MONO_TYPE_R8:
-               *align = ALIGNMENT (gdouble);
+               *align = MONO_ABI_ALIGNOF (double);
                return 8;
        case MONO_TYPE_I8:
        case MONO_TYPE_U8:
-               *align = ALIGNMENT (glong);
+               *align = MONO_ABI_ALIGNOF (gint64);
                return 8;
        case MONO_TYPE_GENERICINST:
                if (!mono_type_generic_inst_is_valuetype (t)) {
@@ -12543,13 +12539,13 @@ mono_marshal_type_size (MonoType *type, MonoMarshalSpec *mspec, guint32 *align,
                return 4;
        case MONO_NATIVE_I8:
        case MONO_NATIVE_U8:
-               *align = ALIGNMENT(guint64);
+               *align = MONO_ABI_ALIGNOF (gint64);
                return 8;
        case MONO_NATIVE_R4:
                *align = 4;
                return 4;
        case MONO_NATIVE_R8:
-               *align = ALIGNMENT(double);
+               *align = MONO_ABI_ALIGNOF (double);
                return 8;
        case MONO_NATIVE_INT:
        case MONO_NATIVE_UINT:
@@ -12567,7 +12563,7 @@ mono_marshal_type_size (MonoType *type, MonoMarshalSpec *mspec, guint32 *align,
        case MONO_NATIVE_ASANY:
        case MONO_NATIVE_FUNC:
        case MONO_NATIVE_LPSTRUCT:
-               *align = ALIGNMENT(gpointer);
+               *align = MONO_ABI_ALIGNOF (gpointer);
                return sizeof (gpointer);
        case MONO_NATIVE_STRUCT: 
                klass = mono_class_from_mono_type (type);
diff --git a/mono/metadata/metadata-cross-helpers.c b/mono/metadata/metadata-cross-helpers.c
new file mode 100644 (file)
index 0000000..5953691
--- /dev/null
@@ -0,0 +1,6 @@
+#include "config.h"
+
+#ifdef ENABLE_EXTENSION_MODULE
+#include "../../../mono-extensions/mono/metadata/metadata-cross-helpers.c"
+#endif
+
index 5a3a09bc7a86ad07f748528a2258ede572d125fd..45495496f5770ca4c0e0c154045d64e3a26cb827 100644 (file)
@@ -25,6 +25,7 @@
 #include "class.h"
 #include "marshal.h"
 #include "debug-helpers.h"
+#include "abi-details.h"
 #include <mono/utils/mono-error-internals.h>
 #include <mono/utils/bsearch.h>
 
@@ -4282,8 +4283,6 @@ mono_backtrace (int limit)
 }
 #endif
 
-#define abi__alignof__(type) G_STRUCT_OFFSET(struct { char c; type x; }, x)
-
 static int i8_align;
 
 /*
@@ -4322,7 +4321,7 @@ mono_type_size (MonoType *t, int *align)
                return 0;
        }
        if (t->byref) {
-               *align = abi__alignof__(gpointer);
+               *align = MONO_ABI_ALIGNOF (gpointer);
                return sizeof (gpointer);
        }
 
@@ -4331,43 +4330,40 @@ mono_type_size (MonoType *t, int *align)
                *align = 1;
                return 0;
        case MONO_TYPE_BOOLEAN:
-               *align = abi__alignof__(gint8);
+               *align = MONO_ABI_ALIGNOF (gint8);
                return 1;
        case MONO_TYPE_I1:
        case MONO_TYPE_U1:
-               *align = abi__alignof__(gint8);
+               *align = MONO_ABI_ALIGNOF (gint8);
                return 1;
        case MONO_TYPE_CHAR:
        case MONO_TYPE_I2:
        case MONO_TYPE_U2:
-               *align = abi__alignof__(gint16);
+               *align = MONO_ABI_ALIGNOF (gint16);
                return 2;               
        case MONO_TYPE_I4:
        case MONO_TYPE_U4:
-               *align = abi__alignof__(gint32);
+               *align = MONO_ABI_ALIGNOF (gint32);
                return 4;
        case MONO_TYPE_R4:
-               *align = abi__alignof__(float);
+               *align = MONO_ABI_ALIGNOF (float);
                return 4;
        case MONO_TYPE_I8:
        case MONO_TYPE_U8:
-               if (i8_align)
-                       *align = i8_align;
-               else
-                       *align = abi__alignof__(gint64);
+               *align = MONO_ABI_ALIGNOF (gint64);
                return 8;               
        case MONO_TYPE_R8:
-               *align = abi__alignof__(double);
+               *align = MONO_ABI_ALIGNOF (double);
                return 8;               
        case MONO_TYPE_I:
        case MONO_TYPE_U:
-               *align = abi__alignof__(gpointer);
+               *align = MONO_ABI_ALIGNOF (gpointer);
                return sizeof (gpointer);
        case MONO_TYPE_STRING:
-               *align = abi__alignof__(gpointer);
+               *align = MONO_ABI_ALIGNOF (gpointer);
                return sizeof (gpointer);
        case MONO_TYPE_OBJECT:
-               *align = abi__alignof__(gpointer);
+               *align = MONO_ABI_ALIGNOF (gpointer);
                return sizeof (gpointer);
        case MONO_TYPE_VALUETYPE: {
                if (t->data.klass->enumtype)
@@ -4380,7 +4376,7 @@ mono_type_size (MonoType *t, int *align)
        case MONO_TYPE_PTR:
        case MONO_TYPE_FNPTR:
        case MONO_TYPE_ARRAY:
-               *align = abi__alignof__(gpointer);
+               *align = MONO_ABI_ALIGNOF (gpointer);
                return sizeof (gpointer);
        case MONO_TYPE_TYPEDBYREF:
                return mono_class_value_size (mono_defaults.typed_reference_class, (guint32*)align);
@@ -4396,14 +4392,14 @@ mono_type_size (MonoType *t, int *align)
                        else
                                return mono_class_value_size (mono_class_from_mono_type (t), (guint32*)align);
                } else {
-                       *align = abi__alignof__(gpointer);
+                       *align = MONO_ABI_ALIGNOF (gpointer);
                        return sizeof (gpointer);
                }
        }
        case MONO_TYPE_VAR:
        case MONO_TYPE_MVAR:
                /* FIXME: Martin, this is wrong. */
-               *align = abi__alignof__(gpointer);
+               *align = MONO_ABI_ALIGNOF (gpointer);
                return sizeof (gpointer);
        default:
                g_error ("mono_type_size: type 0x%02x unknown", t->type);
@@ -4430,7 +4426,7 @@ mono_type_stack_size_internal (MonoType *t, int *align, gboolean allow_open)
        int tmp;
 #if SIZEOF_VOID_P == SIZEOF_REGISTER
        int stack_slot_size = sizeof (gpointer);
-       int stack_slot_align = abi__alignof__ (gpointer);
+       int stack_slot_align = MONO_ABI_ALIGNOF (gpointer);
 #elif SIZEOF_VOID_P < SIZEOF_REGISTER
        int stack_slot_size = SIZEOF_REGISTER;
        int stack_slot_align = SIZEOF_REGISTER;
@@ -4475,17 +4471,14 @@ mono_type_stack_size_internal (MonoType *t, int *align, gboolean allow_open)
                *align = stack_slot_align;
                return stack_slot_size * 3;
        case MONO_TYPE_R4:
-               *align = abi__alignof__(float);
+               *align = MONO_ABI_ALIGNOF (float);
                return sizeof (float);          
        case MONO_TYPE_I8:
        case MONO_TYPE_U8:
-               if (i8_align)
-                       *align = i8_align;
-               else
-                       *align = abi__alignof__(gint64);
+               *align = MONO_ABI_ALIGNOF (gint64);
                return sizeof (gint64);         
        case MONO_TYPE_R8:
-               *align = abi__alignof__(double);
+               *align = MONO_ABI_ALIGNOF (double);
                return sizeof (double);
        case MONO_TYPE_VALUETYPE: {
                guint32 size;
index 0ed15e721aa12dcc9a4d4241a92bd082d4f65fd5..7b03ff5965c44ae9d575b06f33ae460190815e6d 100644 (file)
@@ -10,6 +10,7 @@
 
 #include "config.h"
 #include "loader.h"
+#include "mono/metadata/abi-details.h"
 #include "mono/metadata/method-builder.h"
 #include "mono/metadata/tabledefs.h"
 #include "mono/metadata/exception.h"
@@ -536,7 +537,7 @@ mono_mb_emit_exception_full (MonoMethodBuilder *mb, const char *exc_nspace, cons
        mono_mb_emit_op (mb, CEE_NEWOBJ, ctor);
        if (msg != NULL) {
                mono_mb_emit_byte (mb, CEE_DUP);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoException, message));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoException, message));
                mono_mb_emit_ldstr (mb, (char*)msg);
                mono_mb_emit_byte (mb, CEE_STIND_REF);
        }
index 9784437db466c668357eabedd4b8949d83363426..fc9814b33a1f4d9c51b38b05ca6aad8bcc18b71b 100644 (file)
@@ -12,6 +12,7 @@
 #include <glib.h>
 #include <string.h>
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/monitor.h>
 #include <mono/metadata/threads-types.h>
 #include <mono/metadata/exception.h>
@@ -73,18 +74,6 @@ enum {
  * an object.
  */
 
-struct _MonoThreadsSync
-{
-       gsize owner;                    /* thread ID */
-       guint32 nest;
-#ifdef HAVE_MOVING_COLLECTOR
-       gint32 hash_code;
-#endif
-       volatile gint32 entry_count;
-       HANDLE entry_sem;
-       GSList *wait_list;
-       void *data;
-};
 
 typedef struct _MonitorArray MonitorArray;
 
@@ -813,7 +802,7 @@ emit_obj_syncp_check (MonoMethodBuilder *mb, int syncp_loc, int *obj_null_branch
        /*
          ldarg         0                                                       obj
          conv.i                                                                objp
-         ldc.i4        G_STRUCT_OFFSET(MonoObject, synchronisation)            objp off
+         ldc.i4        MONO_STRUCT_OFFSET(MonoObject, synchronisation)         objp off
          add                                                                   &syncp
          ldind.i                                                               syncp
          stloc         syncp
@@ -823,7 +812,7 @@ emit_obj_syncp_check (MonoMethodBuilder *mb, int syncp_loc, int *obj_null_branch
 
        mono_mb_emit_byte (mb, CEE_LDARG_0);
        mono_mb_emit_byte (mb, CEE_CONV_I);
-       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoObject, synchronisation));
+       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoObject, synchronisation));
        mono_mb_emit_byte (mb, CEE_ADD);
        mono_mb_emit_byte (mb, CEE_LDIND_I);
        mono_mb_emit_stloc (mb, syncp_loc);
@@ -889,7 +878,6 @@ mono_monitor_get_fast_enter_method (MonoMethod *monitor_enter_method)
        static MonoMethod *compare_exchange_method;
        int obj_null_branch, true_locktaken_branch = 0, syncp_null_branch, has_owner_branch, other_owner_branch, tid_branch, thin_hash_branch;
        int tid_loc, syncp_loc, owner_loc;
-       int thread_tls_offset;
        gboolean is_v4 = mono_method_signature (monitor_enter_method)->param_count == 2;
        int fast_path_idx = is_v4 ? FASTPATH_ENTERV4 : FASTPATH_ENTER;
        WrapperInfo *info;
@@ -897,13 +885,12 @@ mono_monitor_get_fast_enter_method (MonoMethod *monitor_enter_method)
        /* The !is_v4 version is not used/tested */
        g_assert (is_v4);
 
-       thread_tls_offset = mono_thread_get_tls_offset ();
-       if (thread_tls_offset == -1)
-               return NULL;
-
        if (monitor_il_fastpaths [fast_path_idx])
                return monitor_il_fastpaths [fast_path_idx];
 
+       if (!mono_get_runtime_callbacks ()->tls_key_supported (TLS_KEY_THREAD))
+               return NULL;
+
        if (!compare_exchange_method) {
                MonoMethodDesc *desc;
                MonoClass *class;
@@ -932,12 +919,12 @@ mono_monitor_get_fast_enter_method (MonoMethod *monitor_enter_method)
 
        /*
          mono. tls     thread_tls_offset                                       threadp
-         ldc.i4        G_STRUCT_OFFSET(MonoThread, tid)                        threadp off
+         ldc.i4        MONO_STRUCT_OFFSET(MonoThread, tid)                     threadp off
          add                                                                   &tid
          ldind.i                                                               tid
          stloc         tid
          ldloc         syncp                                                   syncp
-         ldc.i4        G_STRUCT_OFFSET(MonoThreadsSync, owner)                 syncp off
+         ldc.i4        MONO_STRUCT_OFFSET(MonoThreadsSync, owner)                      syncp off
          add                                                                   &owner
          ldind.i                                                               owner
          stloc         owner
@@ -948,12 +935,12 @@ mono_monitor_get_fast_enter_method (MonoMethod *monitor_enter_method)
        mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
        mono_mb_emit_byte (mb, CEE_MONO_TLS);
        mono_mb_emit_i4 (mb, TLS_KEY_THREAD);
-       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoInternalThread, tid));
+       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoInternalThread, tid));
        mono_mb_emit_byte (mb, CEE_ADD);
        mono_mb_emit_byte (mb, CEE_LDIND_I);
        mono_mb_emit_stloc (mb, tid_loc);
        mono_mb_emit_ldloc (mb, syncp_loc);
-       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoThreadsSync, owner));
+       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoThreadsSync, owner));
        mono_mb_emit_byte (mb, CEE_ADD);
        mono_mb_emit_byte (mb, CEE_LDIND_I);
        mono_mb_emit_stloc (mb, owner_loc);
@@ -962,7 +949,7 @@ mono_monitor_get_fast_enter_method (MonoMethod *monitor_enter_method)
 
        /*
          ldloc         syncp                                                   syncp
-         ldc.i4        G_STRUCT_OFFSET(MonoThreadsSync, owner)                 syncp off
+         ldc.i4        MONO_STRUCT_OFFSET(MonoThreadsSync, owner)                      syncp off
          add                                                                   &owner
          ldloc         tid                                                     &owner tid
          ldc.i4        0                                                       &owner tid 0
@@ -972,7 +959,7 @@ mono_monitor_get_fast_enter_method (MonoMethod *monitor_enter_method)
        */
 
        mono_mb_emit_ldloc (mb, syncp_loc);
-       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoThreadsSync, owner));
+       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoThreadsSync, owner));
        mono_mb_emit_byte (mb, CEE_ADD);
        mono_mb_emit_ldloc (mb, tid_loc);
        mono_mb_emit_byte (mb, CEE_LDC_I4_0);
@@ -992,7 +979,7 @@ mono_monitor_get_fast_enter_method (MonoMethod *monitor_enter_method)
          ldloc         tid                                                     owner tid
          brne.s        other_owner
          ldloc         syncp                                                   syncp
-         ldc.i4        G_STRUCT_OFFSET(MonoThreadsSync, nest)                  syncp off
+         ldc.i4        MONO_STRUCT_OFFSET(MonoThreadsSync, nest)                       syncp off
          add                                                                   &nest
          dup                                                                   &nest &nest
          ldind.i4                                                              &nest nest
@@ -1007,7 +994,7 @@ mono_monitor_get_fast_enter_method (MonoMethod *monitor_enter_method)
        mono_mb_emit_ldloc (mb, tid_loc);
        other_owner_branch = mono_mb_emit_short_branch (mb, CEE_BNE_UN_S);
        mono_mb_emit_ldloc (mb, syncp_loc);
-       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoThreadsSync, nest));
+       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoThreadsSync, nest));
        mono_mb_emit_byte (mb, CEE_ADD);
        mono_mb_emit_byte (mb, CEE_DUP);
        mono_mb_emit_byte (mb, CEE_LDIND_I4);
@@ -1061,17 +1048,15 @@ mono_monitor_get_fast_exit_method (MonoMethod *monitor_exit_method)
        MonoMethodBuilder *mb;
        MonoMethod *res;
        int obj_null_branch, has_waiting_branch, has_syncp_branch, owned_branch, nested_branch, thin_hash_branch;
-       int thread_tls_offset;
        int syncp_loc;
        WrapperInfo *info;
 
-       thread_tls_offset = mono_thread_get_tls_offset ();
-       if (thread_tls_offset == -1)
-               return NULL;
-
        if (monitor_il_fastpaths [FASTPATH_EXIT])
                return monitor_il_fastpaths [FASTPATH_EXIT];
 
+       if (!mono_get_runtime_callbacks ()->tls_key_supported (TLS_KEY_THREAD))
+               return NULL;
+
        mb = mono_mb_new (mono_defaults.monitor_class, "FastMonitorExit", MONO_WRAPPER_UNKNOWN);
 
        mb->method->slot = -1;
@@ -1092,11 +1077,11 @@ mono_monitor_get_fast_exit_method (MonoMethod *monitor_exit_method)
        /*
         has_syncp:
          ldloc         syncp                                                   syncp
-         ldc.i4        G_STRUCT_OFFSET(MonoThreadsSync, owner)                 syncp off
+         ldc.i4        MONO_STRUCT_OFFSET(MonoThreadsSync, owner)                      syncp off
          add                                                                   &owner
          ldind.i                                                               owner
          mono. tls     thread_tls_offset                                       owner threadp
-         ldc.i4        G_STRUCT_OFFSET(MonoThread, tid)                        owner threadp off
+         ldc.i4        MONO_STRUCT_OFFSET(MonoThread, tid)                     owner threadp off
          add                                                                   owner &tid
          ldind.i                                                               owner tid
          beq.s         owned
@@ -1104,13 +1089,13 @@ mono_monitor_get_fast_exit_method (MonoMethod *monitor_exit_method)
 
        mono_mb_patch_short_branch (mb, has_syncp_branch);
        mono_mb_emit_ldloc (mb, syncp_loc);
-       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoThreadsSync, owner));
+       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoThreadsSync, owner));
        mono_mb_emit_byte (mb, CEE_ADD);
        mono_mb_emit_byte (mb, CEE_LDIND_I);
        mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
        mono_mb_emit_byte (mb, CEE_MONO_TLS);
        mono_mb_emit_i4 (mb, TLS_KEY_THREAD);
-       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoInternalThread, tid));
+       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoInternalThread, tid));
        mono_mb_emit_byte (mb, CEE_ADD);
        mono_mb_emit_byte (mb, CEE_LDIND_I);
        owned_branch = mono_mb_emit_short_branch (mb, CEE_BEQ_S);
@@ -1124,7 +1109,7 @@ mono_monitor_get_fast_exit_method (MonoMethod *monitor_exit_method)
        /*
         owned:
          ldloc         syncp                                                   syncp
-         ldc.i4        G_STRUCT_OFFSET(MonoThreadsSync, nest)                  syncp off
+         ldc.i4        MONO_STRUCT_OFFSET(MonoThreadsSync, nest)                       syncp off
          add                                                                   &nest
          dup                                                                   &nest &nest
          ldind.i4                                                              &nest nest
@@ -1135,7 +1120,7 @@ mono_monitor_get_fast_exit_method (MonoMethod *monitor_exit_method)
 
        mono_mb_patch_short_branch (mb, owned_branch);
        mono_mb_emit_ldloc (mb, syncp_loc);
-       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoThreadsSync, nest));
+       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoThreadsSync, nest));
        mono_mb_emit_byte (mb, CEE_ADD);
        mono_mb_emit_byte (mb, CEE_DUP);
        mono_mb_emit_byte (mb, CEE_LDIND_I4);
@@ -1147,7 +1132,7 @@ mono_monitor_get_fast_exit_method (MonoMethod *monitor_exit_method)
          pop                                                                   &nest
          pop
          ldloc         syncp                                                   syncp
-         ldc.i4        G_STRUCT_OFFSET(MonoThreadsSync, entry_count)           syncp off
+         ldc.i4        MONO_STRUCT_OFFSET(MonoThreadsSync, entry_count)                syncp off
          add                                                                   &count
          ldind.i4                                                              count
          brtrue.s      has_waiting
@@ -1156,14 +1141,14 @@ mono_monitor_get_fast_exit_method (MonoMethod *monitor_exit_method)
        mono_mb_emit_byte (mb, CEE_POP);
        mono_mb_emit_byte (mb, CEE_POP);
        mono_mb_emit_ldloc (mb, syncp_loc);
-       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoThreadsSync, entry_count));
+       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoThreadsSync, entry_count));
        mono_mb_emit_byte (mb, CEE_ADD);
        mono_mb_emit_byte (mb, CEE_LDIND_I4);
        has_waiting_branch = mono_mb_emit_short_branch (mb, CEE_BRTRUE_S);
 
        /*
          ldloc         syncp                                                   syncp
-         ldc.i4        G_STRUCT_OFFSET(MonoThreadsSync, owner)                 syncp off
+         ldc.i4        MONO_STRUCT_OFFSET(MonoThreadsSync, owner)                      syncp off
          add                                                                   &owner
          ldnull                                                                &owner 0
          stind.i
@@ -1171,7 +1156,7 @@ mono_monitor_get_fast_exit_method (MonoMethod *monitor_exit_method)
        */
 
        mono_mb_emit_ldloc (mb, syncp_loc);
-       mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoThreadsSync, owner));
+       mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoThreadsSync, owner));
        mono_mb_emit_byte (mb, CEE_ADD);
        mono_mb_emit_byte (mb, CEE_LDNULL);
        mono_mb_emit_byte (mb, CEE_STIND_I);
@@ -1244,9 +1229,9 @@ mono_monitor_threads_sync_members_offset (int *owner_offset, int *nest_offset, i
 
 #define ENCODE_OFF_SIZE(o,s)   (((o) << 8) | ((s) & 0xff))
 
-       *owner_offset = ENCODE_OFF_SIZE (G_STRUCT_OFFSET (MonoThreadsSync, owner), sizeof (ts.owner));
-       *nest_offset = ENCODE_OFF_SIZE (G_STRUCT_OFFSET (MonoThreadsSync, nest), sizeof (ts.nest));
-       *entry_count_offset = ENCODE_OFF_SIZE (G_STRUCT_OFFSET (MonoThreadsSync, entry_count), sizeof (ts.entry_count));
+       *owner_offset = ENCODE_OFF_SIZE (MONO_STRUCT_OFFSET (MonoThreadsSync, owner), sizeof (ts.owner));
+       *nest_offset = ENCODE_OFF_SIZE (MONO_STRUCT_OFFSET (MonoThreadsSync, nest), sizeof (ts.nest));
+       *entry_count_offset = ENCODE_OFF_SIZE (MONO_STRUCT_OFFSET (MonoThreadsSync, entry_count), sizeof (ts.entry_count));
 }
 
 gboolean 
index 183c2ec0b52371a31601b76efe469fc801cb53ab..a32780dcdfea902b5def43a335c17c5532f864ff 100644 (file)
 
 #include <glib.h>
 #include <mono/metadata/object.h>
+#include <mono/io-layer/io-layer.h>
 #include "mono/utils/mono-compiler.h"
 
 G_BEGIN_DECLS
 
+struct _MonoThreadsSync
+{
+       gsize owner;                    /* thread ID */
+       guint32 nest;
+#ifdef HAVE_MOVING_COLLECTOR
+       gint32 hash_code;
+#endif
+       volatile gint32 entry_count;
+       HANDLE entry_sem;
+       GSList *wait_list;
+       void *data;
+};
+
+
 MONO_API void mono_locks_dump (gboolean include_untaken);
 
 void mono_monitor_init (void) MONO_INTERNAL;
index a5f3ff809ad9c4faffcc2e7c390445aebfc0fb82..49fac50c681e62f74e823ec6f9808bf6a7048c88 100644 (file)
@@ -68,7 +68,7 @@ struct _MonoGHashTable {
 #ifdef HAVE_SGEN_GC
 static void *table_hash_descr = NULL;
 
-static void mono_g_hash_mark (void *addr, MonoGCMarkFunc mark_func);
+static void mono_g_hash_mark (void *addr, MonoGCMarkFunc mark_func, void *gc_data);
 
 static Slot*
 new_slot (MonoGHashTable *hash)
@@ -481,7 +481,7 @@ mono_g_hash_table_print_stats (MonoGHashTable *table)
 
 /* GC marker function */
 static void
-mono_g_hash_mark (void *addr, MonoGCMarkFunc mark_func)
+mono_g_hash_mark (void *addr, MonoGCMarkFunc mark_func, void *gc_data)
 {
        MonoGHashTable *table = (MonoGHashTable*)addr;
        Slot *node;
@@ -491,23 +491,23 @@ mono_g_hash_mark (void *addr, MonoGCMarkFunc mark_func)
                for (i = 0; i < table->table_size; i++) {
                        for (node = table->table [i]; node; node = node->next) {
                                if (node->key)
-                                       mark_func (&node->key);
+                                       mark_func (&node->key, gc_data);
                        }
                }
        } else if (table->gc_type == MONO_HASH_VALUE_GC) {
                for (i = 0; i < table->table_size; i++) {
                        for (node = table->table [i]; node; node = node->next) {
                                if (node->value)
-                                       mark_func (&node->value);
+                                       mark_func (&node->value, gc_data);
                        }
                }
        } else if (table->gc_type == MONO_HASH_KEY_VALUE_GC) {
                for (i = 0; i < table->table_size; i++) {
                        for (node = table->table [i]; node; node = node->next) {
                                if (node->key)
-                                       mark_func (&node->key);
+                                       mark_func (&node->key, gc_data);
                                if (node->value)
-                                       mark_func (&node->value);
+                                       mark_func (&node->value, gc_data);
                        }
                }
        }
index 0715ac9a783edd0fc32e92bededf488a99943675..397f3849f3d62e0d425a0301fd586d44f3af79df 100644 (file)
@@ -385,7 +385,7 @@ mono_gc_conservatively_scan_area (void *start, void *end)
 }
 
 void *
-mono_gc_scan_object (void *obj)
+mono_gc_scan_object (void *obj, void *gc_data)
 {
        g_assert_not_reached ();
        return NULL;
index eea738a1e7c502955eae208415d6347e62b21950..9ec3893765a22731c39b454ae05c7497d5a1dfa7 100644 (file)
@@ -596,6 +596,7 @@ typedef struct {
        void     (*set_cast_details) (MonoClass *from, MonoClass *to);
        void     (*debug_log) (int level, MonoString *category, MonoString *message);
        gboolean (*debug_log_is_enabled) (void);
+       gboolean (*tls_key_supported) (MonoTlsKey key);
 } MonoRuntimeCallbacks;
 
 typedef gboolean (*MonoInternalStackWalk) (MonoStackFrameInfo *frame, MonoContext *ctx, gpointer data);
diff --git a/mono/metadata/object-offsets.h b/mono/metadata/object-offsets.h
new file mode 100644 (file)
index 0000000..b094e40
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+This is a parameterized header. It's supposed/ok to be included multiple times.
+
+Input defines: (those to be defined by the includer file)
+
+Required:
+DECL_OFFSET(struct,field)
+DECL_OFFSET2(struct,field,offset)
+DECL_ALIGN(name,type)
+DECL_ALIGN2(name,alignment)
+
+Optional:
+USE_CROSS_COMPILE_OFFSETS - if defined, force the cross compiler offsets to be used, otherwise
+       they will only be used if MONO_CROSS_COMPILE is defined
+
+Output defines:
+
+HAS_CROSS_COMPILER_OFFSETS - if set, it means we found some cross offsets, it doesnt mean we'll use it.
+USED_CROSS_COMPILER_OFFSETS - if set, it means we used the cross offsets
+*/
+
+
+#undef HAS_CROSS_COMPILER_OFFSETS
+#undef USED_CROSS_COMPILER_OFFSETS
+
+#ifdef ENABLE_EXTENSION_MODULE
+#include "../../../mono-extensions/mono/metadata/object-offsets.h"
+#endif
+
+
+#ifndef USED_CROSS_COMPILER_OFFSETS
+
+DECL_ALIGN(gint8)
+DECL_ALIGN(gint16)
+DECL_ALIGN(gint32)
+DECL_ALIGN(gint64)
+DECL_ALIGN(float)
+DECL_ALIGN(double)
+DECL_ALIGN(gpointer)
+
+#ifndef DISABLE_METADATA_OFFSETS
+//object offsets
+DECL_OFFSET(MonoObject, vtable)
+DECL_OFFSET(MonoObject, synchronisation)
+
+DECL_OFFSET(MonoClass, interface_bitmap)
+DECL_OFFSET(MonoClass, byval_arg)
+DECL_OFFSET(MonoClass, cast_class)
+DECL_OFFSET(MonoClass, element_class)
+DECL_OFFSET(MonoClass, idepth)
+DECL_OFFSET(MonoClass, instance_size)
+DECL_OFFSET(MonoClass, interface_id)
+DECL_OFFSET(MonoClass, max_interface_id)
+DECL_OFFSET(MonoClass, parent)
+DECL_OFFSET(MonoClass, rank)
+DECL_OFFSET(MonoClass, sizes)
+DECL_OFFSET(MonoClass, supertypes)
+
+DECL_OFFSET(MonoVTable, klass)
+DECL_OFFSET(MonoVTable, max_interface_id)
+DECL_OFFSET(MonoVTable, interface_bitmap)
+DECL_OFFSET(MonoVTable, vtable)
+DECL_OFFSET(MonoVTable, rank)
+DECL_OFFSET(MonoVTable, type)
+DECL_OFFSET(MonoVTable, runtime_generic_context)
+
+DECL_OFFSET(MonoDomain, stack_overflow_ex)
+
+DECL_OFFSET(MonoDelegate, target)
+DECL_OFFSET(MonoDelegate, method_ptr)
+DECL_OFFSET(MonoDelegate, invoke_impl)
+DECL_OFFSET(MonoDelegate, method)
+DECL_OFFSET(MonoDelegate, method_code)
+
+DECL_OFFSET(MonoInternalThread, tid)
+DECL_OFFSET(MonoInternalThread, static_data)
+
+DECL_OFFSET(MonoMulticastDelegate, prev)
+
+DECL_OFFSET(MonoTransparentProxy, rp)
+DECL_OFFSET(MonoTransparentProxy, remote_class)
+DECL_OFFSET(MonoTransparentProxy, custom_type_info)
+
+DECL_OFFSET(MonoRealProxy, target_domain_id)
+DECL_OFFSET(MonoRealProxy, context)
+DECL_OFFSET(MonoRealProxy, unwrapped_server)
+
+DECL_OFFSET(MonoRemoteClass, proxy_class)
+
+DECL_OFFSET(MonoArray, vector)
+DECL_OFFSET(MonoArray, max_length)
+DECL_OFFSET(MonoArray, bounds)
+
+DECL_OFFSET(MonoArrayBounds, lower_bound)
+DECL_OFFSET(MonoArrayBounds, length)
+
+DECL_OFFSET(MonoSafeHandle, handle)
+
+DECL_OFFSET(MonoHandleRef, handle)
+
+DECL_OFFSET(MonoComInteropProxy, com_object)
+
+DECL_OFFSET(MonoString, length)
+DECL_OFFSET(MonoString, chars)
+
+DECL_OFFSET(MonoException, message)
+
+DECL_OFFSET(MonoTypedRef, type)
+DECL_OFFSET(MonoTypedRef, klass)
+DECL_OFFSET(MonoTypedRef, value)
+
+//Internal structs
+DECL_OFFSET(MonoThreadsSync, owner)
+DECL_OFFSET(MonoThreadsSync, nest)
+DECL_OFFSET(MonoThreadsSync, entry_count)
+
+#if defined (HAVE_SGEN_GC) && !defined (HAVE_KW_THREAD)
+DECL_OFFSET(SgenThreadInfo, tlab_next_addr)
+DECL_OFFSET(SgenThreadInfo, tlab_temp_end)
+#endif
+
+#endif //DISABLE METADATA OFFSETS
+
+#ifndef DISABLE_JIT_OFFSETS
+DECL_OFFSET(MonoLMF, previous_lmf)
+
+DECL_OFFSET(MonoMethodRuntimeGenericContext, class_vtable)
+
+DECL_OFFSET(MonoJitTlsData, lmf)
+DECL_OFFSET(MonoJitTlsData, class_cast_from)
+DECL_OFFSET(MonoJitTlsData, class_cast_to)
+DECL_OFFSET(MonoJitTlsData, handler_block_return_address)
+DECL_OFFSET(MonoJitTlsData, restore_stack_prot)
+
+DECL_OFFSET(MonoGSharedVtMethodRuntimeInfo, locals_size)
+DECL_OFFSET(MonoGSharedVtMethodRuntimeInfo, entries) //XXX more to fix here
+
+DECL_OFFSET(MonoContinuation, stack_used_size)
+DECL_OFFSET(MonoContinuation, saved_stack)
+DECL_OFFSET(MonoContinuation, return_sp)
+DECL_OFFSET(MonoContinuation, lmf)
+DECL_OFFSET(MonoContinuation, return_ip)
+
+#ifdef TARGET_X86
+DECL_OFFSET(MonoContext, eax)
+DECL_OFFSET(MonoContext, ebx)
+DECL_OFFSET(MonoContext, ecx)
+DECL_OFFSET(MonoContext, edx)
+DECL_OFFSET(MonoContext, edi)
+DECL_OFFSET(MonoContext, esi)
+DECL_OFFSET(MonoContext, esp)
+DECL_OFFSET(MonoContext, ebp)
+DECL_OFFSET(MonoContext, eip)
+
+DECL_OFFSET(MonoLMF, method)
+DECL_OFFSET(MonoLMF, lmf_addr)
+DECL_OFFSET(MonoLMF, esp)
+DECL_OFFSET(MonoLMF, ebx)
+DECL_OFFSET(MonoLMF, edi)
+DECL_OFFSET(MonoLMF, esi)
+DECL_OFFSET(MonoLMF, ebp)
+DECL_OFFSET(MonoLMF, eip)
+#endif
+
+#ifdef TARGET_ARM
+DECL_OFFSET (MonoContext, pc)
+DECL_OFFSET (MonoContext, regs)
+DECL_OFFSET (MonoContext, fregs)
+
+DECL_OFFSET(MonoLMF, method)
+DECL_OFFSET(MonoLMF, lmf_addr)
+DECL_OFFSET(MonoLMF, sp)
+DECL_OFFSET(MonoLMF, fp)
+DECL_OFFSET(MonoLMF, ip)
+DECL_OFFSET(MonoLMF, iregs)
+DECL_OFFSET(MonoLMF, fregs)
+
+DECL_OFFSET(SeqPointInfo, bp_addrs)
+DECL_OFFSET(SeqPointInfo, ss_trigger_page)
+
+DECL_OFFSET(DynCallArgs, res)
+DECL_OFFSET(DynCallArgs, res2)
+#endif
+
+#ifdef TARGET_AMD64
+DECL_OFFSET(MonoContext, rax)
+DECL_OFFSET(MonoContext, rcx)
+DECL_OFFSET(MonoContext, rdx)
+DECL_OFFSET(MonoContext, rbx)
+DECL_OFFSET(MonoContext, rbp)
+DECL_OFFSET(MonoContext, rsi)
+DECL_OFFSET(MonoContext, rdi)
+DECL_OFFSET(MonoContext, rsp)
+DECL_OFFSET(MonoContext, r8)
+DECL_OFFSET(MonoContext, r9)
+DECL_OFFSET(MonoContext, r10)
+DECL_OFFSET(MonoContext, r12)
+DECL_OFFSET(MonoContext, r13)
+DECL_OFFSET(MonoContext, r14)
+DECL_OFFSET(MonoContext, r15)
+DECL_OFFSET(MonoContext, rip)
+
+#ifdef TARGET_WIN32
+DECL_OFFSET(MonoLMF, lmf_addr)
+#endif
+
+DECL_OFFSET(MonoLMF, rsp)
+DECL_OFFSET(MonoLMF, rbp)
+DECL_OFFSET(MonoLMF, rip)
+
+DECL_OFFSET(SeqPointInfo, bp_addrs)
+DECL_OFFSET(DynCallArgs, res)
+DECL_OFFSET(SeqPointInfo, ss_trigger_page)
+
+DECL_OFFSET(MonoLMFTramp, regs)
+DECL_OFFSET(MonoLMFTramp, lmf_addr)
+
+#endif
+
+#endif
+
+#endif
+
+#undef DECL_OFFSET
+#undef DECL_OFFSET2
+#undef DECL_ALIGN
+#undef DECL_ALIGN2
+#undef USE_CROSS_COMPILE_OFFSETS
index 7434a69448beab806976b14cc789f8a6c3406e5a..305a48820b980825278dd59f8c6005160cab9611 100644 (file)
@@ -1350,6 +1350,9 @@ build_imt_slots (MonoClass *klass, MonoVTable *vt, MonoDomain *domain, gpointer*
                        int method_slot_in_interface;
                        for (method_slot_in_interface = 0; method_slot_in_interface < iface->method.count; method_slot_in_interface++) {
                                MonoMethod *method = mono_class_get_method_by_index (iface, method_slot_in_interface);
+
+                               if (method->is_generic)
+                                       has_generic_virtual = TRUE;
                                add_imt_builder_entry (imt_builder, method, &imt_collisions_bitmap, interface_offset + method_slot_in_interface, slot_num);
                        }
                        interface_offset += iface->method.count;
index 7ac72db6df04998a4216c84592db8bdb67048f66..254f15d5bbca9ab7e24b130945f000c5fee7617d 100644 (file)
@@ -45,6 +45,7 @@
 #include "metadata/profiler-private.h"
 #include "metadata/marshal.h"
 #include "metadata/method-builder.h"
+#include "metadata/abi-details.h"
 #include "utils/mono-memory-model.h"
 #include "utils/mono-counters.h"
 
@@ -117,13 +118,13 @@ alloc_degraded (MonoVTable *vtable, size_t size, gboolean for_mature)
        void *p;
 
        if (!for_mature) {
-               if (last_major_gc_warned < stat_major_gcs) {
+               if (last_major_gc_warned < gc_stats.major_gc_count) {
                        ++num_degraded;
                        if (num_degraded == 1 || num_degraded == 3)
                                mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_GC, "Warning: Degraded allocation.  Consider increasing nursery-size if the warning persists.");
                        else if (num_degraded == 10)
                                mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_GC, "Warning: Repeated degraded allocation.  Consider increasing nursery-size.");
-                       last_major_gc_warned = stat_major_gcs;
+                       last_major_gc_warned = gc_stats.major_gc_count;
                }
                SGEN_ATOMIC_ADD_P (degraded_mode, size);
                sgen_ensure_free_space (size);
@@ -797,10 +798,10 @@ create_allocator (int atype)
        if (atype == ATYPE_NORMAL || atype == ATYPE_SMALL) {
                /* size = vtable->klass->instance_size; */
                mono_mb_emit_ldarg (mb, 0);
-               mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoVTable, klass));
+               mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoVTable, klass));
                mono_mb_emit_byte (mb, CEE_ADD);
                mono_mb_emit_byte (mb, CEE_LDIND_I);
-               mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoClass, instance_size));
+               mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoClass, instance_size));
                mono_mb_emit_byte (mb, CEE_ADD);
                /* FIXME: assert instance_size stays a 4 byte integer */
                mono_mb_emit_byte (mb, CEE_LDIND_U4);
@@ -840,10 +841,10 @@ create_allocator (int atype)
 
                /* vtable->klass->sizes.element_size */
                mono_mb_emit_ldarg (mb, 0);
-               mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoVTable, klass));
+               mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoVTable, klass));
                mono_mb_emit_byte (mb, CEE_ADD);
                mono_mb_emit_byte (mb, CEE_LDIND_I);
-               mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoClass, sizes.element_size));
+               mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoClass, sizes));
                mono_mb_emit_byte (mb, CEE_ADD);
                mono_mb_emit_byte (mb, CEE_LDIND_U4);
                mono_mb_emit_byte (mb, CEE_CONV_I);
@@ -940,7 +941,7 @@ create_allocator (int atype)
 
        /* tlab_next_addr (local) = tlab_next_addr (TLS var) */
        tlab_next_addr_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
-       EMIT_TLS_ACCESS (mb, tlab_next_addr, TLS_KEY_SGEN_TLAB_NEXT_ADDR);
+       EMIT_TLS_ACCESS_NEXT_ADDR (mb);
        mono_mb_emit_stloc (mb, tlab_next_addr_var);
 
        /* p = (void**)tlab_next; */
@@ -959,7 +960,7 @@ create_allocator (int atype)
 
        /* if (G_LIKELY (new_next < tlab_temp_end)) */
        mono_mb_emit_ldloc (mb, new_next_var);
-       EMIT_TLS_ACCESS (mb, tlab_temp_end, TLS_KEY_SGEN_TLAB_TEMP_END);
+       EMIT_TLS_ACCESS_TEMP_END (mb);
        slowpath_branch = mono_mb_emit_short_branch (mb, MONO_CEE_BLT_UN_S);
 
        /* Slowpath */
@@ -1007,7 +1008,7 @@ create_allocator (int atype)
        if (atype == ATYPE_VECTOR) {
                /* arr->max_length = max_length; */
                mono_mb_emit_ldloc (mb, p_var);
-               mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoArray, max_length));
+               mono_mb_emit_ldflda (mb, MONO_STRUCT_OFFSET (MonoArray, max_length));
                mono_mb_emit_ldarg (mb, 1);
 #ifdef MONO_BIG_ARRAYS
                mono_mb_emit_byte (mb, CEE_STIND_I);
@@ -1018,7 +1019,7 @@ create_allocator (int atype)
                /* need to set length and clear the last char */
                /* s->length = len; */
                mono_mb_emit_ldloc (mb, p_var);
-               mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoString, length));
+               mono_mb_emit_icon (mb, MONO_STRUCT_OFFSET (MonoString, length));
                mono_mb_emit_byte (mb, MONO_CEE_ADD);
                mono_mb_emit_ldarg (mb, 1);
                mono_mb_emit_byte (mb, MONO_CEE_STIND_I4);
index 131bdbee32a66948a702f12c5fac8ecf7b380762..aab3bcb6153332ff59565ab941b449aea71b0fdf 100644 (file)
@@ -45,6 +45,8 @@
 #endif
 #include <sys/types.h>
 
+#define ARRAY_OBJ_INDEX(ptr,array,elem_size) (((char*)(ptr) - ((char*)(array) + G_STRUCT_OFFSET (MonoArray, vector))) / (elem_size))
+
 guint8 *sgen_cardtable;
 
 static gboolean need_mod_union;
index 616ca6befc3750e2302ce8d96d83d9de31b072b4..1387676c75858cb57b6c6a403fb0f00d78705c1e 100644 (file)
@@ -640,7 +640,7 @@ static MonoObject *check_key = NULL;
 static RootRecord *check_root = NULL;
 
 static void
-check_root_obj_specific_ref_from_marker (void **obj)
+check_root_obj_specific_ref_from_marker (void **obj, void *gc_data)
 {
        check_root_obj_specific_ref (check_root, check_key, *obj);
 }
@@ -687,7 +687,7 @@ scan_roots_for_specific_ref (MonoObject *key, int root_type)
                }
                case ROOT_DESC_USER: {
                        MonoGCRootMarkFunc marker = sgen_get_user_descriptor_func (desc);
-                       marker (start_root, check_root_obj_specific_ref_from_marker);
+                       marker (start_root, check_root_obj_specific_ref_from_marker, NULL);
                        break;
                }
                case ROOT_DESC_RUN_LEN:
@@ -735,6 +735,13 @@ check_obj_not_in_domain (void **o)
        g_assert (((MonoObject*)(*o))->vtable->domain != check_domain);
 }
 
+
+static void
+check_obj_not_in_domain_callback (void **o, void *gc_data)
+{
+       g_assert (((MonoObject*)(*o))->vtable->domain != check_domain);
+}
+
 void
 sgen_scan_for_registered_roots_in_domain (MonoDomain *domain, int root_type)
 {
@@ -779,7 +786,7 @@ sgen_scan_for_registered_roots_in_domain (MonoDomain *domain, int root_type)
                }
                case ROOT_DESC_USER: {
                        MonoGCRootMarkFunc marker = sgen_get_user_descriptor_func (desc);
-                       marker (start_root, check_obj_not_in_domain);
+                       marker (start_root, check_obj_not_in_domain_callback, NULL);
                        break;
                }
                case ROOT_DESC_RUN_LEN:
index b3c69379e81e737304ea59e6616455b287b9fb17..dab50ef57a52c7679e84b07ffd21343b4accd55b 100644 (file)
@@ -322,9 +322,6 @@ static int stat_wbarrier_value_copy = 0;
 static int stat_wbarrier_object_copy = 0;
 #endif
 
-int stat_minor_gcs = 0;
-int stat_major_gcs = 0;
-
 static long long stat_pinned_objects = 0;
 
 static long long time_minor_pre_collection_fragment_clear = 0;
@@ -1239,24 +1236,10 @@ typedef struct {
        GrayQueue *queue;
 } UserCopyOrMarkData;
 
-static MonoNativeTlsKey user_copy_or_mark_key;
-
 static void
-init_user_copy_or_mark_key (void)
+single_arg_user_copy_or_mark (void **obj, void *gc_data)
 {
-       mono_native_tls_alloc (&user_copy_or_mark_key, NULL);
-}
-
-static void
-set_user_copy_or_mark_data (UserCopyOrMarkData *data)
-{
-       mono_native_tls_set_value (user_copy_or_mark_key, data);
-}
-
-static void
-single_arg_user_copy_or_mark (void **obj)
-{
-       UserCopyOrMarkData *data = mono_native_tls_get_value (user_copy_or_mark_key);
+       UserCopyOrMarkData *data = gc_data;
 
        data->func (obj, data->queue);
 }
@@ -1312,9 +1295,7 @@ precisely_scan_objects_from (void** start_root, void** end_root, char* n_start,
        case ROOT_DESC_USER: {
                UserCopyOrMarkData data = { copy_func, queue };
                MonoGCRootMarkFunc marker = sgen_get_user_descriptor_func (desc);
-               set_user_copy_or_mark_data (&data);
-               marker (start_root, single_arg_user_copy_or_mark);
-               set_user_copy_or_mark_data (NULL);
+               marker (start_root, single_arg_user_copy_or_mark, &data);
                break;
        }
        case ROOT_DESC_RUN_LEN:
@@ -1456,7 +1437,7 @@ report_finalizer_roots (void)
 static GCRootReport *root_report;
 
 static void
-single_arg_report_root (void **obj)
+single_arg_report_root (void **obj, void *gc_data)
 {
        if (*obj)
                add_profile_gc_root (root_report, *obj, MONO_PROFILE_GC_ROOT_OTHER, 0);
@@ -1498,7 +1479,7 @@ precisely_report_roots_from (GCRootReport *report, void** start_root, void** end
        case ROOT_DESC_USER: {
                MonoGCRootMarkFunc marker = sgen_get_user_descriptor_func (desc);
                root_report = report;
-               marker (start_root, single_arg_report_root);
+               marker (start_root, single_arg_report_root, NULL);
                break;
        }
        case ROOT_DESC_RUN_LEN:
@@ -2211,7 +2192,7 @@ collect_nursery (SgenGrayQueue *unpin_queue, gboolean finish_up_concurrent_mark)
                return TRUE;
 
        MONO_GC_BEGIN (GENERATION_NURSERY);
-       binary_protocol_collection_begin (stat_minor_gcs, GENERATION_NURSERY);
+       binary_protocol_collection_begin (gc_stats.minor_gc_count, GENERATION_NURSERY);
 
        verify_nursery ();
 
@@ -2237,7 +2218,7 @@ collect_nursery (SgenGrayQueue *unpin_queue, gboolean finish_up_concurrent_mark)
        /* FIXME: optimize later to use the higher address where an object can be present */
        nursery_next = MAX (nursery_next, sgen_get_nursery_end ());
 
-       SGEN_LOG (1, "Start nursery collection %d %p-%p, size: %d", stat_minor_gcs, sgen_get_nursery_start (), nursery_next, (int)(nursery_next - sgen_get_nursery_start ()));
+       SGEN_LOG (1, "Start nursery collection %d %p-%p, size: %d", gc_stats.minor_gc_count, sgen_get_nursery_start (), nursery_next, (int)(nursery_next - sgen_get_nursery_start ()));
        max_garbage_amount = nursery_next - sgen_get_nursery_start ();
        g_assert (nursery_section->size >= max_garbage_amount);
 
@@ -2261,7 +2242,6 @@ collect_nursery (SgenGrayQueue *unpin_queue, gboolean finish_up_concurrent_mark)
 
        init_gray_queue ();
 
-       stat_minor_gcs++;
        gc_stats.minor_gc_count ++;
 
        MONO_GC_CHECKPOINT_1 (GENERATION_NURSERY);
@@ -2429,7 +2409,7 @@ collect_nursery (SgenGrayQueue *unpin_queue, gboolean finish_up_concurrent_mark)
        gc_stats.minor_gc_time_usecs += TV_ELAPSED (all_atv, all_btv);
 
        if (heap_dump_file)
-               dump_heap ("minor", stat_minor_gcs - 1, NULL);
+               dump_heap ("minor", gc_stats.minor_gc_count - 1, NULL);
 
        /* prepare the pin queue for the next collection */
        sgen_finish_pinning ();
@@ -2457,7 +2437,7 @@ collect_nursery (SgenGrayQueue *unpin_queue, gboolean finish_up_concurrent_mark)
        objects_pinned = 0;
 
        MONO_GC_END (GENERATION_NURSERY);
-       binary_protocol_collection_end (stat_minor_gcs - 1, GENERATION_NURSERY);
+       binary_protocol_collection_end (gc_stats.minor_gc_count - 1, GENERATION_NURSERY);
 
        if (check_nursery_objects_pinned && !sgen_minor_collector.is_split)
                sgen_check_nursery_objects_pinned (unpin_queue != NULL);
@@ -2755,7 +2735,7 @@ static void
 major_start_collection (gboolean concurrent, size_t *old_next_pin_slot)
 {
        MONO_GC_BEGIN (GENERATION_OLD);
-       binary_protocol_collection_begin (stat_major_gcs, GENERATION_OLD);
+       binary_protocol_collection_begin (gc_stats.major_gc_count, GENERATION_OLD);
 
        current_collection_generation = GENERATION_OLD;
 #ifndef DISABLE_PERFCOUNTERS
@@ -2785,8 +2765,7 @@ major_start_collection (gboolean concurrent, size_t *old_next_pin_slot)
        check_scan_starts ();
 
        degraded_mode = 0;
-       SGEN_LOG (1, "Start major collection %d", stat_major_gcs);
-       stat_major_gcs++;
+       SGEN_LOG (1, "Start major collection %d", gc_stats.major_gc_count);
        gc_stats.major_gc_count ++;
 
        if (major_collector.start_major_collection)
@@ -2945,7 +2924,7 @@ major_finish_collection (const char *reason, size_t old_next_pin_slot, gboolean
        time_major_fragment_creation += TV_ELAPSED (btv, atv);
 
        if (heap_dump_file)
-               dump_heap ("major", stat_major_gcs - 1, reason);
+               dump_heap ("major", gc_stats.major_gc_count - 1, reason);
 
        if (fin_ready_list || critical_fin_list) {
                SGEN_LOG (4, "Finalizer-thread wakeup: ready %d", num_ready_finalizers);
@@ -2971,7 +2950,7 @@ major_finish_collection (const char *reason, size_t old_next_pin_slot, gboolean
        //consistency_check ();
 
        MONO_GC_END (GENERATION_OLD);
-       binary_protocol_collection_end (stat_major_gcs - 1, GENERATION_OLD);
+       binary_protocol_collection_end (gc_stats.major_gc_count - 1, GENERATION_OLD);
 }
 
 static gboolean
@@ -3715,9 +3694,9 @@ mono_gc_conservatively_scan_area (void *start, void *end)
 }
 
 void*
-mono_gc_scan_object (void *obj)
+mono_gc_scan_object (void *obj, void *gc_data)
 {
-       UserCopyOrMarkData *data = mono_native_tls_get_value (user_copy_or_mark_key);
+       UserCopyOrMarkData *data = gc_data;
        current_object_ops.copy_or_mark_object (&obj, data->queue);
        return obj;
 }
@@ -3749,9 +3728,7 @@ scan_thread_data (void *start_nursery, void *end_nursery, gboolean precise, Gray
                SGEN_LOG (3, "Scanning thread %p, range: %p-%p, size: %td, pinned=%zd", info, info->stack_start, info->stack_end, (char*)info->stack_end - (char*)info->stack_start, sgen_get_pinned_count ());
                if (gc_callbacks.thread_mark_func && !conservative_stack_mark) {
                        UserCopyOrMarkData data = { NULL, queue };
-                       set_user_copy_or_mark_data (&data);
-                       gc_callbacks.thread_mark_func (info->runtime_data, info->stack_start, info->stack_end, precise);
-                       set_user_copy_or_mark_data (NULL);
+                       gc_callbacks.thread_mark_func (info->runtime_data, info->stack_start, info->stack_end, precise, &data);
                } else if (!precise) {
                        if (!conservative_stack_mark) {
                                fprintf (stderr, "Precise stack mark not supported - disabling.\n");
@@ -4319,8 +4296,8 @@ int
 mono_gc_collection_count (int generation)
 {
        if (generation == 0)
-               return stat_minor_gcs;
-       return stat_major_gcs;
+               return gc_stats.minor_gc_count;
+       return gc_stats.major_gc_count;
 }
 
 int64_t
@@ -4571,8 +4548,6 @@ mono_gc_base_init (void)
        LOCK_INIT (sgen_interruption_mutex);
        LOCK_INIT (pin_queue_mutex);
 
-       init_user_copy_or_mark_key ();
-
        if ((env = g_getenv (MONO_GC_PARAMS_NAME))) {
                opts = g_strsplit (env, ",", -1);
                for (ptr = opts; *ptr; ++ptr) {
index 9168aebfead46eda600e45d504d3493cef18df38..3d751d6d0b0ad24b05d1b419926d561ce5109230 100644 (file)
@@ -957,8 +957,6 @@ struct _LOSObject {
        char data [MONO_ZERO_LEN_ARRAY];
 };
 
-#define ARRAY_OBJ_INDEX(ptr,array,elem_size) (((char*)(ptr) - ((char*)(array) + G_STRUCT_OFFSET (MonoArray, vector))) / (elem_size))
-
 extern LOSObject *los_object_list;
 extern mword los_memory_usage;
 
@@ -1039,24 +1037,43 @@ extern __thread char *stack_end;
 #endif
 
 #ifdef HAVE_KW_THREAD
-#define EMIT_TLS_ACCESS(mb,member,key) do {    \
+
+#define EMIT_TLS_ACCESS_NEXT_ADDR(mb)  do {    \
+       mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX);   \
+       mono_mb_emit_byte ((mb), CEE_MONO_TLS);         \
+       mono_mb_emit_i4 ((mb), TLS_KEY_SGEN_TLAB_NEXT_ADDR);            \
+       } while (0)
+
+#define EMIT_TLS_ACCESS_TEMP_END(mb)   do {    \
        mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX);   \
        mono_mb_emit_byte ((mb), CEE_MONO_TLS);         \
-       mono_mb_emit_i4 ((mb), (key));          \
+       mono_mb_emit_i4 ((mb), TLS_KEY_SGEN_TLAB_TEMP_END);             \
        } while (0)
+
 #else
 
 #if defined(__APPLE__) || defined (HOST_WIN32)
-#define EMIT_TLS_ACCESS(mb,member,key) do {    \
+#define EMIT_TLS_ACCESS_NEXT_ADDR(mb)  do {    \
        mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX);   \
        mono_mb_emit_byte ((mb), CEE_MONO_TLS);         \
        mono_mb_emit_i4 ((mb), TLS_KEY_SGEN_THREAD_INFO);       \
-       mono_mb_emit_icon ((mb), G_STRUCT_OFFSET (SgenThreadInfo, member));     \
+       mono_mb_emit_icon ((mb), MONO_STRUCT_OFFSET (SgenThreadInfo, tlab_next_addr));  \
        mono_mb_emit_byte ((mb), CEE_ADD);              \
        mono_mb_emit_byte ((mb), CEE_LDIND_I);          \
        } while (0)
+
+#define EMIT_TLS_ACCESS_TEMP_END(mb)   do {    \
+       mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX);   \
+       mono_mb_emit_byte ((mb), CEE_MONO_TLS);         \
+       mono_mb_emit_i4 ((mb), TLS_KEY_SGEN_THREAD_INFO);       \
+       mono_mb_emit_icon ((mb), MONO_STRUCT_OFFSET (SgenThreadInfo, tlab_temp_end));   \
+       mono_mb_emit_byte ((mb), CEE_ADD);              \
+       mono_mb_emit_byte ((mb), CEE_LDIND_I);          \
+       } while (0)
+
 #else
-#define EMIT_TLS_ACCESS(mb,member,key) do { g_error ("sgen is not supported when using --with-tls=pthread.\n"); } while (0)
+#define EMIT_TLS_ACCESS_NEXT_ADDR(mb)  do { g_error ("sgen is not supported when using --with-tls=pthread.\n"); } while (0)
+#define EMIT_TLS_ACCESS_TEMP_END(mb)   do { g_error ("sgen is not supported when using --with-tls=pthread.\n"); } while (0)
 #endif
 
 #endif
@@ -1064,7 +1081,6 @@ extern __thread char *stack_end;
 /* Other globals */
 
 extern GCMemSection *nursery_section;
-extern int stat_major_gcs;
 extern guint32 collect_before_allocs;
 extern guint32 verify_before_allocs;
 extern gboolean has_per_allocation_action;
index a2fc6e4517f1ecb6cef787babf0ad9e4baea3239..0867b3dee8509793a824eb9bc44ed098c762db7e 100755 (executable)
@@ -3577,7 +3577,7 @@ static const int static_data_size [NUM_STATIC_DATA_IDX] = {
 static uintptr_t* static_reference_bitmaps [NUM_STATIC_DATA_IDX];
 
 static void
-mark_tls_slots (void *addr, MonoGCMarkFunc mark_func)
+mark_tls_slots (void *addr, MonoGCMarkFunc mark_func, void *gc_data)
 {
        int i;
        gpointer *static_data = addr;
@@ -3593,7 +3593,7 @@ mark_tls_slots (void *addr, MonoGCMarkFunc mark_func)
                        void ** p = ptr;
                        while (bmap) {
                                if ((bmap & 1) && *p) {
-                                       mark_func (p);
+                                       mark_func (p, gc_data);
                                }
                                p++;
                                bmap >>= 1;
index cd935b50bb78fd589bc654a90f2819d07b3d3fec..f928eec806d3ddb85afc22d2f95875b2b4702f7e 100755 (executable)
@@ -276,9 +276,15 @@ endif
 
 # Create monow.exe, linked for the 'windows' subsystem
 if HOST_WIN32
+if SUPPORT_BOEHM
 monow_LDADD = $(mono_boehm_LDADD)
 monow_LDFLAGS = $(mono_boehm_LDFLAGS) -mwindows
 monow_SOURCES = $(mono_boehm_SOURCES)
+else
+monow_LDADD = $(mono_sgen_LDADD)
+monow_LDFLAGS = $(mono_sgen_LDFLAGS) -mwindows
+monow_SOURCES = $(mono_sgen_SOURCES)
+endif
 endif
 
 genmdesc_SOURCES = \
@@ -426,7 +432,8 @@ common_sources = \
        xdebug.c                        \
        mini-llvm.h                     \
        mini-llvm-cpp.h \
-       alias-analysis.c
+       alias-analysis.c        \
+       mini-cross-helpers.c
 
 test_sources =                         \
        basic-calls.cs          \
index 660d9da1e047dc3b061ee8766037e0b85f83c1b1..aa04ced89dd20f011d9fa71594f5bdbfd6910623 100644 (file)
@@ -43,6 +43,7 @@
 #include <sys/stat.h>
 
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/tabledefs.h>
 #include <mono/metadata/class.h>
 #include <mono/metadata/object.h>
@@ -111,7 +112,7 @@ struct _ReadOnlyValue {
                gpointer ptr;
        } value;
 };
-static ReadOnlyValue *readonly_values = NULL;
+static ReadOnlyValue *readonly_values;
 
 typedef struct MonoAotOptions {
        char *outfile;
@@ -5324,16 +5325,25 @@ emit_exception_debug_info (MonoAotCompile *acfg, MonoCompile *cfg)
        if (use_unwind_ops) {
                guint32 encoded_len;
                guint8 *encoded;
+               guint32 unwind_desc;
 
-               /* 
-                * This is a duplicate of the data in the .debug_frame section, but that
-                * section cannot be accessed using the dl interface.
-                */
                encoded = mono_unwind_ops_encode (cfg->unwind_ops, &encoded_len);
-               encode_value (get_unwind_info_offset (acfg, encoded, encoded_len), p, &p);
-               g_free (encoded);
+
+               unwind_desc = get_unwind_info_offset (acfg, encoded, encoded_len);
+               g_assert (unwind_desc < 0xffff);
+               if (cfg->has_unwind_info_for_epilog) {
+                       /*
+                        * The lower 16 bits identify the unwind descriptor, the upper 16 bits contain the offset of
+                        * the start of the epilog from the end of the method.
+                        */
+                       g_assert (cfg->code_size - cfg->epilog_begin < 0xffff);
+                       encode_value (((cfg->code_size - cfg->epilog_begin) << 16) | unwind_desc, p, &p);
+                       g_free (encoded);
+               } else {
+                       encode_value (unwind_desc, p, &p);
+               }
        } else {
-               encode_value (jinfo->used_regs, p, &p);
+               encode_value (jinfo->unwind_info, p, &p);
        }
 
        /*Encode the number of holes before the number of clauses to make decoding easier*/
@@ -8259,8 +8269,8 @@ emit_file_info (MonoAotCompile *acfg)
                emit_int32 (acfg, align);
        }
 #else
-       emit_int32 (acfg, __alignof__ (double));
-       emit_int32 (acfg, __alignof__ (gint64));
+       emit_int32 (acfg, MONO_ABI_ALIGNOF (double));
+       emit_int32 (acfg, MONO_ABI_ALIGNOF (gint64));
 #endif
        emit_int32 (acfg, MONO_TRAMPOLINE_NUM);
        emit_int32 (acfg, acfg->tramp_page_size);
index 5634e57777c134263e3d6f32911f0c8ee0c5c8b8..297fec6ed953924ed1bcea0c629d79827db23b51 100644 (file)
@@ -37,6 +37,7 @@
 #include <sys/wait.h>  /* for WIFEXITED, WEXITSTATUS */
 #endif
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/tabledefs.h>
 #include <mono/metadata/class.h>
 #include <mono/metadata/object.h>
@@ -1677,8 +1678,8 @@ load_aot_module (MonoAssembly *assembly, gpointer user_data)
                align_int64 = align;
        }
 #else
-       align_double = __alignof__ (double);
-       align_int64 = __alignof__ (gint64);
+       align_double = MONO_ABI_ALIGNOF (double);
+       align_int64 = MONO_ABI_ALIGNOF (gint64);
 #endif
 
        /* Sanity check */
@@ -2291,11 +2292,11 @@ decode_llvm_mono_eh_frame (MonoAotModule *amodule, MonoDomain *domain,
                mono_domain_alloc0_lock_free (domain, MONO_SIZEOF_JIT_INFO + (sizeof (MonoJitExceptionInfo) * (ei_len + nested_len)) + extra_size);
 
        jinfo->code_size = code_len;
-       jinfo->used_regs = mono_cache_unwind_info (info.unw_info, info.unw_info_len);
+       jinfo->unwind_info = mono_cache_unwind_info (info.unw_info, info.unw_info_len);
        jinfo->d.method = method;
        jinfo->code_start = code;
        jinfo->domain_neutral = 0;
-       /* This signals that used_regs points to a normal cached unwind info */
+       /* This signals that unwind_info points to a normal cached unwind info */
        jinfo->from_aot = 0;
        jinfo->num_clauses = ei_len + nested_len;
 
@@ -2377,7 +2378,7 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
 {
        int i, buf_len, num_clauses, len;
        MonoJitInfo *jinfo;
-       guint used_int_regs, flags;
+       guint unwind_info, flags;
        gboolean has_generic_jit_info, has_dwarf_unwind_info, has_clauses, has_seq_points, has_try_block_holes, has_arch_eh_jit_info;
        gboolean from_llvm, has_gc_map;
        guint8 *p;
@@ -2400,13 +2401,10 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
        has_arch_eh_jit_info = (flags & 128) != 0;
 
        if (has_dwarf_unwind_info) {
-               guint32 offset;
-
-               offset = decode_value (p, &p);
-               g_assert (offset < (1 << 30));
-               used_int_regs = offset;
+               unwind_info = decode_value (p, &p);
+               g_assert (unwind_info < (1 << 30));
        } else {
-               used_int_regs = decode_value (p, &p);
+               unwind_info = decode_value (p, &p);
        }
        if (has_generic_jit_info)
                generic_info_size = sizeof (MonoGenericJitInfo);
@@ -2498,7 +2496,7 @@ decode_exception_debug_info (MonoAotModule *amodule, MonoDomain *domain,
                }
 
                jinfo->code_size = code_len;
-               jinfo->used_regs = used_int_regs;
+               jinfo->unwind_info = unwind_info;
                jinfo->d.method = method;
                jinfo->code_start = code;
                jinfo->domain_neutral = 0;
@@ -2699,7 +2697,8 @@ mono_aot_get_unwind_info (MonoJitInfo *ji, guint32 *unwind_info_len)
                mono_aot_unlock ();
        }
 
-       p = amodule->unwind_info + ji->used_regs;
+       /* The upper 16 bits of ji->unwind_info might contain the epilog offset */
+       p = amodule->unwind_info + (ji->unwind_info & 0xffff);
        *unwind_info_len = decode_value (p, &p);
        return p;
 }
index b734d4c4fe710c668442e6a3106e8894a78e23ca..25fc6c15f00af74fa77024dac0ff9234c5e46d83 100644 (file)
@@ -298,10 +298,8 @@ tls_get_reg: dest:i src1:i len:32
 tls_set: src1:i len:16
 tls_set_reg: src1:i src2:i len:32
 atomic_add_i4: src1:b src2:i dest:i len:32
-atomic_add_new_i4: src1:b src2:i dest:i len:32
-atomic_exchange_i4: src1:b src2:i dest:a len:32
 atomic_add_i8: src1:b src2:i dest:i len:32
-atomic_add_new_i8: src1:b src2:i dest:i len:32
+atomic_exchange_i4: src1:b src2:i dest:a len:32
 atomic_exchange_i8: src1:b src2:i dest:a len:32
 atomic_cas_i4: src1:b src2:i src3:a dest:a len:24
 atomic_cas_i8: src1:b src2:i src3:a dest:a len:24
index 367cb5d4c5a6a54232a7f42839513002a7c29ccd..431936113c35613cc15904147fbc8904ab575fa4 100644 (file)
@@ -347,6 +347,6 @@ gc_liveness_use: len:0
 gc_spill_slot_liveness_def: len:0
 gc_param_slot_liveness_def: len:0
 
+atomic_add_i4: dest:i src1:i src2:i len:64
 atomic_exchange_i4: dest:i src1:i src2:i len:64
 atomic_cas_i4: dest:i src1:i src2:i src3:i len:64
-atomic_add_new_i4: dest:i src1:i src2:i len:64
index d57b6eeda2bf956c85d3f5b4c021ab5391c07655..7d9e40b22664406642de34d258df8576bec3941e 100644 (file)
@@ -414,8 +414,8 @@ arm64_cbzx: src1:i len:16
 arm64_cbnzw: src1:i len:16
 arm64_cbnzx: src1:i len:16
 
-atomic_add_new_i4: dest:i src1:i src2:i len:32
-atomic_add_new_i8: dest:i src1:i src2:i len:32
+atomic_add_i4: dest:i src1:i src2:i len:32
+atomic_add_i8: dest:i src1:i src2:i len:32
 atomic_exchange_i4: dest:i src1:i src2:i len:32
 atomic_exchange_i8: dest:i src1:i src2:i len:32
 atomic_cas_i4: dest:i src1:i src2:i src3:i len:32
index 5d4fec04432cc178c05a6fe646ac4e3213e8b1e0..0bae69301bd1ba0eab51d6cf33e51a0ce8cfd76c 100644 (file)
@@ -153,14 +153,12 @@ endfinally: len:96
 aot_const: dest:i len:48
 tls_get: dest:i len:48
 atomic_add_i4: src1:b src2:i dest:i len:48
-atomic_add_new_i4: src1:b src2:i dest:i len:48
-atomic_exchange_i4: src1:b src2:i dest:i len:48
 atomic_add_i8: src1:b src2:i dest:i len:48
-atomic_add_new_i8: src1:b src2:i dest:i len:48
-atomic_add_imm_new_i4: src1:b dest:i len:48
-atomic_add_imm_new_i8: src1:b dest:i len:48
+atomic_exchange_i4: src1:b src2:i dest:i len:48
 atomic_exchange_i8: src1:b src2:i dest:i len:48
 memory_barrier: len:48
+atomic_add_imm_i4: src1:b dest:i len:48
+atomic_add_imm_i8: src1:b dest:i len:48
 adc: dest:i src1:i src2:i len:48
 addcc: dest:i src1:i src2:i len:48
 subcc: dest:i src1:i src2:i len:48
index e8f83655fc85ed4841e679f7692f4014c141bed7..44a482aad1318791135dfa69c99f0fb5d5fb1070 100644 (file)
@@ -313,4 +313,5 @@ vcall2_membase: src1:b len:16 clob:c
 
 jump_table: dest:i len:8
 
+atomic_add_i4: src1:b src2:i dest:i len:20
 atomic_cas_i4: src1:b src2:i src3:i dest:i len:38
index 889af55b4a20c48c9abb60afd2f6aa6219706c08..114bc3cf3b14228052d6b8dcfa07cf59ced16139 100644 (file)
@@ -380,8 +380,7 @@ vcall2_membase: src1:b len:16 clob:c
 
 jump_table: dest:i len:20
 
-atomic_add_new_i4: src1:b src2:i dest:i len:20
-atomic_add_new_i8: src1:b src2:i dest:i len:20
-
+atomic_add_i4: src1:b src2:i dest:i len:20
+atomic_add_i8: src1:b src2:i dest:i len:20
 atomic_cas_i4: src1:b src2:i src3:i dest:i len:38
 atomic_cas_i8: src1:b src2:i src3:i dest:i len:38
index 4bcfa33bafb2cd66d333fb7905f849918e1045c6..b3dce352ec640faff6fbb71abd21c2aeaab6042c 100644 (file)
@@ -56,8 +56,6 @@ and_imm: dest:i src1:i len:24
 aot_const: dest:i len:8
 atomic_add_i4: src1:b src2:i dest:i len:28
 atomic_add_i8: src1:b src2:i dest:i len:30
-atomic_add_new_i4: src1:b src2:i dest:i len:28
-atomic_add_new_i8: src1:b src2:i dest:i len:30
 atomic_exchange_i4: src1:b src2:i dest:i len:18
 atomic_exchange_i8: src1:b src2:i dest:i len:24
 br: len:6
index cc14b0dc15242e27aa0660633372f0ee2aed7479..ca87f2fba43975024ef370c2b354e99cd5665240 100644 (file)
@@ -301,12 +301,11 @@ bigmul: len:2 dest:l src1:a src2:i
 bigmul_un: len:2 dest:l src1:a src2:i
 sext_i1: dest:i src1:y len:3
 sext_i2: dest:i src1:y len:3
-tls_get: dest:i len:20
+tls_get: dest:i len:32
 tls_get_reg: dest:i src1:i len:20
 tls_set: src1:i len:20
 tls_set_reg: src1:i src2:i len:20
 atomic_add_i4: src1:b src2:i dest:i len:16
-atomic_add_new_i4: src1:b src2:i dest:i len:16
 atomic_exchange_i4: src1:b src2:i dest:a len:24
 atomic_cas_i4: src1:b src2:i src3:a dest:a len:24
 memory_barrier: len:16
index 3167fa5a4733330e975f4e6c8178a71d38a6f55f..742b6e93d9df10da151e554ffda327953d4e7895 100644 (file)
@@ -689,7 +689,7 @@ mono_debug_print_vars (gpointer ip, gboolean only_arguments)
  * breakpoint when the method is JITed.
  */
 
-static GPtrArray *breakpoints = NULL;
+static GPtrArray *breakpoints;
 
 static int
 mono_debugger_insert_breakpoint_full (MonoMethodDesc *desc)
index d9032db69a637e93dac7f3e27af43a8318df4b5d..7ff541277867fa3a46995293da878e3bc64802fb 100644 (file)
@@ -289,7 +289,7 @@ typedef struct {
 #define HEADER_LENGTH 11
 
 #define MAJOR_VERSION 2
-#define MINOR_VERSION 34
+#define MINOR_VERSION 36
 
 typedef enum {
        CMD_SET_VM = 1,
@@ -401,7 +401,9 @@ typedef enum {
 
 typedef enum {
        INVOKE_FLAG_DISABLE_BREAKPOINTS = 1,
-       INVOKE_FLAG_SINGLE_THREADED = 2
+       INVOKE_FLAG_SINGLE_THREADED = 2,
+       INVOKE_FLAG_RETURN_OUT_THIS = 4,
+       INVOKE_FLAG_RETURN_OUT_ARGS = 8
 } InvokeFlags;
 
 typedef enum {
@@ -694,8 +696,8 @@ static mono_mutex_t debugger_thread_exited_mutex;
 static DebuggerProfiler debugger_profiler;
 
 /* The single step request instance */
-static SingleStepReq *ss_req = NULL;
-static gpointer ss_invoke_addr = NULL;
+static SingleStepReq *ss_req;
+static gpointer ss_invoke_addr;
 
 #ifdef MONO_ARCH_SOFT_DEBUG_SUPPORTED
 /* Number of single stepping operations in progress */
@@ -1435,6 +1437,41 @@ register_socket_transport (void)
        register_transport (&trans);
 }
 
+/*
+ * socket_fd_transport_connect:
+ *
+ */
+static void
+socket_fd_transport_connect (const char *address)
+{
+       int res;
+
+       res = sscanf (address, "%d", &conn_fd);
+       if (res != 1) {
+               fprintf (stderr, "debugger-agent: socket-fd transport address is invalid: '%s'\n", address);
+               exit (1);
+       }
+
+       if (!transport_handshake ())
+               exit (1);
+}
+
+static void
+register_socket_fd_transport (void)
+{
+       DebuggerTransport trans;
+
+       /* This is the same as the 'dt_socket' transport, but receives an already connected socket fd */
+       trans.name = "socket-fd";
+       trans.connect = socket_fd_transport_connect;
+       trans.close1 = socket_transport_close1;
+       trans.close2 = socket_transport_close2;
+       trans.send = socket_transport_send;
+       trans.recv = socket_transport_recv;
+
+       register_transport (&trans);
+}
+
 #endif /* DISABLE_SOCKET_TRANSPORT */
 
 /*
@@ -1473,6 +1510,7 @@ transport_init (void)
 
 #ifndef DISABLE_SOCKET_TRANSPORT
        register_socket_transport ();
+       register_socket_fd_transport ();
 #endif
 
        for (i = 0; i < ntransports; ++i) {
@@ -6559,9 +6597,14 @@ do_invoke_method (DebuggerTlsData *tls, Buffer *buf, InvokeData *invoke, guint8
                        err = decode_value (sig->params [i], domain, (guint8*)&args [i], p, &p, end);
                        if (err)
                                break;
-
                        if (args [i] && ((MonoObject*)args [i])->vtable->domain != domain)
                                NOT_IMPLEMENTED;
+
+                       if (sig->params [i]->byref) {
+                               arg_buf [i] = g_alloca (sizeof (mgreg_t));
+                               *(gpointer*)arg_buf [i] = args [i];
+                               args [i] = arg_buf [i];
+                       }
                } else {
                        arg_buf [i] = g_alloca (mono_class_instance_size (mono_class_from_mono_type (sig->params [i])));
                        err = decode_value (sig->params [i], domain, arg_buf [i], p, &p, end);
@@ -6582,7 +6625,6 @@ do_invoke_method (DebuggerTlsData *tls, Buffer *buf, InvokeData *invoke, guint8
        /* 
         * Add an LMF frame to link the stack frames on the invoke method with our caller.
         */
-       /* FIXME: Move this to arch specific code */
 #ifdef MONO_ARCH_SOFT_DEBUG_SUPPORTED
        if (invoke->has_ctx) {
                MonoLMF **lmf_addr;
@@ -6611,7 +6653,14 @@ do_invoke_method (DebuggerTlsData *tls, Buffer *buf, InvokeData *invoke, guint8
                buffer_add_byte (buf, 0);
                buffer_add_value (buf, &mono_defaults.object_class->byval_arg, &exc, domain);
        } else {
-               buffer_add_byte (buf, 1);
+               gboolean out_this = FALSE;
+               gboolean out_args = FALSE;
+
+               if ((invoke->flags & INVOKE_FLAG_RETURN_OUT_THIS) && CHECK_PROTOCOL_VERSION (2, 35))
+                       out_this = TRUE;
+               if ((invoke->flags & INVOKE_FLAG_RETURN_OUT_ARGS) && CHECK_PROTOCOL_VERSION (2, 35))
+                       out_args = TRUE;
+               buffer_add_byte (buf, 1 + (out_this ? 2 : 0) + (out_args ? 4 : 0));
                if (sig->ret->type == MONO_TYPE_VOID) {
                        if (!strcmp (m->name, ".ctor") && !m->klass->valuetype) {
                                buffer_add_value (buf, &mono_defaults.object_class->byval_arg, &this, domain);
@@ -6635,6 +6684,21 @@ do_invoke_method (DebuggerTlsData *tls, Buffer *buf, InvokeData *invoke, guint8
                } else {
                        NOT_IMPLEMENTED;
                }
+               if (out_this)
+                       /* Return the new value of the receiver after the call */
+                       buffer_add_value (buf, &m->klass->byval_arg, this_buf, domain);
+               if (out_args) {
+                       buffer_add_int (buf, nargs);
+                       for (i = 0; i < nargs; ++i) {
+                               if (MONO_TYPE_IS_REFERENCE (sig->params [i]))
+                                       buffer_add_value (buf, sig->params [i], &args [i], domain);
+                               else if (sig->params [i]->byref)
+                                       /* add_value () does an indirection */
+                                       buffer_add_value (buf, sig->params [i], &arg_buf [i], domain);
+                               else
+                                       buffer_add_value (buf, sig->params [i], arg_buf [i], domain);
+                       }
+               }
        }
 
        tls->disable_breakpoints = FALSE;
index f2dd9ee8552fc58c975609afd3cc3b04adbd8f0d..07242d86138e0ce371119ddffa80e7d85e9861fe 100644 (file)
@@ -13,6 +13,7 @@
 #include "jit-icalls.h"
 
 #include <mono/metadata/gc-internal.h>
+#include <mono/metadata/abi-details.h>
 
 #ifndef DISABLE_JIT
 
@@ -485,7 +486,7 @@ mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins)
                        ins->opcode = OP_ICONST;
                        MONO_INST_NULLIFY_SREGS (ins);
                        ins->inst_c0 = 0;
-               } else if ((ins->inst_imm > 0) && (ins->inst_imm < (1L << 32)) && (power != -1)) {
+               } else if ((ins->inst_imm > 0) && (ins->inst_imm < (1LL << 32)) && (power != -1)) {
                        gboolean is_long = ins->opcode == OP_LREM_IMM;
                        int compensator_reg = alloc_ireg (cfg);
                        int intermediate_reg;
@@ -1556,7 +1557,7 @@ mono_decompose_array_access_opts (MonoCompile *cfg)
                                switch (ins->opcode) {
                                case OP_LDLEN:
                                        NEW_LOAD_MEMBASE_FLAGS (cfg, dest, OP_LOADI4_MEMBASE, ins->dreg, ins->sreg1,
-                                                                                       G_STRUCT_OFFSET (MonoArray, max_length), ins->flags | MONO_INST_INVARIANT_LOAD);
+                                                                                       MONO_STRUCT_OFFSET (MonoArray, max_length), ins->flags | MONO_INST_INVARIANT_LOAD);
                                        MONO_ADD_INS (cfg->cbb, dest);
                                        break;
                                case OP_BOUNDS_CHECK:
@@ -1595,7 +1596,7 @@ mono_decompose_array_access_opts (MonoCompile *cfg)
                                        break;
                                case OP_STRLEN:
                                        MONO_EMIT_NEW_LOAD_MEMBASE_OP_FLAGS (cfg, OP_LOADI4_MEMBASE, ins->dreg,
-                                                                                                                ins->sreg1, G_STRUCT_OFFSET (MonoString, length), ins->flags | MONO_INST_INVARIANT_LOAD);
+                                                                                                                ins->sreg1, MONO_STRUCT_OFFSET (MonoString, length), ins->flags | MONO_INST_INVARIANT_LOAD);
                                        break;
                                default:
                                        break;
index daca0dcf38dc720cf79d1187d368ce8a6befb9e1..3a67c37ecb7f68bf8a9682960791cb4b6a9b584b 100644 (file)
@@ -57,7 +57,7 @@
 #include "version.h"
 #include "debugger-agent.h"
 
-static FILE *mini_stats_fd = NULL;
+static FILE *mini_stats_fd;
 
 static void mini_usage (void);
 
@@ -1517,9 +1517,6 @@ mono_main (int argc, char* argv[])
        if (g_getenv ("MONO_NO_SMP"))
                mono_set_use_smp (FALSE);
        
-       if (!g_thread_supported ())
-               g_thread_init (NULL);
-
        g_log_set_always_fatal (G_LOG_LEVEL_ERROR);
        g_log_set_fatal_mask (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR);
 
index 212416e06cf3b6d31a38dcbb1eda8268afb44370..2a253a8cef8b5e52f6a0d4c1f4506d3f52970bc9 100644 (file)
@@ -19,6 +19,7 @@
 #endif
 
 #include <mono/arch/amd64/amd64-codegen.h>
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/tabledefs.h>
 #include <mono/metadata/threads.h>
@@ -207,21 +208,21 @@ mono_arch_get_restore_context (MonoTrampInfo **info, gboolean aot)
        amd64_mov_reg_reg (code, AMD64_R11, AMD64_ARG_REG1, 8);
 
        /* Restore all registers except %rip and %r11 */
-       amd64_mov_reg_membase (code, AMD64_RAX, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, rax), 8);
-       amd64_mov_reg_membase (code, AMD64_RCX, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, rcx), 8);
-       amd64_mov_reg_membase (code, AMD64_RDX, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, rdx), 8);
-       amd64_mov_reg_membase (code, AMD64_RBX, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, rbx), 8);
-       amd64_mov_reg_membase (code, AMD64_RBP, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, rbp), 8);
-       amd64_mov_reg_membase (code, AMD64_RSI, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, rsi), 8);
-       amd64_mov_reg_membase (code, AMD64_RDI, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, rdi), 8);
-       //amd64_mov_reg_membase (code, AMD64_R8, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, r8), 8);
-       //amd64_mov_reg_membase (code, AMD64_R9, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, r9), 8);
-       //amd64_mov_reg_membase (code, AMD64_R10, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, r10), 8);
-       amd64_mov_reg_membase (code, AMD64_R12, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, r12), 8);
-       amd64_mov_reg_membase (code, AMD64_R13, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, r13), 8);
-       amd64_mov_reg_membase (code, AMD64_R14, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, r14), 8);
+       amd64_mov_reg_membase (code, AMD64_RAX, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, rax), 8);
+       amd64_mov_reg_membase (code, AMD64_RCX, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, rcx), 8);
+       amd64_mov_reg_membase (code, AMD64_RDX, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, rdx), 8);
+       amd64_mov_reg_membase (code, AMD64_RBX, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, rbx), 8);
+       amd64_mov_reg_membase (code, AMD64_RBP, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, rbp), 8);
+       amd64_mov_reg_membase (code, AMD64_RSI, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, rsi), 8);
+       amd64_mov_reg_membase (code, AMD64_RDI, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, rdi), 8);
+       //amd64_mov_reg_membase (code, AMD64_R8, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, r8), 8);
+       //amd64_mov_reg_membase (code, AMD64_R9, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, r9), 8);
+       //amd64_mov_reg_membase (code, AMD64_R10, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, r10), 8);
+       amd64_mov_reg_membase (code, AMD64_R12, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, r12), 8);
+       amd64_mov_reg_membase (code, AMD64_R13, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, r13), 8);
+       amd64_mov_reg_membase (code, AMD64_R14, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, r14), 8);
 #if !defined(__native_client_codegen__)
-       amd64_mov_reg_membase (code, AMD64_R15, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, r15), 8);
+       amd64_mov_reg_membase (code, AMD64_R15, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, r15), 8);
 #endif
 
        /*
@@ -232,8 +233,8 @@ mono_arch_get_restore_context (MonoTrampInfo **info, gboolean aot)
         * size.  Hence the stack pointer can be restored only after
         * we have finished loading everything from the context.
         */
-       amd64_mov_reg_membase (code, AMD64_R8, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, rsp), 8);
-       amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11,  G_STRUCT_OFFSET (MonoContext, rip), 8);
+       amd64_mov_reg_membase (code, AMD64_R8, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, rsp), 8);
+       amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11,  MONO_STRUCT_OFFSET (MonoContext, rip), 8);
        amd64_mov_reg_reg (code, AMD64_RSP, AMD64_R8, 8);
 
        /* jump to the saved IP */
@@ -293,18 +294,18 @@ mono_arch_get_call_filter (MonoTrampInfo **info, gboolean aot)
                amd64_alu_reg_imm (code, X86_SUB, AMD64_RSP, 8);
 
        /* set new EBP */
-       amd64_mov_reg_membase (code, AMD64_RBP, AMD64_ARG_REG1, G_STRUCT_OFFSET (MonoContext, rbp), 8);
+       amd64_mov_reg_membase (code, AMD64_RBP, AMD64_ARG_REG1, MONO_STRUCT_OFFSET (MonoContext, rbp), 8);
        /* load callee saved regs */
-       amd64_mov_reg_membase (code, AMD64_RBX, AMD64_ARG_REG1, G_STRUCT_OFFSET (MonoContext, rbx), 8);
-       amd64_mov_reg_membase (code, AMD64_R12, AMD64_ARG_REG1, G_STRUCT_OFFSET (MonoContext, r12), 8);
-       amd64_mov_reg_membase (code, AMD64_R13, AMD64_ARG_REG1, G_STRUCT_OFFSET (MonoContext, r13), 8);
-       amd64_mov_reg_membase (code, AMD64_R14, AMD64_ARG_REG1, G_STRUCT_OFFSET (MonoContext, r14), 8);
+       amd64_mov_reg_membase (code, AMD64_RBX, AMD64_ARG_REG1, MONO_STRUCT_OFFSET (MonoContext, rbx), 8);
+       amd64_mov_reg_membase (code, AMD64_R12, AMD64_ARG_REG1, MONO_STRUCT_OFFSET (MonoContext, r12), 8);
+       amd64_mov_reg_membase (code, AMD64_R13, AMD64_ARG_REG1, MONO_STRUCT_OFFSET (MonoContext, r13), 8);
+       amd64_mov_reg_membase (code, AMD64_R14, AMD64_ARG_REG1, MONO_STRUCT_OFFSET (MonoContext, r14), 8);
 #if !defined(__native_client_codegen__)
-       amd64_mov_reg_membase (code, AMD64_R15, AMD64_ARG_REG1, G_STRUCT_OFFSET (MonoContext, r15), 8);
+       amd64_mov_reg_membase (code, AMD64_R15, AMD64_ARG_REG1, MONO_STRUCT_OFFSET (MonoContext, r15), 8);
 #endif
 #ifdef TARGET_WIN32
-       amd64_mov_reg_membase (code, AMD64_RDI, AMD64_ARG_REG1,  G_STRUCT_OFFSET (MonoContext, rdi), 8);
-       amd64_mov_reg_membase (code, AMD64_RSI, AMD64_ARG_REG1,  G_STRUCT_OFFSET (MonoContext, rsi), 8);
+       amd64_mov_reg_membase (code, AMD64_RDI, AMD64_ARG_REG1,  MONO_STRUCT_OFFSET (MonoContext, rdi), 8);
+       amd64_mov_reg_membase (code, AMD64_RSI, AMD64_ARG_REG1,  MONO_STRUCT_OFFSET (MonoContext, rsi), 8);
 #endif
 
        /* call the handler */
@@ -590,6 +591,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
                guint8 *cfa;
                guint32 unwind_info_len;
                guint8 *unwind_info;
+               guint8 *epilog;
 
                frame->type = FRAME_TYPE_MANAGED;
 
@@ -602,6 +604,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
                printf ("%s %p %p\n", ji->d.method->name, ji->code_start, ip);
                mono_print_unwind_info (unwind_info, unwind_info_len);
                */
+               epilog = (guint8*)ji->code_start + ji->code_size - (ji->unwind_info >> 16);
  
                regs [AMD64_RAX] = new_ctx->rax;
                regs [AMD64_RBX] = new_ctx->rbx;
@@ -619,7 +622,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
 
                mono_unwind_frame (unwind_info, unwind_info_len, ji->code_start, 
                                                   (guint8*)ji->code_start + ji->code_size,
-                                                  ip, regs, MONO_MAX_IREGS + 1, 
+                                                  ip, &epilog, regs, MONO_MAX_IREGS + 1,
                                                   save_locations, MONO_MAX_IREGS, &cfa);
 
                new_ctx->rax = regs [AMD64_RAX];
@@ -1399,25 +1402,25 @@ mono_tasklets_arch_restore (void)
        amd64_mov_reg_reg (code, cont_reg, MONO_AMD64_ARG_REG1, 8);
        amd64_mov_reg_reg (code, AMD64_RAX, MONO_AMD64_ARG_REG2, 8);
        /* setup the copy of the stack */
-       amd64_mov_reg_membase (code, AMD64_RCX, cont_reg, G_STRUCT_OFFSET (MonoContinuation, stack_used_size), sizeof (int));
+       amd64_mov_reg_membase (code, AMD64_RCX, cont_reg, MONO_STRUCT_OFFSET (MonoContinuation, stack_used_size), sizeof (int));
        amd64_shift_reg_imm (code, X86_SHR, AMD64_RCX, 3);
        x86_cld (code);
-       amd64_mov_reg_membase (code, AMD64_RSI, cont_reg, G_STRUCT_OFFSET (MonoContinuation, saved_stack), sizeof (gpointer));
-       amd64_mov_reg_membase (code, AMD64_RDI, cont_reg, G_STRUCT_OFFSET (MonoContinuation, return_sp), sizeof (gpointer));
+       amd64_mov_reg_membase (code, AMD64_RSI, cont_reg, MONO_STRUCT_OFFSET (MonoContinuation, saved_stack), sizeof (gpointer));
+       amd64_mov_reg_membase (code, AMD64_RDI, cont_reg, MONO_STRUCT_OFFSET (MonoContinuation, return_sp), sizeof (gpointer));
        amd64_prefix (code, X86_REP_PREFIX);
        amd64_movsl (code);
 
        /* now restore the registers from the LMF */
        NOT_IMPLEMENTED;
-       amd64_mov_reg_membase (code, AMD64_RCX, cont_reg, G_STRUCT_OFFSET (MonoContinuation, lmf), 8);
-       amd64_mov_reg_membase (code, AMD64_RSP, AMD64_RCX, G_STRUCT_OFFSET (MonoLMF, rsp), 8);
+       amd64_mov_reg_membase (code, AMD64_RCX, cont_reg, MONO_STRUCT_OFFSET (MonoContinuation, lmf), 8);
+       amd64_mov_reg_membase (code, AMD64_RSP, AMD64_RCX, MONO_STRUCT_OFFSET (MonoLMF, rsp), 8);
 
        /* restore the lmf chain */
        /*x86_mov_reg_membase (code, X86_ECX, X86_ESP, 12, 4);
        x86_mov_membase_reg (code, X86_ECX, 0, X86_EDX, 4);*/
 
        /* state is already in rax */
-       amd64_jump_membase (code, cont_reg, G_STRUCT_OFFSET (MonoContinuation, return_ip));
+       amd64_jump_membase (code, cont_reg, MONO_STRUCT_OFFSET (MonoContinuation, return_ip));
        g_assert ((code - start) <= kMaxCodeSize);
 
        nacl_global_codeman_validate(&start, kMaxCodeSize, &code);
index 87d66c04d066be2b5c54307a479b12b100721d2c..d7fd3318f3d1e45a5a27693114a4ab2dbbf551c6 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <mono/arch/arm/arm-codegen.h>
 #include <mono/arch/arm/arm-vfp-codegen.h>
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/tabledefs.h>
 #include <mono/metadata/threads.h>
@@ -61,16 +62,16 @@ mono_arch_get_restore_context (MonoTrampInfo **info, gboolean aot)
        ctx_reg = ARMREG_R0;
 
        if (!mono_arch_is_soft_float ()) {
-               ARM_ADD_REG_IMM8 (code, ARMREG_IP, ctx_reg, G_STRUCT_OFFSET (MonoContext, fregs));
+               ARM_ADD_REG_IMM8 (code, ARMREG_IP, ctx_reg, MONO_STRUCT_OFFSET (MonoContext, fregs));
                ARM_FLDMD (code, ARM_VFP_D0, 16, ARMREG_IP);
        }
 
        /* move pc to PC */
-       ARM_LDR_IMM (code, ARMREG_IP, ctx_reg, G_STRUCT_OFFSET (MonoContext, pc));
-       ARM_STR_IMM (code, ARMREG_IP, ctx_reg, G_STRUCT_OFFSET (MonoContext, regs) + (ARMREG_PC * sizeof (mgreg_t)));
+       ARM_LDR_IMM (code, ARMREG_IP, ctx_reg, MONO_STRUCT_OFFSET (MonoContext, pc));
+       ARM_STR_IMM (code, ARMREG_IP, ctx_reg, MONO_STRUCT_OFFSET (MonoContext, regs) + (ARMREG_PC * sizeof (mgreg_t)));
 
        /* restore everything */
-       ARM_ADD_REG_IMM8 (code, ARMREG_IP, ctx_reg, G_STRUCT_OFFSET(MonoContext, regs));
+       ARM_ADD_REG_IMM8 (code, ARMREG_IP, ctx_reg, MONO_STRUCT_OFFSET(MonoContext, regs));
        ARM_LDM (code, ARMREG_IP, 0xffff);
 
        /* never reached */
@@ -111,8 +112,8 @@ mono_arch_get_call_filter (MonoTrampInfo **info, gboolean aot)
 
        /* restore all the regs from ctx (in r0), but not sp, the stack pointer */
        ctx_reg = ARMREG_R0;
-       ARM_LDR_IMM (code, ARMREG_IP, ctx_reg, G_STRUCT_OFFSET (MonoContext, pc));
-       ARM_ADD_REG_IMM8 (code, ARMREG_LR, ctx_reg, G_STRUCT_OFFSET(MonoContext, regs) + (MONO_ARM_FIRST_SAVED_REG * sizeof (mgreg_t)));
+       ARM_LDR_IMM (code, ARMREG_IP, ctx_reg, MONO_STRUCT_OFFSET (MonoContext, pc));
+       ARM_ADD_REG_IMM8 (code, ARMREG_LR, ctx_reg, MONO_STRUCT_OFFSET(MonoContext, regs) + (MONO_ARM_FIRST_SAVED_REG * sizeof (mgreg_t)));
        ARM_LDM (code, ARMREG_LR, MONO_ARM_REGSAVE_MASK);
        /* call handler at eip (r1) and set the first arg with the exception (r2) */
        ARM_MOV_REG_REG (code, ARMREG_R0, ARMREG_R2);
@@ -423,7 +424,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
 
                mono_unwind_frame (unwind_info, unwind_info_len, ji->code_start, 
                                                   (guint8*)ji->code_start + ji->code_size,
-                                                  ip, regs, MONO_MAX_IREGS + 8,
+                                                  ip, NULL, regs, MONO_MAX_IREGS + 8,
                                                   save_locations, MONO_MAX_IREGS, &cfa);
 
                for (i = 0; i < 16; ++i)
index ad6f2552c0e7a4d3986d0435a30c338b3b761a12..34197145048468a709de54e097cead753f06a2f0 100644 (file)
@@ -413,7 +413,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
 
                mono_unwind_frame (unwind_info, unwind_info_len, ji->code_start, 
                                                   (guint8*)ji->code_start + ji->code_size,
-                                                  ip, regs, MONO_MAX_IREGS,
+                                                  ip, NULL, regs, MONO_MAX_IREGS,
                                                   save_locations, MONO_MAX_IREGS, &cfa);
 
                for (i = 0; i < MONO_MAX_IREGS; ++i)
index d2429325d94a5acbfa9ab68d17e904c4ebaa78f2..6c3878e97b8e4df6102126330851adae5cea167f 100644 (file)
@@ -550,7 +550,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
 
                        mono_unwind_frame (unwind_info, unwind_info_len, ji->code_start, 
                                                           (guint8*)ji->code_start + ji->code_size,
-                                                          ip, regs, ppc_lr + 1,
+                                                          ip, NULL, regs, ppc_lr + 1,
                                                           save_locations, MONO_MAX_IREGS, &cfa);
 
                        /* we substract 4, so that the IP points into the call instruction */
index 4820c52a355ef53a0b853f69f25f30726127700a..74c8a0f37a3dfc9fb29813eb87029ad251f7421f 100644 (file)
@@ -478,9 +478,9 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
 
                memcpy(&regs, &ctx->uc_mcontext.gregs, sizeof(regs));
                mono_unwind_frame (unwind_info, unwind_info_len, ji->code_start,
-                               (guint8 *) ji->code_start + ji->code_size,
-                               ip, regs, 16, save_locations, 
-                               MONO_MAX_IREGS, &cfa);
+                                                  (guint8 *) ji->code_start + ji->code_size,
+                                                  ip, NULL, regs, 16, save_locations,
+                                                  MONO_MAX_IREGS, &cfa);
                memcpy (&new_ctx->uc_mcontext.gregs, &regs, sizeof(regs));
                MONO_CONTEXT_SET_IP(new_ctx, regs[14] - 2);
                MONO_CONTEXT_SET_BP(new_ctx, cfa);
index b9f2844038a2ff247f280acdbcbfd8335cb78bb8..d335d7ea5c6c3fa92c97b57f891722683410c673 100644 (file)
@@ -13,6 +13,7 @@
 #include <signal.h>
 #include <string.h>
 
+#include <mono/metadata/abi-details.h>
 #include <mono/arch/x86/x86-codegen.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/tabledefs.h>
@@ -88,13 +89,14 @@ mono_win32_get_handle_stackoverflow (void)
        x86_mov_reg_reg (code, X86_EDI, X86_ESP, 4);
 
        /* use the new freed stack from sigcontext */
+       /* XXX replace usage of struct sigcontext with MonoContext so we can use MONO_STRUCT_OFFSET */
        x86_mov_reg_membase (code, X86_ESP, X86_EBX,  G_STRUCT_OFFSET (struct sigcontext, esp), 4);
 
        /* get the current domain */
        x86_call_code (code, mono_domain_get);
 
        /* get stack overflow exception from domain object */
-       x86_mov_reg_membase (code, X86_EAX, X86_EAX, G_STRUCT_OFFSET (MonoDomain, stack_overflow_ex), 4);
+       x86_mov_reg_membase (code, X86_EAX, X86_EAX, MONO_STRUCT_OFFSET (MonoDomain, stack_overflow_ex), 4);
 
        /* call mono_arch_handle_exception (sctx, stack_overflow_exception_obj) */
        x86_push_reg (code, X86_EAX);
@@ -320,16 +322,16 @@ mono_arch_get_restore_context (MonoTrampInfo **info, gboolean aot)
        x86_mov_reg_membase (code, X86_EAX, X86_ESP, 4, 4);
 
        /* restore EBX */
-       x86_mov_reg_membase (code, X86_EBX, X86_EAX,  G_STRUCT_OFFSET (MonoContext, ebx), 4);
+       x86_mov_reg_membase (code, X86_EBX, X86_EAX,  MONO_STRUCT_OFFSET (MonoContext, ebx), 4);
 
        /* restore EDI */
-       x86_mov_reg_membase (code, X86_EDI, X86_EAX,  G_STRUCT_OFFSET (MonoContext, edi), 4);
+       x86_mov_reg_membase (code, X86_EDI, X86_EAX,  MONO_STRUCT_OFFSET (MonoContext, edi), 4);
 
        /* restore ESI */
-       x86_mov_reg_membase (code, X86_ESI, X86_EAX,  G_STRUCT_OFFSET (MonoContext, esi), 4);
+       x86_mov_reg_membase (code, X86_ESI, X86_EAX,  MONO_STRUCT_OFFSET (MonoContext, esi), 4);
 
        /* restore EDX */
-       x86_mov_reg_membase (code, X86_EDX, X86_EAX,  G_STRUCT_OFFSET (MonoContext, edx), 4);
+       x86_mov_reg_membase (code, X86_EDX, X86_EAX,  MONO_STRUCT_OFFSET (MonoContext, edx), 4);
 
        /*
         * The context resides on the stack, in the stack frame of the
@@ -341,24 +343,24 @@ mono_arch_get_restore_context (MonoTrampInfo **info, gboolean aot)
         */
 
        /* load ESP into EBP */
-       x86_mov_reg_membase (code, X86_EBP, X86_EAX,  G_STRUCT_OFFSET (MonoContext, esp), 4);
+       x86_mov_reg_membase (code, X86_EBP, X86_EAX,  MONO_STRUCT_OFFSET (MonoContext, esp), 4);
        /* load return address into ECX */
-       x86_mov_reg_membase (code, X86_ECX, X86_EAX,  G_STRUCT_OFFSET (MonoContext, eip), 4);
+       x86_mov_reg_membase (code, X86_ECX, X86_EAX,  MONO_STRUCT_OFFSET (MonoContext, eip), 4);
        /* save the return addr to the restored stack - 4 */
        x86_mov_membase_reg (code, X86_EBP, -4, X86_ECX, 4);
 
        /* load EBP into ECX */
-       x86_mov_reg_membase (code, X86_ECX, X86_EAX,  G_STRUCT_OFFSET (MonoContext, ebp), 4);
+       x86_mov_reg_membase (code, X86_ECX, X86_EAX,  MONO_STRUCT_OFFSET (MonoContext, ebp), 4);
        /* save EBP to the restored stack - 8 */
        x86_mov_membase_reg (code, X86_EBP, -8, X86_ECX, 4);
 
        /* load EAX into ECX */
-       x86_mov_reg_membase (code, X86_ECX, X86_EAX,  G_STRUCT_OFFSET (MonoContext, eax), 4);
+       x86_mov_reg_membase (code, X86_ECX, X86_EAX,  MONO_STRUCT_OFFSET (MonoContext, eax), 4);
        /* save EAX to the restored stack - 12 */
        x86_mov_membase_reg (code, X86_EBP, -12, X86_ECX, 4);
 
        /* restore ECX */
-       x86_mov_reg_membase (code, X86_ECX, X86_EAX,  G_STRUCT_OFFSET (MonoContext, ecx), 4);
+       x86_mov_reg_membase (code, X86_ECX, X86_EAX,  MONO_STRUCT_OFFSET (MonoContext, ecx), 4);
 
        /* restore ESP - 12 */
        x86_lea_membase (code, X86_ESP, X86_EBP, -12);
@@ -417,11 +419,11 @@ mono_arch_get_call_filter (MonoTrampInfo **info, gboolean aot)
        x86_push_reg (code, X86_EBP);
 
        /* set new EBP */
-       x86_mov_reg_membase (code, X86_EBP, X86_EAX,  G_STRUCT_OFFSET (MonoContext, ebp), 4);
+       x86_mov_reg_membase (code, X86_EBP, X86_EAX,  MONO_STRUCT_OFFSET (MonoContext, ebp), 4);
        /* restore registers used by global register allocation (EBX & ESI) */
-       x86_mov_reg_membase (code, X86_EBX, X86_EAX,  G_STRUCT_OFFSET (MonoContext, ebx), 4);
-       x86_mov_reg_membase (code, X86_ESI, X86_EAX,  G_STRUCT_OFFSET (MonoContext, esi), 4);
-       x86_mov_reg_membase (code, X86_EDI, X86_EAX,  G_STRUCT_OFFSET (MonoContext, edi), 4);
+       x86_mov_reg_membase (code, X86_EBX, X86_EAX,  MONO_STRUCT_OFFSET (MonoContext, ebx), 4);
+       x86_mov_reg_membase (code, X86_ESI, X86_EAX,  MONO_STRUCT_OFFSET (MonoContext, esi), 4);
+       x86_mov_reg_membase (code, X86_EDI, X86_EAX,  MONO_STRUCT_OFFSET (MonoContext, edi), 4);
 
        /* align stack and save ESP */
        x86_mov_reg_reg (code, X86_EDX, X86_ESP, 4);
@@ -814,7 +816,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
 
                mono_unwind_frame (unwind_info, unwind_info_len, ji->code_start, 
                                                   (guint8*)ji->code_start + ji->code_size,
-                                                  ip, regs, MONO_MAX_IREGS + 1,
+                                                  ip, NULL, regs, MONO_MAX_IREGS + 1,
                                                   save_locations, MONO_MAX_IREGS, &cfa);
 
                new_ctx->eax = regs [X86_EAX];
@@ -1206,26 +1208,26 @@ mono_tasklets_arch_restore (void)
         x86_mov_reg_membase (code, X86_EAX, X86_ESP, 8, 4);
 
        /* setup the copy of the stack */
-       x86_mov_reg_membase (code, X86_ECX, X86_EDX, G_STRUCT_OFFSET (MonoContinuation, stack_used_size), 4);
+       x86_mov_reg_membase (code, X86_ECX, X86_EDX, MONO_STRUCT_OFFSET (MonoContinuation, stack_used_size), 4);
        x86_shift_reg_imm (code, X86_SHR, X86_ECX, 2);
        x86_cld (code);
-       x86_mov_reg_membase (code, X86_ESI, X86_EDX, G_STRUCT_OFFSET (MonoContinuation, saved_stack), 4);
-       x86_mov_reg_membase (code, X86_EDI, X86_EDX, G_STRUCT_OFFSET (MonoContinuation, return_sp), 4);
+       x86_mov_reg_membase (code, X86_ESI, X86_EDX, MONO_STRUCT_OFFSET (MonoContinuation, saved_stack), 4);
+       x86_mov_reg_membase (code, X86_EDI, X86_EDX, MONO_STRUCT_OFFSET (MonoContinuation, return_sp), 4);
        x86_prefix (code, X86_REP_PREFIX);
        x86_movsl (code);
 
        /* now restore the registers from the LMF */
-       x86_mov_reg_membase (code, X86_ECX, X86_EDX, G_STRUCT_OFFSET (MonoContinuation, lmf), 4);
-       x86_mov_reg_membase (code, X86_EBX, X86_ECX, G_STRUCT_OFFSET (MonoLMF, ebx), 4);
-       x86_mov_reg_membase (code, X86_EBP, X86_ECX, G_STRUCT_OFFSET (MonoLMF, ebp), 4);
-       x86_mov_reg_membase (code, X86_ESI, X86_ECX, G_STRUCT_OFFSET (MonoLMF, esi), 4);
-       x86_mov_reg_membase (code, X86_EDI, X86_ECX, G_STRUCT_OFFSET (MonoLMF, edi), 4);
+       x86_mov_reg_membase (code, X86_ECX, X86_EDX, MONO_STRUCT_OFFSET (MonoContinuation, lmf), 4);
+       x86_mov_reg_membase (code, X86_EBX, X86_ECX, MONO_STRUCT_OFFSET (MonoLMF, ebx), 4);
+       x86_mov_reg_membase (code, X86_EBP, X86_ECX, MONO_STRUCT_OFFSET (MonoLMF, ebp), 4);
+       x86_mov_reg_membase (code, X86_ESI, X86_ECX, MONO_STRUCT_OFFSET (MonoLMF, esi), 4);
+       x86_mov_reg_membase (code, X86_EDI, X86_ECX, MONO_STRUCT_OFFSET (MonoLMF, edi), 4);
 
        /* restore the lmf chain */
        /*x86_mov_reg_membase (code, X86_ECX, X86_ESP, 12, 4);
        x86_mov_membase_reg (code, X86_ECX, 0, X86_EDX, 4);*/
 
-       x86_jump_membase (code, X86_EDX, G_STRUCT_OFFSET (MonoContinuation, return_ip));
+       x86_jump_membase (code, X86_EDX, MONO_STRUCT_OFFSET (MonoContinuation, return_ip));
        g_assert ((code - start) <= 48);
        saved = start;
        return (MonoContinuationRestore)saved;
index 9ba92bf3765bb3fb377aba0cdfe547a704c3adb6..c208c2a4b1211f5cd77af89b691867639dbcdfc6 100644 (file)
@@ -933,15 +933,15 @@ static int ccount = 0;
                if (!(cfg->opt & MONO_OPT_ABCREM)) {                                                    \
                        MONO_EMIT_NULL_CHECK (cfg, array_reg);                                          \
                        if (COMPILE_LLVM (cfg)) \
-                               MONO_EMIT_DEFAULT_BOUNDS_CHECK ((cfg), (array_reg), G_STRUCT_OFFSET (array_type, array_length_field), (index_reg), TRUE); \
+                               MONO_EMIT_DEFAULT_BOUNDS_CHECK ((cfg), (array_reg), MONO_STRUCT_OFFSET (array_type, array_length_field), (index_reg), TRUE); \
                        else \
-                               MONO_ARCH_EMIT_BOUNDS_CHECK ((cfg), (array_reg), G_STRUCT_OFFSET (array_type, array_length_field), (index_reg)); \
+                               MONO_ARCH_EMIT_BOUNDS_CHECK ((cfg), (array_reg), MONO_STRUCT_OFFSET (array_type, array_length_field), (index_reg)); \
                } else {                                                                                                                \
                        MonoInst *ins;                                                                                          \
                        MONO_INST_NEW ((cfg), ins, OP_BOUNDS_CHECK);                            \
                        ins->sreg1 = array_reg;                                                                         \
                        ins->sreg2 = index_reg;                                                                         \
-                       ins->inst_imm = G_STRUCT_OFFSET (array_type, array_length_field); \
+                       ins->inst_imm = MONO_STRUCT_OFFSET (array_type, array_length_field); \
                        ins->flags |= MONO_INST_FAULT; \
                        MONO_ADD_INS ((cfg)->cbb, ins);                                                         \
                        (cfg)->flags |= MONO_CFG_HAS_ARRAY_ACCESS;                                      \
index 7ed3d639745a95a85fe49c65bbfd7a6163fa7884..3dbf66950af189b12bfe602660501c13fc8e8fc0 100644 (file)
@@ -33,7 +33,8 @@
 #endif
 
 #include <mono/utils/memcheck.h>
-
+#include "mini.h"
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/assembly.h>
 #include <mono/metadata/attrdefs.h>
 #include <mono/metadata/loader.h>
@@ -60,7 +61,6 @@
 #include <mono/utils/mono-memory-model.h>
 #include <mono/metadata/mono-basic-block.h>
 
-#include "mini.h"
 #include "trace.h"
 
 #include "ir-emit.h"
@@ -139,13 +139,13 @@ int mono_op_to_op_imm_noemul (int opcode);
 MONO_API MonoInst* mono_emit_native_call (MonoCompile *cfg, gconstpointer func, MonoMethodSignature *sig, MonoInst **args);
 
 /* helper methods signatures */
-static MonoMethodSignature *helper_sig_class_init_trampoline = NULL;
-static MonoMethodSignature *helper_sig_domain_get = NULL;
-static MonoMethodSignature *helper_sig_generic_class_init_trampoline = NULL;
-static MonoMethodSignature *helper_sig_generic_class_init_trampoline_llvm = NULL;
-static MonoMethodSignature *helper_sig_rgctx_lazy_fetch_trampoline = NULL;
-static MonoMethodSignature *helper_sig_monitor_enter_exit_trampoline = NULL;
-static MonoMethodSignature *helper_sig_monitor_enter_exit_trampoline_llvm = NULL;
+static MonoMethodSignature *helper_sig_class_init_trampoline;
+static MonoMethodSignature *helper_sig_domain_get;
+static MonoMethodSignature *helper_sig_generic_class_init_trampoline;
+static MonoMethodSignature *helper_sig_generic_class_init_trampoline_llvm;
+static MonoMethodSignature *helper_sig_rgctx_lazy_fetch_trampoline;
+static MonoMethodSignature *helper_sig_monitor_enter_exit_trampoline;
+static MonoMethodSignature *helper_sig_monitor_enter_exit_trampoline_llvm;
 
 /*
  * Instruction metadata
@@ -1523,7 +1523,7 @@ mini_emit_interface_bitmap_check (MonoCompile *cfg, int intf_bit_reg, int base_r
 static void
 mini_emit_load_intf_bit_reg_class (MonoCompile *cfg, int intf_bit_reg, int klass_reg, MonoClass *klass)
 {
-       mini_emit_interface_bitmap_check (cfg, intf_bit_reg, klass_reg, G_STRUCT_OFFSET (MonoClass, interface_bitmap), klass);
+       mini_emit_interface_bitmap_check (cfg, intf_bit_reg, klass_reg, MONO_STRUCT_OFFSET (MonoClass, interface_bitmap), klass);
 }
 
 /* 
@@ -1533,7 +1533,7 @@ mini_emit_load_intf_bit_reg_class (MonoCompile *cfg, int intf_bit_reg, int klass
 static void
 mini_emit_load_intf_bit_reg_vtable (MonoCompile *cfg, int intf_bit_reg, int vtable_reg, MonoClass *klass)
 {
-       mini_emit_interface_bitmap_check (cfg, intf_bit_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, interface_bitmap), klass);
+       mini_emit_interface_bitmap_check (cfg, intf_bit_reg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, interface_bitmap), klass);
 }
 
 /* 
@@ -1564,7 +1564,7 @@ mini_emit_max_iid_check_vtable (MonoCompile *cfg, int vtable_reg, MonoClass *kla
 {
        int max_iid_reg = alloc_preg (cfg);
                
-       MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU2_MEMBASE, max_iid_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, max_interface_id));
+       MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU2_MEMBASE, max_iid_reg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, max_interface_id));
        mini_emit_max_iid_check (cfg, max_iid_reg, klass, false_target);
 }
 
@@ -1575,7 +1575,7 @@ mini_emit_max_iid_check_class (MonoCompile *cfg, int klass_reg, MonoClass *klass
 {
        int max_iid_reg = alloc_preg (cfg);
 
-       MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU2_MEMBASE, max_iid_reg, klass_reg, G_STRUCT_OFFSET (MonoClass, max_interface_id));          
+       MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU2_MEMBASE, max_iid_reg, klass_reg, MONO_STRUCT_OFFSET (MonoClass, max_interface_id));
        mini_emit_max_iid_check (cfg, max_iid_reg, klass, false_target);
 }
 
@@ -1589,11 +1589,11 @@ mini_emit_isninst_cast_inst (MonoCompile *cfg, int klass_reg, MonoClass *klass,
        mono_class_setup_supertypes (klass);
 
        if (klass->idepth > MONO_DEFAULT_SUPERTABLE_SIZE) {
-               MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU2_MEMBASE, idepth_reg, klass_reg, G_STRUCT_OFFSET (MonoClass, idepth));
+               MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU2_MEMBASE, idepth_reg, klass_reg, MONO_STRUCT_OFFSET (MonoClass, idepth));
                MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, idepth_reg, klass->idepth);
                MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_PBLT_UN, false_target);
        }
-       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, stypes_reg, klass_reg, G_STRUCT_OFFSET (MonoClass, supertypes));
+       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, stypes_reg, klass_reg, MONO_STRUCT_OFFSET (MonoClass, supertypes));
        MONO_EMIT_NEW_LOAD_MEMBASE (cfg, stype, stypes_reg, ((klass->idepth - 1) * SIZEOF_VOID_P));
        if (klass_ins) {
                MONO_EMIT_NEW_BIALU (cfg, OP_COMPARE, -1, stype, klass_ins->dreg);
@@ -1689,14 +1689,14 @@ mini_emit_castclass_inst (MonoCompile *cfg, int obj_reg, int klass_reg, MonoClas
                int eclass_reg = alloc_preg (cfg);
 
                g_assert (!klass_inst);
-               MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU1_MEMBASE, rank_reg, klass_reg, G_STRUCT_OFFSET (MonoClass, rank));
+               MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU1_MEMBASE, rank_reg, klass_reg, MONO_STRUCT_OFFSET (MonoClass, rank));
                MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, rank_reg, klass->rank);
                MONO_EMIT_NEW_COND_EXC (cfg, NE_UN, "InvalidCastException");
-               //              MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, eclass_reg, klass_reg, G_STRUCT_OFFSET (MonoClass, cast_class));
+               //              MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, klass));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, eclass_reg, klass_reg, MONO_STRUCT_OFFSET (MonoClass, cast_class));
                if (klass->cast_class == mono_defaults.object_class) {
                        int parent_reg = alloc_preg (cfg);
-                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, parent_reg, eclass_reg, G_STRUCT_OFFSET (MonoClass, parent));
+                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, parent_reg, eclass_reg, MONO_STRUCT_OFFSET (MonoClass, parent));
                        mini_emit_class_check_branch (cfg, parent_reg, mono_defaults.enum_class->parent, OP_PBNE_UN, object_is_null);
                        mini_emit_class_check (cfg, eclass_reg, mono_defaults.enum_class);
                } else if (klass->cast_class == mono_defaults.enum_class->parent) {
@@ -1714,7 +1714,7 @@ mini_emit_castclass_inst (MonoCompile *cfg, int obj_reg, int klass_reg, MonoClas
                if ((klass->rank == 1) && (klass->byval_arg.type == MONO_TYPE_SZARRAY) && (obj_reg != -1)) {
                        /* Check that the object is a vector too */
                        int bounds_reg = alloc_preg (cfg);
-                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, bounds_reg, obj_reg, G_STRUCT_OFFSET (MonoArray, bounds));
+                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, bounds_reg, obj_reg, MONO_STRUCT_OFFSET (MonoArray, bounds));
                        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, bounds_reg, 0);
                        MONO_EMIT_NEW_COND_EXC (cfg, NE_UN, "InvalidCastException");
                }
@@ -1726,11 +1726,11 @@ mini_emit_castclass_inst (MonoCompile *cfg, int obj_reg, int klass_reg, MonoClas
                mono_class_setup_supertypes (klass);
 
                if (klass->idepth > MONO_DEFAULT_SUPERTABLE_SIZE) {
-                       MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU2_MEMBASE, idepth_reg, klass_reg, G_STRUCT_OFFSET (MonoClass, idepth));
+                       MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU2_MEMBASE, idepth_reg, klass_reg, MONO_STRUCT_OFFSET (MonoClass, idepth));
                        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, idepth_reg, klass->idepth);
                        MONO_EMIT_NEW_COND_EXC (cfg, LT_UN, "InvalidCastException");
                }
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, stypes_reg, klass_reg, G_STRUCT_OFFSET (MonoClass, supertypes));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, stypes_reg, klass_reg, MONO_STRUCT_OFFSET (MonoClass, supertypes));
                MONO_EMIT_NEW_LOAD_MEMBASE (cfg, stype, stypes_reg, ((klass->idepth - 1) * SIZEOF_VOID_P));
                mini_emit_class_check_inst (cfg, stype, klass, klass_inst);
        }
@@ -1930,7 +1930,7 @@ emit_push_lmf (MonoCompile *cfg)
                EMIT_NEW_VARLOADA (cfg, ins, cfg->lmf_var, NULL);
                lmf_reg = ins->dreg;
                /* Save previous_lmf */
-               EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, lmf_reg, G_STRUCT_OFFSET (MonoLMF, previous_lmf), lmf_ins->dreg);
+               EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, lmf_reg, MONO_STRUCT_OFFSET (MonoLMF, previous_lmf), lmf_ins->dreg);
                /* Set new LMF */
                emit_tls_set (cfg, lmf_reg, TLS_KEY_LMF);
        } else {
@@ -1947,7 +1947,7 @@ emit_push_lmf (MonoCompile *cfg)
 
                        MONO_ADD_INS (cfg->cbb, ins);
                        lmf_reg = alloc_preg (cfg);
-                       EMIT_NEW_BIALU_IMM (cfg, lmf_ins, OP_PADD_IMM, lmf_reg, jit_tls_dreg, G_STRUCT_OFFSET (MonoJitTlsData, lmf));
+                       EMIT_NEW_BIALU_IMM (cfg, lmf_ins, OP_PADD_IMM, lmf_reg, jit_tls_dreg, MONO_STRUCT_OFFSET (MonoJitTlsData, lmf));
                } else {
                        lmf_ins = mono_emit_jit_icall (cfg, mono_get_lmf_addr, NULL);
                }
@@ -1967,7 +1967,7 @@ emit_push_lmf (MonoCompile *cfg)
                        /* call pthread_getspecific () */
                        jit_tls_ins = mono_emit_jit_icall (cfg, pthread_getspecific, args);
                        /* lmf_addr = &jit_tls->lmf */
-                       EMIT_NEW_BIALU_IMM (cfg, ins, OP_PADD_IMM, cfg->lmf_addr_var->dreg, jit_tls_ins->dreg, G_STRUCT_OFFSET (MonoJitTlsData, lmf));
+                       EMIT_NEW_BIALU_IMM (cfg, ins, OP_PADD_IMM, cfg->lmf_addr_var->dreg, jit_tls_ins->dreg, MONO_STRUCT_OFFSET (MonoJitTlsData, lmf));
                        lmf_ins = ins;
 #else
                        lmf_ins = mono_emit_jit_icall (cfg, mono_get_lmf_addr, NULL);
@@ -1982,7 +1982,7 @@ emit_push_lmf (MonoCompile *cfg)
                prev_lmf_reg = alloc_preg (cfg);
                /* Save previous_lmf */
                EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, prev_lmf_reg, cfg->lmf_addr_var->dreg, 0);
-               EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, lmf_reg, G_STRUCT_OFFSET (MonoLMF, previous_lmf), prev_lmf_reg);
+               EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, lmf_reg, MONO_STRUCT_OFFSET (MonoLMF, previous_lmf), prev_lmf_reg);
                /* Set new lmf */
                EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, cfg->lmf_addr_var->dreg, 0, lmf_reg);
        }
@@ -2008,7 +2008,7 @@ emit_pop_lmf (MonoCompile *cfg)
        if (cfg->lmf_ir_mono_lmf && mini_tls_get_supported (cfg, TLS_KEY_LMF)) {
                /* Load previous_lmf */
                prev_lmf_reg = alloc_preg (cfg);
-               EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, prev_lmf_reg, lmf_reg, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
+               EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, prev_lmf_reg, lmf_reg, MONO_STRUCT_OFFSET (MonoLMF, previous_lmf));
                /* Set new LMF */
                emit_tls_set (cfg, prev_lmf_reg, TLS_KEY_LMF);
        } else {
@@ -2022,7 +2022,7 @@ emit_pop_lmf (MonoCompile *cfg)
                lmf_addr_reg = cfg->lmf_addr_var->dreg;
 
                prev_lmf_reg = alloc_preg (cfg);
-               EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, prev_lmf_reg, lmf_reg, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
+               EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, prev_lmf_reg, lmf_reg, MONO_STRUCT_OFFSET (MonoLMF, previous_lmf));
                EMIT_NEW_STORE_MEMBASE (cfg, ins, OP_STORE_MEMBASE_REG, lmf_addr_reg, 0, prev_lmf_reg);
        }
 }
@@ -2344,7 +2344,6 @@ callvirt_to_call (int opcode)
        return -1;
 }
 
-#ifdef MONO_ARCH_HAVE_IMT
 /* Either METHOD or IMT_ARG needs to be set */
 static void
 emit_imt_argument (MonoCompile *cfg, MonoCallInst *call, MonoMethod *method, MonoInst *imt_arg)
@@ -2398,7 +2397,6 @@ emit_imt_argument (MonoCompile *cfg, MonoCallInst *call, MonoMethod *method, Mon
        mono_arch_emit_imt_argument (cfg, call, imt_arg);
 #endif
 }
-#endif
 
 static MonoJumpInfo *
 mono_patch_info_new (MonoMemPool *mp, int ip, MonoJumpInfoType type, gconstpointer target)
@@ -2755,7 +2753,7 @@ mono_emit_method_call_full (MonoCompile *cfg, MonoMethod *method, MonoMethodSign
 
                        /* Make a call to delegate->invoke_impl */
                        call->inst.inst_basereg = this_reg;
-                       call->inst.inst_offset = G_STRUCT_OFFSET (MonoDelegate, invoke_impl);
+                       call->inst.inst_offset = MONO_STRUCT_OFFSET (MonoDelegate, invoke_impl);
                        MONO_ADD_INS (cfg->cbb, (MonoInst*)call);
 
                        /* We must emit a dummy use here because the delegate trampoline will
@@ -2809,17 +2807,15 @@ mono_emit_method_call_full (MonoCompile *cfg, MonoMethod *method, MonoMethodSign
                        call->inst.opcode = callvirt_to_call (call->inst.opcode);
                } else {
                        vtable_reg = alloc_preg (cfg);
-                       MONO_EMIT_NEW_LOAD_MEMBASE_FAULT (cfg, vtable_reg, this_reg, G_STRUCT_OFFSET (MonoObject, vtable));
+                       MONO_EMIT_NEW_LOAD_MEMBASE_FAULT (cfg, vtable_reg, this_reg, MONO_STRUCT_OFFSET (MonoObject, vtable));
                        if (method->klass->flags & TYPE_ATTRIBUTE_INTERFACE) {
                                slot_reg = -1;
-#ifdef MONO_ARCH_HAVE_IMT
                                if (mono_use_imt) {
                                        guint32 imt_slot = mono_method_get_imt_slot (method);
                                        emit_imt_argument (cfg, call, call->method, imt_arg);
                                        slot_reg = vtable_reg;
                                        offset = ((gint32)imt_slot - MONO_IMT_SIZE) * SIZEOF_VOID_P;
                                }
-#endif
                                if (slot_reg == -1) {
                                        slot_reg = alloc_preg (cfg);
                                        mini_emit_load_intf_reg_vtable (cfg, slot_reg, vtable_reg, method->klass);
@@ -2827,14 +2823,12 @@ mono_emit_method_call_full (MonoCompile *cfg, MonoMethod *method, MonoMethodSign
                                }
                        } else {
                                slot_reg = vtable_reg;
-                               offset = G_STRUCT_OFFSET (MonoVTable, vtable) +
+                               offset = MONO_STRUCT_OFFSET (MonoVTable, vtable) +
                                        ((mono_method_get_vtable_index (method)) * (SIZEOF_VOID_P));
-#ifdef MONO_ARCH_HAVE_IMT
                                if (imt_arg) {
                                        g_assert (mono_method_signature (method)->generic_param_count);
                                        emit_imt_argument (cfg, call, call->method, imt_arg);
                                }
-#endif
                        }
 
                        call->inst.sreg1 = slot_reg;
@@ -3307,7 +3301,7 @@ emit_get_rgctx (MonoCompile *cfg, MonoMethod *method, int context_used)
                        int vtable_reg;
 
                        vtable_reg = alloc_preg (cfg);
-                       EMIT_NEW_LOAD_MEMBASE (cfg, vtable_var, OP_LOAD_MEMBASE, vtable_reg, mrgctx_var->dreg, G_STRUCT_OFFSET (MonoMethodRuntimeGenericContext, class_vtable));
+                       EMIT_NEW_LOAD_MEMBASE (cfg, vtable_var, OP_LOAD_MEMBASE, vtable_reg, mrgctx_var->dreg, MONO_STRUCT_OFFSET (MonoMethodRuntimeGenericContext, class_vtable));
                        vtable_var->type = STACK_PTR;
                }
 
@@ -3317,7 +3311,7 @@ emit_get_rgctx (MonoCompile *cfg, MonoMethod *method, int context_used)
                int vtable_reg;
        
                vtable_reg = alloc_preg (cfg);
-               EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, vtable_reg, this->dreg, G_STRUCT_OFFSET (MonoObject, vtable));
+               EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, vtable_reg, this->dreg, MONO_STRUCT_OFFSET (MonoObject, vtable));
                return ins;
        }
 }
@@ -3486,7 +3480,7 @@ emit_get_gsharedvt_info (MonoCompile *cfg, gpointer data, MonoRgctxInfoType rgct
        idx = get_gsharedvt_info_slot (cfg, data, rgctx_type);
        /* Load info->entries [idx] */
        dreg = alloc_preg (cfg);
-       EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, dreg, cfg->gsharedvt_info_var->dreg, G_STRUCT_OFFSET (MonoGSharedVtMethodRuntimeInfo, entries) + (idx * sizeof (gpointer)));
+       EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, dreg, cfg->gsharedvt_info_var->dreg, MONO_STRUCT_OFFSET (MonoGSharedVtMethodRuntimeInfo, entries) + (idx * sizeof (gpointer)));
 
        return ins;
 }
@@ -3569,12 +3563,12 @@ save_cast_details (MonoCompile *cfg, MonoClass *klass, int obj_reg, gboolean nul
                }
 
                MONO_ADD_INS (cfg->cbb, tls_get);
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, vtable_reg, obj_reg, G_STRUCT_OFFSET (MonoObject, vtable));
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, vtable_reg, obj_reg, MONO_STRUCT_OFFSET (MonoObject, vtable));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, klass));
 
-               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, tls_get->dreg, G_STRUCT_OFFSET (MonoJitTlsData, class_cast_from), klass_reg);
+               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, tls_get->dreg, MONO_STRUCT_OFFSET (MonoJitTlsData, class_cast_from), klass_reg);
                MONO_EMIT_NEW_PCONST (cfg, to_klass_reg, klass);
-               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, tls_get->dreg, G_STRUCT_OFFSET (MonoJitTlsData, class_cast_to), to_klass_reg);
+               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, tls_get->dreg, MONO_STRUCT_OFFSET (MonoJitTlsData, class_cast_to), to_klass_reg);
 
                if (null_check) {
                        MONO_START_BB (cfg, is_null_bb);
@@ -3593,7 +3587,7 @@ reset_cast_details (MonoCompile *cfg)
 
                MONO_ADD_INS (cfg->cbb, tls_get);
                /* It is enough to reset the from field */
-               MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STORE_MEMBASE_IMM, tls_get->dreg, G_STRUCT_OFFSET (MonoJitTlsData, class_cast_from), 0);
+               MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STORE_MEMBASE_IMM, tls_get->dreg, MONO_STRUCT_OFFSET (MonoJitTlsData, class_cast_from), 0);
        }
 }
 
@@ -3610,11 +3604,11 @@ mini_emit_check_array_type (MonoCompile *cfg, MonoInst *obj, MonoClass *array_cl
 
        save_cast_details (cfg, array_class, obj->dreg, FALSE, NULL);
 
-       MONO_EMIT_NEW_LOAD_MEMBASE_FAULT (cfg, vtable_reg, obj->dreg, G_STRUCT_OFFSET (MonoObject, vtable));
+       MONO_EMIT_NEW_LOAD_MEMBASE_FAULT (cfg, vtable_reg, obj->dreg, MONO_STRUCT_OFFSET (MonoObject, vtable));
 
        if (cfg->opt & MONO_OPT_SHARED) {
                int class_reg = alloc_preg (cfg);
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, class_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, class_reg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, klass));
                if (cfg->compile_aot) {
                        int klass_reg = alloc_preg (cfg);
                        MONO_EMIT_NEW_CLASSCONST (cfg, klass_reg, array_class);
@@ -3700,8 +3694,8 @@ handle_unbox (MonoCompile *cfg, MonoClass *klass, MonoInst **sp, int context_use
        int rank_reg = alloc_dreg (cfg ,STACK_I4);
 
        obj_reg = sp [0]->dreg;
-       MONO_EMIT_NEW_LOAD_MEMBASE_FAULT (cfg, vtable_reg, obj_reg, G_STRUCT_OFFSET (MonoObject, vtable));
-       MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU1_MEMBASE, rank_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, rank));
+       MONO_EMIT_NEW_LOAD_MEMBASE_FAULT (cfg, vtable_reg, obj_reg, MONO_STRUCT_OFFSET (MonoObject, vtable));
+       MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU1_MEMBASE, rank_reg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, rank));
 
        /* FIXME: generics */
        g_assert (klass->rank == 0);
@@ -3710,8 +3704,8 @@ handle_unbox (MonoCompile *cfg, MonoClass *klass, MonoInst **sp, int context_use
        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, rank_reg, 0);
        MONO_EMIT_NEW_COND_EXC (cfg, NE_UN, "InvalidCastException");
 
-       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
-       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, eclass_reg, klass_reg, G_STRUCT_OFFSET (MonoClass, element_class));
+       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, klass));
+       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, eclass_reg, klass_reg, MONO_STRUCT_OFFSET (MonoClass, element_class));
 
        if (context_used) {
                MonoInst *element_class;
@@ -4111,12 +4105,12 @@ handle_castclass (MonoCompile *cfg, MonoClass *klass, MonoInst *src, int context
        save_cast_details (cfg, klass, obj_reg, FALSE, NULL);
 
        if (klass->flags & TYPE_ATTRIBUTE_INTERFACE) {
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, vtable_reg, obj_reg, G_STRUCT_OFFSET (MonoObject, vtable));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, vtable_reg, obj_reg, MONO_STRUCT_OFFSET (MonoObject, vtable));
                mini_emit_iface_cast (cfg, vtable_reg, klass, NULL, NULL);
        } else {
                int klass_reg = alloc_preg (cfg);
 
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, vtable_reg, obj_reg, G_STRUCT_OFFSET (MonoObject, vtable));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, vtable_reg, obj_reg, MONO_STRUCT_OFFSET (MonoObject, vtable));
 
                if (!klass->rank && !cfg->compile_aot && !(cfg->opt & MONO_OPT_SHARED) && (klass->flags & TYPE_ATTRIBUTE_SEALED)) {
                        /* the remoting code is broken, access the class for now */
@@ -4129,12 +4123,12 @@ handle_castclass (MonoCompile *cfg, MonoClass *klass, MonoInst *src, int context
                                }
                                MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, vtable_reg, vt);
                        } else {
-                               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
+                               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, klass));
                                MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, klass_reg, klass);
                        }
                        MONO_EMIT_NEW_COND_EXC (cfg, NE_UN, "InvalidCastException");
                } else {
-                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
+                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, klass));
                        mini_emit_castclass_inst (cfg, obj_reg, klass_reg, klass, klass_inst, is_null_bb);
                }
        }
@@ -4195,7 +4189,7 @@ handle_isinst (MonoCompile *cfg, MonoClass *klass, MonoInst *src, int context_us
        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, obj_reg, 0);
        MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_IBEQ, is_null_bb);
 
-       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, vtable_reg, obj_reg, G_STRUCT_OFFSET (MonoObject, vtable));
+       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, vtable_reg, obj_reg, MONO_STRUCT_OFFSET (MonoObject, vtable));
 
        if (klass->flags & TYPE_ATTRIBUTE_INTERFACE) {
                g_assert (!context_used);
@@ -4209,14 +4203,14 @@ handle_isinst (MonoCompile *cfg, MonoClass *klass, MonoInst *src, int context_us
                        int eclass_reg = alloc_preg (cfg);
 
                        g_assert (!context_used);
-                       MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU1_MEMBASE, rank_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, rank));
+                       MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADU1_MEMBASE, rank_reg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, rank));
                        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, rank_reg, klass->rank);
                        MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_PBNE_UN, false_bb);
-                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
-                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, eclass_reg, klass_reg, G_STRUCT_OFFSET (MonoClass, cast_class));
+                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, klass));
+                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, eclass_reg, klass_reg, MONO_STRUCT_OFFSET (MonoClass, cast_class));
                        if (klass->cast_class == mono_defaults.object_class) {
                                int parent_reg = alloc_preg (cfg);
-                               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, parent_reg, eclass_reg, G_STRUCT_OFFSET (MonoClass, parent));
+                               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, parent_reg, eclass_reg, MONO_STRUCT_OFFSET (MonoClass, parent));
                                mini_emit_class_check_branch (cfg, parent_reg, mono_defaults.enum_class->parent, OP_PBNE_UN, is_null_bb);
                                mini_emit_class_check_branch (cfg, eclass_reg, mono_defaults.enum_class, OP_PBEQ, is_null_bb);
                                MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_BR, false_bb);
@@ -4233,7 +4227,7 @@ handle_isinst (MonoCompile *cfg, MonoClass *klass, MonoInst *src, int context_us
                                if ((klass->rank == 1) && (klass->byval_arg.type == MONO_TYPE_SZARRAY)) {
                                        /* Check that the object is a vector too */
                                        int bounds_reg = alloc_preg (cfg);
-                                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, bounds_reg, obj_reg, G_STRUCT_OFFSET (MonoArray, bounds));
+                                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, bounds_reg, obj_reg, MONO_STRUCT_OFFSET (MonoArray, bounds));
                                        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, bounds_reg, 0);
                                        MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_PBNE_UN, false_bb);
                                }
@@ -4243,7 +4237,7 @@ handle_isinst (MonoCompile *cfg, MonoClass *klass, MonoInst *src, int context_us
                        }
                } else if (mono_class_is_nullable (klass)) {
                        g_assert (!context_used);
-                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
+                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, klass));
                        /* the is_null_bb target simply copies the input register to the output */
                        mini_emit_isninst_cast (cfg, klass_reg, klass->cast_class, false_bb, is_null_bb);
                } else {
@@ -4259,13 +4253,13 @@ handle_isinst (MonoCompile *cfg, MonoClass *klass, MonoInst *src, int context_us
                                        }
                                        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, vtable_reg, vt);
                                } else {
-                                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
+                                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, klass));
                                        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, klass_reg, klass);
                                }
                                MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_PBNE_UN, false_bb);
                                MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_BR, is_null_bb);
                        } else {
-                               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
+                               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, klass));
                                /* the is_null_bb target simply copies the input register to the output */
                                mini_emit_isninst_cast_inst (cfg, klass_reg, klass, klass_inst, false_bb, is_null_bb);
                        }
@@ -4322,16 +4316,16 @@ handle_cisinst (MonoCompile *cfg, MonoClass *klass, MonoInst *src)
 #endif
 
                tmp_reg = alloc_preg (cfg);
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, G_STRUCT_OFFSET (MonoObject, vtable));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, MONO_STRUCT_OFFSET (MonoObject, vtable));
 #ifndef DISABLE_REMOTING
                mini_emit_iface_cast (cfg, tmp_reg, klass, interface_fail_bb, true_bb);
                MONO_START_BB (cfg, interface_fail_bb);
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, tmp_reg, G_STRUCT_OFFSET (MonoVTable, klass));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, tmp_reg, MONO_STRUCT_OFFSET (MonoVTable, klass));
                
                mini_emit_class_check_branch (cfg, klass_reg, mono_defaults.transparent_proxy_class, OP_PBNE_UN, false_bb);
 
                tmp_reg = alloc_preg (cfg);
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, G_STRUCT_OFFSET (MonoTransparentProxy, custom_type_info));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, MONO_STRUCT_OFFSET (MonoTransparentProxy, custom_type_info));
                MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, tmp_reg, 0);
                MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_PBNE_UN, false2_bb);                
 #else
@@ -4340,16 +4334,16 @@ handle_cisinst (MonoCompile *cfg, MonoClass *klass, MonoInst *src)
        } else {
 #ifndef DISABLE_REMOTING
                tmp_reg = alloc_preg (cfg);
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, G_STRUCT_OFFSET (MonoObject, vtable));
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, tmp_reg, G_STRUCT_OFFSET (MonoVTable, klass));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, MONO_STRUCT_OFFSET (MonoObject, vtable));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, tmp_reg, MONO_STRUCT_OFFSET (MonoVTable, klass));
 
                mini_emit_class_check_branch (cfg, klass_reg, mono_defaults.transparent_proxy_class, OP_PBNE_UN, no_proxy_bb);          
                tmp_reg = alloc_preg (cfg);
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, G_STRUCT_OFFSET (MonoTransparentProxy, remote_class));
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, tmp_reg, G_STRUCT_OFFSET (MonoRemoteClass, proxy_class));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, MONO_STRUCT_OFFSET (MonoTransparentProxy, remote_class));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, tmp_reg, MONO_STRUCT_OFFSET (MonoRemoteClass, proxy_class));
 
                tmp_reg = alloc_preg (cfg);             
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, G_STRUCT_OFFSET (MonoTransparentProxy, custom_type_info));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, MONO_STRUCT_OFFSET (MonoTransparentProxy, custom_type_info));
                MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, tmp_reg, 0);
                MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_PBEQ, no_proxy_bb);
                
@@ -4424,22 +4418,22 @@ handle_ccastclass (MonoCompile *cfg, MonoClass *klass, MonoInst *src)
 #ifndef DISABLE_REMOTING
                NEW_BBLOCK (cfg, interface_fail_bb);
        
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, G_STRUCT_OFFSET (MonoObject, vtable));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, MONO_STRUCT_OFFSET (MonoObject, vtable));
                mini_emit_iface_cast (cfg, tmp_reg, klass, interface_fail_bb, ok_result_bb);
                MONO_START_BB (cfg, interface_fail_bb);
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, tmp_reg, G_STRUCT_OFFSET (MonoVTable, klass));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, tmp_reg, MONO_STRUCT_OFFSET (MonoVTable, klass));
 
                mini_emit_class_check (cfg, klass_reg, mono_defaults.transparent_proxy_class);
 
                tmp_reg = alloc_preg (cfg);             
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, G_STRUCT_OFFSET (MonoTransparentProxy, custom_type_info));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, MONO_STRUCT_OFFSET (MonoTransparentProxy, custom_type_info));
                MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, tmp_reg, 0);
                MONO_EMIT_NEW_COND_EXC (cfg, EQ, "InvalidCastException");
                
                MONO_EMIT_NEW_ICONST (cfg, dreg, 1);
                MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_BR, end_bb);
 #else
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, G_STRUCT_OFFSET (MonoObject, vtable));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, MONO_STRUCT_OFFSET (MonoObject, vtable));
                mini_emit_iface_cast (cfg, tmp_reg, klass, NULL, NULL);
                MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_BR, ok_result_bb);
 #endif
@@ -4447,16 +4441,16 @@ handle_ccastclass (MonoCompile *cfg, MonoClass *klass, MonoInst *src)
 #ifndef DISABLE_REMOTING
                NEW_BBLOCK (cfg, no_proxy_bb);
 
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, G_STRUCT_OFFSET (MonoObject, vtable));
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, tmp_reg, G_STRUCT_OFFSET (MonoVTable, klass));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, MONO_STRUCT_OFFSET (MonoObject, vtable));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, tmp_reg, MONO_STRUCT_OFFSET (MonoVTable, klass));
                mini_emit_class_check_branch (cfg, klass_reg, mono_defaults.transparent_proxy_class, OP_PBNE_UN, no_proxy_bb);          
 
                tmp_reg = alloc_preg (cfg);
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, G_STRUCT_OFFSET (MonoTransparentProxy, remote_class));
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, tmp_reg, G_STRUCT_OFFSET (MonoRemoteClass, proxy_class));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, MONO_STRUCT_OFFSET (MonoTransparentProxy, remote_class));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, tmp_reg, MONO_STRUCT_OFFSET (MonoRemoteClass, proxy_class));
 
                tmp_reg = alloc_preg (cfg);
-               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, G_STRUCT_OFFSET (MonoTransparentProxy, custom_type_info));
+               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, tmp_reg, obj_reg, MONO_STRUCT_OFFSET (MonoTransparentProxy, custom_type_info));
                MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, tmp_reg, 0);
                MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_PBEQ, no_proxy_bb);
 
@@ -4515,17 +4509,17 @@ handle_delegate_ctor (MonoCompile *cfg, MonoClass *klass, MonoInst *target, Mono
        /* Set target field */
        /* Optimize away setting of NULL target */
        if (!(target->opcode == OP_PCONST && target->inst_p0 == 0)) {
-               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, obj->dreg, G_STRUCT_OFFSET (MonoDelegate, target), target->dreg);
+               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, obj->dreg, MONO_STRUCT_OFFSET (MonoDelegate, target), target->dreg);
                if (cfg->gen_write_barriers) {
                        dreg = alloc_preg (cfg);
-                       EMIT_NEW_BIALU_IMM (cfg, ptr, OP_PADD_IMM, dreg, obj->dreg, G_STRUCT_OFFSET (MonoDelegate, target));
+                       EMIT_NEW_BIALU_IMM (cfg, ptr, OP_PADD_IMM, dreg, obj->dreg, MONO_STRUCT_OFFSET (MonoDelegate, target));
                        emit_write_barrier (cfg, ptr, target);
                }
        }
 
        /* Set method field */
        method_ins = emit_get_rgctx_method (cfg, context_used, method, MONO_RGCTX_INFO_METHOD);
-       MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, obj->dreg, G_STRUCT_OFFSET (MonoDelegate, method), method_ins->dreg);
+       MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, obj->dreg, MONO_STRUCT_OFFSET (MonoDelegate, method), method_ins->dreg);
        /* 
         * To avoid looking up the compiled code belonging to the target method
         * in mono_delegate_trampoline (), we allocate a per-domain memory slot to
@@ -4553,7 +4547,7 @@ handle_delegate_ctor (MonoCompile *cfg, MonoClass *klass, MonoInst *target, Mono
                        else
                                EMIT_NEW_PCONST (cfg, code_slot_ins, code_slot);
                }
-               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, obj->dreg, G_STRUCT_OFFSET (MonoDelegate, method_code), code_slot_ins->dreg);           
+               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, obj->dreg, MONO_STRUCT_OFFSET (MonoDelegate, method_code), code_slot_ins->dreg);                
        }
 
        /* Set invoke_impl field */
@@ -4568,7 +4562,7 @@ handle_delegate_ctor (MonoCompile *cfg, MonoClass *klass, MonoInst *target, Mono
                trampoline = mono_create_delegate_trampoline_with_method (cfg->domain, klass, context_used ? NULL : method);
                EMIT_NEW_PCONST (cfg, tramp_ins, trampoline);
        }
-       MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, obj->dreg, G_STRUCT_OFFSET (MonoDelegate, invoke_impl), tramp_ins->dreg);
+       MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, obj->dreg, MONO_STRUCT_OFFSET (MonoDelegate, invoke_impl), tramp_ins->dreg);
 
        /* All the checks which are in mono_delegate_ctor () are done by the delegate trampoline */
 
@@ -4815,7 +4809,7 @@ mini_emit_ldelema_1_ins (MonoCompile *cfg, MonoClass *klass, MonoInst *arr, Mono
        if (size == 1 || size == 2 || size == 4 || size == 8) {
                static const int fast_log2 [] = { 1, 0, 1, -1, 2, -1, -1, -1, 3 };
 
-               EMIT_NEW_X86_LEA (cfg, ins, array_reg, index2_reg, fast_log2 [size], G_STRUCT_OFFSET (MonoArray, vector));
+               EMIT_NEW_X86_LEA (cfg, ins, array_reg, index2_reg, fast_log2 [size], MONO_STRUCT_OFFSET (MonoArray, vector));
                ins->klass = mono_class_get_element_class (klass);
                ins->type = STACK_MP;
 
@@ -4838,7 +4832,7 @@ mini_emit_ldelema_1_ins (MonoCompile *cfg, MonoClass *klass, MonoInst *arr, Mono
                MONO_EMIT_NEW_BIALU_IMM (cfg, OP_MUL_IMM, mult_reg, index2_reg, size);
        }
        MONO_EMIT_NEW_BIALU (cfg, OP_PADD, add_reg, array_reg, mult_reg);
-       NEW_BIALU_IMM (cfg, ins, OP_PADD_IMM, add_reg, add_reg, G_STRUCT_OFFSET (MonoArray, vector));
+       NEW_BIALU_IMM (cfg, ins, OP_PADD_IMM, add_reg, add_reg, MONO_STRUCT_OFFSET (MonoArray, vector));
        ins->klass = mono_class_get_element_class (klass);
        ins->type = STACK_MP;
        MONO_ADD_INS (cfg->cbb, ins);
@@ -4890,21 +4884,21 @@ mini_emit_ldelema_2_ins (MonoCompile *cfg, MonoClass *klass, MonoInst *arr, Mono
 
        /* range checking */
        MONO_EMIT_NEW_LOAD_MEMBASE (cfg, bounds_reg, 
-                                      arr->dreg, G_STRUCT_OFFSET (MonoArray, bounds));
+                                      arr->dreg, MONO_STRUCT_OFFSET (MonoArray, bounds));
 
        MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADI4_MEMBASE, low1_reg, 
-                                      bounds_reg, G_STRUCT_OFFSET (MonoArrayBounds, lower_bound));
+                                      bounds_reg, MONO_STRUCT_OFFSET (MonoArrayBounds, lower_bound));
        MONO_EMIT_NEW_BIALU (cfg, OP_PSUB, realidx1_reg, index1, low1_reg);
        MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADI4_MEMBASE, high1_reg, 
-                                      bounds_reg, G_STRUCT_OFFSET (MonoArrayBounds, length));
+                                      bounds_reg, MONO_STRUCT_OFFSET (MonoArrayBounds, length));
        MONO_EMIT_NEW_BIALU (cfg, OP_COMPARE, -1, high1_reg, realidx1_reg);
        MONO_EMIT_NEW_COND_EXC (cfg, LE_UN, "IndexOutOfRangeException");
 
        MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADI4_MEMBASE, low2_reg, 
-                                      bounds_reg, sizeof (MonoArrayBounds) + G_STRUCT_OFFSET (MonoArrayBounds, lower_bound));
+                                      bounds_reg, sizeof (MonoArrayBounds) + MONO_STRUCT_OFFSET (MonoArrayBounds, lower_bound));
        MONO_EMIT_NEW_BIALU (cfg, OP_PSUB, realidx2_reg, index2, low2_reg);
        MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADI4_MEMBASE, high2_reg, 
-                                      bounds_reg, sizeof (MonoArrayBounds) + G_STRUCT_OFFSET (MonoArrayBounds, length));
+                                      bounds_reg, sizeof (MonoArrayBounds) + MONO_STRUCT_OFFSET (MonoArrayBounds, length));
        MONO_EMIT_NEW_BIALU (cfg, OP_COMPARE, -1, high2_reg, realidx2_reg);
        MONO_EMIT_NEW_COND_EXC (cfg, LE_UN, "IndexOutOfRangeException");
 
@@ -4912,7 +4906,7 @@ mini_emit_ldelema_2_ins (MonoCompile *cfg, MonoClass *klass, MonoInst *arr, Mono
        MONO_EMIT_NEW_BIALU (cfg, OP_PADD, sum_reg, mult_reg, realidx2_reg);
        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_PMUL_IMM, mult2_reg, sum_reg, size);
        MONO_EMIT_NEW_BIALU (cfg, OP_PADD, add_reg, mult2_reg, arr->dreg);
-       NEW_BIALU_IMM (cfg, ins, OP_PADD_IMM, add_reg, add_reg, G_STRUCT_OFFSET (MonoArray, vector));
+       NEW_BIALU_IMM (cfg, ins, OP_PADD_IMM, add_reg, add_reg, MONO_STRUCT_OFFSET (MonoArray, vector));
 
        ins->type = STACK_MP;
        ins->klass = klass;
@@ -5061,7 +5055,7 @@ emit_array_store (MonoCompile *cfg, MonoClass *klass, MonoInst **sp, gboolean sa
                } else if (sp [1]->opcode == OP_ICONST) {
                        int array_reg = sp [0]->dreg;
                        int index_reg = sp [1]->dreg;
-                       int offset = (mono_class_array_element_size (klass) * sp [1]->inst_c0) + G_STRUCT_OFFSET (MonoArray, vector);
+                       int offset = (mono_class_array_element_size (klass) * sp [1]->inst_c0) + MONO_STRUCT_OFFSET (MonoArray, vector);
 
                        if (safety_checks)
                                MONO_EMIT_BOUNDS_CHECK (cfg, array_reg, MonoArray, max_length, index_reg);
@@ -5270,7 +5264,7 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                        MONO_EMIT_BOUNDS_CHECK (cfg, args [0]->dreg, MonoString, length, index_reg);
 
 #if defined(TARGET_X86) || defined(TARGET_AMD64)
-                       EMIT_NEW_X86_LEA (cfg, ins, args [0]->dreg, index_reg, 1, G_STRUCT_OFFSET (MonoString, chars));
+                       EMIT_NEW_X86_LEA (cfg, ins, args [0]->dreg, index_reg, 1, MONO_STRUCT_OFFSET (MonoString, chars));
                        add_reg = ins->dreg;
                        /* Avoid a warning */
                        mult_reg = 0;
@@ -5280,7 +5274,7 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_SHL_IMM, mult_reg, index_reg, 1);
                        MONO_EMIT_NEW_BIALU (cfg, OP_PADD, add_reg, mult_reg, args [0]->dreg);
                        EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOADU2_MEMBASE, dreg, 
-                                                                  add_reg, G_STRUCT_OFFSET (MonoString, chars));
+                                                                  add_reg, MONO_STRUCT_OFFSET (MonoString, chars));
 #endif
                        type_from_op (ins, NULL, NULL);
                        return ins;
@@ -5301,7 +5295,7 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                        /* The corlib functions check for oob already. */
                        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_SHL_IMM, mult_reg, args [1]->dreg, 1);
                        MONO_EMIT_NEW_BIALU (cfg, OP_PADD, add_reg, mult_reg, args [0]->dreg);
-                       MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREI2_MEMBASE_REG, add_reg, G_STRUCT_OFFSET (MonoString, chars), args [2]->dreg);
+                       MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREI2_MEMBASE_REG, add_reg, MONO_STRUCT_OFFSET (MonoString, chars), args [2]->dreg);
                        return cfg->cbb->last_ins;
                } else 
                        return NULL;
@@ -5310,8 +5304,8 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                if (strcmp (cmethod->name, "GetType") == 0) {
                        int dreg = alloc_ireg_ref (cfg);
                        int vt_reg = alloc_preg (cfg);
-                       MONO_EMIT_NEW_LOAD_MEMBASE_FAULT (cfg, vt_reg, args [0]->dreg, G_STRUCT_OFFSET (MonoObject, vtable));
-                       EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, dreg, vt_reg, G_STRUCT_OFFSET (MonoVTable, type));
+                       MONO_EMIT_NEW_LOAD_MEMBASE_FAULT (cfg, vt_reg, args [0]->dreg, MONO_STRUCT_OFFSET (MonoObject, vtable));
+                       EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, dreg, vt_reg, MONO_STRUCT_OFFSET (MonoVTable, type));
                        type_from_op (ins, NULL, NULL);
 
                        return ins;
@@ -5351,22 +5345,22 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                        NEW_BBLOCK (cfg, szarray_bb);
 
                        EMIT_NEW_LOAD_MEMBASE_FAULT (cfg, ins, OP_LOAD_MEMBASE, bounds_reg,
-                                                                                args [0]->dreg, G_STRUCT_OFFSET (MonoArray, bounds));
+                                                                                args [0]->dreg, MONO_STRUCT_OFFSET (MonoArray, bounds));
                        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, bounds_reg, 0);
                        MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_IBEQ, szarray_bb);
                        /* Non-szarray case */
                        if (get_length)
                                EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOADI4_MEMBASE, dreg,
-                                                                          bounds_reg, G_STRUCT_OFFSET (MonoArrayBounds, length));
+                                                                          bounds_reg, MONO_STRUCT_OFFSET (MonoArrayBounds, length));
                        else
                                EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOADI4_MEMBASE, dreg,
-                                                                          bounds_reg, G_STRUCT_OFFSET (MonoArrayBounds, lower_bound));
+                                                                          bounds_reg, MONO_STRUCT_OFFSET (MonoArrayBounds, lower_bound));
                        MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_BR, end_bb);
                        MONO_START_BB (cfg, szarray_bb);
                        /* Szarray case */
                        if (get_length)
                                EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOADI4_MEMBASE, dreg,
-                                                                          args [0]->dreg, G_STRUCT_OFFSET (MonoArray, max_length));
+                                                                          args [0]->dreg, MONO_STRUCT_OFFSET (MonoArray, max_length));
                        else
                                MONO_EMIT_NEW_ICONST (cfg, dreg, 0);
                        MONO_START_BB (cfg, end_bb);
@@ -5385,9 +5379,9 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                        int dreg = alloc_ireg (cfg);
                        int vtable_reg = alloc_preg (cfg);
                        MONO_EMIT_NEW_LOAD_MEMBASE_OP_FAULT (cfg, OP_LOAD_MEMBASE, vtable_reg, 
-                                                                                                args [0]->dreg, G_STRUCT_OFFSET (MonoObject, vtable));
+                                                                                                args [0]->dreg, MONO_STRUCT_OFFSET (MonoObject, vtable));
                        EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOADU1_MEMBASE, dreg,
-                                                                  vtable_reg, G_STRUCT_OFFSET (MonoVTable, rank));
+                                                                  vtable_reg, MONO_STRUCT_OFFSET (MonoVTable, rank));
                        type_from_op (ins, NULL, NULL);
 
                        return ins;
@@ -5395,7 +5389,7 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                        int dreg = alloc_ireg (cfg);
 
                        EMIT_NEW_LOAD_MEMBASE_FAULT (cfg, ins, OP_LOADI4_MEMBASE, dreg, 
-                                                                                args [0]->dreg, G_STRUCT_OFFSET (MonoArray, max_length));
+                                                                                args [0]->dreg, MONO_STRUCT_OFFSET (MonoArray, max_length));
                        type_from_op (ins, NULL, NULL);
 
                        return ins;
@@ -5404,7 +5398,7 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
        } else if (cmethod->klass == runtime_helpers_class) {
 
                if (strcmp (cmethod->name, "get_OffsetToStringData") == 0) {
-                       EMIT_NEW_ICONST (cfg, ins, G_STRUCT_OFFSET (MonoString, chars));
+                       EMIT_NEW_ICONST (cfg, ins, MONO_STRUCT_OFFSET (MonoString, chars));
                        return ins;
                } else
                        return NULL;
@@ -5510,18 +5504,17 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                }
 #endif
 
-#ifdef MONO_ARCH_HAVE_ATOMIC_ADD
                if (strcmp (cmethod->name, "Increment") == 0) {
                        MonoInst *ins_iconst;
                        guint32 opcode = 0;
 
                        if (fsig->params [0]->type == MONO_TYPE_I4) {
-                               opcode = OP_ATOMIC_ADD_NEW_I4;
-                               cfg->has_atomic_add_new_i4 = TRUE;
+                               opcode = OP_ATOMIC_ADD_I4;
+                               cfg->has_atomic_add_i4 = TRUE;
                        }
 #if SIZEOF_REGISTER == 8
                        else if (fsig->params [0]->type == MONO_TYPE_I8)
-                               opcode = OP_ATOMIC_ADD_NEW_I8;
+                               opcode = OP_ATOMIC_ADD_I8;
 #endif
                        if (opcode) {
                                if (!mono_arch_opcode_supported (opcode))
@@ -5536,7 +5529,7 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                                ins->inst_basereg = args [0]->dreg;
                                ins->inst_offset = 0;
                                ins->sreg2 = ins_iconst->dreg;
-                               ins->type = (opcode == OP_ATOMIC_ADD_NEW_I4) ? STACK_I4 : STACK_I8;
+                               ins->type = (opcode == OP_ATOMIC_ADD_I4) ? STACK_I4 : STACK_I8;
                                MONO_ADD_INS (cfg->cbb, ins);
                        }
                } else if (strcmp (cmethod->name, "Decrement") == 0) {
@@ -5544,12 +5537,12 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                        guint32 opcode = 0;
 
                        if (fsig->params [0]->type == MONO_TYPE_I4) {
-                               opcode = OP_ATOMIC_ADD_NEW_I4;
-                               cfg->has_atomic_add_new_i4 = TRUE;
+                               opcode = OP_ATOMIC_ADD_I4;
+                               cfg->has_atomic_add_i4 = TRUE;
                        }
 #if SIZEOF_REGISTER == 8
                        else if (fsig->params [0]->type == MONO_TYPE_I8)
-                               opcode = OP_ATOMIC_ADD_NEW_I8;
+                               opcode = OP_ATOMIC_ADD_I8;
 #endif
                        if (opcode) {
                                if (!mono_arch_opcode_supported (opcode))
@@ -5564,19 +5557,19 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                                ins->inst_basereg = args [0]->dreg;
                                ins->inst_offset = 0;
                                ins->sreg2 = ins_iconst->dreg;
-                               ins->type = (opcode == OP_ATOMIC_ADD_NEW_I4) ? STACK_I4 : STACK_I8;
+                               ins->type = (opcode == OP_ATOMIC_ADD_I4) ? STACK_I4 : STACK_I8;
                                MONO_ADD_INS (cfg->cbb, ins);
                        }
                } else if (strcmp (cmethod->name, "Add") == 0) {
                        guint32 opcode = 0;
 
                        if (fsig->params [0]->type == MONO_TYPE_I4) {
-                               opcode = OP_ATOMIC_ADD_NEW_I4;
-                               cfg->has_atomic_add_new_i4 = TRUE;
+                               opcode = OP_ATOMIC_ADD_I4;
+                               cfg->has_atomic_add_i4 = TRUE;
                        }
 #if SIZEOF_REGISTER == 8
                        else if (fsig->params [0]->type == MONO_TYPE_I8)
-                               opcode = OP_ATOMIC_ADD_NEW_I8;
+                               opcode = OP_ATOMIC_ADD_I8;
 #endif
                        if (opcode) {
                                if (!mono_arch_opcode_supported (opcode))
@@ -5586,13 +5579,11 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                                ins->inst_basereg = args [0]->dreg;
                                ins->inst_offset = 0;
                                ins->sreg2 = args [1]->dreg;
-                               ins->type = (opcode == OP_ATOMIC_ADD_NEW_I4) ? STACK_I4 : STACK_I8;
+                               ins->type = (opcode == OP_ATOMIC_ADD_I4) ? STACK_I4 : STACK_I8;
                                MONO_ADD_INS (cfg->cbb, ins);
                        }
                }
-#endif /* MONO_ARCH_HAVE_ATOMIC_ADD */
 
-#ifdef MONO_ARCH_HAVE_ATOMIC_EXCHANGE
                if (strcmp (cmethod->name, "Exchange") == 0) {
                        guint32 opcode;
                        gboolean is_ref = fsig->params [0]->type == MONO_TYPE_OBJECT;
@@ -5642,9 +5633,7 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                        if (cfg->gen_write_barriers && is_ref)
                                emit_write_barrier (cfg, args [0], args [1]);
                }
-#endif /* MONO_ARCH_HAVE_ATOMIC_EXCHANGE */
-#ifdef MONO_ARCH_HAVE_ATOMIC_CAS
+
                if ((strcmp (cmethod->name, "CompareExchange") == 0)) {
                        int size = 0;
                        gboolean is_ref = mini_type_is_reference (cfg, fsig->params [1]);
@@ -5681,7 +5670,6 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
                        if (cfg->gen_write_barriers && is_ref)
                                emit_write_barrier (cfg, args [0], args [1]);
                }
-#endif /* MONO_ARCH_HAVE_ATOMIC_CAS */
 
                if (strcmp (cmethod->name, "MemoryBarrier") == 0)
                        ins = emit_memory_barrier (cfg, FullBarrier);
@@ -6752,7 +6740,7 @@ emit_managed_static_data_access (MonoCompile *cfg, MonoInst *thread_ins, int off
        // idx = (offset >> 24) - 1;
        // return ((char*) thread->static_data [idx]) + (offset & 0xffffff);
        static_data_reg = alloc_ireg (cfg);
-       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, static_data_reg, thread_ins->dreg, G_STRUCT_OFFSET (MonoInternalThread, static_data));
+       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, static_data_reg, thread_ins->dreg, MONO_STRUCT_OFFSET (MonoInternalThread, static_data));
        idx_reg = alloc_ireg (cfg);
        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_ISHR_IMM, idx_reg, offset_reg, 24);
        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_ISUB_IMM, idx_reg, idx_reg, 1);
@@ -7206,7 +7194,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                cfg->gsharedvt_locals_var = locals_var;
 
                dreg = alloc_ireg (cfg);
-               MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADI4_MEMBASE, dreg, var->dreg, G_STRUCT_OFFSET (MonoGSharedVtMethodRuntimeInfo, locals_size));
+               MONO_EMIT_NEW_LOAD_MEMBASE_OP (cfg, OP_LOADI4_MEMBASE, dreg, var->dreg, MONO_STRUCT_OFFSET (MonoGSharedVtMethodRuntimeInfo, locals_size));
 
                MONO_INST_NEW (cfg, ins, OP_LOCALLOC);
                ins->dreg = locals_var->dreg;
@@ -10380,7 +10368,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                                //      return ((char*) thread->static_data [idx]) + (offset & 0xffffff);
                                MONO_ADD_INS (cfg->cbb, thread_ins);
                                static_data_reg = alloc_ireg (cfg);
-                               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, static_data_reg, thread_ins->dreg, G_STRUCT_OFFSET (MonoInternalThread, static_data));
+                               MONO_EMIT_NEW_LOAD_MEMBASE (cfg, static_data_reg, thread_ins->dreg, MONO_STRUCT_OFFSET (MonoInternalThread, static_data));
 
                                if (cfg->compile_aot) {
                                        int offset_reg, offset2_reg, idx_reg;
@@ -10750,7 +10738,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                                MonoInst *iargs [3];
                                int add_reg = alloc_ireg_mp (cfg);
 
-                               EMIT_NEW_BIALU_IMM (cfg, iargs [0], OP_PADD_IMM, add_reg, ins->dreg, G_STRUCT_OFFSET (MonoArray, vector));
+                               EMIT_NEW_BIALU_IMM (cfg, iargs [0], OP_PADD_IMM, add_reg, ins->dreg, MONO_STRUCT_OFFSET (MonoArray, vector));
                                if (cfg->compile_aot) {
                                        EMIT_NEW_AOTCONST_TOKEN (cfg, iargs [1], MONO_PATCH_INFO_RVA, method->klass->image, GPOINTER_TO_UINT(field_token), STACK_PTR, NULL);
                                } else {
@@ -10847,7 +10835,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                        } else if (sp [1]->opcode == OP_ICONST) {
                                int array_reg = sp [0]->dreg;
                                int index_reg = sp [1]->dreg;
-                               int offset = (mono_class_array_element_size (klass) * sp [1]->inst_c0) + G_STRUCT_OFFSET (MonoArray, vector);
+                               int offset = (mono_class_array_element_size (klass) * sp [1]->inst_c0) + MONO_STRUCT_OFFSET (MonoArray, vector);
 
                                MONO_EMIT_BOUNDS_CHECK (cfg, array_reg, MonoArray, max_length, index_reg);
                                EMIT_NEW_LOAD_MEMBASE_TYPE (cfg, ins, &klass->byval_arg, array_reg, offset);
@@ -10936,7 +10924,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                        if (!src_var)
                                src_var = mono_compile_create_var_for_vreg (cfg, &mono_defaults.typed_reference_class->byval_arg, OP_LOCAL, sp [0]->dreg);
                        EMIT_NEW_VARLOADA (cfg, src, src_var, src_var->inst_vtype);
-                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, src->dreg, G_STRUCT_OFFSET (MonoTypedRef, klass));
+                       MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, src->dreg, MONO_STRUCT_OFFSET (MonoTypedRef, klass));
 
                        if (context_used) {
                                MonoInst *klass_ins;
@@ -10950,7 +10938,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                        } else {
                                mini_emit_class_check (cfg, klass_reg, klass);
                        }
-                       EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, dreg, src->dreg, G_STRUCT_OFFSET (MonoTypedRef, value));
+                       EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOAD_MEMBASE, dreg, src->dreg, MONO_STRUCT_OFFSET (MonoTypedRef, value));
                        ins->type = STACK_MP;
                        *sp++ = ins;
                        ip += 5;
@@ -10979,22 +10967,22 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                                int type_reg = alloc_preg (cfg);
 
                                const_ins = emit_get_rgctx_klass (cfg, context_used, klass, MONO_RGCTX_INFO_KLASS);
-                               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREP_MEMBASE_REG, addr->dreg, G_STRUCT_OFFSET (MonoTypedRef, klass), const_ins->dreg);
-                               MONO_EMIT_NEW_BIALU_IMM (cfg, OP_ADD_IMM, type_reg, const_ins->dreg, G_STRUCT_OFFSET (MonoClass, byval_arg));
-                               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREP_MEMBASE_REG, addr->dreg, G_STRUCT_OFFSET (MonoTypedRef, type), type_reg);
+                               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREP_MEMBASE_REG, addr->dreg, MONO_STRUCT_OFFSET (MonoTypedRef, klass), const_ins->dreg);
+                               MONO_EMIT_NEW_BIALU_IMM (cfg, OP_ADD_IMM, type_reg, const_ins->dreg, MONO_STRUCT_OFFSET (MonoClass, byval_arg));
+                               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREP_MEMBASE_REG, addr->dreg, MONO_STRUCT_OFFSET (MonoTypedRef, type), type_reg);
                        } else if (cfg->compile_aot) {
                                int const_reg = alloc_preg (cfg);
                                int type_reg = alloc_preg (cfg);
 
                                MONO_EMIT_NEW_CLASSCONST (cfg, const_reg, klass);
-                               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREP_MEMBASE_REG, addr->dreg, G_STRUCT_OFFSET (MonoTypedRef, klass), const_reg);
-                               MONO_EMIT_NEW_BIALU_IMM (cfg, OP_ADD_IMM, type_reg, const_reg, G_STRUCT_OFFSET (MonoClass, byval_arg));
-                               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREP_MEMBASE_REG, addr->dreg, G_STRUCT_OFFSET (MonoTypedRef, type), type_reg);
+                               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREP_MEMBASE_REG, addr->dreg, MONO_STRUCT_OFFSET (MonoTypedRef, klass), const_reg);
+                               MONO_EMIT_NEW_BIALU_IMM (cfg, OP_ADD_IMM, type_reg, const_reg, MONO_STRUCT_OFFSET (MonoClass, byval_arg));
+                               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREP_MEMBASE_REG, addr->dreg, MONO_STRUCT_OFFSET (MonoTypedRef, type), type_reg);
                        } else {
-                               MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STOREP_MEMBASE_IMM, addr->dreg, G_STRUCT_OFFSET (MonoTypedRef, type), &klass->byval_arg);
-                               MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STOREP_MEMBASE_IMM, addr->dreg, G_STRUCT_OFFSET (MonoTypedRef, klass), klass);
+                               MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STOREP_MEMBASE_IMM, addr->dreg, MONO_STRUCT_OFFSET (MonoTypedRef, type), &klass->byval_arg);
+                               MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STOREP_MEMBASE_IMM, addr->dreg, MONO_STRUCT_OFFSET (MonoTypedRef, klass), klass);
                        }
-                       MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREP_MEMBASE_REG, addr->dreg, G_STRUCT_OFFSET (MonoTypedRef, value), sp [0]->dreg);
+                       MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STOREP_MEMBASE_REG, addr->dreg, MONO_STRUCT_OFFSET (MonoTypedRef, value), sp [0]->dreg);
 
                        EMIT_NEW_TEMPLOAD (cfg, ins, loc->inst_c0);
                        ins->type = STACK_VTYPE;
@@ -12114,7 +12102,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                                if (!src_var)
                                        src_var = mono_compile_create_var_for_vreg (cfg, &mono_defaults.typed_reference_class->byval_arg, OP_LOCAL, sp [0]->dreg);
                                EMIT_NEW_VARLOADA (cfg, src, src_var, src_var->inst_vtype);
-                               EMIT_NEW_LOAD_MEMBASE_TYPE (cfg, ins, &mono_defaults.typehandle_class->byval_arg, src->dreg, G_STRUCT_OFFSET (MonoTypedRef, type));
+                               EMIT_NEW_LOAD_MEMBASE_TYPE (cfg, ins, &mono_defaults.typehandle_class->byval_arg, src->dreg, MONO_STRUCT_OFFSET (MonoTypedRef, type));
                                *sp++ = ins;
                                ip += 2;
                                break;
@@ -13240,7 +13228,7 @@ mono_spill_global_vars (MonoCompile *cfg, gboolean *need_local_opts)
                                                g_assert_not_reached ();
                                        }
                                        reg2 = alloc_ireg (cfg);
-                                       NEW_LOAD_MEMBASE (cfg, load2, OP_LOADI4_MEMBASE, reg2, reg1, G_STRUCT_OFFSET (MonoGSharedVtMethodRuntimeInfo, entries) + (idx * sizeof (gpointer)));
+                                       NEW_LOAD_MEMBASE (cfg, load2, OP_LOADI4_MEMBASE, reg2, reg1, MONO_STRUCT_OFFSET (MonoGSharedVtMethodRuntimeInfo, entries) + (idx * sizeof (gpointer)));
                                        /* Load the locals area address */
                                        reg3 = alloc_ireg (cfg);
                                        if (locals_var->opcode == OP_REGOFFSET) {
index 38a7649bc2973622c74bcbd6b2f97f028cd4a076..e06afc3f0630201980ed1794480812c04968c194 100644 (file)
@@ -20,6 +20,7 @@
 #include <unistd.h>
 #endif
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/debug-helpers.h>
 #include <mono/metadata/threads.h>
@@ -70,13 +71,6 @@ static CRITICAL_SECTION mini_arch_mutex;
 MonoBreakpointInfo
 mono_breakpoint_info [MONO_BREAKPOINT_ARRAY_SIZE];
 
-/* Structure used by the sequence points in AOTed code */
-typedef struct {
-       gpointer ss_trigger_page;
-       gpointer bp_trigger_page;
-       gpointer bp_addrs [MONO_ZERO_LEN_ARRAY];
-} SeqPointInfo;
-
 /*
  * The code generated for sequence points reads from this location, which is
  * made read-only when single stepping is enabled.
@@ -536,14 +530,10 @@ typedef struct {
 #define DEBUG(a) if (cfg->verbose_level > 1) a
 
 #ifdef HOST_WIN32
-#define PARAM_REGS 4
-
 static AMD64_Reg_No param_regs [] = { AMD64_RCX, AMD64_RDX, AMD64_R8, AMD64_R9 };
 
 static AMD64_Reg_No return_regs [] = { AMD64_RAX, AMD64_RDX };
 #else
-#define PARAM_REGS 6
 static AMD64_Reg_No param_regs [] = { AMD64_RDI, AMD64_RSI, AMD64_RDX, AMD64_RCX, AMD64_R8, AMD64_R9 };
 
  static AMD64_Reg_No return_regs [] = { AMD64_RAX, AMD64_RDX };
@@ -2618,12 +2608,6 @@ typedef struct {
        CallInfo *cinfo;
 } ArchDynCallInfo;
 
-typedef struct {
-       mgreg_t regs [PARAM_REGS];
-       mgreg_t res;
-       guint8 *ret;
-} DynCallArgs;
-
 static gboolean
 dyn_call_supported (MonoMethodSignature *sig, CallInfo *cinfo)
 {
@@ -3765,21 +3749,21 @@ emit_setup_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, int cfa_offse
         * sp is saved right before calls but we need to save it here too so
         * async stack walks would work.
         */
-       amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rsp), AMD64_RSP, 8);
+       amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, rsp), AMD64_RSP, 8);
        /* Save rbp */
-       amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rbp), AMD64_RBP, 8);
+       amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, rbp), AMD64_RBP, 8);
        if (cfg->arch.omit_fp && cfa_offset != -1)
-               mono_emit_unwind_op_offset (cfg, code, AMD64_RBP, - (cfa_offset - (lmf_offset + G_STRUCT_OFFSET (MonoLMF, rbp))));
+               mono_emit_unwind_op_offset (cfg, code, AMD64_RBP, - (cfa_offset - (lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, rbp))));
 
        /* These can't contain refs */
-       mini_gc_set_slot_type_from_fp (cfg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), SLOT_NOREF);
+       mini_gc_set_slot_type_from_fp (cfg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, previous_lmf), SLOT_NOREF);
 #ifdef HOST_WIN32
-       mini_gc_set_slot_type_from_fp (cfg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), SLOT_NOREF);
+       mini_gc_set_slot_type_from_fp (cfg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, lmf_addr), SLOT_NOREF);
 #endif
-       mini_gc_set_slot_type_from_fp (cfg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rip), SLOT_NOREF);
-       mini_gc_set_slot_type_from_fp (cfg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rsp), SLOT_NOREF);
+       mini_gc_set_slot_type_from_fp (cfg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, rip), SLOT_NOREF);
+       mini_gc_set_slot_type_from_fp (cfg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, rsp), SLOT_NOREF);
        /* These are handled automatically by the stack marking code */
-       mini_gc_set_slot_type_from_fp (cfg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rbp), SLOT_NOREF);
+       mini_gc_set_slot_type_from_fp (cfg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, rbp), SLOT_NOREF);
 
        return code;
 }
@@ -3795,7 +3779,7 @@ emit_push_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, gboolean *args
 {
        if (jit_tls_offset != -1) {
                code = mono_amd64_emit_tls_get (code, AMD64_RAX, jit_tls_offset);
-               amd64_alu_reg_imm (code, X86_ADD, AMD64_RAX, G_STRUCT_OFFSET (MonoJitTlsData, lmf));
+               amd64_alu_reg_imm (code, X86_ADD, AMD64_RAX, MONO_STRUCT_OFFSET (MonoJitTlsData, lmf));
        } else {
                /* 
                 * The call might clobber argument registers, but they are already
@@ -3808,10 +3792,10 @@ emit_push_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, gboolean *args
        }
 
        /* Save lmf_addr */
-       amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), AMD64_RAX, sizeof(gpointer));
+       amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, lmf_addr), AMD64_RAX, sizeof(gpointer));
        /* Save previous_lmf */
        amd64_mov_reg_membase (code, AMD64_R11, AMD64_RAX, 0, sizeof(gpointer));
-       amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), AMD64_R11, sizeof(gpointer));
+       amd64_mov_membase_reg (code, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, previous_lmf), AMD64_R11, sizeof(gpointer));
        /* Set new lmf */
        amd64_lea_membase (code, AMD64_R11, cfg->frame_reg, lmf_offset);
        amd64_mov_membase_reg (code, AMD64_RAX, 0, AMD64_R11, sizeof(gpointer));
@@ -3830,8 +3814,8 @@ static guint8*
 emit_pop_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset)
 {
        /* Restore previous lmf */
-       amd64_mov_reg_membase (code, AMD64_RCX, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), sizeof(gpointer));
-       amd64_mov_reg_membase (code, AMD64_R11, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), sizeof(gpointer));
+       amd64_mov_reg_membase (code, AMD64_RCX, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, previous_lmf), sizeof(gpointer));
+       amd64_mov_reg_membase (code, AMD64_R11, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, lmf_addr), sizeof(gpointer));
        amd64_mov_membase_reg (code, AMD64_R11, 0, AMD64_RCX, sizeof(gpointer));
 
        return code;
@@ -4306,7 +4290,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
 
                                /* Load info var */
                                amd64_mov_reg_membase (code, AMD64_R11, info_var->inst_basereg, info_var->inst_offset, 8);
-                               val = ((offset) * sizeof (guint8*)) + G_STRUCT_OFFSET (SeqPointInfo, bp_addrs);
+                               val = ((offset) * sizeof (guint8*)) + MONO_STRUCT_OFFSET (SeqPointInfo, bp_addrs);
                                /* Load the info->bp_addrs [offset], which is either a valid address or the address of a trigger page */
                                amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, val, 8);
                                amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, 0, 8);
@@ -4937,12 +4921,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
 
                        /* Save result */
                        amd64_mov_reg_membase (code, AMD64_R11, var->inst_basereg, var->inst_offset, 8);
-                       amd64_mov_membase_reg (code, AMD64_R11, G_STRUCT_OFFSET (DynCallArgs, res), AMD64_RAX, 8);
+                       amd64_mov_membase_reg (code, AMD64_R11, MONO_STRUCT_OFFSET (DynCallArgs, res), AMD64_RAX, 8);
                        break;
                }
                case OP_AMD64_SAVE_SP_TO_LMF: {
                        MonoInst *lmf_var = cfg->lmf_var;
-                       amd64_mov_membase_reg (code, lmf_var->inst_basereg, lmf_var->inst_offset + G_STRUCT_OFFSET (MonoLMF, rsp), AMD64_RSP, 8);
+                       amd64_mov_membase_reg (code, lmf_var->inst_basereg, lmf_var->inst_offset + MONO_STRUCT_OFFSET (MonoLMF, rsp), AMD64_RSP, 8);
                        break;
                }
                case OP_X86_PUSH:
@@ -5635,25 +5619,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        int dreg = ins->dreg;
                        guint32 size = (ins->opcode == OP_ATOMIC_ADD_I4) ? 4 : 8;
 
-                       if (dreg == ins->inst_basereg)
-                               dreg = AMD64_R11;
-                       
-                       if (dreg != ins->sreg2)
-                               amd64_mov_reg_reg (code, ins->dreg, ins->sreg2, size);
-
-                       x86_prefix (code, X86_LOCK_PREFIX);
-                       amd64_xadd_membase_reg (code, ins->inst_basereg, ins->inst_offset, dreg, size);
-
-                       if (dreg != ins->dreg)
-                               amd64_mov_reg_reg (code, ins->dreg, dreg, size);
-
-                       break;
-               }
-               case OP_ATOMIC_ADD_NEW_I4:
-               case OP_ATOMIC_ADD_NEW_I8: {
-                       int dreg = ins->dreg;
-                       guint32 size = (ins->opcode == OP_ATOMIC_ADD_NEW_I4) ? 4 : 8;
-
                        if ((dreg == ins->sreg2) || (dreg == ins->inst_basereg))
                                dreg = AMD64_R11;
 
@@ -7145,7 +7110,7 @@ mono_arch_emit_prolog (MonoCompile *cfg)
 
                if (cfg->compile_aot) {
                        amd64_mov_reg_membase (code, AMD64_R11, info_var->inst_basereg, info_var->inst_offset, 8);
-                       amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, G_STRUCT_OFFSET (SeqPointInfo, ss_trigger_page), 8);
+                       amd64_mov_reg_membase (code, AMD64_R11, AMD64_R11, MONO_STRUCT_OFFSET (SeqPointInfo, ss_trigger_page), 8);
                } else {
                        amd64_mov_reg_imm (code, AMD64_R11, (guint64)ss_trigger_page);
                }
@@ -7169,7 +7134,7 @@ mono_arch_emit_epilog (MonoCompile *cfg)
        CallInfo *cinfo;
        gint32 lmf_offset = cfg->lmf_var ? ((MonoInst*)cfg->lmf_var)->inst_offset : -1;
        gint32 save_area_offset = cfg->arch.reg_save_area_offset;
-       
+
        max_epilog_size = get_max_epilog_size (cfg);
 
        while (cfg->code_len + max_epilog_size > (cfg->code_size - 16)) {
@@ -7180,6 +7145,14 @@ mono_arch_emit_epilog (MonoCompile *cfg)
 
        code = cfg->native_code + cfg->code_len;
 
+       cfg->has_unwind_info_for_epilog = TRUE;
+
+       /* Mark the start of the epilog */
+       mono_emit_unwind_op_mark_loc (cfg, code, 0);
+
+       /* Save the uwind state which is needed by the out-of-line code */
+       mono_emit_unwind_op_remember_state (cfg, code);
+
        if (mono_jit_trace_calls != NULL && mono_trace_eval (method))
                code = mono_arch_instrument_epilog (cfg, mono_trace_leave_method, code, TRUE);
 
@@ -7192,13 +7165,13 @@ mono_arch_emit_epilog (MonoCompile *cfg)
 #endif
 
                /* check if we need to restore protection of the stack after a stack overflow */
-               if (mono_get_jit_tls_offset () != -1) {
+               if (!cfg->compile_aot && mono_get_jit_tls_offset () != -1) {
                        guint8 *patch;
                        code = mono_amd64_emit_tls_get (code, AMD64_RCX, mono_get_jit_tls_offset ());
                        /* we load the value in a separate instruction: this mechanism may be
                         * used later as a safer way to do thread interruption
                         */
-                       amd64_mov_reg_membase (code, AMD64_RCX, AMD64_RCX, G_STRUCT_OFFSET (MonoJitTlsData, restore_stack_prot), 8);
+                       amd64_mov_reg_membase (code, AMD64_RCX, AMD64_RCX, MONO_STRUCT_OFFSET (MonoJitTlsData, restore_stack_prot), 8);
                        x86_alu_reg_imm (code, X86_CMP, X86_ECX, 0);
                        patch = code;
                        x86_branch8 (code, X86_CC_Z, 0, FALSE);
@@ -7209,7 +7182,7 @@ mono_arch_emit_epilog (MonoCompile *cfg)
                        /* FIXME: maybe save the jit tls in the prolog */
                }
                if (cfg->used_int_regs & (1 << AMD64_RBP)) {
-                       amd64_mov_reg_membase (code, AMD64_RBP, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rbp), 8);
+                       amd64_mov_reg_membase (code, AMD64_RBP, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, rbp), 8);
                }
        }
 
@@ -7217,8 +7190,11 @@ mono_arch_emit_epilog (MonoCompile *cfg)
        for (i = 0; i < AMD64_NREG; ++i) {
                if (AMD64_IS_CALLEE_SAVED_REG (i) && (cfg->arch.saved_iregs & (1 << i))) {
                        /* Restore only used_int_regs, not arch.saved_iregs */
-                       if (cfg->used_int_regs & (1 << i))
+                       if (cfg->used_int_regs & (1 << i)) {
                                amd64_mov_reg_membase (code, i, cfg->frame_reg, save_area_offset, 8);
+                               mono_emit_unwind_op_same_value (cfg, code, i);
+                               async_exc_point (code);
+                       }
                        save_area_offset += 8;
                }
        }
@@ -7249,14 +7225,20 @@ mono_arch_emit_epilog (MonoCompile *cfg)
        }
 
        if (cfg->arch.omit_fp) {
-               if (cfg->arch.stack_alloc_size)
+               if (cfg->arch.stack_alloc_size) {
                        amd64_alu_reg_imm (code, X86_ADD, AMD64_RSP, cfg->arch.stack_alloc_size);
+               }
        } else {
                amd64_leave (code);
+               mono_emit_unwind_op_same_value (cfg, code, AMD64_RBP);
        }
+       mono_emit_unwind_op_def_cfa (cfg, code, AMD64_RSP, 8);
        async_exc_point (code);
        amd64_ret (code);
 
+       /* Restore the unwind state to be the same as before the epilog */
+       mono_emit_unwind_op_restore_state (cfg, code);
+
        cfg->code_len = code - cfg->native_code;
 
        g_assert (cfg->code_len < cfg->code_size);
@@ -7855,15 +7837,15 @@ get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *cod
 
                /* Replace the this argument with the target */
                amd64_mov_reg_reg (code, AMD64_RAX, AMD64_ARG_REG1, 8);
-               amd64_mov_reg_membase (code, AMD64_ARG_REG1, AMD64_RAX, G_STRUCT_OFFSET (MonoDelegate, target), 8);
-               amd64_jump_membase (code, AMD64_RAX, G_STRUCT_OFFSET (MonoDelegate, method_ptr));
+               amd64_mov_reg_membase (code, AMD64_ARG_REG1, AMD64_RAX, MONO_STRUCT_OFFSET (MonoDelegate, target), 8);
+               amd64_jump_membase (code, AMD64_RAX, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr));
 
                g_assert ((code - start) < 64);
        } else {
                start = code = mono_global_codeman_reserve (64);
 
                if (param_count == 0) {
-                       amd64_jump_membase (code, AMD64_ARG_REG1, G_STRUCT_OFFSET (MonoDelegate, method_ptr));
+                       amd64_jump_membase (code, AMD64_ARG_REG1, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr));
                } else {
                        /* We have to shift the arguments left */
                        amd64_mov_reg_reg (code, AMD64_RAX, AMD64_ARG_REG1, 8);
@@ -7878,7 +7860,7 @@ get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *cod
 #endif
                        }
 
-                       amd64_jump_membase (code, AMD64_RAX, G_STRUCT_OFFSET (MonoDelegate, method_ptr));
+                       amd64_jump_membase (code, AMD64_RAX, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr));
                }
                g_assert ((code - start) < 64);
        }
@@ -8012,8 +7994,6 @@ mono_arch_free_jit_tls_data (MonoJitTlsData *tls)
 {
 }
 
-#ifdef MONO_ARCH_HAVE_IMT
-
 #if defined(__default_codegen__)
 #define CMP_SIZE (6 + 1)
 #define CMP_REG_REG_SIZE (4 + 1)
@@ -8216,7 +8196,6 @@ mono_arch_find_imt_method (mgreg_t *regs, guint8 *code)
 {
        return (MonoMethod*)regs [MONO_ARCH_IMT_REG];
 }
-#endif
 
 MonoVTable*
 mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code)
@@ -8640,3 +8619,19 @@ mono_arch_init_lmf_ext (MonoLMFExt *ext, gpointer prev_lmf)
 }
 
 #endif
+
+gboolean
+mono_arch_opcode_supported (int opcode)
+{
+       switch (opcode) {
+       case OP_ATOMIC_ADD_I4:
+       case OP_ATOMIC_ADD_I8:
+       case OP_ATOMIC_EXCHANGE_I4:
+       case OP_ATOMIC_EXCHANGE_I8:
+       case OP_ATOMIC_CAS_I4:
+       case OP_ATOMIC_CAS_I8:
+               return TRUE;
+       default:
+               return FALSE;
+       }
+}
index 89009f38803976eb279399ff22e8208a886c4cc0..7baab9d6e6e50909bb2041d689218f284e7cf829 100644 (file)
@@ -206,6 +206,28 @@ typedef struct MonoCompileArch {
        gpointer lmf_var;
 } MonoCompileArch;
 
+
+
+#ifdef HOST_WIN32
+#define PARAM_REGS 4
+#else
+#define PARAM_REGS 6
+#endif
+
+/* Structure used by the sequence points in AOTed code */
+typedef struct {
+       gpointer ss_trigger_page;
+       gpointer bp_trigger_page;
+       gpointer bp_addrs [MONO_ZERO_LEN_ARRAY];
+} SeqPointInfo;
+
+typedef struct {
+       mgreg_t regs [PARAM_REGS];
+       mgreg_t res;
+       guint8 *ret;
+} DynCallArgs;
+
+
 #define MONO_CONTEXT_SET_LLVM_EXC_REG(ctx, exc) do { (ctx)->rax = (gsize)exc; } while (0)
 
 #define MONO_ARCH_INIT_TOP_LMF_ENTRY(lmf)
@@ -337,11 +359,7 @@ typedef struct MonoCompileArch {
 #define MONO_ARCH_ENABLE_MONO_LMF_VAR 1
 #define MONO_ARCH_HAVE_INVALIDATE_METHOD 1
 #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE 1
-#define MONO_ARCH_HAVE_ATOMIC_ADD 1
-#define MONO_ARCH_HAVE_ATOMIC_EXCHANGE 1
-#define MONO_ARCH_HAVE_ATOMIC_CAS 1
 #define MONO_ARCH_HAVE_FULL_AOT_TRAMPOLINES 1
-#define MONO_ARCH_HAVE_IMT 1
 #define MONO_ARCH_HAVE_TLS_GET (mono_amd64_have_tls_get ())
 #define MONO_ARCH_IMT_REG AMD64_R10
 #define MONO_ARCH_IMT_SCRATCH_REG AMD64_R11
index 71ed6a53d2e027aa13dd3aa6463da58bc51e93b1..503e4137bd981d718d020156f324cb34a57e419b 100644 (file)
@@ -12,6 +12,7 @@
 #include "mini.h"
 #include <string.h>
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/debug-helpers.h>
 #include <mono/utils/mono-mmap.h>
@@ -152,13 +153,6 @@ static gpointer ss_trigger_page;
 /* Enabled breakpoints read from this trigger page */
 static gpointer bp_trigger_page;
 
-/* Structure used by the sequence points in AOTed code */
-typedef struct {
-       gpointer ss_trigger_page;
-       gpointer bp_trigger_page;
-       guint8* bp_addrs [MONO_ZERO_LEN_ARRAY];
-} SeqPointInfo;
-
 /*
  * TODO:
  * floating point support: on ARM it is a mess, there are at least 3
@@ -461,7 +455,7 @@ emit_save_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset)
                                                         (gpointer)"pthread_getspecific");
                code = emit_call_seq (cfg, code);
                /* lmf_addr = &jit_tls->lmf */
-               lmf_offset = G_STRUCT_OFFSET (MonoJitTlsData, lmf);
+               lmf_offset = MONO_STRUCT_OFFSET (MonoJitTlsData, lmf);
                g_assert (arm_is_imm8 (lmf_offset));
                ARM_ADD_REG_IMM (code, ARMREG_R0, ARMREG_R0, lmf_offset, 0);
 
@@ -484,18 +478,18 @@ emit_save_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset)
         */
        code = emit_big_add (code, ARMREG_R1, ARMREG_SP, lmf_offset);
        /* r0 is the result from mono_get_lmf_addr () */
-       ARM_STR_IMM (code, ARMREG_R0, ARMREG_R1, G_STRUCT_OFFSET (MonoLMF, lmf_addr));
+       ARM_STR_IMM (code, ARMREG_R0, ARMREG_R1, MONO_STRUCT_OFFSET (MonoLMF, lmf_addr));
        /* new_lmf->previous_lmf = *lmf_addr */
-       ARM_LDR_IMM (code, ARMREG_IP, ARMREG_R0, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
-       ARM_STR_IMM (code, ARMREG_IP, ARMREG_R1, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
+       ARM_LDR_IMM (code, ARMREG_IP, ARMREG_R0, MONO_STRUCT_OFFSET (MonoLMF, previous_lmf));
+       ARM_STR_IMM (code, ARMREG_IP, ARMREG_R1, MONO_STRUCT_OFFSET (MonoLMF, previous_lmf));
        /* *(lmf_addr) = r1 */
-       ARM_STR_IMM (code, ARMREG_R1, ARMREG_R0, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
+       ARM_STR_IMM (code, ARMREG_R1, ARMREG_R0, MONO_STRUCT_OFFSET (MonoLMF, previous_lmf));
        /* Skip method (only needed for trampoline LMF frames) */
-       ARM_STR_IMM (code, ARMREG_SP, ARMREG_R1, G_STRUCT_OFFSET (MonoLMF, sp));
-       ARM_STR_IMM (code, ARMREG_FP, ARMREG_R1, G_STRUCT_OFFSET (MonoLMF, fp));
+       ARM_STR_IMM (code, ARMREG_SP, ARMREG_R1, MONO_STRUCT_OFFSET (MonoLMF, sp));
+       ARM_STR_IMM (code, ARMREG_FP, ARMREG_R1, MONO_STRUCT_OFFSET (MonoLMF, fp));
        /* save the current IP */
        ARM_MOV_REG_REG (code, ARMREG_IP, ARMREG_PC);
-       ARM_STR_IMM (code, ARMREG_IP, ARMREG_R1, G_STRUCT_OFFSET (MonoLMF, ip));
+       ARM_STR_IMM (code, ARMREG_IP, ARMREG_R1, MONO_STRUCT_OFFSET (MonoLMF, ip));
 
        for (i = 0; i < sizeof (MonoLMF); i += sizeof (mgreg_t))
                mini_gc_set_slot_type_from_fp (cfg, lmf_offset + i, SLOT_NOREF);
@@ -603,11 +597,11 @@ emit_restore_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset)
        }
 
        /* ip = previous_lmf */
-       ARM_LDR_IMM (code, ARMREG_IP, basereg, offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf));
+       ARM_LDR_IMM (code, ARMREG_IP, basereg, offset + MONO_STRUCT_OFFSET (MonoLMF, previous_lmf));
        /* lr = lmf_addr */
-       ARM_LDR_IMM (code, ARMREG_LR, basereg, offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr));
+       ARM_LDR_IMM (code, ARMREG_LR, basereg, offset + MONO_STRUCT_OFFSET (MonoLMF, lmf_addr));
        /* *(lmf_addr) = previous_lmf */
-       ARM_STR_IMM (code, ARMREG_IP, ARMREG_LR, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
+       ARM_STR_IMM (code, ARMREG_IP, ARMREG_LR, MONO_STRUCT_OFFSET (MonoLMF, previous_lmf));
 
        return code;
 }
@@ -682,8 +676,8 @@ get_delegate_invoke_impl (gboolean has_target, gboolean param_count, guint32 *co
                start = code = mono_global_codeman_reserve (12);
 
                /* Replace the this argument with the target */
-               ARM_LDR_IMM (code, ARMREG_IP, ARMREG_R0, G_STRUCT_OFFSET (MonoDelegate, method_ptr));
-               ARM_LDR_IMM (code, ARMREG_R0, ARMREG_R0, G_STRUCT_OFFSET (MonoDelegate, target));
+               ARM_LDR_IMM (code, ARMREG_IP, ARMREG_R0, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr));
+               ARM_LDR_IMM (code, ARMREG_R0, ARMREG_R0, MONO_STRUCT_OFFSET (MonoDelegate, target));
                ARM_MOV_REG_REG (code, ARMREG_PC, ARMREG_IP);
 
                g_assert ((code - start) <= 12);
@@ -695,7 +689,7 @@ get_delegate_invoke_impl (gboolean has_target, gboolean param_count, guint32 *co
                size = 8 + param_count * 4;
                start = code = mono_global_codeman_reserve (size);
 
-               ARM_LDR_IMM (code, ARMREG_IP, ARMREG_R0, G_STRUCT_OFFSET (MonoDelegate, method_ptr));
+               ARM_LDR_IMM (code, ARMREG_IP, ARMREG_R0, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr));
                /* slide down the arguments */
                for (i = 0; i < param_count; ++i) {
                        ARM_MOV_REG_REG (code, (ARMREG_R0 + i), (ARMREG_R0 + i + 1));
@@ -811,17 +805,12 @@ mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code)
 void
 mono_arch_cpu_init (void)
 {
-#ifdef TARGET_IOS
-       i8_align = 4;
-#else
-       i8_align = __alignof__ (gint64);
-#endif
-
+       i8_align = MONO_ABI_ALIGNOF (gint64);
 #ifdef MONO_CROSS_COMPILE
        /* Need to set the alignment of i8 since it can different on the target */
 #ifdef TARGET_ANDROID
        /* linux gnueabi */
-       mono_type_set_alignment (MONO_TYPE_I8, 8);
+       mono_type_set_alignment (MONO_TYPE_I8, i8_align);
 #endif
 #endif
 }
@@ -840,12 +829,12 @@ create_function_wrapper (gpointer function)
        ARM_SUB_REG_IMM8 (code, ARMREG_SP, ARMREG_SP, sizeof (MonoContext));
 
        /* save ip, lr and pc into their correspodings ctx.regs slots. */
-       ARM_STR_IMM (code, ARMREG_IP, ARMREG_SP, G_STRUCT_OFFSET (MonoContext, regs) + sizeof (mgreg_t) * ARMREG_IP);
-       ARM_STR_IMM (code, ARMREG_LR, ARMREG_SP, G_STRUCT_OFFSET (MonoContext, regs) + 4 * ARMREG_LR);
-       ARM_STR_IMM (code, ARMREG_LR, ARMREG_SP, G_STRUCT_OFFSET (MonoContext, regs) + 4 * ARMREG_PC);
+       ARM_STR_IMM (code, ARMREG_IP, ARMREG_SP, MONO_STRUCT_OFFSET (MonoContext, regs) + sizeof (mgreg_t) * ARMREG_IP);
+       ARM_STR_IMM (code, ARMREG_LR, ARMREG_SP, MONO_STRUCT_OFFSET (MonoContext, regs) + 4 * ARMREG_LR);
+       ARM_STR_IMM (code, ARMREG_LR, ARMREG_SP, MONO_STRUCT_OFFSET (MonoContext, regs) + 4 * ARMREG_PC);
 
        /* save r0..r10 and fp */
-       ARM_ADD_REG_IMM8 (code, ARMREG_IP, ARMREG_SP, G_STRUCT_OFFSET (MonoContext, regs));
+       ARM_ADD_REG_IMM8 (code, ARMREG_IP, ARMREG_SP, MONO_STRUCT_OFFSET (MonoContext, regs));
        ARM_STM (code, ARMREG_IP, 0x0fff);
 
        /* now we can update fp. */
@@ -854,11 +843,11 @@ create_function_wrapper (gpointer function)
        /* make ctx.esp hold the actual value of sp at the beginning of this method. */
        ARM_ADD_REG_IMM8 (code, ARMREG_R0, ARMREG_FP, sizeof (MonoContext));
        ARM_STR_IMM (code, ARMREG_R0, ARMREG_IP, 4 * ARMREG_SP);
-       ARM_STR_IMM (code, ARMREG_R0, ARMREG_FP, G_STRUCT_OFFSET (MonoContext, regs) + 4 * ARMREG_SP);
+       ARM_STR_IMM (code, ARMREG_R0, ARMREG_FP, MONO_STRUCT_OFFSET (MonoContext, regs) + 4 * ARMREG_SP);
 
        /* make ctx.eip hold the address of the call. */
        ARM_SUB_REG_IMM8 (code, ARMREG_LR, ARMREG_LR, 4);
-       ARM_STR_IMM (code, ARMREG_LR, ARMREG_SP, G_STRUCT_OFFSET (MonoContext, pc));
+       ARM_STR_IMM (code, ARMREG_LR, ARMREG_SP, MONO_STRUCT_OFFSET (MonoContext, pc));
 
        /* r0 now points to the MonoContext */
        ARM_MOV_REG_REG (code, ARMREG_R0, ARMREG_FP);
@@ -879,12 +868,12 @@ create_function_wrapper (gpointer function)
        ARM_BLX_REG (code, ARMREG_IP);
 
        /* we're back; save ctx.eip and ctx.esp into the corresponding regs slots. */
-       ARM_LDR_IMM (code, ARMREG_R0, ARMREG_FP, G_STRUCT_OFFSET (MonoContext, pc));
-       ARM_STR_IMM (code, ARMREG_R0, ARMREG_FP, G_STRUCT_OFFSET (MonoContext, regs) + 4 * ARMREG_LR);
-       ARM_STR_IMM (code, ARMREG_R0, ARMREG_FP, G_STRUCT_OFFSET (MonoContext, regs) + 4 * ARMREG_PC);
+       ARM_LDR_IMM (code, ARMREG_R0, ARMREG_FP, MONO_STRUCT_OFFSET (MonoContext, pc));
+       ARM_STR_IMM (code, ARMREG_R0, ARMREG_FP, MONO_STRUCT_OFFSET (MonoContext, regs) + 4 * ARMREG_LR);
+       ARM_STR_IMM (code, ARMREG_R0, ARMREG_FP, MONO_STRUCT_OFFSET (MonoContext, regs) + 4 * ARMREG_PC);
 
        /* make ip point to the regs array, then restore everything, including pc. */
-       ARM_ADD_REG_IMM8 (code, ARMREG_IP, ARMREG_FP, G_STRUCT_OFFSET (MonoContext, regs));
+       ARM_ADD_REG_IMM8 (code, ARMREG_IP, ARMREG_FP, MONO_STRUCT_OFFSET (MonoContext, regs));
        ARM_LDM (code, ARMREG_IP, 0xffff);
 
        mono_arch_flush_icache (start, code - start);
@@ -1225,13 +1214,6 @@ typedef struct {
 
 #define DEBUG(a)
 
-#ifndef __GNUC__
-/*#define __alignof__(a) sizeof(a)*/
-#define __alignof__(type) G_STRUCT_OFFSET(struct { char c; type x; }, x)
-#endif
-
-#define PARAM_REGS 4
-
 static void inline
 add_general (guint *gr, guint *stack_size, ArgInfo *ainfo, gboolean simple)
 {
@@ -1980,7 +1962,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
                offset += size;
        }
 
-       if (cfg->has_atomic_exchange_i4 || cfg->has_atomic_cas_i4 || cfg->has_atomic_add_new_i4) {
+       if (cfg->has_atomic_exchange_i4 || cfg->has_atomic_cas_i4 || cfg->has_atomic_add_i4) {
                /* Allocate a temporary used by the atomic ops */
                size = 4;
                align = 4;
@@ -2606,19 +2588,11 @@ mono_arch_is_inst_imm (gint64 imm)
        return TRUE;
 }
 
-#define DYN_CALL_STACK_ARGS 6
-
 typedef struct {
        MonoMethodSignature *sig;
        CallInfo *cinfo;
 } ArchDynCallInfo;
 
-typedef struct {
-       mgreg_t regs [PARAM_REGS + DYN_CALL_STACK_ARGS];
-       mgreg_t res, res2;
-       guint8 *ret;
-} DynCallArgs;
-
 static gboolean
 dyn_call_supported (CallInfo *cinfo, MonoMethodSignature *sig)
 {
@@ -4174,7 +4148,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        break;
                case OP_ATOMIC_EXCHANGE_I4:
                case OP_ATOMIC_CAS_I4:
-               case OP_ATOMIC_ADD_NEW_I4: {
+               case OP_ATOMIC_ADD_I4: {
                        int tmpreg;
                        guint8 *buf [16];
 
@@ -4217,7 +4191,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                                arm_patch (buf [2], buf [0]);
                                arm_patch (buf [1], code);
                                break;
-                       case OP_ATOMIC_ADD_NEW_I4:
+                       case OP_ATOMIC_ADD_I4:
                                buf [0] = code;
                                ARM_DMB (code, ARM_DMB_SY);
                                ARM_LDREX_REG (code, ARMREG_LR, ins->sreg1);
@@ -4489,7 +4463,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
 
                                ARM_LDR_IMM (code, dreg, info_var->inst_basereg, info_var->inst_offset);
                                /* Add the offset */
-                               val = ((offset / 4) * sizeof (guint8*)) + G_STRUCT_OFFSET (SeqPointInfo, bp_addrs);
+                               val = ((offset / 4) * sizeof (guint8*)) + MONO_STRUCT_OFFSET (SeqPointInfo, bp_addrs);
                                /* Load the info->bp_addrs [offset], which is either 0 or the address of a trigger page */
                                if (arm_is_imm12 ((int)val)) {
                                        ARM_LDR_IMM (code, dreg, dreg, val);
@@ -5014,8 +4988,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
 
                        /* Save result */
                        ARM_LDR_IMM (code, ARMREG_IP, var->inst_basereg, var->inst_offset);
-                       ARM_STR_IMM (code, ARMREG_R0, ARMREG_IP, G_STRUCT_OFFSET (DynCallArgs, res)); 
-                       ARM_STR_IMM (code, ARMREG_R1, ARMREG_IP, G_STRUCT_OFFSET (DynCallArgs, res2)); 
+                       ARM_STR_IMM (code, ARMREG_R0, ARMREG_IP, MONO_STRUCT_OFFSET (DynCallArgs, res)); 
+                       ARM_STR_IMM (code, ARMREG_R1, ARMREG_IP, MONO_STRUCT_OFFSET (DynCallArgs, res2)); 
                        break;
                }
                case OP_THROW: {
@@ -6139,7 +6113,7 @@ mono_arch_emit_prolog (MonoCompile *cfg)
 
                        ARM_LDR_IMM (code, dreg, info_var->inst_basereg, info_var->inst_offset);
                        /* Load the trigger page addr */
-                       ARM_LDR_IMM (code, dreg, dreg, G_STRUCT_OFFSET (SeqPointInfo, ss_trigger_page));
+                       ARM_LDR_IMM (code, dreg, dreg, MONO_STRUCT_OFFSET (SeqPointInfo, ss_trigger_page));
                        ARM_STR_IMM (code, dreg, ss_trigger_page_var->inst_basereg, ss_trigger_page_var->inst_offset);
                }
        }
@@ -6428,8 +6402,6 @@ mono_arch_flush_register_windows (void)
 {
 }
 
-#ifdef MONO_ARCH_HAVE_IMT
-
 #ifndef DISABLE_JIT
 
 void
@@ -6915,8 +6887,6 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
        return start;
 }
 
-#endif
-
 mgreg_t
 mono_arch_context_get_int_reg (MonoContext *ctx, int reg)
 {
@@ -7220,9 +7190,9 @@ gboolean
 mono_arch_opcode_supported (int opcode)
 {
        switch (opcode) {
+       case OP_ATOMIC_ADD_I4:
        case OP_ATOMIC_EXCHANGE_I4:
        case OP_ATOMIC_CAS_I4:
-       case OP_ATOMIC_ADD_NEW_I4:
                return v7_supported;
        default:
                return FALSE;
index 131d43300166f748532ccb0c60dd987131906671..69c9c8d28c5918a7c4eca7fef4e466d47b932591 100644 (file)
@@ -167,6 +167,23 @@ typedef struct {
        int map [MONO_ZERO_LEN_ARRAY];
 } GSharedVtCallInfo;
 
+/* Structure used by the sequence points in AOTed code */
+typedef struct {
+       gpointer ss_trigger_page;
+       gpointer bp_trigger_page;
+       guint8* bp_addrs [MONO_ZERO_LEN_ARRAY];
+} SeqPointInfo;
+
+
+#define PARAM_REGS 4
+#define DYN_CALL_STACK_ARGS 6
+
+typedef struct {
+       mgreg_t regs [PARAM_REGS + DYN_CALL_STACK_ARGS];
+       mgreg_t res, res2;
+       guint8 *ret;
+} DynCallArgs;
+
 void arm_patch (guchar *code, const guchar *target);
 guint8* mono_arm_emit_load_imm (guint8 *code, int dreg, guint32 val);
 int mono_arm_is_rotated_imm8 (guint32 val, gint *rot_amount);
@@ -246,7 +263,6 @@ typedef struct MonoCompileArch {
 #define ARM_NUM_REG_FPARGS 0
 
 #define MONO_ARCH_HAVE_FULL_AOT_TRAMPOLINES 1
-#define MONO_ARCH_HAVE_IMT 1
 #define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1
 
 #define MONO_ARCH_AOT_SUPPORTED 1
@@ -274,10 +290,6 @@ typedef struct MonoCompileArch {
 #define MONO_ARCH_HAVE_OP_TAIL_CALL 1
 #endif
 #define MONO_ARCH_HAVE_DUMMY_INIT 1
-#define MONO_ARCH_HAVE_OPCODE_SUPPORTED 1
-#define MONO_ARCH_HAVE_ATOMIC_EXCHANGE 1
-#define MONO_ARCH_HAVE_ATOMIC_CAS 1
-#define MONO_ARCH_HAVE_ATOMIC_ADD 1
 
 #if defined(__native_client__)
 #undef MONO_ARCH_SOFT_DEBUG_SUPPORTED
diff --git a/mono/mini/mini-cross-helpers.c b/mono/mini/mini-cross-helpers.c
new file mode 100644 (file)
index 0000000..dede99f
--- /dev/null
@@ -0,0 +1,13 @@
+#include "config.h"
+
+#ifdef ENABLE_EXTENSION_MODULE
+#include "../../../mono-extensions/mono/mini/mini-cross-helpers.c"
+#else
+
+void mono_cross_helpers_run (void);
+
+void
+mono_cross_helpers_run (void)
+{
+}
+#endif
index dcdc2ea68f552eb91cf8e2a3ba7310bbc651bfc7..4486c3b689d0fbf4fb017eb1d3bc08da58bf59ec 100644 (file)
@@ -2264,7 +2264,7 @@ mono_handle_native_sigsegv (int signal, void *ctx)
                        ;
 #else
                while (1) {
-                       sleep (0);
+                       sleep (1);
                }
 #endif
        }
@@ -2747,5 +2747,6 @@ mono_jinfo_get_unwind_info (MonoJitInfo *ji, guint32 *unwind_info_len)
        if (ji->from_aot)
                return mono_aot_get_unwind_info (ji, unwind_info_len);
        else
-               return mono_get_cached_unwind_info (ji->used_regs, unwind_info_len);
+               /* The upper 16 bits of ji->unwind_info might contain the epilog offset */
+               return mono_get_cached_unwind_info (ji->unwind_info & 0xffff, unwind_info_len);
 }
index 29c92711fdac1962f5b574d523ad6f371dc0c31d..8ca1eebfe5b6bcdc5728d5a4861c2d06e3c31e5e 100644 (file)
@@ -1103,7 +1103,7 @@ conservative_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end)
  * pass.
  */
 static void
-precise_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end)
+precise_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end, void *gc_data)
 {
        int findex, i;
        FrameInfo *fi;
@@ -1141,7 +1141,7 @@ precise_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end)
                                        MonoObject *obj = *ptr;
                                        if (obj) {
                                                DEBUG (fprintf (logfile, "\tref %s0x%x(fp)=%p: %p ->", (guint8*)ptr >= (guint8*)fi->fp ? "" : "-", ABS ((int)((gssize)ptr - (gssize)fi->fp)), ptr, obj));
-                                               *ptr = mono_gc_scan_object (obj);
+                                               *ptr = mono_gc_scan_object (obj, gc_data);
                                                DEBUG (fprintf (logfile, " %p.\n", *ptr));
                                        } else {
                                                DEBUG (fprintf (logfile, "\tref %s0x%x(fp)=%p: %p.\n", (guint8*)ptr >= (guint8*)fi->fp ? "" : "-", ABS ((int)((gssize)ptr - (gssize)fi->fp)), ptr, obj));
@@ -1182,7 +1182,7 @@ precise_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end)
 
                        if (obj) {
                                DEBUG (fprintf (logfile, "\treg %s saved at %p: %p ->", mono_arch_regname (fi->regs [i]), ptr, obj));
-                               *ptr = mono_gc_scan_object (obj);
+                               *ptr = mono_gc_scan_object (obj, gc_data);
                                DEBUG (fprintf (logfile, " %p.\n", *ptr));
                        } else {
                                DEBUG (fprintf (logfile, "\treg %s saved at %p: %p\n", mono_arch_regname (fi->regs [i]), ptr, obj));
@@ -1210,7 +1210,7 @@ precise_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end)
  * structure filled up by thread_suspend_func. 
  */
 static void
-thread_mark_func (gpointer user_data, guint8 *stack_start, guint8 *stack_end, gboolean precise)
+thread_mark_func (gpointer user_data, guint8 *stack_start, guint8 *stack_end, gboolean precise, void *gc_data)
 {
        TlsData *tls = user_data;
 
@@ -1221,7 +1221,7 @@ thread_mark_func (gpointer user_data, guint8 *stack_start, guint8 *stack_end, gb
        if (!precise)
                conservative_pass (tls, stack_start, stack_end);
        else
-               precise_pass (tls, stack_start, stack_end);
+               precise_pass (tls, stack_start, stack_end, gc_data);
 }
 
 #ifndef DISABLE_JIT
index ab9245f26a948d2f0786bd28cc63b5e0fc41ed1f..1ee16ef763246fc05aa3977a081ef46ecac32740 100644 (file)
@@ -1343,9 +1343,6 @@ instantiate_info (MonoDomain *domain, MonoRuntimeGenericContextInfoTemplate *oti
 
                if (virtual) {
                        /* Same as in mono_emit_method_call_full () */
-#ifndef MONO_ARCH_HAVE_IMT
-                       NOT_IMPLEMENTED;
-#endif
                        if ((method->klass->parent == mono_defaults.multicastdelegate_class) && (!strcmp (method->name, "Invoke"))) {
                                /* See mono_emit_method_call_full () */
                                /* The gsharedvt trampoline will recognize this constant */
index 17cc1f9f2f7f50c8ce62031fde85e2ef3bc19bfb..7d74ad8f45f34aead1f502d2d46f48a2d6006a8d 100644 (file)
@@ -1487,10 +1487,10 @@ mono_arch_lowering_pass (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_LOADR8_MEMBASE:
                case OP_ATOMIC_EXCHANGE_I4:
                case OP_ATOMIC_EXCHANGE_I8:
-               case OP_ATOMIC_ADD_NEW_I4:
-               case OP_ATOMIC_ADD_NEW_I8:
-               case OP_ATOMIC_ADD_IMM_NEW_I4:
-               case OP_ATOMIC_ADD_IMM_NEW_I8:
+               case OP_ATOMIC_ADD_I4:
+               case OP_ATOMIC_ADD_I8:
+               case OP_ATOMIC_ADD_IMM_I4:
+               case OP_ATOMIC_ADD_IMM_I8:
                        /* There are no membase instructions on ia64 */
                        if (ins->inst_offset == 0) {
                                break;
@@ -2934,12 +2934,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_MEMORY_BARRIER:
                        ia64_mf (code);
                        break;
-               case OP_ATOMIC_ADD_IMM_NEW_I4:
+               case OP_ATOMIC_ADD_IMM_I4:
                        g_assert (ins->inst_offset == 0);
                        ia64_fetchadd4_acq_hint (code, ins->dreg, ins->inst_basereg, ins->inst_imm, 0);
                        ia64_adds_imm (code, ins->dreg, ins->inst_imm, ins->dreg);
                        break;
-               case OP_ATOMIC_ADD_IMM_NEW_I8:
+               case OP_ATOMIC_ADD_IMM_I8:
                        g_assert (ins->inst_offset == 0);
                        ia64_fetchadd8_acq_hint (code, ins->dreg, ins->inst_basereg, ins->inst_imm, 0);
                        ia64_adds_imm (code, ins->dreg, ins->inst_imm, ins->dreg);
@@ -2951,7 +2951,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_ATOMIC_EXCHANGE_I8:
                        ia64_xchg8_hint (code, ins->dreg, ins->inst_basereg, ins->sreg2, 0);
                        break;
-               case OP_ATOMIC_ADD_NEW_I4: {
+               case OP_ATOMIC_ADD_I4: {
                        guint8 *label, *buf;
 
                        /* From libatomic_ops */
@@ -2971,7 +2971,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        ia64_add (code, ins->dreg, GP_SCRATCH_REG, ins->sreg2);
                        break;
                }
-               case OP_ATOMIC_ADD_NEW_I8: {
+               case OP_ATOMIC_ADD_I8: {
                        guint8 *label, *buf;
 
                        /* From libatomic_ops */
@@ -4526,8 +4526,6 @@ mono_arch_free_jit_tls_data (MonoJitTlsData *tls)
 {
 }
 
-#ifdef MONO_ARCH_HAVE_IMT
-
 /*
  * LOCKING: called with the domain lock held
  */
@@ -4638,7 +4636,6 @@ mono_arch_emit_imt_argument (MonoCompile *cfg, MonoCallInst *call, MonoInst *imt
 {
        /* Done by the implementation of the CALL_MEMBASE opcodes */
 }
-#endif
 
 gpointer
 mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code)
@@ -4669,9 +4666,9 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho
                        guint32 opcode;
 
                        if (fsig->params [0]->type == MONO_TYPE_I4)
-                               opcode = OP_ATOMIC_ADD_IMM_NEW_I4;
+                               opcode = OP_ATOMIC_ADD_IMM_I4;
                        else if (fsig->params [0]->type == MONO_TYPE_I8)
-                               opcode = OP_ATOMIC_ADD_IMM_NEW_I8;
+                               opcode = OP_ATOMIC_ADD_IMM_I8;
                        else
                                g_assert_not_reached ();
                        MONO_INST_NEW (cfg, ins, opcode);
@@ -4684,9 +4681,9 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho
                        guint32 opcode;
 
                        if (fsig->params [0]->type == MONO_TYPE_I4)
-                               opcode = OP_ATOMIC_ADD_IMM_NEW_I4;
+                               opcode = OP_ATOMIC_ADD_IMM_I4;
                        else if (fsig->params [0]->type == MONO_TYPE_I8)
-                               opcode = OP_ATOMIC_ADD_IMM_NEW_I8;
+                               opcode = OP_ATOMIC_ADD_IMM_I8;
                        else
                                g_assert_not_reached ();
                        MONO_INST_NEW (cfg, ins, opcode);
@@ -4708,9 +4705,9 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho
 
                        if (is_imm) {
                                if (fsig->params [0]->type == MONO_TYPE_I4)
-                                       opcode = OP_ATOMIC_ADD_IMM_NEW_I4;
+                                       opcode = OP_ATOMIC_ADD_IMM_I4;
                                else if (fsig->params [0]->type == MONO_TYPE_I8)
-                                       opcode = OP_ATOMIC_ADD_IMM_NEW_I8;
+                                       opcode = OP_ATOMIC_ADD_IMM_I8;
                                else
                                        g_assert_not_reached ();
 
@@ -4719,12 +4716,12 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho
                                ins->inst_basereg = args [0]->dreg;
                                ins->inst_offset = 0;
                                ins->inst_imm = imm;
-                               ins->type = (opcode == OP_ATOMIC_ADD_IMM_NEW_I4) ? STACK_I4 : STACK_I8;
+                               ins->type = (opcode == OP_ATOMIC_ADD_IMM_I4) ? STACK_I4 : STACK_I8;
                        } else {
                                if (fsig->params [0]->type == MONO_TYPE_I4)
-                                       opcode = OP_ATOMIC_ADD_NEW_I4;
+                                       opcode = OP_ATOMIC_ADD_I4;
                                else if (fsig->params [0]->type == MONO_TYPE_I8)
-                                       opcode = OP_ATOMIC_ADD_NEW_I8;
+                                       opcode = OP_ATOMIC_ADD_I8;
                                else
                                        g_assert_not_reached ();
 
@@ -4733,7 +4730,7 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho
                                ins->inst_basereg = args [0]->dreg;
                                ins->inst_offset = 0;
                                ins->sreg2 = args [1]->dreg;
-                               ins->type = (opcode == OP_ATOMIC_ADD_NEW_I4) ? STACK_I4 : STACK_I8;
+                               ins->type = (opcode == OP_ATOMIC_ADD_I4) ? STACK_I4 : STACK_I8;
                        }
                        MONO_ADD_INS (cfg->cbb, ins);
                }
@@ -4754,3 +4751,17 @@ mono_arch_context_get_int_reg (MonoContext *ctx, int reg)
        /* FIXME: implement */
        g_assert_not_reached ();
 }
+
+gboolean
+mono_arch_opcode_supported (int opcode)
+{
+       switch (opcode) {
+       case OP_ATOMIC_ADD_I4:
+       case OP_ATOMIC_ADD_I8:
+       case OP_ATOMIC_EXCHANGE_I4:
+       case OP_ATOMIC_EXCHANGE_I8:
+               return TRUE;
+       default:
+               return FALSE;
+       }
+}
index 4d4f1df44317af2ca40fe79bc3e1d48c4bded62e..d419bc26c728aaa2d9f100ff610ec629b50ce66c 100644 (file)
@@ -114,8 +114,6 @@ unw_dyn_region_info_t* mono_ia64_create_unwind_region (Ia64CodegenState *code);
 #define MONO_ARCH_HAVE_INVALIDATE_METHOD 1
 #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE 1
 #define MONO_ARCH_HAVE_SAVE_UNWIND_INFO 1
-#define MONO_ARCH_HAVE_ATOMIC_EXCHANGE 1
-#define MONO_ARCH_HAVE_IMT 1
 #define MONO_ARCH_HAVE_GENERALIZED_IMT_THUNK 1
 #define MONO_ARCH_THIS_AS_FIRST_ARG 1
 
index c6f04b8073acb2eb2d7bc0de089c2255d8e2b1ae..df6de20bab48786bcf4caed9ec1b139896289f9c 100644 (file)
@@ -3328,12 +3328,12 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
                        values [ins->dreg] = mono_llvm_build_atomic_rmw (builder, LLVM_ATOMICRMW_OP_XCHG, args [0], args [1]);
                        break;
                }
-               case OP_ATOMIC_ADD_NEW_I4:
-               case OP_ATOMIC_ADD_NEW_I8: {
+               case OP_ATOMIC_ADD_I4:
+               case OP_ATOMIC_ADD_I8: {
                        LLVMValueRef args [2];
                        LLVMTypeRef t;
                                
-                       if (ins->opcode == OP_ATOMIC_ADD_NEW_I4)
+                       if (ins->opcode == OP_ATOMIC_ADD_I4)
                                t = LLVMInt32Type ();
                        else
                                t = LLVMInt64Type ();
index 235fd33a449b15e2c2d8b4e2f8c0f2f900d8871b..cc32f05f72828cf9f1a6a06fcded6d33be8a6bfe 100644 (file)
@@ -15,6 +15,7 @@
 #include <string.h>
 #include <asm/cachectl.h>
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/debug-helpers.h>
 #include <mono/utils/mono-mmap.h>
@@ -551,8 +552,8 @@ get_delegate_invoke_impl (gboolean has_target, gboolean param_count, guint32 *co
                start = code = mono_global_codeman_reserve (16);
 
                /* Replace the this argument with the target */
-               mips_lw (code, mips_temp, mips_a0, G_STRUCT_OFFSET (MonoDelegate, method_ptr));
-               mips_lw (code, mips_a0, mips_a0, G_STRUCT_OFFSET (MonoDelegate, target));
+               mips_lw (code, mips_temp, mips_a0, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr));
+               mips_lw (code, mips_a0, mips_a0, MONO_STRUCT_OFFSET (MonoDelegate, target));
                mips_jr (code, mips_temp);
                mips_nop (code);
 
@@ -565,7 +566,7 @@ get_delegate_invoke_impl (gboolean has_target, gboolean param_count, guint32 *co
                size = 16 + param_count * 4;
                start = code = mono_global_codeman_reserve (size);
 
-               mips_lw (code, mips_temp, mips_a0, G_STRUCT_OFFSET (MonoDelegate, method_ptr));
+               mips_lw (code, mips_temp, mips_a0, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr));
                /* slide down the arguments */
                for (i = 0; i < param_count; ++i) {
                        mips_move (code, mips_a0 + i, mips_a0 + i + 1);
@@ -5844,8 +5845,6 @@ mono_arch_context_get_int_reg (MonoContext *ctx, int reg)
        return ctx->sc_regs [reg];
 }
 
-#ifdef MONO_ARCH_HAVE_IMT
-
 #define ENABLE_WRONG_METHOD_CHECK 0
 
 #define MIPS_LOAD_SEQUENCE_LENGTH      8
@@ -5999,7 +5998,6 @@ mono_arch_find_imt_method (mgreg_t *regs, guint8 *code)
 {
        return (MonoMethod*) regs [MONO_ARCH_IMT_REG];
 }
-#endif
 
 MonoVTable*
 mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code)
@@ -6142,3 +6140,9 @@ mono_arch_init_lmf_ext (MonoLMFExt *ext, gpointer prev_lmf)
 }
 
 #endif /* MONO_ARCH_SOFT_DEBUG_SUPPORTED */
+
+gboolean
+mono_arch_opcode_supported (int opcode)
+{
+       return FALSE;
+}
index 7476469c2711742fead279f319b7431504e019cb..c94f7c898f36c621c9b8286e562cba50fb84db01 100644 (file)
@@ -257,7 +257,6 @@ typedef struct MonoCompileArch {
 #define MIPS_LAST_FPARG_REG    mips_f19
 #endif
 
-#define MONO_ARCH_HAVE_IMT     1
 #define MONO_ARCH_IMT_REG      mips_t0
 
 #define MONO_ARCH_VTABLE_REG   mips_a0
index b1a31ee16d760a892f4782aa404a173625e0442f..e667a4c08f5050f328c1637ebfe03f84674cd5a8 100644 (file)
@@ -847,32 +847,36 @@ MINI_OP(OP_XMOVE,   "xmove", XREG, XREG, NONE)
 MINI_OP(OP_XZERO,   "xzero", XREG, NONE, NONE)
 MINI_OP(OP_XPHI,       "xphi", XREG, NONE, NONE)
 
-/* Atomic specific
-
-       Note, OP_ATOMIC_ADD_IMM_NEW_I4 and
-       OP_ATOMIC_ADD_NEW_I4 returns the new
-       value compared to OP_ATOMIC_ADD_I4 that
-       returns the old value.
-
-       OP_ATOMIC_ADD_NEW_I4 is used by
-       Interlocked::Increment and Interlocked:Decrement
-       and atomic_add_i4 by Interlocked::Add
+/*
+ * These are used for efficient implementation of the
+ * methods on the System.Threading.Interlocked class
+ * on architectures that support it. This is checked
+ * via mono_arch_opcode_supported ().
+ *
+ * Note that while the 32-bit variants are used on
+ * both 32-bit and 64-bit systems, the 64-bit variants
+ * are only used if the system is 64-bit. If that is
+ * not the case, the fallback code in the runtime is
+ * used instead. This is done because decomposing the
+ * 64-bit variants to instructions operating on 32-bit
+ * registers is very complicated on some architectures.
+ *
+ * The memory_barrier instruction translates to a full
+ * acquire/release barrier. Such a memory barrier is
+ * implied at the beginning and end of all other atomic
+ * operations, such that they ensure sequential
+ * consistency.
+ *
+ * All of these return the new value at the given
+ * memory location after performing the operation.
 */
 MINI_OP(OP_ATOMIC_ADD_I4, "atomic_add_i4", IREG, IREG, IREG)
-MINI_OP(OP_ATOMIC_ADD_NEW_I4, "atomic_add_new_i4", IREG, IREG, IREG)
-MINI_OP(OP_ATOMIC_ADD_IMM_I4, "atomic_add_imm_i4", IREG, IREG, NONE)
-MINI_OP(OP_ATOMIC_ADD_IMM_NEW_I4, "atomic_add_imm_new_i4", IREG, IREG, NONE)
-MINI_OP(OP_ATOMIC_EXCHANGE_I4, "atomic_exchange_i4", IREG, IREG, IREG)
-
 MINI_OP(OP_ATOMIC_ADD_I8, "atomic_add_i8", IREG, IREG, IREG)
-MINI_OP(OP_ATOMIC_ADD_NEW_I8, "atomic_add_new_i8", IREG, IREG, IREG)
-MINI_OP(OP_ATOMIC_ADD_IMM_I8, "atomic_add_imm_i8", IREG, IREG, NONE)
-MINI_OP(OP_ATOMIC_ADD_IMM_NEW_I8, "atomic_add_imm_new_i8", IREG, IREG, NONE)
+MINI_OP(OP_ATOMIC_EXCHANGE_I4, "atomic_exchange_i4", IREG, IREG, IREG)
 MINI_OP(OP_ATOMIC_EXCHANGE_I8, "atomic_exchange_i8", IREG, IREG, IREG)
-MINI_OP(OP_MEMORY_BARRIER, "memory_barrier", NONE, NONE, NONE)
-
 MINI_OP3(OP_ATOMIC_CAS_I4, "atomic_cas_i4", IREG, IREG, IREG, IREG)
 MINI_OP3(OP_ATOMIC_CAS_I8, "atomic_cas_i8", IREG, IREG, IREG, IREG)
+MINI_OP(OP_MEMORY_BARRIER, "memory_barrier", NONE, NONE, NONE)
 
 /* Conditional move opcodes.
  * Must be in the same order as the matching CEE_B... opcodes
@@ -1077,6 +1081,9 @@ MINI_OP(OP_S390_ISUB_OVF_UN,    "s390_int_sub_ovf_un", IREG, IREG, IREG)
 #endif
 
 #if defined(__ia64__)
+MINI_OP(OP_ATOMIC_ADD_IMM_I4, "atomic_add_imm_i4", IREG, IREG, NONE)
+MINI_OP(OP_ATOMIC_ADD_IMM_I8, "atomic_add_imm_i8", IREG, IREG, NONE)
+
 MINI_OP(OP_IA64_LOAD,          "ia64_load", NONE, NONE, NONE)
 MINI_OP(OP_IA64_LOADI1,        "ia64_loadi1", NONE, NONE, NONE)
 MINI_OP(OP_IA64_LOADU1,        "ia64_loadu1", NONE, NONE, NONE)
index d2a7aec7cd7373b9ca668f044e158a33502e63ea..d3ebe5de2aaa8b786a9fa893aec1b7834216f458 100644 (file)
@@ -12,6 +12,7 @@
 #include "mini.h"
 #include <string.h>
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/debug-helpers.h>
 #include <mono/utils/mono-proclib.h>
@@ -391,14 +392,14 @@ get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *cod
                        code = mono_ppc_create_pre_code_ftnptr (code);
 
                /* Replace the this argument with the target */
-               ppc_ldptr (code, ppc_r0, G_STRUCT_OFFSET (MonoDelegate, method_ptr), ppc_r3);
+               ppc_ldptr (code, ppc_r0, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr), ppc_r3);
 #ifdef PPC_USES_FUNCTION_DESCRIPTOR
                /* it's a function descriptor */
                /* Can't use ldptr as it doesn't work with r0 */
                ppc_ldptr_indexed (code, ppc_r0, 0, ppc_r0);
 #endif
                ppc_mtctr (code, ppc_r0);
-               ppc_ldptr (code, ppc_r3, G_STRUCT_OFFSET (MonoDelegate, target), ppc_r3);
+               ppc_ldptr (code, ppc_r3, MONO_STRUCT_OFFSET (MonoDelegate, target), ppc_r3);
                ppc_bcctr (code, PPC_BR_ALWAYS, 0);
 
                g_assert ((code - start) <= size);
@@ -412,7 +413,7 @@ get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *cod
                if (!aot)
                        code = mono_ppc_create_pre_code_ftnptr (code);
 
-               ppc_ldptr (code, ppc_r0, G_STRUCT_OFFSET (MonoDelegate, method_ptr), ppc_r3);
+               ppc_ldptr (code, ppc_r0, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr), ppc_r3);
 #ifdef PPC_USES_FUNCTION_DESCRIPTOR
                /* it's a function descriptor */
                ppc_ldptr_indexed (code, ppc_r0, 0, ppc_r0);
@@ -2429,6 +2430,7 @@ loop_start:
                case OP_IDIV_IMM:
                case OP_IREM_IMM:
                case OP_IREM_UN_IMM:
+               CASE_PPC64 (OP_LREM_IMM) {
                        NEW_INS (cfg, temp, OP_ICONST);
                        temp->inst_c0 = ins->inst_imm;
                        temp->dreg = mono_alloc_ireg (cfg);
@@ -2441,9 +2443,12 @@ loop_start:
                                ins->opcode = OP_IDIV_UN;
                        else if (ins->opcode == OP_IREM_UN_IMM)
                                ins->opcode = OP_IREM_UN;
+                       else if (ins->opcode == OP_LREM_IMM)
+                               ins->opcode = OP_LREM;
                        last_ins = temp;
                        /* handle rem separately */
                        goto loop_start;
+               }
                case OP_IREM:
                case OP_IREM_UN:
                CASE_PPC64 (OP_LREM)
@@ -4384,23 +4389,35 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        else
                                ppc_mr (code, ins->dreg, ins->sreg1);
                        break;
-               case OP_ATOMIC_ADD_NEW_I4:
-               case OP_ATOMIC_ADD_NEW_I8: {
-                       guint8 *loop = code, *branch;
+               case OP_ATOMIC_ADD_I4:
+               CASE_PPC64 (OP_ATOMIC_ADD_I8) {
+                       int location = ins->inst_basereg;
+                       int addend = ins->sreg2;
+                       guint8 *loop, *branch;
                        g_assert (ins->inst_offset == 0);
+
+                       loop = code;
                        ppc_sync (code);
-                       if (ins->opcode == OP_ATOMIC_ADD_NEW_I4)
-                               ppc_lwarx (code, ppc_r0, 0, ins->inst_basereg);
+                       if (ins->opcode == OP_ATOMIC_ADD_I4)
+                               ppc_lwarx (code, ppc_r0, 0, location);
+#ifdef __mono_ppc64__
                        else
-                               ppc_ldarx (code, ppc_r0, 0, ins->inst_basereg);
-                       ppc_add (code, ppc_r0, ppc_r0, ins->sreg2);
-                       if (ins->opcode == OP_ATOMIC_ADD_NEW_I4)
-                               ppc_stwcxd (code, ppc_r0, 0, ins->inst_basereg);
+                               ppc_ldarx (code, ppc_r0, 0, location);
+#endif
+
+                       ppc_add (code, ppc_r0, ppc_r0, addend);
+
+                       if (ins->opcode == OP_ATOMIC_ADD_I4)
+                               ppc_stwcxd (code, ppc_r0, 0, location);
+#ifdef __mono_ppc64__
                        else
-                               ppc_stdcxd (code, ppc_r0, 0, ins->inst_basereg);
+                               ppc_stdcxd (code, ppc_r0, 0, location);
+#endif
+
                        branch = code;
                        ppc_bc (code, PPC_BR_FALSE, PPC_BR_EQ, 0);
                        ppc_patch (branch, loop);
+
                        ppc_sync (code);
                        ppc_mr (code, ins->dreg, ppc_r0);
                        break;
@@ -4435,10 +4452,11 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        else
                                ppc_ldarx (code, ppc_r0, 0, location);
 #endif
-                       ppc_cmp (code, 0, ins->opcode == OP_ATOMIC_CAS_I4 ? 0 : 1, ppc_r0, comparand);
 
+                       ppc_cmp (code, 0, ins->opcode == OP_ATOMIC_CAS_I4 ? 0 : 1, ppc_r0, comparand);
                        not_equal = code;
                        ppc_bc (code, PPC_BR_FALSE, PPC_BR_EQ, 0);
+
                        if (ins->opcode == OP_ATOMIC_CAS_I4)
                                ppc_stwcxd (code, value, 0, location);
 #ifdef __mono_ppc64__
@@ -4449,8 +4467,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        lost_reservation = code;
                        ppc_bc (code, PPC_BR_FALSE, PPC_BR_EQ, 0);
                        ppc_patch (lost_reservation, start);
-
                        ppc_patch (not_equal, code);
+
                        ppc_sync (code);
                        ppc_mr (code, ins->dreg, ppc_r0);
                        break;
@@ -5541,8 +5559,6 @@ mono_arch_free_jit_tls_data (MonoJitTlsData *tls)
 {
 }
 
-#ifdef MONO_ARCH_HAVE_IMT
-
 #define CMP_SIZE (PPC_LOAD_SEQUENCE_LENGTH + 4)
 #define BR_SIZE 4
 #define LOADSTORE_SIZE 4
@@ -5698,7 +5714,6 @@ mono_arch_find_imt_method (mgreg_t *regs, guint8 *code)
 
        return (MonoMethod*)(gsize) r [MONO_ARCH_IMT_REG];
 }
-#endif
 
 MonoVTable*
 mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code)
@@ -5945,3 +5960,19 @@ mono_arch_init_lmf_ext (MonoLMFExt *ext, gpointer prev_lmf)
 }
 
 #endif
+
+gboolean
+mono_arch_opcode_supported (int opcode)
+{
+       switch (opcode) {
+       case OP_ATOMIC_ADD_I4:
+       case OP_ATOMIC_CAS_I4:
+#ifdef TARGET_POWERPC64
+       case OP_ATOMIC_ADD_I8:
+       case OP_ATOMIC_CAS_I8:
+#endif
+               return TRUE;
+       default:
+               return FALSE;
+       }
+}
index 13b6adb5376fccf0bc1957d16eb5fdc27b8de21c..dcc1c5fae282ceb718968eb76979057494613a5a 100644 (file)
@@ -68,7 +68,6 @@ typedef struct MonoCompileArch {
 #ifdef __mono_ppc64__
 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS
 #define MONO_ARCH_NO_EMULATE_LONG_MUL_OPTS
-#define MONO_ARCH_HAVE_ATOMIC_ADD 1
 #define PPC_USES_FUNCTION_DESCRIPTOR
 
 #ifndef __mono_ilp32__
@@ -95,7 +94,6 @@ typedef struct MonoCompileArch {
 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1
 #define MONO_ARCH_EMULATE_FREM 1
 #define MONO_ARCH_BIGMUL_INTRINS 1
-#define MONO_ARCH_HAVE_ATOMIC_CAS 1
 
 /* Parameters used by the register allocator */
 #define MONO_ARCH_CALLEE_REGS ((0xff << ppc_r3) | (1 << ppc_r11) | (1 << ppc_r12))
@@ -171,7 +169,6 @@ typedef struct MonoCompileArch {
 #endif /* HAVE_WORKING_SIGALTSTACK */
 
 #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE
-#define MONO_ARCH_HAVE_IMT 1
 #define MONO_ARCH_IMT_REG ppc_r12
 
 #define MONO_ARCH_VTABLE_REG   ppc_r12
index fbc6278a34239e379a26c97c0751bcfa055b63ed..96c054d4c5793eaab0ffc94a5d3305d0e2a94d84 100644 (file)
@@ -260,6 +260,7 @@ if (ins->inst_target_bb->native_offset) {                                   \
 #include <sys/types.h>
 #include <unistd.h>
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/debug-helpers.h>
 #include <mono/metadata/profiler-private.h>
@@ -4529,15 +4530,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        s390_lgr (code, ins->dreg, s390_r1);
                }
                        break;  
-               case OP_ATOMIC_ADD_NEW_I8: {
-                       s390_lgr (code, s390_r1, ins->sreg2);
-                       s390_lg  (code, s390_r0, 0, ins->inst_basereg, ins->inst_offset);
-                       s390_agr (code, s390_r1, s390_r0);
-                       s390_csg (code, s390_r0, s390_r1, ins->inst_basereg, ins->inst_offset);
-                       s390_jnz (code, -10);
-                       s390_lgr (code, ins->dreg, s390_r1);
-               }
-                       break;  
                case OP_ATOMIC_EXCHANGE_I8: {
                        s390_lg  (code, s390_r0, 0, ins->inst_basereg, ins->inst_offset);
                        s390_csg (code, s390_r0, ins->sreg2, ins->inst_basereg, ins->inst_offset);
@@ -4554,15 +4546,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        s390_lgfr(code, ins->dreg, s390_r1);
                }
                        break;  
-               case OP_ATOMIC_ADD_NEW_I4: {
-                       s390_lgfr(code, s390_r1, ins->sreg2);
-                       s390_lgf (code, s390_r0, 0, ins->inst_basereg, ins->inst_offset);
-                       s390_agr (code, s390_r1, s390_r0);
-                       s390_cs  (code, s390_r0, s390_r1, ins->inst_basereg, ins->inst_offset);
-                       s390_jnz (code, -9);
-                       s390_lgfr(code, ins->dreg, s390_r1);
-               }
-                       break;  
                case OP_ATOMIC_EXCHANGE_I4: {
                        s390_l   (code, s390_r0, 0, ins->inst_basereg, ins->inst_offset);
                        s390_cs  (code, s390_r0, ins->sreg2, ins->inst_basereg, ins->inst_offset);
@@ -5616,8 +5599,8 @@ get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *cod
                start = code = mono_global_codeman_reserve (size);
 
                /* Replace the this argument with the target */
-               s390_lg   (code, s390_r1, 0, s390_r2, G_STRUCT_OFFSET(MonoDelegate, method_ptr));
-               s390_lg   (code, s390_r2, 0, s390_r2, G_STRUCT_OFFSET(MonoDelegate, target));
+               s390_lg   (code, s390_r1, 0, s390_r2, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr));
+               s390_lg   (code, s390_r2, 0, s390_r2, MONO_STRUCT_OFFSET (MonoDelegate, target));
                s390_br   (code, s390_r1);
                g_assert ((code - start) <= size);
 
@@ -5628,7 +5611,7 @@ get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *cod
                size = 32 + param_count * 8;
                start = code = mono_global_codeman_reserve (size);
 
-               s390_lg   (code, s390_r1, 0, s390_r2, G_STRUCT_OFFSET(MonoDelegate, method_ptr));
+               s390_lg   (code, s390_r1, 0, s390_r2, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr));
                /* slide down the arguments */
                for (i = 0; i < param_count; ++i) {
                        s390_lgr (code, (s390_r2 + i), (s390_r2 + i + 1));
@@ -6138,3 +6121,17 @@ mono_arch_init_lmf_ext (MonoLMFExt *ext, gpointer prev_lmf)
 /*========================= End of Function ========================*/
 
 #endif
+
+gboolean
+mono_arch_opcode_supported (int opcode)
+{
+       switch (opcode) {
+       case OP_ATOMIC_ADD_I4:
+       case OP_ATOMIC_ADD_I8:
+       case OP_ATOMIC_EXCHANGE_I4:
+       case OP_ATOMIC_EXCHANGE_I8:
+               return TRUE;
+       default:
+               return FALSE;
+       }
+}
index 8ca5fb27ad29937182d013f1f838007ed13f0521..50b74c51fd9de7a315072acf8d89d8c198fe984f 100644 (file)
@@ -45,12 +45,9 @@ typedef struct
 #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS            1
 #define MONO_ARCH_HAVE_IS_INT_OVERFLOW                 1
 #define MONO_ARCH_NEED_DIV_CHECK                       1
-#define MONO_ARCH_HAVE_ATOMIC_ADD                      1
-#define MONO_ARCH_HAVE_ATOMIC_EXCHANGE                         1
 #define MONO_ARCH_SIGNAL_STACK_SIZE                    256*1024
 #define MONO_ARCH_HAVE_DECOMPOSE_OPTS                  1
 #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE      1
-#define MONO_ARCH_HAVE_IMT                             1
 #define MONO_ARCH_HAVE_TLS_GET                         1
 #define MONO_ARCH_ENABLE_MONO_LMF_VAR                  1
 #define MONO_ARCH_IMT_REG                              s390_r9
index ec65fb5c6b9abf2b5f4d6d986f1f0995b5842a57..3b95fd970336c9f187ef0e05f7f563b96acc9190 100644 (file)
@@ -4430,3 +4430,9 @@ mono_arch_context_get_int_reg (MonoContext *ctx, int reg)
        /* FIXME: implement */
        g_assert_not_reached ();
 }
+
+gboolean
+mono_arch_opcode_supported (int opcode)
+{
+       return FALSE;
+}
index f2b3b41d7963a5ae2a0c8b4ac632d74813ef8af5..4b9477845585d9a18e0d5efa1758b2b77e0bb1be 100644 (file)
@@ -102,7 +102,6 @@ typedef struct MonoCompileArch {
 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1
 #define MONO_ARCH_EMULATE_FREM 1
 #define MONO_ARCH_NEED_DIV_CHECK 1
-#define MONO_ARCH_HAVE_IMT 1
 #define MONO_ARCH_IMT_REG sparc_g1
 #define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1
 #define MONO_ARCH_HAVE_TLS_INIT 1
index 6e56ed5d2a0abb6b68583cd27a25666b63d6b284..1f2b1dc252f5548b2b6017c57087880cbb4e659a 100644 (file)
@@ -22,9 +22,9 @@
  */
 guint8* mono_trampoline_code [MONO_TRAMPOLINE_NUM];
 
-static GHashTable *class_init_hash_addr = NULL;
-static GHashTable *rgctx_lazy_fetch_trampoline_hash = NULL;
-static GHashTable *rgctx_lazy_fetch_trampoline_hash_addr = NULL;
+static GHashTable *class_init_hash_addr;
+static GHashTable *rgctx_lazy_fetch_trampoline_hash;
+static GHashTable *rgctx_lazy_fetch_trampoline_hash_addr;
 static guint32 trampoline_calls, jit_trampolines, unbox_trampolines, static_rgctx_trampolines;
 
 #define mono_trampolines_lock() EnterCriticalSection (&trampolines_mutex)
@@ -138,8 +138,6 @@ mono_create_static_rgctx_trampoline (MonoMethod *m, gpointer addr)
 }
 #endif
 
-#ifdef MONO_ARCH_HAVE_IMT
-
 /*
  * Either IMPL_METHOD or AOT_ADDR will be set on return.
  */
@@ -243,7 +241,6 @@ __attribute__ ((noinline))
                }
        }
 }
-#endif
 
 /*
  * This is a super-ugly hack to fix bug #616463.
@@ -406,7 +403,6 @@ common_call_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tram
        orig_vtable_slot = vtable_slot;
        vtable_slot_to_patch = vtable_slot;
 
-#ifdef MONO_ARCH_HAVE_IMT
        /* IMT call */
        if (vt && (gpointer)vtable_slot < (gpointer)vt) {
                MonoMethod *impl_method = NULL;
@@ -464,7 +460,6 @@ common_call_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tram
                        m = impl_method;
                }
        }
-#endif
 
        /*
         * The virtual check is needed because is_generic_method_definition (m) could
@@ -484,9 +479,7 @@ common_call_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tram
                else
                        g_assert (!m->klass->generic_container);
 
-#ifdef MONO_ARCH_HAVE_IMT
                generic_virtual = mono_arch_find_imt_method (regs, code);
-#endif
                if (generic_virtual) {
                        g_assert (generic_virtual->is_inflated);
                        context.method_inst = ((MonoMethodInflated*)generic_virtual)->context.method_inst;
@@ -524,7 +517,6 @@ common_call_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tram
                        g_assert_not_reached ();
 #endif
                } else {
-#ifdef MONO_ARCH_HAVE_IMT
                        MonoObject *this_argument = mono_arch_get_this_arg_from_call (regs, code);
 
                        vt = this_argument->vtable;
@@ -537,9 +529,6 @@ common_call_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tram
                                mono_class_setup_supertypes (this_argument->vtable->klass);
                                klass = this_argument->vtable->klass->supertypes [m->klass->idepth - 1];
                        }
-#else
-                       NOT_IMPLEMENTED;
-#endif
                }
 
                g_assert (vtable_slot || klass);
@@ -816,11 +805,9 @@ mono_generic_virtual_remoting_trampoline (mgreg_t *regs, guint8 *code, MonoMetho
        else
                g_assert (!m->klass->generic_container);
 
-#ifdef MONO_ARCH_HAVE_IMT
        imt_method = mono_arch_find_imt_method (regs, code);
        if (imt_method->is_inflated)
                context.method_inst = ((MonoMethodInflated*)imt_method)->context.method_inst;
-#endif
        m = mono_class_inflate_generic_method (declaring, &context);
        m = mono_marshal_get_remoting_invoke_with_check (m);
 
index 6b6ba7ad2f94fb6989412733dfd1a098e2fd5e82..a2c9f49805dbf617c500af6139e3cdf5c9bdc99e 100644 (file)
 #define DW_CFA_lo_user           0x1c
 #define DW_CFA_hi_user           0x3f
 
+/*
+ * Mono extension, advance loc to a location stored outside the unwind info.
+ * This is required to make the unwind descriptors sharable, since otherwise each one would contain
+ * an advance_loc with a different offset just before the unwind ops for the epilog.
+ */
+#define DW_CFA_mono_advance_loc DW_CFA_lo_user
+
 /* Represents one unwind instruction */
 typedef struct {
        guint8 op; /* One of DW_CFA_... */
@@ -84,6 +91,16 @@ typedef struct {
 #define mono_emit_unwind_op_same_value(cfg,ip,reg) mono_emit_unwind_op (cfg, (ip) - (cfg)->native_code, DW_CFA_same_value, (reg), 0)
 /* Reg is saved at cfa+offset */
 #define mono_emit_unwind_op_offset(cfg,ip,reg,offset) mono_emit_unwind_op (cfg, (ip) - (cfg)->native_code, DW_CFA_offset, (reg), (offset))
+/* Save the unwind state into an implicit stack */
+#define mono_emit_unwind_op_remember_state(cfg,ip) mono_emit_unwind_op (cfg, (ip) - (cfg)->native_code, DW_CFA_remember_state, 0, 0)
+/* Restore the unwind state from the state stack */
+#define mono_emit_unwind_op_restore_state(cfg,ip) mono_emit_unwind_op (cfg, (ip) - (cfg)->native_code, DW_CFA_restore_state, 0, 0)
+/*
+ * Mark the current location as a location stored outside the unwind info, which will be passed
+ * explicitly to mono_unwind_frame () in the MARK_LOCATIONS argument. This allows the unwind info
+ * to be shared among multiple methods.
+ */
+#define mono_emit_unwind_op_mark_loc(cfg,ip,n) mono_emit_unwind_op (cfg, (ip) - (cfg)->native_code, DW_CFA_mono_advance_loc, 0, (n))
 
 /* Similar macros usable when a cfg is not available, like for trampolines */
 #define mono_add_unwind_op_def_cfa(op_list,code,buf,reg,offset) do { (op_list) = g_slist_append ((op_list), mono_create_unwind_op ((code) - (buf), DW_CFA_def_cfa, (reg), (offset))); } while (0)
@@ -127,7 +144,8 @@ mono_unwind_ops_encode (GSList *unwind_ops, guint32 *out_len) MONO_INTERNAL;
 
 void
 mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len, 
-                                  guint8 *start_ip, guint8 *end_ip, guint8 *ip, mgreg_t *regs, int nregs,
+                                  guint8 *start_ip, guint8 *end_ip, guint8 *ip, guint8 **mark_locations,
+                                  mgreg_t *regs, int nregs,
                                   mgreg_t **save_locations, int save_locations_len,
                                   guint8 **out_cfa) MONO_INTERNAL;
 
index 3de9b0be1a226801938979a57a19bb9a0c8bae13..08637dbb8e1cad77848ae3c430340771b13ebf01 100644 (file)
@@ -17,6 +17,7 @@
 #include <unistd.h>
 #endif
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/debug-helpers.h>
 #include <mono/metadata/threads.h>
@@ -1065,7 +1066,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
        cfg->frame_reg = X86_EBP;
        offset = 0;
 
-       if (cfg->has_atomic_add_new_i4 || cfg->has_atomic_exchange_i4) {
+       if (cfg->has_atomic_add_i4 || cfg->has_atomic_exchange_i4) {
                /* The opcode implementations use callee-saved regs as scratch regs by pushing and pop-ing them, but that is not async safe */
                cfg->used_int_regs |= (1 << X86_EBX) | (1 << X86_EDI) | (1 << X86_ESI);
        }
@@ -2460,12 +2461,22 @@ mono_x86_emit_tls_get (guint8* code, int dreg, int tls_offset)
         * See the Under the Hood article in the May 1996 issue of Microsoft Systems 
         * Journal and/or a disassembly of the TlsGet () function.
         */
-       g_assert (tls_offset < 64);
        x86_prefix (code, X86_FS_PREFIX);
        x86_mov_reg_mem (code, dreg, 0x18, 4);
-       /* Dunno what this does but TlsGetValue () contains it */
-       x86_alu_membase_imm (code, X86_AND, dreg, 0x34, 0);
-       x86_mov_reg_membase (code, dreg, dreg, 3600 + (tls_offset * 4), 4);
+       if (tls_offset < 64) {
+               x86_mov_reg_membase (code, dreg, dreg, 3600 + (tls_offset * 4), 4);
+       } else {
+               guint8 *buf [16];
+
+               g_assert (tls_offset < 0x440);
+               /* Load TEB->TlsExpansionSlots */
+               x86_mov_reg_membase (code, dreg, dreg, 0xf94, 4);
+               x86_test_reg_reg (code, dreg, dreg);
+               buf [0] = code;
+               x86_branch (code, X86_CC_EQ, code, TRUE);
+               x86_mov_reg_membase (code, dreg, dreg, (tls_offset * 4) - 0x100, 4);
+               x86_patch (buf [0], code);
+       }
 #else
        if (optimize_for_xen) {
                x86_prefix (code, X86_GS_PREFIX);
@@ -2539,13 +2550,13 @@ static guint8*
 emit_setup_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, int cfa_offset)
 {
        /* save all caller saved regs */
-       x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebx), X86_EBX, sizeof (mgreg_t));
-       mono_emit_unwind_op_offset (cfg, code, X86_EBX, - cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebx));
-       x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, edi), X86_EDI, sizeof (mgreg_t));
-       mono_emit_unwind_op_offset (cfg, code, X86_EDI, - cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, edi));
-       x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, esi), X86_ESI, sizeof (mgreg_t));
-       mono_emit_unwind_op_offset (cfg, code, X86_ESI, - cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, esi));
-       x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebp), X86_EBP, sizeof (mgreg_t));
+       x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, ebx), X86_EBX, sizeof (mgreg_t));
+       mono_emit_unwind_op_offset (cfg, code, X86_EBX, - cfa_offset + lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, ebx));
+       x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, edi), X86_EDI, sizeof (mgreg_t));
+       mono_emit_unwind_op_offset (cfg, code, X86_EDI, - cfa_offset + lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, edi));
+       x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, esi), X86_ESI, sizeof (mgreg_t));
+       mono_emit_unwind_op_offset (cfg, code, X86_ESI, - cfa_offset + lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, esi));
+       x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, ebp), X86_EBP, sizeof (mgreg_t));
 
        /* save the current IP */
        if (cfg->compile_aot) {
@@ -2556,17 +2567,17 @@ emit_setup_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, int cfa_offse
                mono_add_patch_info (cfg, code + 1 - cfg->native_code, MONO_PATCH_INFO_IP, NULL);
                x86_mov_reg_imm (code, X86_EAX, 0);
        }
-       x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, eip), X86_EAX, sizeof (mgreg_t));
-
-       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, eip), SLOT_NOREF);
-       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebp), SLOT_NOREF);
-       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, esi), SLOT_NOREF);
-       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, edi), SLOT_NOREF);
-       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebx), SLOT_NOREF);
-       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, esp), SLOT_NOREF);
-       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, method), SLOT_NOREF);
-       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), SLOT_NOREF);
-       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), SLOT_NOREF);
+       x86_mov_membase_reg (code, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, eip), X86_EAX, sizeof (mgreg_t));
+
+       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, eip), SLOT_NOREF);
+       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, ebp), SLOT_NOREF);
+       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, esi), SLOT_NOREF);
+       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, edi), SLOT_NOREF);
+       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, ebx), SLOT_NOREF);
+       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, esp), SLOT_NOREF);
+       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, method), SLOT_NOREF);
+       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, lmf_addr), SLOT_NOREF);
+       mini_gc_set_slot_type_from_cfa (cfg, -cfa_offset + lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, previous_lmf), SLOT_NOREF);
 
        return code;
 }
@@ -4372,28 +4383,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_ATOMIC_ADD_I4: {
                        int dreg = ins->dreg;
 
-                       if (dreg == ins->inst_basereg) {
-                               x86_push_reg (code, ins->sreg2);
-                               dreg = ins->sreg2;
-                       } 
-                       
-                       if (dreg != ins->sreg2)
-                               x86_mov_reg_reg (code, ins->dreg, ins->sreg2, 4);
-
-                       x86_prefix (code, X86_LOCK_PREFIX);
-                       x86_xadd_membase_reg (code, ins->inst_basereg, ins->inst_offset, dreg, 4);
-
-                       if (dreg != ins->dreg) {
-                               x86_mov_reg_reg (code, ins->dreg, dreg, 4);
-                               x86_pop_reg (code, dreg);
-                       }
-
-                       break;
-               }
-               case OP_ATOMIC_ADD_NEW_I4: {
-                       int dreg = ins->dreg;
-
-                       g_assert (cfg->has_atomic_add_new_i4);
+                       g_assert (cfg->has_atomic_add_i4);
 
                        /* hack: limit in regalloc, dreg != sreg1 && dreg != sreg2 */
                        if (ins->sreg2 == dreg) {
@@ -5596,7 +5586,7 @@ mono_arch_emit_epilog (MonoCompile *cfg)
                        /* we load the value in a separate instruction: this mechanism may be
                         * used later as a safer way to do thread interruption
                         */
-                       x86_mov_reg_membase (code, X86_ECX, X86_ECX, G_STRUCT_OFFSET (MonoJitTlsData, restore_stack_prot), 4);
+                       x86_mov_reg_membase (code, X86_ECX, X86_ECX, MONO_STRUCT_OFFSET (MonoJitTlsData, restore_stack_prot), 4);
                        x86_alu_reg_imm (code, X86_CMP, X86_ECX, 0);
                        patch = code;
                        x86_branch8 (code, X86_CC_Z, 0, FALSE);
@@ -5609,14 +5599,14 @@ mono_arch_emit_epilog (MonoCompile *cfg)
 
                /* restore caller saved regs */
                if (cfg->used_int_regs & (1 << X86_EBX)) {
-                       x86_mov_reg_membase (code, X86_EBX, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebx), 4);
+                       x86_mov_reg_membase (code, X86_EBX, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, ebx), 4);
                }
 
                if (cfg->used_int_regs & (1 << X86_EDI)) {
-                       x86_mov_reg_membase (code, X86_EDI, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, edi), 4);
+                       x86_mov_reg_membase (code, X86_EDI, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, edi), 4);
                }
                if (cfg->used_int_regs & (1 << X86_ESI)) {
-                       x86_mov_reg_membase (code, X86_ESI, cfg->frame_reg, lmf_offset + G_STRUCT_OFFSET (MonoLMF, esi), 4);
+                       x86_mov_reg_membase (code, X86_ESI, cfg->frame_reg, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, esi), 4);
                }
 
                /* EBP is restored by LEAVE */
@@ -5840,8 +5830,6 @@ mono_arch_free_jit_tls_data (MonoJitTlsData *tls)
 {
 }
 
-#ifdef MONO_ARCH_HAVE_IMT
-
 // Linear handler, the bsearch head compare is shorter
 //[2 + 4] x86_alu_reg_imm (code, X86_CMP, ins->sreg1, ins->inst_imm);
 //[1 + 1] x86_branch8(inst,cond,imm,is_signed)
@@ -6010,7 +5998,6 @@ mono_arch_find_imt_method (mgreg_t *regs, guint8 *code)
 {
        return (MonoMethod*) regs [MONO_ARCH_IMT_REG];
 }
-#endif
 
 MonoVTable*
 mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code)
@@ -6203,10 +6190,8 @@ mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code)
         * The stack looks like:
         * <other args>
         * <this=delegate>
-        * <return addr>
-        * <4 pointers pushed by mono_arch_create_trampoline_code ()>
         */
-       res = (((MonoObject**)esp) [5 + (offset / 4)]);
+       res = ((MonoObject**)esp) [0];
        if (cinfo)
                g_free (cinfo);
        return res;
@@ -6231,9 +6216,9 @@ get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *cod
 
                /* Replace the this argument with the target */
                x86_mov_reg_membase (code, X86_EAX, X86_ESP, 4, 4);
-               x86_mov_reg_membase (code, X86_ECX, X86_EAX, G_STRUCT_OFFSET (MonoDelegate, target), 4);
+               x86_mov_reg_membase (code, X86_ECX, X86_EAX, MONO_STRUCT_OFFSET (MonoDelegate, target), 4);
                x86_mov_membase_reg (code, X86_ESP, 4, X86_ECX, 4);
-               x86_jump_membase (code, X86_EAX, G_STRUCT_OFFSET (MonoDelegate, method_ptr));
+               x86_jump_membase (code, X86_EAX, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr));
 
                g_assert ((code - start) < code_reserve);
        } else {
@@ -6272,7 +6257,7 @@ get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *cod
                        x86_mov_membase_reg (code, X86_ESP, (i+1)*4, X86_EAX, 4);
                }
 
-               x86_jump_membase (code, X86_ECX, G_STRUCT_OFFSET (MonoDelegate, method_ptr));
+               x86_jump_membase (code, X86_ECX, MONO_STRUCT_OFFSET (MonoDelegate, method_ptr));
 
                g_assert ((code - start) < code_reserve);
        }
@@ -6849,6 +6834,19 @@ mono_arch_init_lmf_ext (MonoLMFExt *ext, gpointer prev_lmf)
 
 #endif
 
+gboolean
+mono_arch_opcode_supported (int opcode)
+{
+       switch (opcode) {
+       case OP_ATOMIC_ADD_I4:
+       case OP_ATOMIC_EXCHANGE_I4:
+       case OP_ATOMIC_CAS_I4:
+               return TRUE;
+       default:
+               return FALSE;
+       }
+}
+
 #if defined(ENABLE_GSHAREDVT)
 
 #include "../../../mono-extensions/mono/mini/mini-x86-gsharedvt.c"
index 2f7eaca37b6ac519649f4011229dc0e4aa454e6b..e342054fceb72163ae24e91c423385d48f28e683 100644 (file)
@@ -209,12 +209,11 @@ typedef struct {
 #define MONO_ARCH_HAVE_IS_INT_OVERFLOW 1
 #define MONO_ARCH_HAVE_INVALIDATE_METHOD 1
 #define MONO_ARCH_NEED_GOT_VAR 1
+#ifndef HOST_WIN32
+/* X86 uses jit_tls->lmf (See emit_push_lmf ()) */
 #define MONO_ARCH_ENABLE_MONO_LMF_VAR 1
+#endif
 #define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE 1
-#define MONO_ARCH_HAVE_ATOMIC_ADD 1
-#define MONO_ARCH_HAVE_ATOMIC_EXCHANGE 1
-#define MONO_ARCH_HAVE_ATOMIC_CAS 1
-#define MONO_ARCH_HAVE_IMT 1
 #define MONO_ARCH_HAVE_TLS_GET (mono_x86_have_tls_get ())
 #define MONO_ARCH_IMT_REG X86_EDX
 #define MONO_ARCH_VTABLE_REG X86_EDX
index 4d4c39c2f2aaaeb2280ca0711c62abb057f422ad..860d24ecbfd7a7c563f011a8832a272527c3f73a 100644 (file)
@@ -88,15 +88,15 @@ MonoNativeTlsKey mono_jit_tls_id;
 MONO_FAST_TLS_DECLARE(mono_jit_tls);
 #endif
 
-MonoTraceSpec *mono_jit_trace_calls = NULL;
+MonoTraceSpec *mono_jit_trace_calls;
 gboolean mono_compile_aot = FALSE;
 /* If this is set, no code is generated dynamically, everything is taken from AOT files */
 gboolean mono_aot_only = FALSE;
 /* Whenever to use IMT */
-gboolean mono_use_imt = ARCH_HAVE_IMT;
-MonoMethodDesc *mono_inject_async_exc_method = NULL;
+gboolean mono_use_imt = TRUE;
+MonoMethodDesc *mono_inject_async_exc_method;
 int mono_inject_async_exc_pos;
-MonoMethodDesc *mono_break_at_bb_method = NULL;
+MonoMethodDesc *mono_break_at_bb_method;
 int mono_break_at_bb_bb_num;
 gboolean mono_do_x86_stack_align = TRUE;
 const char *mono_build_date;
@@ -115,9 +115,9 @@ gboolean mono_use_llvm = FALSE;
 #define mono_jit_unlock() LeaveCriticalSection (&jit_mutex)
 static CRITICAL_SECTION jit_mutex;
 
-static MonoCodeManager *global_codeman = NULL;
+static MonoCodeManager *global_codeman;
 
-static GHashTable *jit_icall_name_hash = NULL;
+static GHashTable *jit_icall_name_hash;
 
 static MonoDebugOptions debug_options;
 
@@ -141,6 +141,8 @@ gboolean disable_vtypes_in_regs = FALSE;
 
 static GSList *tramp_infos;
 
+static void register_icalls (void);
+
 gpointer
 mono_realloc_native_code (MonoCompile *cfg)
 {
@@ -1526,7 +1528,7 @@ mono_create_jump_table (MonoCompile *cfg, MonoInst *label, MonoBasicBlock **bbs,
 static MonoMethodSignature *
 mono_get_array_new_va_signature (int arity)
 {
-       static GHashTable *sighash = NULL;
+       static GHashTable *sighash;
        MonoMethodSignature *res;
        int i;
 
@@ -2362,8 +2364,8 @@ mono_allocate_stack_slots (MonoCompile *cfg, gboolean backward, guint32 *stack_s
 static mono_byte emul_opcode_hit_cache [(OP_LAST>>EMUL_HIT_SHIFT) + 1] = {0};
 static short emul_opcode_num = 0;
 static short emul_opcode_alloced = 0;
-static short *emul_opcode_opcodes = NULL;
-static MonoJitICallInfo **emul_opcode_map = NULL;
+static short *emul_opcode_opcodes;
+static MonoJitICallInfo **emul_opcode_map;
 
 MonoJitICallInfo *
 mono_find_jit_opcode_emulation (int opcode)
@@ -2952,9 +2954,6 @@ mini_get_tls_offset (MonoTlsKey key)
        case TLS_KEY_JIT_TLS:
 #ifdef HOST_WIN32
                offset = mono_get_jit_tls_key ();
-               /* Only 64 tls entries can be accessed using inline code */
-               if (offset >= 64)
-                       offset = -1;
 #else
                offset = mono_get_jit_tls_offset ();
 #endif
@@ -2974,6 +2973,12 @@ mini_get_tls_offset (MonoTlsKey key)
                break;
        }
 
+#if defined(HOST_WIN32) && defined(TARGET_AMD64)
+       /* Only 64 tls entries can be accessed using inline code */
+       if (offset >= 64)
+               offset = -1;
+#endif
+
        return offset;
 }
 
@@ -3008,6 +3013,15 @@ mini_tls_get_supported (MonoCompile *cfg, MonoTlsKey key)
                return mini_get_tls_offset (key) != -1;
 }
 
+static gboolean
+mini_tls_key_supported (MonoTlsKey key)
+{
+       if (!MONO_ARCH_HAVE_TLS_GET)
+               return FALSE;
+
+       return mini_get_tls_offset (key) != -1;
+}
+
 MonoInst*
 mono_create_tls_get (MonoCompile *cfg, MonoTlsKey key)
 {
@@ -4299,7 +4313,7 @@ create_jit_info_for_trampoline (MonoMethod *wrapper, MonoTrampInfo *info)
        jinfo->d.method = wrapper;
        jinfo->code_start = info->code;
        jinfo->code_size = info->code_size;
-       jinfo->used_regs = mono_cache_unwind_info (uw_info, info_len);
+       jinfo->unwind_info = mono_cache_unwind_info (uw_info, info_len);
 
        if (!info->uw_info)
                g_free (uw_info);
@@ -4382,7 +4396,6 @@ create_jit_info (MonoCompile *cfg, MonoMethod *method_to_compile)
        jinfo->d.method = cfg->method_to_register;
        jinfo->code_start = cfg->native_code;
        jinfo->code_size = cfg->code_len;
-       jinfo->used_regs = cfg->used_int_regs;
        jinfo->domain_neutral = (cfg->opt & MONO_OPT_SHARED) != 0;
        jinfo->num_clauses = num_clauses;
 
@@ -4628,19 +4641,31 @@ create_jit_info (MonoCompile *cfg, MonoMethod *method_to_compile)
                }
        }
 
-       /* 
-        * Its possible to generate dwarf unwind info for xdebug etc, but not actually
-        * using it during runtime, hence the define.
-        */
        if (cfg->encoded_unwind_ops) {
-               jinfo->used_regs = mono_cache_unwind_info (cfg->encoded_unwind_ops, cfg->encoded_unwind_ops_len);
+               /* Generated by LLVM */
+               jinfo->unwind_info = mono_cache_unwind_info (cfg->encoded_unwind_ops, cfg->encoded_unwind_ops_len);
                g_free (cfg->encoded_unwind_ops);
        } else if (cfg->unwind_ops) {
                guint32 info_len;
                guint8 *unwind_info = mono_unwind_ops_encode (cfg->unwind_ops, &info_len);
+               guint32 unwind_desc;
 
-               jinfo->used_regs = mono_cache_unwind_info (unwind_info, info_len);
+               unwind_desc = mono_cache_unwind_info (unwind_info, info_len);
+
+               if (cfg->has_unwind_info_for_epilog) {
+                       /*
+                        * The lower 16 bits identify the unwind descriptor, the upper 16 bits contain the offset of
+                        * the start of the epilog from the end of the method.
+                        */
+                       g_assert (unwind_desc < 0xffff);
+                       g_assert (cfg->code_size - cfg->epilog_begin < 0xffff);
+                       jinfo->unwind_info = ((cfg->code_size - cfg->epilog_begin) << 16) | unwind_desc;
+               } else {
+                       jinfo->unwind_info = unwind_desc;
+               }
                g_free (unwind_info);
+       } else {
+               jinfo->unwind_info = cfg->used_int_regs;
        }
 
        return jinfo;
@@ -5820,7 +5845,7 @@ lookup_method (MonoDomain *domain, MonoMethod *method)
 }
 
 #if ENABLE_JIT_MAP
-static FILE* perf_map_file = NULL;
+static FILE* perf_map_file;
 
 void
 mono_enable_jit_map (void)
@@ -6443,9 +6468,9 @@ mono_jit_find_compiled_method_with_jit_info (MonoDomain *domain, MonoMethod *met
 
 gboolean mono_do_single_method_regression = FALSE;
 guint32 mono_single_method_regression_opt = 0;
-MonoMethod *mono_current_single_method = NULL;
-GSList *mono_single_method_list = NULL;
-GHashTable *mono_single_method_hash = NULL;
+MonoMethod *mono_current_single_method;
+GSList *mono_single_method_list;
+GHashTable *mono_single_method_hash;
 
 guint32
 mono_get_optimizations_for_method (MonoMethod *method, guint32 default_opt)
@@ -7219,6 +7244,8 @@ mini_init (const char *filename, const char *runtime_version)
 
        InitializeCriticalSection (&jit_mutex);
 
+       mono_cross_helpers_run ();
+
        /* Happens when using the embedding interface */
        if (!default_opt_set)
                default_opt = mono_parse_default_optimizations (NULL);
@@ -7240,7 +7267,6 @@ mini_init (const char *filename, const char *runtime_version)
 
        if (!global_codeman)
                global_codeman = mono_code_manager_new ();
-       jit_icall_name_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
 
        memset (&callbacks, 0, sizeof (callbacks));
        callbacks.create_ftnptr = mini_create_ftnptr;
@@ -7249,13 +7275,12 @@ mini_init (const char *filename, const char *runtime_version)
        callbacks.set_cast_details = mono_set_cast_details;
        callbacks.debug_log = mono_debugger_agent_debug_log;
        callbacks.debug_log_is_enabled = mono_debugger_agent_debug_log_is_enabled;
+       callbacks.tls_key_supported = mini_tls_key_supported;
 
-#ifdef MONO_ARCH_HAVE_IMT
        if (mono_use_imt) {
                callbacks.get_vtable_trampoline = mini_get_vtable_trampoline;
                callbacks.get_imt_trampoline = mini_get_imt_trampoline;
        }
-#endif
 
        mono_install_callbacks (&callbacks);
 
@@ -7266,7 +7291,6 @@ mini_init (const char *filename, const char *runtime_version)
 
        mono_threads_runtime_init (&ticallbacks);
 
-
        if (g_getenv ("MONO_DEBUG") != NULL)
                mini_parse_debug_options ();
 
@@ -7305,9 +7329,6 @@ mini_init (const char *filename, const char *runtime_version)
 
        mono_trampolines_init ();
 
-       if (!g_thread_supported ())
-               g_thread_init (NULL);
-
        mono_native_tls_alloc (&mono_jit_tls_id, NULL);
 
        if (default_opt & MONO_OPT_AOT)
@@ -7355,9 +7376,8 @@ mini_init (const char *filename, const char *runtime_version)
        mono_install_get_class_from_name (mono_aot_get_class_from_name);
        mono_install_jit_info_find_in_aot (mono_aot_find_jit_info);
 
-       if (debug_options.collect_pagefault_stats) {
+       if (debug_options.collect_pagefault_stats)
                mono_aot_set_make_unreadable (TRUE);
-       }
 
        if (runtime_version)
                domain = mono_init_version (filename, runtime_version);
@@ -7370,14 +7390,12 @@ mini_init (const char *filename, const char *runtime_version)
                mono_marshal_use_aot_wrappers (TRUE);
        }
 
-#ifdef MONO_ARCH_HAVE_IMT
        if (mono_use_imt) {
                if (mono_aot_only)
                        mono_install_imt_thunk_builder (mono_aot_get_imt_thunk);
                else
                        mono_install_imt_thunk_builder (mono_arch_build_imt_thunk);
        }
-#endif
 
        /*Init arch tls information only after the metadata side is inited to make sure we see dynamic appdomain tls keys*/
        mono_arch_finish_init ();
@@ -7390,6 +7408,58 @@ mini_init (const char *filename, const char *runtime_version)
        /* This should come after mono_init () too */
        mini_gc_init ();
 
+#ifndef DISABLE_JIT
+       mono_create_helper_signatures ();
+#endif
+
+       register_jit_stats ();
+
+#define JIT_CALLS_WORK
+#ifdef JIT_CALLS_WORK
+       /* Needs to be called here since register_jit_icall depends on it */
+       mono_marshal_init ();
+
+       jit_icall_name_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+
+       mono_arch_register_lowlevel_calls ();
+
+       register_icalls ();
+
+       mono_generic_sharing_init ();
+#endif
+
+#ifdef MONO_ARCH_SIMD_INTRINSICS
+       mono_simd_intrinsics_init ();
+#endif
+
+#if MONO_SUPPORT_TASKLETS
+       mono_tasklets_init ();
+#endif
+
+       if (mono_compile_aot)
+               /*
+                * Avoid running managed code when AOT compiling, since the platform
+                * might only support aot-only execution.
+                */
+               mono_runtime_set_no_exec (TRUE);
+
+#define JIT_RUNTIME_WORKS
+#ifdef JIT_RUNTIME_WORKS
+       mono_install_runtime_cleanup ((MonoDomainFunc)mini_cleanup);
+       mono_runtime_init (domain, mono_thread_start_cb, mono_thread_attach_cb);
+       mono_thread_attach (domain);
+#endif
+
+       mono_profiler_runtime_initialized ();
+
+       MONO_VES_INIT_END ();
+
+       return domain;
+}
+
+static void
+register_icalls (void)
+{
        mono_add_internal_call ("System.Diagnostics.StackFrame::get_frame_info", 
                                ves_icall_get_frame_info);
        mono_add_internal_call ("System.Diagnostics.StackTrace::get_trace", 
@@ -7408,19 +7478,6 @@ mini_init (const char *filename, const char *runtime_version)
                                mono_debugger_agent_unhandled_exception);
 #endif
 
-#ifndef DISABLE_JIT
-       mono_create_helper_signatures ();
-#endif
-
-       register_jit_stats ();
-
-#define JIT_CALLS_WORK
-#ifdef JIT_CALLS_WORK
-       /* Needs to be called here since register_jit_icall depends on it */
-       mono_marshal_init ();
-
-       mono_arch_register_lowlevel_calls ();
-
        /*
         * It's important that we pass `TRUE` as the last argument here, as
         * it causes the JIT to omit a wrapper for these icalls. If the JIT
@@ -7621,41 +7678,10 @@ mini_init (const char *filename, const char *runtime_version)
        register_icall (mono_object_isinst_with_cache, "mono_object_isinst_with_cache", "object object ptr ptr", FALSE);
 
        register_icall (mono_debugger_agent_user_break, "mono_debugger_agent_user_break", "void", FALSE);
-#endif
 
 #ifdef TARGET_IOS
        register_icall (pthread_getspecific, "pthread_getspecific", "ptr ptr", TRUE);
 #endif
-
-       mono_generic_sharing_init ();
-
-#ifdef MONO_ARCH_SIMD_INTRINSICS
-       mono_simd_intrinsics_init ();
-#endif
-
-#if MONO_SUPPORT_TASKLETS
-       mono_tasklets_init ();
-#endif
-
-       if (mono_compile_aot)
-               /* 
-                * Avoid running managed code when AOT compiling, since the platform
-                * might only support aot-only execution.
-                */
-               mono_runtime_set_no_exec (TRUE);
-
-#define JIT_RUNTIME_WORKS
-#ifdef JIT_RUNTIME_WORKS
-       mono_install_runtime_cleanup ((MonoDomainFunc)mini_cleanup);
-       mono_runtime_init (domain, mono_thread_start_cb, mono_thread_attach_cb);
-       mono_thread_attach (domain);
-#endif
-
-       mono_profiler_runtime_initialized ();
-
-       MONO_VES_INIT_END ();
-       
-       return domain;
 }
 
 MonoJitStats mono_jit_stats = {0};
@@ -7959,16 +7985,6 @@ mono_arch_get_gsharedvt_trampoline (MonoTrampInfo **info, gboolean aot)
 
 #endif
 
-#ifndef MONO_ARCH_HAVE_OPCODE_SUPPORTED
-
-gboolean
-mono_arch_opcode_supported (int opcode)
-{
-       return TRUE;
-}
-
-#endif
-
 #if defined(MONO_ARCH_GSHAREDVT_SUPPORTED) && !defined(ENABLE_GSHAREDVT)
 
 gboolean
@@ -7996,7 +8012,7 @@ typedef struct MonoJumpTableChunk {
        /* gpointer entries[total]; */
 } MonoJumpTableChunk;
 
-static MonoJumpTableChunk* g_jumptable = NULL;
+static MonoJumpTableChunk* g_jumptable;
 #define mono_jumptable_lock() EnterCriticalSection (&jumptable_mutex)
 #define mono_jumptable_unlock() LeaveCriticalSection (&jumptable_mutex)
 static CRITICAL_SECTION jumptable_mutex;
index 76cbdf32022f906d8c4fb701b8cc443cb3d2aa68..267b4ed15025d18e867d2cda48246a13e77063bd 100644 (file)
 #define printf g_print
 #endif
 
+#if !defined(HAVE_KW_THREAD) || !defined(MONO_ARCH_ENABLE_MONO_LMF_VAR)
+#define MONO_JIT_TLS_DATA_HAS_LMF
+#endif
+
 #define MONO_TYPE_IS_PRIMITIVE(t) ((!(t)->byref && ((((t)->type >= MONO_TYPE_BOOLEAN && (t)->type <= MONO_TYPE_R8) || ((t)->type >= MONO_TYPE_I && (t)->type <= MONO_TYPE_U)))))
 
 /* Constants used to encode different types of methods in AOT */
@@ -1025,9 +1029,8 @@ typedef struct {
 typedef struct {
        gpointer          end_of_stack;
        guint32           stack_size;
-#if !defined(HAVE_KW_THREAD) || !defined(MONO_ARCH_ENABLE_MONO_LMF_VAR)
+       /* !defined(HAVE_KW_THREAD) || !defined(MONO_ARCH_ENABLE_MONO_LMF_VAR) */
        MonoLMF          *lmf;
-#endif
        MonoLMF          *first_lmf;
        gpointer         restore_stack_prot;
        guint32          handling_stack_ovf;
@@ -1266,6 +1269,7 @@ typedef enum {
        MONO_TRAMPOLINE_NUM
 } MonoTrampolineType;
 
+/* These trampolines return normally to their caller */
 #define MONO_TRAMPOLINE_TYPE_MUST_RETURN(t)            \
        ((t) == MONO_TRAMPOLINE_CLASS_INIT ||           \
         (t) == MONO_TRAMPOLINE_GENERIC_CLASS_INIT ||   \
@@ -1491,10 +1495,11 @@ typedef struct {
        guint            soft_breakpoints : 1;
        guint            arch_eh_jit_info : 1;
        guint            has_indirection : 1;
-       guint            has_atomic_add_new_i4 : 1;
+       guint            has_atomic_add_i4 : 1;
        guint            has_atomic_exchange_i4 : 1;
        guint            has_atomic_cas_i4 : 1;
        guint            check_pinvoke_callconv : 1;
+       guint            has_unwind_info_for_epilog : 1;
        gpointer         debug_info;
        guint32          lmf_offset;
     guint16          *intvars;
@@ -2779,6 +2784,8 @@ void mono_runtime_posix_install_handlers (void) MONO_INTERNAL;
 pid_t mono_runtime_syscall_fork (void) MONO_INTERNAL;
 void mono_gdb_render_native_backtraces (pid_t crashed_pid) MONO_INTERNAL;
 
+void mono_cross_helpers_run (void) MONO_INTERNAL;
+
 /*
  * Signal handling
  */
@@ -2865,12 +2872,6 @@ gboolean SIG_HANDLER_SIGNATURE (mono_chain_signal) MONO_INTERNAL;
 #define MONO_ARCH_DYN_CALL_PARAM_AREA 0
 #endif
 
-#ifdef MONO_ARCH_HAVE_IMT
-#define ARCH_HAVE_IMT 1
-#else
-#define ARCH_HAVE_IMT 0
-#endif
-
 #ifdef MONO_ARCH_VARARG_ICALLS
 #define ARCH_VARARG_ICALLS 1
 #else
index ff737bbe9347a7b0f5d2fce3e44832386bd9c356..2fb8f0709a9efbbdb682c7e2db1af750fb40b1bd 100644 (file)
@@ -13,6 +13,7 @@
 #include "mini.h"
 #include "ir-emit.h"
 #include "mono/utils/bsearch.h"
+#include <mono/metadata/abi-details.h>
 
 /*
 General notes on SIMD intrinsics
@@ -1569,7 +1570,7 @@ mono_emit_vector_ldelema (MonoCompile *cfg, MonoType *array_type, MonoInst *arr,
 
        MONO_EMIT_NEW_BIALU_IMM (cfg, OP_MUL_IMM, mult_reg, index2_reg, size);
        MONO_EMIT_NEW_BIALU (cfg, OP_PADD, add_reg, array_reg, mult_reg);
-       NEW_BIALU_IMM (cfg, ins, OP_PADD_IMM, add_reg, add_reg, G_STRUCT_OFFSET (MonoArray, vector));
+       NEW_BIALU_IMM (cfg, ins, OP_PADD_IMM, add_reg, add_reg, MONO_STRUCT_OFFSET (MonoArray, vector));
        ins->type = STACK_PTR;
        MONO_ADD_INS (cfg->cbb, ins);
 
index a6499d13d5f7e6a25506cc88f26287c7480ff48f..692eedfaccb823436ae257254609a91e0922239d 100644 (file)
@@ -651,7 +651,7 @@ add_expression_to_tree (MonoSsapreExpression *tree, MonoSsapreExpression *expres
 }
 
 #if (MONO_APPLY_SSAPRE_TO_SINGLE_EXPRESSION)
-static char *mono_ssapre_expression_name = NULL;
+static char *mono_ssapre_expression_name;
 static gboolean
 check_ssapre_expression_name (MonoSsapreWorkArea *area, MonoSsapreExpressionDescription *expression_description) {
        if (area->expression_is_handled_father) {
index 6766c26a694ad7f82fb5daaf20a32cef29aa049f..9ab067a76b57cbd9ae0c4e67ebbff09c699df07d 100644 (file)
@@ -8,7 +8,7 @@
 #if defined(MONO_SUPPORT_TASKLETS)
 
 /* keepalive_stacks could be a per-stack var to avoid locking overhead */
-static MonoGHashTable *keepalive_stacks = NULL;
+static MonoGHashTable *keepalive_stacks;
 static CRITICAL_SECTION tasklets_mutex;
 #define tasklets_lock() EnterCriticalSection(&tasklets_mutex)
 #define tasklets_unlock() LeaveCriticalSection(&tasklets_mutex)
index 69f4fb6597914c55380c882fe54e3cb6827c5dc1..50d57970fe6e791d268f64c6662dbe49cf3a23ab 100644 (file)
@@ -13,6 +13,7 @@
 #include <config.h>
 #include <glib.h>
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/marshal.h>
 #include <mono/metadata/tabledefs.h>
@@ -585,17 +586,17 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
                amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, 8, sizeof(gpointer));
        else
                amd64_mov_reg_imm (code, AMD64_R11, 0);
-       amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rip), AMD64_R11, sizeof(mgreg_t));
+       amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, rip), AMD64_R11, sizeof(mgreg_t));
        /* Save fp */
        amd64_mov_reg_membase (code, AMD64_R11, AMD64_RSP, framesize, sizeof(mgreg_t));
-       amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rbp), AMD64_R11, sizeof(mgreg_t));
+       amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, rbp), AMD64_R11, sizeof(mgreg_t));
        /* Save sp */
        amd64_mov_reg_reg (code, AMD64_R11, AMD64_RSP, sizeof(mgreg_t));
        amd64_alu_reg_imm (code, X86_ADD, AMD64_R11, framesize + 16);
-       amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, rsp), AMD64_R11, sizeof(mgreg_t));
+       amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, rsp), AMD64_R11, sizeof(mgreg_t));
        /* Save pointer to registers */
        amd64_lea_membase (code, AMD64_R11, AMD64_RBP, saved_regs_offset);
-       amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMFTramp, regs), AMD64_R11, sizeof(mgreg_t));
+       amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + MONO_STRUCT_OFFSET (MonoLMFTramp, regs), AMD64_R11, sizeof(mgreg_t));
 
        if (aot) {
                code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_get_lmf_addr");
@@ -605,13 +606,13 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
        amd64_call_reg (code, AMD64_R11);
 
        /* Save lmf_addr */
-       amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMFTramp, lmf_addr), AMD64_RAX, sizeof(gpointer));
+       amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + MONO_STRUCT_OFFSET (MonoLMFTramp, lmf_addr), AMD64_RAX, sizeof(gpointer));
        /* Save previous_lmf */
        /* Set the lowest bit to signal that this LMF has the ip field set */
        /* Set the third lowest bit to signal that this is a MonoLMFTramp structure */
        amd64_mov_reg_membase (code, AMD64_R11, AMD64_RAX, 0, sizeof(gpointer));
        amd64_alu_reg_imm_size (code, X86_ADD, AMD64_R11, 0x5, sizeof(gpointer));
-       amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), AMD64_R11, sizeof(gpointer));
+       amd64_mov_membase_reg (code, AMD64_RBP, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, previous_lmf), AMD64_R11, sizeof(gpointer));
        /* Set new lmf */
        amd64_lea_membase (code, AMD64_R11, AMD64_RBP, lmf_offset);
        amd64_mov_membase_reg (code, AMD64_RAX, 0, AMD64_R11, sizeof(gpointer));
@@ -658,9 +659,9 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
        amd64_mov_reg_membase (code, AMD64_RAX, AMD64_RBP, res_offset, sizeof(mgreg_t));        
 
        /* Restore LMF */
-       amd64_mov_reg_membase (code, AMD64_RCX, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), sizeof(gpointer));
+       amd64_mov_reg_membase (code, AMD64_RCX, AMD64_RBP, lmf_offset + MONO_STRUCT_OFFSET (MonoLMF, previous_lmf), sizeof(gpointer));
        amd64_alu_reg_imm_size (code, X86_SUB, AMD64_RCX, 0x5, sizeof(gpointer));
-       amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, lmf_offset + G_STRUCT_OFFSET (MonoLMFTramp, lmf_addr), sizeof(gpointer));
+       amd64_mov_reg_membase (code, AMD64_R11, AMD64_RBP, lmf_offset + MONO_STRUCT_OFFSET (MonoLMFTramp, lmf_addr), sizeof(gpointer));
        amd64_mov_membase_reg (code, AMD64_R11, 0, AMD64_RCX, sizeof(gpointer));
 
        /* 
@@ -833,7 +834,7 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info
                amd64_mov_reg_reg (code, AMD64_RAX, AMD64_ARG_REG1, 8);
        } else {
                /* load rgctx ptr from vtable */
-               amd64_mov_reg_membase (code, AMD64_RAX, AMD64_ARG_REG1, G_STRUCT_OFFSET (MonoVTable, runtime_generic_context), sizeof(gpointer));
+               amd64_mov_reg_membase (code, AMD64_RAX, AMD64_ARG_REG1, MONO_STRUCT_OFFSET (MonoVTable, runtime_generic_context), sizeof(gpointer));
                /* is the rgctx ptr null? */
                amd64_test_reg_reg (code, AMD64_RAX, AMD64_RAX);
                /* if yes, jump to actual trampoline */
@@ -981,7 +982,7 @@ mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot)
                amd64_branch8 (code, X86_CC_Z, -1, 1);
 
                /* load obj->synchronization to RCX */
-               amd64_mov_reg_membase (code, AMD64_RCX, AMD64_RDI, G_STRUCT_OFFSET (MonoObject, synchronisation), 8);
+               amd64_mov_reg_membase (code, AMD64_RCX, AMD64_RDI, MONO_STRUCT_OFFSET (MonoObject, synchronisation), 8);
 
                if (mono_gc_is_moving ()) {
                        /*if bit zero is set it's a thin hash*/
@@ -1003,7 +1004,7 @@ mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot)
                /* load MonoInternalThread* into RDX */
                code = mono_amd64_emit_tls_get (code, AMD64_RDX, mono_thread_get_tls_offset ());
                /* load TID into RDX */
-               amd64_mov_reg_membase (code, AMD64_RDX, AMD64_RDX, G_STRUCT_OFFSET (MonoInternalThread, tid), 8);
+               amd64_mov_reg_membase (code, AMD64_RDX, AMD64_RDX, MONO_STRUCT_OFFSET (MonoInternalThread, tid), 8);
 
                /* is synchronization->owner null? */
                amd64_alu_membase_imm_size (code, X86_CMP, AMD64_RCX, owner_offset, 0, 8);
@@ -1106,7 +1107,7 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot)
                amd64_branch8 (code, X86_CC_Z, -1, 1);
 
                /* load obj->synchronization to RCX */
-               amd64_mov_reg_membase (code, AMD64_RCX, AMD64_RDI, G_STRUCT_OFFSET (MonoObject, synchronisation), 8);
+               amd64_mov_reg_membase (code, AMD64_RCX, AMD64_RDI, MONO_STRUCT_OFFSET (MonoObject, synchronisation), 8);
 
                if (mono_gc_is_moving ()) {
                        /*if bit zero is set it's a thin hash*/
@@ -1129,7 +1130,7 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot)
                /* load MonoInternalThread* into RDX */
                code = mono_amd64_emit_tls_get (code, AMD64_RDX, mono_thread_get_tls_offset ());
                /* load TID into RDX */
-               amd64_mov_reg_membase (code, AMD64_RDX, AMD64_RDX, G_STRUCT_OFFSET (MonoInternalThread, tid), 8);
+               amd64_mov_reg_membase (code, AMD64_RDX, AMD64_RDX, MONO_STRUCT_OFFSET (MonoInternalThread, tid), 8);
                /* is synchronization->owner == TID */
                amd64_alu_membase_reg_size (code, X86_CMP, AMD64_RCX, owner_offset, AMD64_RDX, 8);
                /* if no, jump to actual trampoline */
@@ -1228,7 +1229,7 @@ mono_arch_create_handler_block_trampoline (MonoTrampInfo **info, gboolean aot)
 
        if (mono_get_jit_tls_offset () != -1) {
                code = mono_amd64_emit_tls_get (code, AMD64_RDI, mono_get_jit_tls_offset ());
-               amd64_mov_reg_membase (code, AMD64_RDI, AMD64_RDI, G_STRUCT_OFFSET (MonoJitTlsData, handler_block_return_address), 8);
+               amd64_mov_reg_membase (code, AMD64_RDI, AMD64_RDI, MONO_STRUCT_OFFSET (MonoJitTlsData, handler_block_return_address), 8);
                /* Simulate a call */
                amd64_push_reg (code, AMD64_RAX);
                amd64_jump_code (code, tramp);
index 9810f48f79cb5b47c243f5b80140dc86674e6c30..bb500a7c0f505c954834f36b68c97deb7a424337 100644 (file)
@@ -12,6 +12,7 @@
 #include <config.h>
 #include <glib.h>
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/marshal.h>
 #include <mono/metadata/tabledefs.h>
@@ -296,33 +297,33 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
         */
 
        /* r0 is the result from mono_get_lmf_addr () */
-       ARM_STR_IMM (code, ARMREG_R0, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, lmf_addr));
+       ARM_STR_IMM (code, ARMREG_R0, ARMREG_V1, MONO_STRUCT_OFFSET (MonoLMF, lmf_addr));
        /* new_lmf->previous_lmf = *lmf_addr */
-       ARM_LDR_IMM (code, ARMREG_R2, ARMREG_R0, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
-       ARM_STR_IMM (code, ARMREG_R2, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
+       ARM_LDR_IMM (code, ARMREG_R2, ARMREG_R0, MONO_STRUCT_OFFSET (MonoLMF, previous_lmf));
+       ARM_STR_IMM (code, ARMREG_R2, ARMREG_V1, MONO_STRUCT_OFFSET (MonoLMF, previous_lmf));
        /* *(lmf_addr) = r1 */
-       ARM_STR_IMM (code, ARMREG_V1, ARMREG_R0, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
+       ARM_STR_IMM (code, ARMREG_V1, ARMREG_R0, MONO_STRUCT_OFFSET (MonoLMF, previous_lmf));
        /* save method info (it's in v2) */
        if ((tramp_type == MONO_TRAMPOLINE_JIT) || (tramp_type == MONO_TRAMPOLINE_JUMP))
-               ARM_STR_IMM (code, ARMREG_V2, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, method));
+               ARM_STR_IMM (code, ARMREG_V2, ARMREG_V1, MONO_STRUCT_OFFSET (MonoLMF, method));
        else {
                ARM_MOV_REG_IMM8 (code, ARMREG_R2, 0);
-               ARM_STR_IMM (code, ARMREG_R2, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, method));
+               ARM_STR_IMM (code, ARMREG_R2, ARMREG_V1, MONO_STRUCT_OFFSET (MonoLMF, method));
        }
        /* save caller SP */
        code = mono_arm_emit_load_imm (code, ARMREG_R2, cfa_offset);
        ARM_ADD_REG_REG (code, ARMREG_R2, ARMREG_SP, ARMREG_R2);
-       ARM_STR_IMM (code, ARMREG_R2, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, sp));
+       ARM_STR_IMM (code, ARMREG_R2, ARMREG_V1, MONO_STRUCT_OFFSET (MonoLMF, sp));
        /* save caller FP */
-       ARM_LDR_IMM (code, ARMREG_R2, ARMREG_V1, (G_STRUCT_OFFSET (MonoLMF, iregs) + ARMREG_FP*4));
-       ARM_STR_IMM (code, ARMREG_R2, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, fp));
+       ARM_LDR_IMM (code, ARMREG_R2, ARMREG_V1, (MONO_STRUCT_OFFSET (MonoLMF, iregs) + ARMREG_FP*4));
+       ARM_STR_IMM (code, ARMREG_R2, ARMREG_V1, MONO_STRUCT_OFFSET (MonoLMF, fp));
        /* save the IP (caller ip) */
        if (tramp_type == MONO_TRAMPOLINE_JUMP) {
                ARM_MOV_REG_IMM8 (code, ARMREG_R2, 0);
        } else {
-               ARM_LDR_IMM (code, ARMREG_R2, ARMREG_V1, (G_STRUCT_OFFSET (MonoLMF, iregs) + 13*4));
+               ARM_LDR_IMM (code, ARMREG_R2, ARMREG_V1, (MONO_STRUCT_OFFSET (MonoLMF, iregs) + 13*4));
        }
-       ARM_STR_IMM (code, ARMREG_R2, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, ip));
+       ARM_STR_IMM (code, ARMREG_R2, ARMREG_V1, MONO_STRUCT_OFFSET (MonoLMF, ip));
 
        /* Save VFP registers. */
        if (mono_arm_is_hard_float ()) {
@@ -331,7 +332,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
                 * it's easier than attempting to store them on the stack since
                 * this trampoline code is pretty messy.
                 */
-               ARM_ADD_REG_IMM8 (code, ARMREG_R0, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, fregs));
+               ARM_ADD_REG_IMM8 (code, ARMREG_R0, ARMREG_V1, MONO_STRUCT_OFFSET (MonoLMF, fregs));
                ARM_FSTMD (code, ARM_VFP_D0, 8, ARMREG_R0);
        }
 
@@ -339,7 +340,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
         * Now we're ready to call xxx_trampoline ().
         */
        /* Arg 1: the saved registers */
-       ARM_ADD_REG_IMM (code, ARMREG_R0, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, iregs), 0);
+       ARM_ADD_REG_IMM (code, ARMREG_R0, ARMREG_V1, MONO_STRUCT_OFFSET (MonoLMF, iregs), 0);
 
        /* Arg 2: code (next address to the instruction that called us) */
        if (tramp_type == MONO_TRAMPOLINE_JUMP) {
@@ -378,7 +379,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
         * clobbered). This way we can just restore all the regs in one inst
         * and branch to IP.
         */
-       ARM_STR_IMM (code, ARMREG_R0, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, iregs) + (ARMREG_R12 * sizeof (mgreg_t)));
+       ARM_STR_IMM (code, ARMREG_R0, ARMREG_V1, MONO_STRUCT_OFFSET (MonoLMF, iregs) + (ARMREG_R12 * sizeof (mgreg_t)));
 
        /* Check for thread interruption */
        /* This is not perf critical code so no need to check the interrupt flag */
@@ -413,15 +414,15 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
         * the same state as before we executed.
         */
        /* ip = previous_lmf */
-       ARM_LDR_IMM (code, ARMREG_IP, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
+       ARM_LDR_IMM (code, ARMREG_IP, ARMREG_V1, MONO_STRUCT_OFFSET (MonoLMF, previous_lmf));
        /* lr = lmf_addr */
-       ARM_LDR_IMM (code, ARMREG_LR, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, lmf_addr));
+       ARM_LDR_IMM (code, ARMREG_LR, ARMREG_V1, MONO_STRUCT_OFFSET (MonoLMF, lmf_addr));
        /* *(lmf_addr) = previous_lmf */
-       ARM_STR_IMM (code, ARMREG_IP, ARMREG_LR, G_STRUCT_OFFSET (MonoLMF, previous_lmf));
+       ARM_STR_IMM (code, ARMREG_IP, ARMREG_LR, MONO_STRUCT_OFFSET (MonoLMF, previous_lmf));
 
        /* Restore VFP registers. */
        if (mono_arm_is_hard_float ()) {
-               ARM_ADD_REG_IMM8 (code, ARMREG_R0, ARMREG_V1, G_STRUCT_OFFSET (MonoLMF, fregs));
+               ARM_ADD_REG_IMM8 (code, ARMREG_R0, ARMREG_V1, MONO_STRUCT_OFFSET (MonoLMF, fregs));
                ARM_FLDMD (code, ARM_VFP_D0, 8, ARMREG_R0);
        }
 
@@ -703,8 +704,8 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info
                ARM_MOV_REG_REG (code, ARMREG_R1, ARMREG_R0);
        } else {
                /* load rgctx ptr from vtable */
-               g_assert (arm_is_imm12 (G_STRUCT_OFFSET (MonoVTable, runtime_generic_context)));
-               ARM_LDR_IMM (code, ARMREG_R1, ARMREG_R0, G_STRUCT_OFFSET (MonoVTable, runtime_generic_context));
+               g_assert (arm_is_imm12 (MONO_STRUCT_OFFSET (MonoVTable, runtime_generic_context)));
+               ARM_LDR_IMM (code, ARMREG_R1, ARMREG_R0, MONO_STRUCT_OFFSET (MonoVTable, runtime_generic_context));
                /* is the rgctx ptr null? */
                ARM_CMP_REG_IMM (code, ARMREG_R1, 0, 0);
                /* if yes, jump to actual trampoline */
index d7b598537d8ab2616d9998b50eee770f10d31854..9b80527ae790288c183d35d6511ce47a4d768751 100644 (file)
@@ -16,6 +16,7 @@
 #include <config.h>
 #include <glib.h>
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/marshal.h>
 #include <mono/metadata/tabledefs.h>
@@ -408,8 +409,8 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info
                mips_move (code, mips_a1, mips_a0);
        } else {
                /* load rgctx ptr from vtable */
-               g_assert (mips_is_imm16 (G_STRUCT_OFFSET (MonoVTable, runtime_generic_context)));
-               mips_lw (code, mips_a1, mips_a0, G_STRUCT_OFFSET (MonoVTable, runtime_generic_context));
+               g_assert (mips_is_imm16 (MONO_STRUCT_OFFSET (MonoVTable, runtime_generic_context)));
+               mips_lw (code, mips_a1, mips_a0, MONO_STRUCT_OFFSET (MonoVTable, runtime_generic_context));
                /* is the rgctx ptr null? */
                /* if yes, jump to actual trampoline */
                rgctx_null_jumps [njumps ++] = code;
index aec06abc142ffdf74e8c73829635044f3f3f4bc1..6fac1a1bcb0d8547183da06ccdcf4c8b479318e8 100644 (file)
@@ -14,6 +14,7 @@
 #include <config.h>
 #include <glib.h>
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/marshal.h>
 #include <mono/metadata/tabledefs.h>
@@ -545,7 +546,7 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info
                ppc_mr (code, ppc_r4, PPC_FIRST_ARG_REG);
        } else {
                /* load rgctx ptr from vtable */
-               ppc_ldptr (code, ppc_r4, G_STRUCT_OFFSET (MonoVTable, runtime_generic_context), PPC_FIRST_ARG_REG);
+               ppc_ldptr (code, ppc_r4, MONO_STRUCT_OFFSET (MonoVTable, runtime_generic_context), PPC_FIRST_ARG_REG);
                /* is the rgctx ptr null? */
                ppc_compare_reg_imm (code, 0, ppc_r4, 0);
                /* if yes, jump to actual trampoline */
index d694c70f01db531db14c953ada975f3bd12c622e..fa664e12e11f8b57ae731c0a7afd29404193589f 100644 (file)
@@ -46,6 +46,7 @@
 #include <glib.h>
 #include <string.h>
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/marshal.h>
 #include <mono/metadata/tabledefs.h>
@@ -533,7 +534,7 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info
                s390_lgr (code, s390_r1, s390_r2);
        } else {
                /* load rgctx ptr from vtable */
-               s390_lg (code, s390_r1, 0, s390_r2, G_STRUCT_OFFSET(MonoVTable, runtime_generic_context));
+               s390_lg (code, s390_r1, 0, s390_r2, MONO_STRUCT_OFFSET(MonoVTable, runtime_generic_context));
                /* is the rgctx ptr null? */
                s390_ltgr (code, s390_r1, s390_r1);
                /* if yes, jump to actual trampoline */
index 5d9f17dff5eddc5f61283b0bf0f170aabbca42ec..e86e061eb7a4419e38b8d78fe937f0ba41ad4993 100644 (file)
@@ -10,6 +10,7 @@
 #include <config.h>
 #include <glib.h>
 
+#include <mono/metadata/abi-details.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/metadata-internals.h>
 #include <mono/metadata/marshal.h>
@@ -25,6 +26,8 @@
 #include "mini.h"
 #include "mini-x86.h"
 
+#define ALIGN_TO(val,align) ((((guint64)val) + ((align) - 1)) & ~((align) - 1))
+
 /*
  * mono_arch_get_unbox_trampoline:
  * @m: method pointer
@@ -297,9 +300,9 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
 {
        char *tramp_name;
        guint8 *buf, *code, *tramp;
-       int pushed_args, pushed_args_caller_saved;
        GSList *unwind_ops = NULL;
        MonoJumpInfo *ji = NULL;
+       int i, offset, frame_size, regarray_offset, lmf_offset, caller_ip_offset, arg_offset;
 
        unwind_ops = mono_arch_get_cie_program ();
 
@@ -310,65 +313,75 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
         * the ret address is at: esp + (pushed_args + 1) * sizeof (gpointer)
         */
 
-       /* Put all registers into an array on the stack
-        * If this code is changed, make sure to update the offset value in
-        * mono_arch_get_this_arg_from_call () in mini-x86.c.
-        */
-       x86_push_reg (code, X86_EDI);
-       x86_push_reg (code, X86_ESI);
-       x86_push_reg (code, X86_EBP);
-       x86_push_reg (code, X86_ESP);
-       x86_push_reg (code, X86_EBX);
-       x86_push_reg (code, X86_EDX);
-       x86_push_reg (code, X86_ECX);
-       x86_push_reg (code, X86_EAX);
-
-       pushed_args_caller_saved = pushed_args = 8;
-
-       /* Align stack on apple */
-       x86_alu_reg_imm (code, X86_SUB, X86_ESP, 4);
-
-       pushed_args ++;
-
-       /* save LMF begin */
-
-       /* save the IP (caller ip) */
-       if (tramp_type == MONO_TRAMPOLINE_JUMP)
-               x86_push_imm (code, 0);
-       else
-               x86_push_membase (code, X86_ESP, (pushed_args + 1) * sizeof (gpointer));
-
-       pushed_args++;
-
+       // FIXME: Unwind info
+
+       /* Compute frame offsets relative to the frame pointer %ebp */
+       arg_offset = sizeof (mgreg_t);
+       caller_ip_offset = 2 * sizeof (mgreg_t);
+       offset = 0;
+       offset += sizeof (MonoLMF);
+       lmf_offset = -offset;
+       offset += X86_NREG * sizeof (mgreg_t);
+       regarray_offset = -offset;
+       /* Argument area */
+       offset += 4 * sizeof (mgreg_t);
+       frame_size = ALIGN_TO (offset, MONO_ARCH_FRAME_ALIGNMENT);
+
+       /* Allocate frame */
        x86_push_reg (code, X86_EBP);
-       x86_push_reg (code, X86_ESI);
-       x86_push_reg (code, X86_EDI);
-       x86_push_reg (code, X86_EBX);
-
-       pushed_args += 4;
-
-       /* save ESP */
-       x86_push_reg (code, X86_ESP);
-       /* Adjust ESP so it points to the previous frame */
-       x86_alu_membase_imm (code, X86_ADD, X86_ESP, 0, (pushed_args + 2) * 4);
-
-       pushed_args ++;
-
-       /* save method info */
-       if ((tramp_type == MONO_TRAMPOLINE_JIT) || (tramp_type == MONO_TRAMPOLINE_JUMP))
-               x86_push_membase (code, X86_ESP, pushed_args * sizeof (gpointer));
-       else
-               x86_push_imm (code, 0);
-
-       pushed_args++;
-
-       /* On apple, the stack is correctly aligned to 16 bytes because pushed_args is
-        * 16 and there is the extra trampoline arg + the return ip pushed by call
-        * FIXME: Note that if an exception happens while some args are pushed
-        * on the stack, the stack will be misaligned.
-        */
-       g_assert (pushed_args == 16);
+       x86_mov_reg_reg (code, X86_EBP, X86_ESP, sizeof (mgreg_t));
+       /* There are three words on the stack, adding + 4 aligns the stack to 16, which is needed on osx */
+       x86_alu_reg_imm (code, X86_SUB, X86_ESP, frame_size + sizeof (mgreg_t));
+
+       /* Save all registers */
+       for (i = X86_EAX; i <= X86_EDI; ++i) {
+               int reg = i;
+
+               if (i == X86_EBP) {
+                       /* Save original ebp */
+                       /* EAX is already saved */
+                       x86_mov_reg_membase (code, X86_EAX, X86_EBP, 0, sizeof (mgreg_t));
+                       reg = X86_EAX;
+               } else if (i == X86_ESP) {
+                       /* Save original esp */
+                       /* EAX is already saved */
+                       x86_mov_reg_reg (code, X86_EAX, X86_EBP, sizeof (mgreg_t));
+                       /* Saved ebp + trampoline arg + return addr */
+                       x86_alu_reg_imm (code, X86_ADD, X86_EAX, 3 * sizeof (mgreg_t));
+                       reg = X86_EAX;
+               }
+               x86_mov_membase_reg (code, X86_EBP, regarray_offset + (i * sizeof (mgreg_t)), reg, sizeof (mgreg_t));
+       }
 
+       /* Setup LMF */
+       /* eip */
+       if (tramp_type == MONO_TRAMPOLINE_JUMP) {
+               x86_mov_membase_imm (code, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, eip), 0, sizeof (mgreg_t));
+       } else {
+               x86_mov_reg_membase (code, X86_EAX, X86_EBP, caller_ip_offset, sizeof (mgreg_t));
+               x86_mov_membase_reg (code, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, eip), X86_EAX, sizeof (mgreg_t));
+       }
+       /* method */
+       if ((tramp_type == MONO_TRAMPOLINE_JIT) || (tramp_type == MONO_TRAMPOLINE_JUMP)) {
+               x86_mov_reg_membase (code, X86_EAX, X86_EBP, arg_offset, sizeof (mgreg_t));
+               x86_mov_membase_reg (code, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, method), X86_EAX, sizeof (mgreg_t));
+       } else {
+               x86_mov_membase_imm (code, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, method), 0, sizeof (mgreg_t));
+       }
+       /* esp */
+       x86_mov_reg_membase (code, X86_EAX, X86_EBP, regarray_offset + (X86_ESP * sizeof (mgreg_t)), sizeof (mgreg_t));
+       x86_mov_membase_reg (code, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, esp), X86_EAX, sizeof (mgreg_t));
+       /* callee save registers */
+       x86_mov_reg_membase (code, X86_EAX, X86_EBP, regarray_offset + (X86_EBX * sizeof (mgreg_t)), sizeof (mgreg_t));
+       x86_mov_membase_reg (code, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebx), X86_EAX, sizeof (mgreg_t));
+       x86_mov_reg_membase (code, X86_EAX, X86_EBP, regarray_offset + (X86_EDI * sizeof (mgreg_t)), sizeof (mgreg_t));
+       x86_mov_membase_reg (code, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, edi), X86_EAX, sizeof (mgreg_t));
+       x86_mov_reg_membase (code, X86_EAX, X86_EBP, regarray_offset + (X86_ESI * sizeof (mgreg_t)), sizeof (mgreg_t));
+       x86_mov_membase_reg (code, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, esi), X86_EAX, sizeof (mgreg_t));
+       x86_mov_reg_membase (code, X86_EAX, X86_EBP, regarray_offset + (X86_EBP * sizeof (mgreg_t)), sizeof (mgreg_t));
+       x86_mov_membase_reg (code, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, ebp), X86_EAX, sizeof (mgreg_t));
+
+       /* Push LMF */
        /* get the address of lmf for the current thread */
        if (aot) {
                code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_get_lmf_addr");
@@ -376,42 +389,36 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
        } else {
                x86_call_code (code, mono_get_lmf_addr);
        }
-       /* push lmf */
-       x86_push_reg (code, X86_EAX); 
-       /* push *lfm (previous_lmf) */
-       x86_push_membase (code, X86_EAX, 0);
+       /* lmf->lmf_addr = lmf_addr (%eax) */
+       x86_mov_membase_reg (code, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), X86_EAX, sizeof (mgreg_t));
+       /* lmf->previous_lmf = *(lmf_addr) */
+       x86_mov_reg_membase (code, X86_ECX, X86_EAX, 0, sizeof (mgreg_t));
        /* Signal to mono_arch_find_jit_info () that this is a trampoline frame */
-       x86_alu_membase_imm (code, X86_ADD, X86_ESP, 0, 1);
-       /* *(lmf) = ESP */
-       x86_mov_membase_reg (code, X86_EAX, 0, X86_ESP, 4);
-       /* save LFM end */
-
-       pushed_args += 2;
-
-       /* starting the call sequence */
-
-       /* FIXME: Push the trampoline address */
-       x86_push_imm (code, 0);
-
-       pushed_args++;
-
-       /* push the method info */
-       x86_push_membase (code, X86_ESP, pushed_args * sizeof (gpointer));
-
-       pushed_args++;
-
-       /* push the return address onto the stack */
-       if (tramp_type == MONO_TRAMPOLINE_JUMP)
-               x86_push_imm (code, 0);
-       else
-               x86_push_membase (code, X86_ESP, (pushed_args + 1) * sizeof (gpointer));
-       pushed_args++;
-       /* push the address of the register array */
-       x86_lea_membase (code, X86_EAX, X86_ESP, (pushed_args - 8) * sizeof (gpointer));
-       x86_push_reg (code, X86_EAX);
-
-       pushed_args++;
-
+       x86_alu_reg_imm (code, X86_ADD, X86_ECX, 1);
+       x86_mov_membase_reg (code, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), X86_ECX, sizeof (mgreg_t));
+       /* *lmf_addr = lmf */
+       x86_lea_membase (code, X86_ECX, X86_EBP, lmf_offset);
+       x86_mov_membase_reg (code, X86_EAX, 0, X86_ECX, sizeof (mgreg_t));
+
+       /* Call trampoline function */
+       /* Arg 1 - registers */
+       x86_lea_membase (code, X86_EAX, X86_EBP, regarray_offset);
+       x86_mov_membase_reg (code, X86_ESP, (0 * sizeof (mgreg_t)), X86_EAX, sizeof (mgreg_t));
+       /* Arg2 - calling code */
+       if (tramp_type == MONO_TRAMPOLINE_JUMP) {
+               x86_mov_membase_imm (code, X86_ESP, (1 * sizeof (mgreg_t)), 0, sizeof (mgreg_t));
+       } else {
+               x86_mov_reg_membase (code, X86_EAX, X86_EBP, caller_ip_offset, sizeof (mgreg_t));
+               x86_mov_membase_reg (code, X86_ESP, (1 * sizeof (mgreg_t)), X86_EAX, sizeof (mgreg_t));
+       }
+       /* Arg3 - trampoline argument */
+       x86_mov_reg_membase (code, X86_EAX, X86_EBP, arg_offset, sizeof (mgreg_t));
+       x86_mov_membase_reg (code, X86_ESP, (2 * sizeof (mgreg_t)), X86_EAX, sizeof (mgreg_t));
+       /* Arg4 - trampoline address */
+       // FIXME:
+       x86_mov_membase_imm (code, X86_ESP, (3 * sizeof (mgreg_t)), 0, sizeof (mgreg_t));
+
+       // FIXME:
 #ifdef __APPLE__
        /* check the stack is aligned after the ret ip is pushed */
        /*x86_mov_reg_reg (buf, X86_EDX, X86_ESP, 4);
@@ -421,8 +428,6 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
        x86_breakpoint (buf);*/
 #endif
 
-       mono_add_unwind_op_def_cfa (unwind_ops, code, buf, X86_ESP, ((pushed_args + 2) * 4));
-
        if (aot) {
                char *icall_name = g_strdup_printf ("trampoline_func_%d", tramp_type);
                code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, icall_name);
@@ -432,96 +437,53 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf
                x86_call_code (code, tramp);
        }
 
-       x86_alu_reg_imm (code, X86_ADD, X86_ESP, 4*4);
-
-       pushed_args -= 4;
+       /*
+        * Overwrite the trampoline argument with the address we need to jump to,
+        * to free %eax.
+        */
+       x86_mov_membase_reg (code, X86_EBP, arg_offset, X86_EAX, 4);
 
-       /* Check for thread interruption */
-       /* This is not perf critical code so no need to check the interrupt flag */
-       /* Align the stack on osx */
-       x86_alu_reg_imm (code, X86_SUB, X86_ESP, 3 * 4);
-       x86_push_reg (code, X86_EAX);
+       /* Check for interruptions */
        if (aot) {
                code = mono_arch_emit_load_aotconst (buf, code, &ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_thread_force_interruption_checkpoint");
                x86_call_reg (code, X86_EAX);
        } else {
                x86_call_code (code, (guint8*)mono_thread_force_interruption_checkpoint);
        }
-       x86_pop_reg (code, X86_EAX);
-       x86_alu_reg_imm (code, X86_ADD, X86_ESP, 3 * 4);
 
        /* Restore LMF */
-
-       /* ebx = previous_lmf */
-       x86_pop_reg (code, X86_EBX);
-       pushed_args--;
-       x86_alu_reg_imm (code, X86_SUB, X86_EBX, 1);
-
-       /* edi = lmf */
-       x86_pop_reg (code, X86_EDI);
-       pushed_args--;
-
-       /* *(lmf) = previous_lmf */
-       x86_mov_membase_reg (code, X86_EDI, 0, X86_EBX, 4);
-
-       /* discard method info */
-       x86_pop_reg (code, X86_ESI);
-       pushed_args--;
-
-       /* discard ESP */
-       x86_pop_reg (code, X86_ESI);
-       pushed_args--;
-
-       /* restore caller saved regs */
-       x86_pop_reg (code, X86_EBX);
-       x86_pop_reg (code, X86_EDI);
-       x86_pop_reg (code, X86_ESI);
-       x86_pop_reg (code, X86_EBP);
-
-       pushed_args -= 4;
-
-       /* discard save IP */
-       x86_alu_reg_imm (code, X86_ADD, X86_ESP, 4);
-       pushed_args--;
-
-       /* restore LMF end */
-
-       if (!MONO_TRAMPOLINE_TYPE_MUST_RETURN (tramp_type)) {
-               /* 
-                * Overwrite the method ptr with the address we need to jump to,
-                * to free %eax.
-                */
-               x86_mov_membase_reg (code, X86_ESP, pushed_args * sizeof (gpointer), X86_EAX, 4);
+       x86_mov_reg_membase (code, X86_EAX, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, lmf_addr), sizeof (mgreg_t));
+       x86_mov_reg_membase (code, X86_ECX, X86_EBP, lmf_offset + G_STRUCT_OFFSET (MonoLMF, previous_lmf), sizeof (mgreg_t));
+       x86_alu_reg_imm (code, X86_SUB, X86_ECX, 1);
+       x86_mov_membase_reg (code, X86_EAX, 0, X86_ECX, sizeof (mgreg_t));
+
+       /* Restore registers */
+       for (i = X86_EAX; i <= X86_EDI; ++i) {
+               if (i == X86_ESP || i == X86_EBP)
+                       continue;
+               if (i == X86_EAX && !((tramp_type == MONO_TRAMPOLINE_RESTORE_STACK_PROT) || (tramp_type == MONO_TRAMPOLINE_AOT_PLT)))
+                       continue;
+               x86_mov_reg_membase (code, i, X86_EBP, regarray_offset + (i * 4), 4);
        }
 
-       /* Restore caller saved registers */
-       x86_mov_reg_membase (code, X86_ECX, X86_ESP, (pushed_args - pushed_args_caller_saved + X86_ECX) * 4, 4);
-       x86_mov_reg_membase (code, X86_EDX, X86_ESP, (pushed_args - pushed_args_caller_saved + X86_EDX) * 4, 4);
-       if ((tramp_type == MONO_TRAMPOLINE_RESTORE_STACK_PROT) || (tramp_type == MONO_TRAMPOLINE_AOT_PLT))
-               x86_mov_reg_membase (code, X86_EAX, X86_ESP, (pushed_args - pushed_args_caller_saved + X86_EAX) * 4, 4);
-
-       if (!MONO_TRAMPOLINE_TYPE_MUST_RETURN (tramp_type)) {
-               /* Pop saved reg array + stack align */
-               x86_alu_reg_imm (code, X86_ADD, X86_ESP, 9 * 4);
-               pushed_args -= 9;
-               g_assert (pushed_args == 0);
-       } else {
-               /* Pop saved reg array + stack align + method ptr */
-               x86_alu_reg_imm (code, X86_ADD, X86_ESP, 10 * 4);
-               pushed_args -= 10;
-
-               /* We've popped one more stack item than we've pushed (the
-                  method ptr argument), so we must end up at -1. */
-               g_assert (pushed_args == -1);
-       }
+       /* Restore frame */
+       x86_leave (code);
 
-       /*block guard trampolines are called with the stack aligned but must exit with the stack unaligned. */
-       if (tramp_type == MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD) {
-               x86_pop_reg (code, X86_EAX);
-               x86_alu_reg_imm (code, X86_ADD, X86_ESP, 0x8);
-               x86_jump_reg (code, X86_EAX);
-       } else {
+       if (MONO_TRAMPOLINE_TYPE_MUST_RETURN (tramp_type)) {
+               /* Load the value returned by the trampoline */
+               x86_mov_reg_membase (code, X86_EAX, X86_ESP, 0, 4);
+               /* The trampoline returns normally, pop the trampoline argument */
+               x86_alu_reg_imm (code, X86_ADD, X86_ESP, 4);
                x86_ret (code);
+       } else {
+               /* The trampoline argument is at the top of the stack, and it contains the address we need to branch to */
+               if (tramp_type == MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD) {
+                       x86_pop_reg (code, X86_EAX);
+                       x86_alu_reg_imm (code, X86_ADD, X86_ESP, 0x8);
+                       x86_jump_reg (code, X86_EAX);
+               } else {
+                       x86_ret (code);
+               }
        }
 
        nacl_global_codeman_validate (&buf, 256, &code);
@@ -622,7 +584,7 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info
        x86_mov_reg_membase (code, X86_EAX, X86_ESP, 4, 4);
        if (!mrgctx) {
                /* load rgctx ptr from vtable */
-               x86_mov_reg_membase (code, X86_EAX, X86_EAX, G_STRUCT_OFFSET (MonoVTable, runtime_generic_context), 4);
+               x86_mov_reg_membase (code, X86_EAX, X86_EAX, MONO_STRUCT_OFFSET (MonoVTable, runtime_generic_context), 4);
                /* is the rgctx ptr null? */
                x86_test_reg_reg (code, X86_EAX, X86_EAX);
                /* if yes, jump to actual trampoline */
@@ -834,7 +796,7 @@ mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot)
                x86_branch8 (code, X86_CC_Z, -1, 1);
 
                /* load obj->synchronization to ECX */
-               x86_mov_reg_membase (code, X86_ECX, X86_EAX, G_STRUCT_OFFSET (MonoObject, synchronisation), 4);
+               x86_mov_reg_membase (code, X86_ECX, X86_EAX, MONO_STRUCT_OFFSET (MonoObject, synchronisation), 4);
 
                if (mono_gc_is_moving ()) {
                        /*if bit zero is set it's a thin hash*/
@@ -865,7 +827,7 @@ mono_arch_create_monitor_enter_trampoline (MonoTrampInfo **info, gboolean aot)
                        code = mono_x86_emit_tls_get (code, X86_EDX, mono_thread_get_tls_offset ());
                }
                /* load TID into EDX */
-               x86_mov_reg_membase (code, X86_EDX, X86_EDX, G_STRUCT_OFFSET (MonoInternalThread, tid), 4);
+               x86_mov_reg_membase (code, X86_EDX, X86_EDX, MONO_STRUCT_OFFSET (MonoInternalThread, tid), 4);
 
                /* is synchronization->owner null? */
                x86_alu_membase_imm (code, X86_CMP, X86_ECX, owner_offset, 0);
@@ -975,7 +937,7 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot)
                x86_branch8 (code, X86_CC_Z, -1, 1);
 
                /* load obj->synchronization to ECX */
-               x86_mov_reg_membase (code, X86_ECX, X86_EAX, G_STRUCT_OFFSET (MonoObject, synchronisation), 4);
+               x86_mov_reg_membase (code, X86_ECX, X86_EAX, MONO_STRUCT_OFFSET (MonoObject, synchronisation), 4);
 
                if (mono_gc_is_moving ()) {
                        /*if bit zero is set it's a thin hash*/
@@ -1006,7 +968,7 @@ mono_arch_create_monitor_exit_trampoline (MonoTrampInfo **info, gboolean aot)
                        code = mono_x86_emit_tls_get (code, X86_EDX, mono_thread_get_tls_offset ());
                }
                /* load TID into EDX */
-               x86_mov_reg_membase (code, X86_EDX, X86_EDX, G_STRUCT_OFFSET (MonoInternalThread, tid), 4);
+               x86_mov_reg_membase (code, X86_EDX, X86_EDX, MONO_STRUCT_OFFSET (MonoInternalThread, tid), 4);
                /* is synchronization->owner == TID */
                x86_alu_membase_reg (code, X86_CMP, X86_ECX, owner_offset, X86_EDX);
                /* if no, jump to actual trampoline */
@@ -1121,7 +1083,7 @@ mono_arch_create_handler_block_trampoline (MonoTrampInfo **info, gboolean aot)
 
        if (mono_get_jit_tls_offset () != -1) {
                code = mono_x86_emit_tls_get (code, X86_EAX, mono_get_jit_tls_offset ());
-               x86_mov_reg_membase (code, X86_EAX, X86_EAX, G_STRUCT_OFFSET (MonoJitTlsData, handler_block_return_address), 4);
+               x86_mov_reg_membase (code, X86_EAX, X86_EAX, MONO_STRUCT_OFFSET (MonoJitTlsData, handler_block_return_address), 4);
        } else {
                /*Slow path uses a c helper*/
                x86_call_code (code, handler_block_trampoline_helper);
index 8a7d46eae49127b91fc61b1926694b968ac027b9..a993350aefd6bbc2f22b4792f563aefc00468201 100644 (file)
@@ -307,10 +307,23 @@ mono_print_unwind_info (guint8 *unwind_info, int unwind_info_len)
                                offset = decode_sleb128 (p, &p) * DWARF_DATA_ALIGN;
                                printf ("CFA: [%x] offset_extended_sf: %s at cfa-0x%x\n", pos, mono_arch_regname (mono_dwarf_reg_to_hw_reg (reg)), -offset);
                                break;
+                       case DW_CFA_same_value:
+                               reg = decode_uleb128 (p, &p);
+                               printf ("CFA: [%x] same_value: %s\n", pos, mono_arch_regname (mono_dwarf_reg_to_hw_reg (reg)));
+                               break;
                        case DW_CFA_advance_loc4:
                                pos += read32 (p);
                                p += 4;
                                break;
+                       case DW_CFA_remember_state:
+                               printf ("CFA: [%x] remember_state\n", pos);
+                               break;
+                       case DW_CFA_restore_state:
+                               printf ("CFA: [%x] restore_state\n", pos);
+                               break;
+                       case DW_CFA_mono_advance_loc:
+                               printf ("CFA: [%x] mono_advance_loc\n", pos);
+                               break;
                        default:
                                g_assert_not_reached ();
                        }
@@ -348,9 +361,31 @@ mono_unwind_ops_encode (GSList *unwind_ops, guint32 *out_len)
                /* Convert the register from the hw encoding to the dwarf encoding */
                reg = mono_hw_reg_to_dwarf_reg (op->reg);
 
+               if (op->op == DW_CFA_mono_advance_loc) {
+                       /* This advances loc to its location */
+                       loc = op->when;
+               }
+
                /* Emit an advance_loc if neccesary */
                while (op->when > loc) {
-                       if (op->when - loc < 32) {
+                       if (op->when - loc > 65536) {
+                               *p ++ = DW_CFA_advance_loc4;
+                               *(guint32*)p = (guint32)(op->when - loc);
+                               g_assert (read32 (p) == (guint32)(op->when - loc));
+                               p += 4;
+                               loc = op->when;
+                       } else if (op->when - loc > 256) {
+                               *p ++ = DW_CFA_advance_loc2;
+                               *(guint16*)p = (guint16)(op->when - loc);
+                               g_assert (read16 (p) == (guint32)(op->when - loc));
+                               p += 2;
+                               loc = op->when;
+                       } else if (op->when - loc >= 32) {
+                               *p ++ = DW_CFA_advance_loc1;
+                               *(guint8*)p = (guint8)(op->when - loc);
+                               p += 1;
+                               loc = op->when;
+                       } else if (op->when - loc < 32) {
                                *p ++ = DW_CFA_advance_loc | (op->when - loc);
                                loc = op->when;
                        } else {
@@ -373,6 +408,10 @@ mono_unwind_ops_encode (GSList *unwind_ops, guint32 *out_len)
                        *p ++ = op->op;
                        encode_uleb128 (reg, p, &p);
                        break;
+               case DW_CFA_same_value:
+                       *p ++ = op->op;
+                       encode_uleb128 (reg, p, &p);
+                       break;
                case DW_CFA_offset:
                        if (reg > 63) {
                                *p ++ = DW_CFA_offset_extended_sf;
@@ -383,6 +422,15 @@ mono_unwind_ops_encode (GSList *unwind_ops, guint32 *out_len)
                                encode_uleb128 (op->val / DWARF_DATA_ALIGN, p, &p);
                        }
                        break;
+               case DW_CFA_remember_state:
+               case DW_CFA_restore_state:
+                       *p ++ = op->op;
+                       break;
+               case DW_CFA_mono_advance_loc:
+                       /* Only one location is supported */
+                       g_assert (op->val == 0);
+                       *p ++ = op->op;
+                       break;
                default:
                        g_assert_not_reached ();
                        break;
@@ -416,6 +464,12 @@ print_dwarf_state (int cfa_reg, int cfa_offset, int ip, int nregs, Loc *location
        printf ("\n");
 }
 
+typedef struct {
+       Loc locations [NUM_REGS];
+       guint8 reg_saved [NUM_REGS];
+       int cfa_reg, cfa_offset;
+} UnwindState;
+
 /*
  * Given the state of the current frame as stored in REGS, execute the unwind 
  * operations in unwind_info until the location counter reaches POS. The result is 
@@ -423,11 +477,13 @@ print_dwarf_state (int cfa_reg, int cfa_offset, int ip, int nregs, Loc *location
  * If SAVE_LOCATIONS is non-NULL, it should point to an array of size SAVE_LOCATIONS_LEN.
  * On return, the nth entry will point to the address of the stack slot where register
  * N was saved, or NULL, if it was not saved by this frame.
+ * MARK_LOCATIONS should contain the locations marked by mono_emit_unwind_op_mark_loc (), if any.
  * This function is signal safe.
  */
 void
 mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len, 
-                                  guint8 *start_ip, guint8 *end_ip, guint8 *ip, mgreg_t *regs, int nregs,
+                                  guint8 *start_ip, guint8 *end_ip, guint8 *ip, guint8 **mark_locations,
+                                  mgreg_t *regs, int nregs,
                                   mgreg_t **save_locations, int save_locations_len,
                                   guint8 **out_cfa)
 {
@@ -436,6 +492,8 @@ mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len,
        int i, pos, reg, cfa_reg, cfa_offset, offset;
        guint8 *p;
        guint8 *cfa_val;
+       UnwindState state_stack [1];
+       int state_stack_pos;
 
        memset (reg_saved, 0, sizeof (reg_saved));
 
@@ -443,6 +501,7 @@ mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len,
        pos = 0;
        cfa_reg = -1;
        cfa_offset = -1;
+       state_stack_pos = 0;
        while (pos <= ip - start_ip && p < unwind_info + unwind_info_len) {
                int op = *p & 0xc0;
 
@@ -489,10 +548,42 @@ mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len,
                                locations [reg].loc_type = LOC_OFFSET;
                                locations [reg].offset = offset * DWARF_DATA_ALIGN;
                                break;
+                       case DW_CFA_same_value:
+                               reg = decode_uleb128 (p, &p);
+                               locations [reg].loc_type = LOC_SAME;
+                               break;
+                       case DW_CFA_advance_loc1:
+                               pos += *p;
+                               p += 1;
+                               break;
+                       case DW_CFA_advance_loc2:
+                               pos += read16 (p);
+                               p += 2;
+                               break;
                        case DW_CFA_advance_loc4:
                                pos += read32 (p);
                                p += 4;
                                break;
+                       case DW_CFA_remember_state:
+                               g_assert (state_stack_pos == 0);
+                               memcpy (&state_stack [0].locations, &locations, sizeof (locations));
+                               memcpy (&state_stack [0].reg_saved, &reg_saved, sizeof (reg_saved));
+                               state_stack [0].cfa_reg = cfa_reg;
+                               state_stack [0].cfa_offset = cfa_offset;
+                               state_stack_pos ++;
+                               break;
+                       case DW_CFA_restore_state:
+                               g_assert (state_stack_pos == 1);
+                               state_stack_pos --;
+                               memcpy (&locations, &state_stack [0].locations, sizeof (locations));
+                               memcpy (&reg_saved, &state_stack [0].reg_saved, sizeof (reg_saved));
+                               cfa_reg = state_stack [0].cfa_reg;
+                               cfa_offset = state_stack [0].cfa_offset;
+                               break;
+                       case DW_CFA_mono_advance_loc:
+                               g_assert (mark_locations [0]);
+                               pos = mark_locations [0] - start_ip;
+                               break;
                        default:
                                g_assert_not_reached ();
                        }
@@ -555,7 +646,7 @@ mono_unwind_cleanup (void)
  * A copy is made of the unwind info.
  * This function is useful for two reasons:
  * - many methods have the same unwind info
- * - MonoJitInfo->used_regs is an int so it can't store the pointer to the unwind info
+ * - MonoJitInfo->unwind_info is an int so it can't store the pointer to the unwind info
  */
 guint32
 mono_cache_unwind_info (guint8 *unwind_info, guint32 unwind_info_len)
index 9b9bf2dc3df4f6d98f2759cf9e1b2f97dcd24fe9..dde31cbc345b5c5bc1adff7db1d8959454b7234b 100644 (file)
@@ -6,35 +6,25 @@ class P {
 
        static public int count = 0;
        ~P () {
-               T.finalized = true;
-               Thread.Sleep (1000);
                // Console.WriteLine ("finalizer done");
                count++;
        }
 }
 
 class T {
-
-       static public bool finalized = false;
-
-       static void makeP () {
-               P p = new P ();
-               p = null;
-       }
-
        static int Main () {
-               var t = new Thread (makeP);
-               t.Start ();
-               t.Join ();
-
-               GC.Collect ();
-               while (!finalized) {
-                       Thread.Sleep (100);
+               for (int i = 0; i < 1000; ++i) {
+                       var t = new Thread (() => {
+                                       P p = new P ();
+                               });
+                       t.Start ();
+                       t.Join ();
+
+                       GC.Collect ();
+                       GC.WaitForPendingFinalizers ();
+                       if (P.count != i + 1)
+                               return 1;
                }
-               GC.WaitForPendingFinalizers ();
-
-               if (P.count == 0)
-                       return 1;
                return 0;
        }
 }
index 4daa22ba8066120ba05ae1c63c9e0c2aed2d4b06..54eca51ef5197e10332720ead06d5652bd9e8f7d 100755 (executable)
@@ -10,7 +10,7 @@ descriptor-tests.exe : descriptor-tests.cs
        $(MCS) -Warn:0 descriptor-tests.cs
 
 descriptor-tests.cs : descriptor-tests-driver.cs descriptor-tests-prefix.cs gen-descriptor-tests.py
-       -cp $^ .
+       if [ "$(srcdir)" != "$(builddir)" ]; then cp $^ .; fi
        $(srcdir)/gen-descriptor-tests.py >descriptor-tests.cs
 
 EXTRA_DIST = descriptor-tests-driver.cs descriptor-tests-prefix.cs gen-descriptor-tests.py
index 02cfbbd40a6cacef016398732a3dc4323c730413..640f4a04d7822e98699f3a79b4b144833f1bed78 100644 (file)
@@ -218,9 +218,9 @@ public class Test
                        if (Marshal.SizeOf (typeof (TestStruct10)) != 12)
                                return 16;
                } else {
-                       if (Marshal.SizeOf (typeof (TestStruct8)) != 16)
+                       if (Marshal.SizeOf (typeof (TestStruct8)) != 16 && Marshal.SizeOf (typeof (TestStruct8)) != 12)
                                return 14;
-                       if (Marshal.SizeOf (typeof (TestStruct10)) != 16)
+                       if (Marshal.SizeOf (typeof (TestStruct10)) != 16 && Marshal.SizeOf (typeof (TestStruct10)) != 12)
                                return 16;
                }
                if (Marshal.SizeOf (typeof (TestStruct9)) != 12)
index d4624ea5816e763a717f521051f6dc7e2554550a..0b2579b6eae506d53853af1b10d26cab116d90cd 100644 (file)
@@ -4,6 +4,7 @@
 /.libs
 /*.la
 /*.lo
+/*.trs
 /test-gc-memfuncs
 /test-mono-linked-list-set
 /test-sgen-qsort
index c1a1a94b47597e5e288ba306348925bf391c06a2..306800cfe1d0cd508a56aafb341a815de949233c 100755 (executable)
@@ -108,13 +108,19 @@ static inline gint64 InterlockedAdd64(volatile gint64 *dest, gint64 add)
 #endif
 #endif
 
+#ifdef HOST_WIN32
+#define TO_INTERLOCKED_ARGP(ptr) ((volatile LONG*)(ptr))
+#else
+#define TO_INTERLOCKED_ARGP(ptr) (ptr)
+#endif
+
 /* And now for some dirty hacks... The Windows API doesn't
  * provide any useful primitives for this (other than getting
  * into architecture-specific madness), so use CAS. */
 
 static inline gint32 InterlockedRead(volatile gint32 *src)
 {
-       return InterlockedCompareExchange (src, 0, 0);
+       return InterlockedCompareExchange (TO_INTERLOCKED_ARGP (src), 0, 0);
 }
 
 static inline gint64 InterlockedRead64(volatile gint64 *src)
@@ -129,7 +135,7 @@ static inline gpointer InterlockedReadPointer(volatile gpointer *src)
 
 static inline void InterlockedWrite(volatile gint32 *dst, gint32 val)
 {
-       InterlockedExchange (dst, val);
+       InterlockedExchange (TO_INTERLOCKED_ARGP (dst), val);
 }
 
 static inline void InterlockedWrite64(volatile gint64 *dst, gint64 val)
index 37bc7580da51fd08cc59b13c61fba969a73b1fdc..8a21c553054ececad51ede4fa23538c47ce95490 100644 (file)
@@ -9,6 +9,12 @@
 
 #include <config.h>
 
+#if defined(TARGET_OSX)
+/* For pthread_main_np () */
+#define _DARWIN_C_SOURCE 1
+#include <pthread.h>
+#endif
+
 #if defined(__OpenBSD__) || defined(__FreeBSD__)
 #include <pthread.h>
 #include <pthread_np.h>
@@ -187,14 +193,13 @@ mono_threads_core_get_stack_bounds (guint8 **staddr, size_t *stsize)
        *staddr = (guint8*)pthread_get_stackaddr_np (pthread_self());
        *stsize = pthread_get_stacksize_np (pthread_self());
 
-
 #ifdef TARGET_OSX
        /*
         * Mavericks reports stack sizes as 512kb:
         * http://permalink.gmane.org/gmane.comp.java.openjdk.hotspot.devel/11590
         * https://bugs.openjdk.java.net/browse/JDK-8020753
         */
-       if (*stsize == 512 * 1024)
+       if (pthread_main_np () && *stsize == 512 * 1024)
                *stsize = 2048 * mono_pagesize ();
 #endif
 
index 4520e2a0927f5c15e5f84281c34ac0a59ec6fac9..3635bdae2d58d611d345399c4860b7c3f3a55e6b 100644 (file)
     <ClCompile Include="..\mono\metadata\threadpool.c" />\r
     <ClCompile Include="..\mono\metadata\threads.c" />\r
     <ClCompile Include="..\mono\metadata\verify.c" />\r
+    <ClCompile Include="..\mono\mini\mini-cross-helpers.c" />\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="..\mono\metadata\appdomain.h" />\r
index 6a1f0d49d5448d79a932eb4435c2f4a3c42ac8bb..61d1779c336f0c0e92e509eaf94a9c5b3e3d0100 100644 (file)
@@ -243,6 +243,7 @@ mono_domain_has_type_resolve
 mono_domain_is_unloading
 mono_domain_owns_vtable_slot
 mono_domain_set
+mono_domain_set_config
 mono_domain_set_internal
 mono_domain_try_type_resolve
 mono_domain_try_unload
index 0cbc870c9a4cba7116c78ecd693635a26aec488e..2c7a641e8a7392e9b03dabf1f4a5a54ca99f5cb4 100644 (file)
@@ -244,6 +244,7 @@ mono_domain_has_type_resolve
 mono_domain_is_unloading
 mono_domain_owns_vtable_slot
 mono_domain_set
+mono_domain_set_config
 mono_domain_set_internal
 mono_domain_try_type_resolve
 mono_domain_try_unload
index 84f306ab796ee877df04c105250f037d9874768d..d1c62a89b70eecfd3d9b2c8bcdbe7fbe8ab6fb94 100644 (file)
@@ -243,6 +243,7 @@ mono_domain_has_type_resolve
 mono_domain_is_unloading
 mono_domain_owns_vtable_slot
 mono_domain_set
+mono_domain_set_config
 mono_domain_set_internal
 mono_domain_try_type_resolve
 mono_domain_try_unload