From 3cf55e6016811ce115ef47fbb9636f10d4b62789 Mon Sep 17 00:00:00 2001 From: marcos henrich Date: Thu, 29 May 2014 17:42:10 +0100 Subject: [PATCH 001/694] Test that ConcurrentQueue does not keep old references. Covers 18421. --- .../ConcurrentQueueTests.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs b/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs index b0006440afa..80313356fe2 100644 --- a/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs +++ b/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs @@ -215,6 +215,28 @@ public void ToExistingArray_Overflow () { queue.CopyTo (new int[3], 0); } + + static WeakReference CreateWeakReference (object obj) + { + return new WeakReference (obj); + } + + [Test] + public void TryDequeueReferenceTest () + { + var obj = new Object (); + var weakReference = CreateWeakReference(obj); + var queue = new ConcurrentQueue (); + + queue.Enqueue (obj); + queue.TryDequeue (out obj); + obj = null; + + GC.Collect (); + GC.WaitForPendingFinalizers (); + + Assert.IsFalse (weakReference.IsAlive); + } } } #endif From 7c52a7bf5fe10f70b547b37f757a9ad022d29d1f Mon Sep 17 00:00:00 2001 From: marcos henrich Date: Thu, 29 May 2014 17:53:32 +0100 Subject: [PATCH 002/694] Overwrites dequeued ref/value with default. Fixes 18421. ConcurrentQueue was keeping the last dequeued ref/value. --- .../corlib/System.Collections.Concurrent/ConcurrentQueue.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mcs/class/corlib/System.Collections.Concurrent/ConcurrentQueue.cs b/mcs/class/corlib/System.Collections.Concurrent/ConcurrentQueue.cs index d19cc4cec7d..aff2492e021 100644 --- a/mcs/class/corlib/System.Collections.Concurrent/ConcurrentQueue.cs +++ b/mcs/class/corlib/System.Collections.Concurrent/ConcurrentQueue.cs @@ -97,12 +97,13 @@ bool IProducerConsumerCollection.TryAdd (T item) public bool TryDequeue (out T result) { result = default (T); + Node oldNext = null; bool advanced = false; while (!advanced) { Node oldHead = head; Node oldTail = tail; - Node oldNext = oldHead.Next; + oldNext = oldHead.Next; if (oldHead == head) { // Empty case ? @@ -122,6 +123,8 @@ public bool TryDequeue (out T result) } } + oldNext.Value = default (T); + Interlocked.Decrement (ref count); return true; From 382ed03051f0ea7b5add210084a3225218f00c6f Mon Sep 17 00:00:00 2001 From: Bertrand Lorentz Date: Fri, 30 May 2014 17:05:04 +0200 Subject: [PATCH 003/694] Mono.Cairo: Add Context.InClip method The cairo_in_clip function was added in cairo 1.10. --- mcs/class/Mono.Cairo/Mono.Cairo/Context.cs | 5 +++++ mcs/class/Mono.Cairo/Mono.Cairo/NativeMethods.cs | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/mcs/class/Mono.Cairo/Mono.Cairo/Context.cs b/mcs/class/Mono.Cairo/Mono.Cairo/Context.cs index 1eff46c1ec1..13d08106458 100644 --- a/mcs/class/Mono.Cairo/Mono.Cairo/Context.cs +++ b/mcs/class/Mono.Cairo/Mono.Cairo/Context.cs @@ -548,6 +548,11 @@ public void ResetClip () NativeMethods.cairo_reset_clip (handle); } + public bool InClip (double x, double y) + { + return NativeMethods.cairo_in_clip (handle, x, y); + } + public bool InStroke (double x, double y) { return NativeMethods.cairo_in_stroke (handle, x, y); diff --git a/mcs/class/Mono.Cairo/Mono.Cairo/NativeMethods.cs b/mcs/class/Mono.Cairo/Mono.Cairo/NativeMethods.cs index c53f0009c00..413550d3957 100644 --- a/mcs/class/Mono.Cairo/Mono.Cairo/NativeMethods.cs +++ b/mcs/class/Mono.Cairo/Mono.Cairo/NativeMethods.cs @@ -292,6 +292,10 @@ internal static class NativeMethods [DllImport (cairo, CallingConvention=CallingConvention.Cdecl)] internal static extern int cairo_image_surface_get_width (IntPtr surface); + [DllImport (cairo, CallingConvention=CallingConvention.Cdecl)] + [return: MarshalAs (UnmanagedType.U1)] + internal static extern bool cairo_in_clip (IntPtr cr, double x, double y); + [DllImport (cairo, CallingConvention=CallingConvention.Cdecl)] [return: MarshalAs (UnmanagedType.U1)] internal static extern bool cairo_in_fill (IntPtr cr, double x, double y); From acc644b7a5e1ee66a1850357c0de29dedf76fe56 Mon Sep 17 00:00:00 2001 From: Bertrand Lorentz Date: Fri, 30 May 2014 17:10:28 +0200 Subject: [PATCH 004/694] Mono.Cairo: Add Context.HasCurrentPoint property The cairo_has_current_point function was added in cairo 1.6. --- mcs/class/Mono.Cairo/Mono.Cairo/Context.cs | 6 ++++++ mcs/class/Mono.Cairo/Mono.Cairo/NativeMethods.cs | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/mcs/class/Mono.Cairo/Mono.Cairo/Context.cs b/mcs/class/Mono.Cairo/Mono.Cairo/Context.cs index 13d08106458..84059516902 100644 --- a/mcs/class/Mono.Cairo/Mono.Cairo/Context.cs +++ b/mcs/class/Mono.Cairo/Mono.Cairo/Context.cs @@ -280,6 +280,12 @@ public PointD CurrentPoint { } } + public bool HasCurrentPoint { + get { + return NativeMethods.cairo_has_current_point (handle); + } + } + [Obsolete ("Use GetTarget/SetTarget")] public Cairo.Surface Target { set { diff --git a/mcs/class/Mono.Cairo/Mono.Cairo/NativeMethods.cs b/mcs/class/Mono.Cairo/Mono.Cairo/NativeMethods.cs index 413550d3957..8509c6db25f 100644 --- a/mcs/class/Mono.Cairo/Mono.Cairo/NativeMethods.cs +++ b/mcs/class/Mono.Cairo/Mono.Cairo/NativeMethods.cs @@ -258,6 +258,10 @@ internal static class NativeMethods [DllImport (cairo, CallingConvention=CallingConvention.Cdecl)] internal static extern void cairo_glyph_path (IntPtr cr, IntPtr glyphs, int num_glyphs); + [DllImport (cairo, CallingConvention=CallingConvention.Cdecl)] + [return: MarshalAs (UnmanagedType.U1)] + internal static extern bool cairo_has_current_point (IntPtr cr); + [DllImport (cairo, CallingConvention=CallingConvention.Cdecl)] internal static extern void cairo_identity_matrix (IntPtr cr); From 014d517bfb04121ebafcbc7ad35a199acfc7239f Mon Sep 17 00:00:00 2001 From: Bertrand Lorentz Date: Fri, 30 May 2014 17:11:55 +0200 Subject: [PATCH 005/694] Mono.Cairo: Add Context.SetSourceColor(Color) convenience method The Color property was obsoleted, but the suggested replacement SetSourceRGBA has 4 double parameters, which can be unconvenient. Add a SetSourceColor that takes a Cairo.Color parameter, make the Color property use it, and update the message on the Obsolete attribute. --- mcs/class/Mono.Cairo/Mono.Cairo/Context.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mcs/class/Mono.Cairo/Mono.Cairo/Context.cs b/mcs/class/Mono.Cairo/Mono.Cairo/Context.cs index 84059516902..57cb86cd8b0 100644 --- a/mcs/class/Mono.Cairo/Mono.Cairo/Context.cs +++ b/mcs/class/Mono.Cairo/Mono.Cairo/Context.cs @@ -161,10 +161,10 @@ public Operator Operator { } } - [Obsolete ("Use SetSourceRGBA method")] + [Obsolete ("Use SetSourceColor method")] public Color Color { set { - NativeMethods.cairo_set_source_rgba (handle, value.R, value.G, value.B, value.A); + SetSourceColor (value); } } @@ -337,6 +337,11 @@ public uint ReferenceCount { get { return NativeMethods.cairo_get_reference_count (handle); } } + public void SetSourceColor (Color color) + { + NativeMethods.cairo_set_source_rgba (handle, color.R, color.G, color.B, color.A); + } + public void SetSourceRGB (double r, double g, double b) { NativeMethods.cairo_set_source_rgb (handle, r, g, b); From 610a5d2c0831fcf22074274ec96a8072c821d239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Karla=C5=A1?= Date: Fri, 30 May 2014 20:10:54 +0200 Subject: [PATCH 006/694] [Mono.Debugger.Soft] Using environment variable MONO_SDB_LOG as logfile path --- .../Mono.Debugger.Soft/Connection.cs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs b/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs index 03d2d3af13a..29e782c7f14 100644 --- a/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs +++ b/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs @@ -404,8 +404,7 @@ public abstract class Connection static readonly bool EnableConnectionLogging = !String.IsNullOrEmpty (Environment.GetEnvironmentVariable ("MONO_SDB_LOG")); static int ConnectionId; - readonly StreamWriter LoggingStream = EnableConnectionLogging ? - new StreamWriter (string.Format ("/tmp/sdb_conn_log_{0}", ConnectionId++), false) : null; + readonly StreamWriter LoggingStream; /* * Th version of the wire-protocol implemented by the library. The library @@ -1068,6 +1067,19 @@ protected Connection () { reply_cbs = new Dictionary (); reply_cb_counts = new Dictionary (); reply_packets_monitor = new Object (); + if (EnableConnectionLogging) { + var path = Environment.GetEnvironmentVariable ("MONO_SDB_LOG"); + if (path.Contains ("{0}")) { + //C:\SomeDir\sdbLog{0}.txt -> C:\SomeDir\sdbLog1.txt + LoggingStream = new StreamWriter (string.Format (path, ConnectionId++), false); + } else if (Path.HasExtension (path)) { + //C:\SomeDir\sdbLog.txt -> C:\SomeDir\sdbLog1.txt + LoggingStream = new StreamWriter (Path.GetDirectoryName (path) + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension (path) + ConnectionId++ + "." + Path.GetExtension (path), false); + } else { + //C:\SomeDir\sdbLog -> C:\SomeDir\sdbLog1 + LoggingStream = new StreamWriter (path + ConnectionId++, false); + } + } } protected abstract int TransportReceive (byte[] buf, int buf_offset, int len); @@ -1443,7 +1455,7 @@ public void StopBuffering () { WritePackets (buffered_packets); if (EnableConnectionLogging) { - LoggingStream.WriteLine (String.Format ("Sent {1} packets.", buffered_packets.Count)); + LoggingStream.WriteLine (String.Format ("Sent {0} packets.", buffered_packets.Count)); LoggingStream.Flush (); } buffered_packets.Clear (); From 02aacdb39e8303db5dc23690257514895325c1a9 Mon Sep 17 00:00:00 2001 From: marcos henrich Date: Fri, 30 May 2014 20:22:21 +0100 Subject: [PATCH 007/694] Added stress test to ConcurrentQueue.TryPeek. The test checks that in some race condition the queue does not return null. --- .../ConcurrentQueueTests.cs | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs b/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs index 80313356fe2..df35b501787 100644 --- a/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs +++ b/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs @@ -30,6 +30,7 @@ using System.Collections.Concurrent; using NUnit.Framework; +using MonoTests.System.Threading.Tasks; namespace MonoTests.System.Collections.Concurrent { @@ -115,6 +116,34 @@ public void StressDequeueTestCase () CollectionStressTestHelper.RemoveStressTest (new ConcurrentQueue (), CheckOrderingType.InOrder); } + [Test] + public void StressTryPeekTestCase () + { + ParallelTestHelper.Repeat (delegate { + var queue = new ConcurrentQueue (); + queue.Enqueue (new object()); + + const int threads = 10; + int threadCounter = 0; + bool success = true; + + ParallelTestHelper.ParallelStressTest (queue, (q) => { + int threadId = Interlocked.Increment (ref threadCounter); + object temp; + if (threadId < threads) + { + while (queue.TryPeek (out temp)) + if (temp == null) + success = false; + } else { + queue.TryDequeue (out temp); + } + }, threads); + + Assert.IsTrue (success, "TryPeek returned unexpected null value."); + }, 10); + } + [Test] public void CountTestCase() { From 4449269d8fa64d0bdb09908ae28a8cc020989326 Mon Sep 17 00:00:00 2001 From: marcos henrich Date: Fri, 30 May 2014 20:31:47 +0100 Subject: [PATCH 008/694] Changed TryPeek to handle race condition with Dequeue. Dequeue sets the head.Value to its default. When TryPeek is interrupted in the process of retrieving the value some times Dequeue sets the value to its default. TryPeek now checks the head has not been changed before returning the value. --- .../ConcurrentQueue.cs | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/mcs/class/corlib/System.Collections.Concurrent/ConcurrentQueue.cs b/mcs/class/corlib/System.Collections.Concurrent/ConcurrentQueue.cs index aff2492e021..ea8984394b4 100644 --- a/mcs/class/corlib/System.Collections.Concurrent/ConcurrentQueue.cs +++ b/mcs/class/corlib/System.Collections.Concurrent/ConcurrentQueue.cs @@ -132,14 +132,24 @@ public bool TryDequeue (out T result) public bool TryPeek (out T result) { - Node first = head.Next; + result = default (T); + bool update = true; + + while (update) + { + Node oldHead = head; + Node oldNext = oldHead.Next; - if (first == null) { - result = default (T); - return false; - } + if (oldNext == null) { + result = default (T); + return false; + } - result = first.Value; + result = oldNext.Value; + + //check if head has been updated + update = head != oldHead; + } return true; } From 45362dc90be7eb00047898e237628c986df45ac0 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Sat, 31 May 2014 01:41:27 +0200 Subject: [PATCH 009/694] [sdb] Add a lower level lock and use it in place of the loader lock in some places. --- mono/mini/debugger-agent.c | 63 +++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c index d7a903adbed..4f7872d1a40 100644 --- a/mono/mini/debugger-agent.c +++ b/mono/mini/debugger-agent.c @@ -678,6 +678,7 @@ static gboolean embedding; static FILE *log_file; /* Assemblies whose assembly load event has no been sent yet */ +/* Protected by the dbg lock */ static GPtrArray *pending_assembly_loads; /* Whenever the debugger thread has exited */ @@ -719,6 +720,10 @@ static gboolean buffer_replies; static ReplyPacket reply_packets [128]; int nreply_packets; +#define dbg_lock() EnterCriticalSection (&debug_mutex) +#define dbg_unlock() LeaveCriticalSection (&debug_mutex) +static CRITICAL_SECTION debug_mutex; + static void transport_init (void); static void transport_connect (const char *address); static gboolean transport_handshake (void); @@ -953,6 +958,8 @@ mono_debugger_agent_parse_options (char *options) void mono_debugger_agent_init (void) { + InitializeCriticalSection (&debug_mutex); + if (!agent_config.enabled) return; @@ -1894,6 +1901,9 @@ typedef struct { /* Maps objid -> ObjRef */ static GHashTable *objrefs; +static GHashTable *obj_to_objref; +/* Protected by the dbg lock */ +static MonoGHashTable *suspended_objs; static void free_objref (gpointer value) @@ -1909,6 +1919,9 @@ static void objrefs_init (void) { objrefs = g_hash_table_new_full (NULL, NULL, NULL, free_objref); + obj_to_objref = g_hash_table_new (NULL, NULL); + suspended_objs = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_KEY_GC); + MONO_GC_REGISTER_ROOT_FIXED (suspended_objs); } static void @@ -1918,9 +1931,6 @@ objrefs_cleanup (void) objrefs = NULL; } -static GHashTable *obj_to_objref; -static MonoGHashTable *suspended_objs; - /* * Return an ObjRef for OBJ. */ @@ -1934,20 +1944,16 @@ get_objref (MonoObject *obj) if (obj == NULL) return 0; - mono_loader_lock (); - - if (!obj_to_objref) { - obj_to_objref = g_hash_table_new (NULL, NULL); - suspended_objs = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_KEY_GC); - MONO_GC_REGISTER_ROOT_FIXED (suspended_objs); - } - if (suspend_count) { /* * Have to keep object refs created during suspensions alive for the duration of the suspension, so GCs during invokes don't collect them. */ + dbg_lock (); mono_g_hash_table_insert (suspended_objs, obj, NULL); + dbg_unlock (); } + + mono_loader_lock (); /* FIXME: The tables can grow indefinitely */ @@ -2003,9 +2009,9 @@ true_pred (gpointer key, gpointer value, gpointer user_data) static void clear_suspended_objs (void) { - mono_loader_lock (); + dbg_lock (); mono_g_hash_table_foreach_remove (suspended_objs, true_pred, NULL); - mono_loader_unlock (); + dbg_unlock (); } static inline int @@ -2121,6 +2127,7 @@ typedef struct { } AgentDomainInfo; /* Maps id -> Id */ +/* Protected by the dbg lock */ static GPtrArray *ids [ID_NUM]; static void @@ -2188,6 +2195,7 @@ mono_debugger_agent_free_domain_info (MonoDomain *domain) domain_jit_info (domain)->agent_info = NULL; /* Clear ids referencing structures in the domain */ + dbg_lock (); for (i = 0; i < ID_NUM; ++i) { if (ids [i]) { for (j = 0; j < ids [i]->len; ++j) { @@ -2197,6 +2205,7 @@ mono_debugger_agent_free_domain_info (MonoDomain *domain) } } } + dbg_unlock (); mono_loader_lock (); g_hash_table_remove (domains, domain); @@ -2249,6 +2258,8 @@ get_id (MonoDomain *domain, IdType type, gpointer val) return id->id; } + dbg_lock (); + id = g_new0 (Id, 1); /* Reserve id 0 */ id->id = ids [type]->len + 1; @@ -2256,10 +2267,11 @@ get_id (MonoDomain *domain, IdType type, gpointer val) id->data.val = val; g_hash_table_insert (info->val_to_id [type], val, id); + g_ptr_array_add (ids [type], id); - mono_domain_unlock (domain); + dbg_unlock (); - g_ptr_array_add (ids [type], id); + mono_domain_unlock (domain); mono_loader_unlock (); @@ -2281,11 +2293,11 @@ decode_ptr_id (guint8 *buf, guint8 **endbuf, guint8 *limit, IdType type, MonoDom return NULL; // FIXME: error handling - mono_loader_lock (); + dbg_lock (); g_assert (id > 0 && id <= ids [type]->len); res = g_ptr_array_index (ids [type], GPOINTER_TO_INT (id - 1)); - mono_loader_unlock (); + dbg_unlock (); if (res->domain == NULL) { DEBUG (0, fprintf (log_file, "ERR_UNLOADED, id=%d, type=%d.\n", id, type)); @@ -4057,9 +4069,9 @@ static void assembly_load (MonoProfiler *prof, MonoAssembly *assembly, int result) { /* Sent later in jit_end () */ - mono_loader_lock (); + dbg_lock (); g_ptr_array_add (pending_assembly_loads, assembly); - mono_loader_unlock (); + dbg_unlock (); } static void @@ -4180,12 +4192,12 @@ jit_end (MonoProfiler *prof, MonoMethod *method, MonoJitInfo *jinfo, int result) MonoAssembly *assembly = NULL; // FIXME: Maybe store this in TLS so the thread of the event is correct ? - mono_loader_lock (); + dbg_lock (); if (pending_assembly_loads->len > 0) { assembly = g_ptr_array_index (pending_assembly_loads, 0); g_ptr_array_remove_index (pending_assembly_loads, 0); } - mono_loader_unlock (); + dbg_unlock (); if (assembly) { process_profiler_event (EVENT_KIND_ASSEMBLY_LOAD, assembly); @@ -4313,9 +4325,12 @@ insert_breakpoint (MonoSeqPointInfo *seq_points, MonoDomain *domain, MonoJitInfo g_ptr_array_add (bp->children, inst); + mono_loader_unlock (); + + dbg_lock (); count = GPOINTER_TO_INT (g_hash_table_lookup (bp_locs, inst->ip)); g_hash_table_insert (bp_locs, inst->ip, GINT_TO_POINTER (count + 1)); - mono_loader_unlock (); + dbg_unlock (); if (sp->native_offset == SEQ_POINT_NATIVE_OFFSET_DEAD_CODE) { DEBUG (1, fprintf (log_file, "[dbg] Attempting to insert seq point at dead IL offset %d, ignoring.\n", (int)bp->il_offset)); @@ -4338,10 +4353,10 @@ remove_breakpoint (BreakpointInstance *inst) MonoJitInfo *ji = inst->ji; guint8 *ip = inst->ip; - mono_loader_lock (); + dbg_lock (); count = GPOINTER_TO_INT (g_hash_table_lookup (bp_locs, ip)); g_hash_table_insert (bp_locs, ip, GINT_TO_POINTER (count - 1)); - mono_loader_unlock (); + dbg_unlock (); g_assert (count > 0); From 3b130980064499fc736dd059ce13a0ab5d301ea0 Mon Sep 17 00:00:00 2001 From: Meai1 Date: Sat, 31 May 2014 12:36:50 +0200 Subject: [PATCH 010/694] Update README.md Add info on parallel installations which is going to be the case for 99% of people trying to compile and use mono from source. --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 07c950004d7..6d033c86540 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,10 @@ a. Build Requirements * libzlib - This library and the development headers are required for compression file support in the 2.0 profile. + 4. Mono is required to build Mono. Use a system package or mono-lite (explained further below) + + 5. Now that you most likely already have an existing system Mono installation you will need to read this: http://mono-project.com/Parallel_Mono_Environments#Setting_up_a_Build_Environment + b. Building the Software ------------------------ From a64dbc3e942a89c234bd4e7b4cfc1df9a43ce347 Mon Sep 17 00:00:00 2001 From: Miguel de Icaza Date: Sat, 31 May 2014 12:52:59 -0400 Subject: [PATCH 011/694] MemoryMappedFile fixes This patch includes a few fixes: * CreateNew will actually create a memory map file, the previous logic in MemoryMapImpl.Open was wrong, and would fail if the file did not exist. We now cope with this (bug #20052 was caused by this). * Some exceptions were wrong, so this patch updates the exceptions being thrown to be the right ones * On Mobile, we inverted the logic to ensure that capacity must be bigger or equal than the file size (which is what the API needs to do), previously it performed the opposite test. Added tests that match the behavior on .NET for this. --- .../MemoryMappedFile.cs | 86 +++++++++++++------ .../MemoryMappedFileTest.cs | 37 ++++++++ 2 files changed, 99 insertions(+), 24 deletions(-) diff --git a/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedFile.cs b/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedFile.cs index 20973c00c65..7fa4586a44b 100644 --- a/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedFile.cs +++ b/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedFile.cs @@ -25,7 +25,6 @@ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // - #if NET_4_0 using System; @@ -44,8 +43,21 @@ namespace System.IO.MemoryMappedFiles { + internal static partial class MemoryMapImpl { + static Exception ArgumentCapacity () + { + return new ArgumentException ("A positive capacity must be specified for a Memory Mapped File backed by an empty file."); + } + + static Exception CapacitySmallerThanSize () + { + return new ArgumentOutOfRangeException ("The capacity may not be smaller than the file size."); + } + } + + #if !MOBILE - internal static class MemoryMapImpl { + partial class MemoryMapImpl { // // Turns the FileMode into the first half of open(2) flags // @@ -121,25 +133,39 @@ internal static int Open (string path, FileMode mode, ref long capacity, MemoryM { if (MonoUtil.IsUnix){ Stat buf; - if (Syscall.stat (path, out buf) == -1) - UnixMarshal.ThrowExceptionForLastError (); - if (capacity == 0) { - // Special files such as FIFOs, sockets, and devices can - // have a size of 0. Specifying a capacity for these - // also makes little sense, so don't do the check if the - // file is one of these. - if (buf.st_size == 0 && - (buf.st_mode & (FilePermissions.S_IFCHR | - FilePermissions.S_IFBLK | - FilePermissions.S_IFIFO | - FilePermissions.S_IFSOCK)) == 0) { - throw new ArgumentException ("A positive capacity must be specified for a Memory Mapped File backed by an empty file."); - } + int result = Syscall.stat (path, out buf); - capacity = buf.st_size; - } else if (capacity < buf.st_size) { - throw new ArgumentException ("The capacity may not be smaller than the file size."); + if (mode == FileMode.Truncate || mode == FileMode.Append || mode == FileMode.Open){ + if (result == -1) + UnixMarshal.ThrowExceptionForLastError (); + } + if (mode == FileMode.CreateNew && result == 0) + throw new IOException ("The file already exists"); + + if (result == 0){ + if (capacity == 0) { + // Special files such as FIFOs, sockets, and devices can + // have a size of 0. Specifying a capacity for these + // also makes little sense, so don't do the check if the + // file is one of these. + if (buf.st_size == 0 && + (buf.st_mode & (FilePermissions.S_IFCHR | + FilePermissions.S_IFBLK | + FilePermissions.S_IFIFO | + FilePermissions.S_IFSOCK)) == 0) { + throw ArgumentCapacity (); + } + + capacity = buf.st_size; + } else if (capacity < buf.st_size) { + throw CapacitySmallerThanSize (); + } + } else { + if (mode == FileMode.CreateNew){ + if (capacity == 0) + throw ArgumentCapacity (); + } } int fd = Syscall.open (path, ToUnixMode (mode) | ToUnixMode (access), FilePermissions.DEFFILEMODE); @@ -232,7 +258,7 @@ internal static void ConfigureFD (IntPtr handle, HandleInheritability inheritabi } #else - internal static class MemoryMapImpl { + partial class MemoryMapImpl { [DllImport ("libc")] static extern int fsync (int fd); @@ -383,11 +409,23 @@ static void ThrowErrorFromErrno (int errno) internal static int Open (string path, FileMode mode, ref long capacity, MemoryMappedFileAccess access) { long file_size = mono_filesize_from_path (path); - if (file_size < 0) - throw new FileNotFoundException (path); - if (capacity > file_size) - throw new ArgumentException ("capacity"); + Console.WriteLine ("{0} is {1} big", path, file_size); + if (mode == FileMode.Truncate || mode == FileMode.Append || mode == FileMode.Open){ + if (file_size < 0) + throw new FileNotFoundException (path); + if (capacity == 0) + capacity = file_size; + if (capacity < file_size) + throw CapacitySmallerThanSize (); + } else { + if (mode == FileMode.CreateNew){ + if (file_size >= 0) + throw new IOException ("The file already exists"); + if (capacity == 0) + throw ArgumentCapacity (); + } + } int fd = open (path, ToUnixMode (mode) | ToUnixMode (access), DEFFILEMODE); diff --git a/mcs/class/System.Core/Test/System.IO.MemoryMappedFiles/MemoryMappedFileTest.cs b/mcs/class/System.Core/Test/System.IO.MemoryMappedFiles/MemoryMappedFileTest.cs index 8047da25ee2..5dee58b704b 100644 --- a/mcs/class/System.Core/Test/System.IO.MemoryMappedFiles/MemoryMappedFileTest.cs +++ b/mcs/class/System.Core/Test/System.IO.MemoryMappedFiles/MemoryMappedFileTest.cs @@ -92,6 +92,43 @@ public void Basic () { } } + [Test] + public void CreateNew () + { + // This must succeed + MemoryMappedFile.CreateNew (Path.Combine (tempDir, "createNew.test"), 8192); + } + + [Test] + [ExpectedException (typeof (IOException))] + public void CreateNew_OnExistingFile () + { + // This must succeed + MemoryMappedFile.CreateNew (Path.Combine (tempDir, "createNew.test"), 8192); + + // This should fail, the file exists + MemoryMappedFile.CreateNew (Path.Combine (tempDir, "createNew.test"), 8192); + } + + // Call this twice, it should always work + [Test] + public void CreateOrOpen_Multiple () + { + MemoryMappedFile.CreateOrOpen (Path.Combine (tempDir, "createOrOpen.test"), 8192); + MemoryMappedFile.CreateOrOpen (Path.Combine (tempDir, "createOrOpen.test"), 8192); + } + + [Test] + [ExpectedException(typeof(ArgumentOutOfRangeException))] + public void CreateFromFileWithSmallerCapacityThanFile () + { + var f = Path.Combine (tempDir, "8192-file"); + File.WriteAllBytes (f, new byte [8192]); + + // We are requesting fewer bytes to map. + MemoryMappedFile.CreateFromFile (f, FileMode.Open, "myMap", 4192); + } + [Test] public void CreateFromFile_Null () { AssertThrows (delegate () { From 91d14d4d5a763b26b2d5ad391484b236cbeb1f9e Mon Sep 17 00:00:00 2001 From: Meai1 Date: Sat, 31 May 2014 20:25:33 +0200 Subject: [PATCH 012/694] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6d033c86540..f42e3000815 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,9 @@ a. Build Requirements * libzlib - This library and the development headers are required for compression file support in the 2.0 profile. - 4. Mono is required to build Mono. Use a system package or mono-lite (explained further below) + 4. Mono is required to build Mono. Use a system package or monolite (explained further below) - 5. Now that you most likely already have an existing system Mono installation you will need to read this: http://mono-project.com/Parallel_Mono_Environments#Setting_up_a_Build_Environment + 5. If you have a system Mono (not monolite), you will need to read this: http://mono-project.com/Parallel_Mono_Environments#Setting_up_a_Build_Environment b. Building the Software ------------------------ From 5511ba6d611540cd7120443fa230d17cd2229337 Mon Sep 17 00:00:00 2001 From: Seth Jackson Date: Sun, 1 Jun 2014 10:46:56 -0400 Subject: [PATCH 013/694] Print the correct GC type if compiling using --with-gc=none. This change released under the MIT license. --- configure.ac | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index 1dbacb744f3..27808ae439f 100644 --- a/configure.ac +++ b/configure.ac @@ -1087,6 +1087,7 @@ case "x$gc" in AC_MSG_WARN("Compiling mono without GC.") AC_DEFINE_UNQUOTED(DEFAULT_GC_NAME, "none", [GC description]) AC_DEFINE(HAVE_NULL_GC,1,[No GC support.]) + gc_msg="none" ;; *) AC_MSG_ERROR([Invalid argument to --with-gc.]) From 7fee3f491b98dfb5bf443f620ce0cec4aea49101 Mon Sep 17 00:00:00 2001 From: Seth Jackson Date: Sun, 1 Jun 2014 11:08:32 -0400 Subject: [PATCH 014/694] Allow building with null-gc and sgen. Previously if --with-gc=none --with-sgen=yes was specified the sgen runtime would include the null GC and the sgen GC which would confuse the linker. This change released uner the MIT license. --- mono/metadata/Makefile.am.in | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mono/metadata/Makefile.am.in b/mono/metadata/Makefile.am.in index fa622832634..92fc55dc658 100644 --- a/mono/metadata/Makefile.am.in +++ b/mono/metadata/Makefile.am.in @@ -86,6 +86,9 @@ libmonoruntime_static_la_LIBADD = $(bundle_obj) $(libmonoruntime_la_LIBADD) null_sources = \ console-null.c +null_gc_sources = \ + null-gc.c + common_sources = \ $(platform_sources) \ assembly.c \ @@ -159,7 +162,6 @@ common_sources = \ monitor.h \ nacl-stub.c \ normalization-tables.h \ - null-gc.c \ number-formatter.h \ object-internals.h \ opcodes.c \ @@ -262,7 +264,7 @@ sgen_sources = \ sgen-qsort.c \ sgen-qsort.h -libmonoruntime_la_SOURCES = $(common_sources) $(gc_dependent_sources) $(boehm_sources) +libmonoruntime_la_SOURCES = $(common_sources) $(gc_dependent_sources) $(null_gc_sources) $(boehm_sources) libmonoruntime_la_CFLAGS = $(BOEHM_DEFINES) libmonoruntimesgen_la_SOURCES = $(common_sources) $(gc_dependent_sources) $(sgen_sources) From 203320edc96427056feb9ba88fc8c16c0bb2cafd Mon Sep 17 00:00:00 2001 From: Lucas Date: Sun, 1 Jun 2014 16:50:38 -0400 Subject: [PATCH 015/694] Null Exception in System.Security.Claims This fixed a runtime exception when trying to get a ClaimsPrincipal from an IIdentity. Noticed this work working with aspnet Identity in a Web Api 2 controller. Exception fired when running User.Identity.IsAuthenticated. Exception detail: http://falk.pw:7777/tocehuhemo.xml --- mcs/class/corlib/System.Security.Claims/ClaimsIdentity.cs | 8 +++++--- .../corlib/System.Security.Claims/ClaimsPrincipal.cs | 6 ++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/mcs/class/corlib/System.Security.Claims/ClaimsIdentity.cs b/mcs/class/corlib/System.Security.Claims/ClaimsIdentity.cs index 852e4f40085..7b62592da15 100644 --- a/mcs/class/corlib/System.Security.Claims/ClaimsIdentity.cs +++ b/mcs/class/corlib/System.Security.Claims/ClaimsIdentity.cs @@ -97,8 +97,10 @@ public ClaimsIdentity (IIdentity identity, IEnumerable claims, string aut foreach (var c in ci.Claims) this.claims.Add (c); - foreach (var c in claims) - this.claims.Add (c); + if (claims != null) { + foreach (var c in claims) + this.claims.Add (c); + } Label = ci.Label; NameClaimType = ci.NameClaimType; RoleClaimType = ci.RoleClaimType; @@ -264,4 +266,4 @@ public virtual bool TryRemoveClaim (Claim claim) } } } -#endif \ No newline at end of file +#endif diff --git a/mcs/class/corlib/System.Security.Claims/ClaimsPrincipal.cs b/mcs/class/corlib/System.Security.Claims/ClaimsPrincipal.cs index d3827b8d1a2..76fb35f2976 100644 --- a/mcs/class/corlib/System.Security.Claims/ClaimsPrincipal.cs +++ b/mcs/class/corlib/System.Security.Claims/ClaimsPrincipal.cs @@ -66,7 +66,9 @@ public ClaimsPrincipal (IIdentity identity) { if (identity == null) throw new ArgumentNullException ("identity"); - // TODO + + identities = new List (); + identities.Add (new ClaimsIdentity (identity)) } public ClaimsPrincipal (IPrincipal principal) @@ -187,4 +189,4 @@ public virtual bool IsInRole (string role) } } -#endif \ No newline at end of file +#endif From 19f48e7920a915c04a4a81e8859a1fd17cde32aa Mon Sep 17 00:00:00 2001 From: marcos henrich Date: Mon, 2 Jun 2014 08:21:08 +0100 Subject: [PATCH 016/694] Test that DeflateStream.Read does read an empty stream. Covers #19313. --- .../DeflateStreamTest.cs | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/mcs/class/System/Test/System.IO.Compression/DeflateStreamTest.cs b/mcs/class/System/Test/System.IO.Compression/DeflateStreamTest.cs index 61eda5b8030..84cc1c419ae 100644 --- a/mcs/class/System/Test/System.IO.Compression/DeflateStreamTest.cs +++ b/mcs/class/System/Test/System.IO.Compression/DeflateStreamTest.cs @@ -297,6 +297,35 @@ public void JunkAtTheEnd () } } } + + class Bug19313Stream : MemoryStream + { + public Bug19313Stream (byte [] buffer) + : base (buffer) + { + } + + public override int Read (byte [] buffer, int offset, int count) + { + // Thread was blocking when DeflateStream uses a NetworkStream. + // Because the NetworkStream.Read calls Socket.Receive that + // blocks the thread waiting for at least a byte to return. + // This assert guarantees that Read is called only when there + // is something to be read. + Assert.IsTrue (Position < Length, "Trying to read empty stream."); + + return base.Read (buffer, offset, count); + } + } + + [Test] + public void Bug19313 () + { + byte [] buffer = new byte [512]; + using (var backing = new Bug19313Stream (compressed_data)) + using (var decompressing = new DeflateStream (backing, CompressionMode.Decompress)) + decompressing.Read (buffer, 0, buffer.Length); + } } } From 6a6631d8838d2531ba16c31c7096011456c20fd2 Mon Sep 17 00:00:00 2001 From: marcos henrich Date: Mon, 2 Jun 2014 08:22:33 +0100 Subject: [PATCH 017/694] Removed DeflateStream.UnmanagedRead Read loop. Fixes #19313. If the base_stream was a NetworkStream UnmanagedRead loop would call base_stream.Read a second time and block until one byte was available to return. Without the loop UnmanagedRead will only read the base_stream once. --- .../System.IO.Compression/DeflateStream.cs | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/mcs/class/System/System.IO.Compression/DeflateStream.cs b/mcs/class/System/System.IO.Compression/DeflateStream.cs index 02c0c9f6b02..1a67e39e0c7 100644 --- a/mcs/class/System/System.IO.Compression/DeflateStream.cs +++ b/mcs/class/System/System.IO.Compression/DeflateStream.cs @@ -395,24 +395,15 @@ static int UnmanagedRead (IntPtr buffer, int length, IntPtr data) int UnmanagedRead (IntPtr buffer, int length) { - int total = 0; - int n = 1; - while (length > 0 && n > 0) { - if (io_buffer == null) - io_buffer = new byte [BufferSize]; + if (io_buffer == null) + io_buffer = new byte [BufferSize]; - int count = Math.Min (length, io_buffer.Length); - n = base_stream.Read (io_buffer, 0, count); - if (n > 0) { - Marshal.Copy (io_buffer, 0, buffer, n); - unsafe { - buffer = new IntPtr ((byte *) buffer.ToPointer () + n); - } - length -= n; - total += n; - } - } - return total; + int count = Math.Min (length, io_buffer.Length); + int n = base_stream.Read (io_buffer, 0, count); + if (n > 0) + Marshal.Copy (io_buffer, 0, buffer, n); + + return n; } #if MONOTOUCH From 029044a956ad631b96260d4ff59901ad2fbd58bb Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Wed, 28 May 2014 14:40:35 +0900 Subject: [PATCH 018/694] [ms.build] pass DefaultToolsVersion from ProjectInstance to build request data. --- .../Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs index cb6badde216..46cf573e631 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs @@ -435,6 +435,7 @@ public bool Build (string[] targets, IEnumerable loggers, IEnumerable Date: Wed, 28 May 2014 14:44:00 +0900 Subject: [PATCH 019/694] [ms.build] several fixes in BuildEngine4. - InitialTargets also need to be executed. - toolsVersion must be filled. - HostServices object is also passed from the parent build. --- .../Microsoft.Build.Internal/BuildEngine4.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs index 4540fa0f312..844b44df502 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs @@ -127,8 +127,10 @@ void BuildProject (InternalBuildArguments args) LogMessageEvent (new BuildMessageEventArgs (initialItemsFormatted, null, null, MessageImportance.Low)); // null targets -> success. empty targets -> success(!) + foreach (var targetName in (request.ProjectInstance.InitialTargets).Where (t => t != null)) + BuildTargetByName (targetName, args); if (request.TargetNames == null) - args.Result.OverallResult = BuildResultCode.Success; + args.Result.OverallResult = args.CheckCancel () ? BuildResultCode.Failure : args.Result.ResultsByTarget.Any (p => p.Value.ResultCode == TargetResultCode.Failure) ? BuildResultCode.Failure : BuildResultCode.Success; else { foreach (var targetName in (args.TargetNames ?? request.TargetNames).Where (t => t != null)) BuildTargetByName (targetName, args); @@ -574,10 +576,11 @@ public void Yield () // To NOT reuse this IBuildEngine instance for different build, we create another BuildManager and BuildSubmisson and then run it. public bool BuildProjectFile (string projectFileName, string[] targetNames, IDictionary globalProperties, IDictionary targetOutputs, string toolsVersion) { + toolsVersion = string.IsNullOrEmpty (toolsVersion) ? project.ToolsVersion : toolsVersion; var globalPropertiesThatMakeSense = new Dictionary (); foreach (DictionaryEntry p in globalProperties) globalPropertiesThatMakeSense [(string) p.Key] = (string) p.Value; - var result = new BuildManager ().Build (this.submission.BuildManager.OngoingBuildParameters.Clone (), new BuildRequestData (projectFileName, globalPropertiesThatMakeSense, toolsVersion, targetNames, null)); + var result = new BuildManager ().Build (this.submission.BuildManager.OngoingBuildParameters.Clone (), new BuildRequestData (projectFileName, globalPropertiesThatMakeSense, toolsVersion, targetNames ?? new String [0], this.submission.BuildRequest.HostServices)); foreach (var p in result.ResultsByTarget) targetOutputs [p.Key] = p.Value.Items; return result.OverallResult == BuildResultCode.Success; From ce1d55ff605e56241d56ab4bdecf34c246b38e65 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Thu, 29 May 2014 02:17:39 +0900 Subject: [PATCH 020/694] [MS.Build] load ImportGroup in root. --- .../Microsoft.Build.Construction/ProjectRootElement.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Construction/ProjectRootElement.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Construction/ProjectRootElement.cs index d7d5d77249b..c9bcf5cdda4 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Construction/ProjectRootElement.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Construction/ProjectRootElement.cs @@ -533,6 +533,8 @@ internal override ProjectElement LoadChildElement (XmlReader reader) var item = CreateItemGroupElement (); AppendChild (item); return item; + case "ImportGroup": + return AddImportGroup (); case "Import": return AddImport (null); case "Target": From f2d143e6c39248d0226e0767230ca51633f49e21 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Thu, 29 May 2014 18:29:00 +0900 Subject: [PATCH 021/694] [MS.Build] ProjectInstance needs ChildrenReversed to evaluate items. This behavioral difference between ProjectRootElement, Project and ProjectInstance was discovered while trying to get F# project working (where item order significantly matters). --- .../Microsoft.Build.Execution/ProjectInstance.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs index 46cf573e631..04c70b14126 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs @@ -192,7 +192,7 @@ void ProcessXml (ProjectRootElement xml) // At first step, all non-imported properties are evaluated TOO, WHILE those properties are being evaluated. // This means, Include and IncludeGroup elements with Condition attribute MAY contain references to // properties and they will be expanded. - var elements = EvaluatePropertiesAndUsingTasksAndImportsAndChooses (xml.Children).ToArray (); // ToArray(): to not lazily evaluate elements. + var elements = EvaluatePropertiesAndUsingTasksAndImportsAndChooses (xml.ChildrenReversed).ToArray (); // ToArray(): to not lazily evaluate elements. // next, evaluate items EvaluateItems (xml, elements); From 30414940d2e55878408e5ce180d566bf01ac3498 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Thu, 29 May 2014 19:07:54 +0900 Subject: [PATCH 022/694] [MS.Build] revise previous fix; only Items are in reverse order. The previous change regressed at order of property evaluation. Now this fix does not regress as well as F# project still builds. --- .../Microsoft.Build.Execution/ProjectInstance.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs index 04c70b14126..ee8b24f417d 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs @@ -192,7 +192,7 @@ void ProcessXml (ProjectRootElement xml) // At first step, all non-imported properties are evaluated TOO, WHILE those properties are being evaluated. // This means, Include and IncludeGroup elements with Condition attribute MAY contain references to // properties and they will be expanded. - var elements = EvaluatePropertiesAndUsingTasksAndImportsAndChooses (xml.ChildrenReversed).ToArray (); // ToArray(): to not lazily evaluate elements. + var elements = EvaluatePropertiesAndUsingTasksAndImportsAndChooses (xml.Children).ToArray (); // ToArray(): to not lazily evaluate elements. // next, evaluate items EvaluateItems (xml, elements); @@ -256,7 +256,7 @@ internal IEnumerable GetAllItems (string include, string exclude, Func elements) { - foreach (var child in elements) { + foreach (var child in elements.Reverse ()) { var ige = child as ProjectItemGroupElement; if (ige != null) { foreach (var p in ige.Items) { From d86c100d20687b4e663e84bbb15683ae5a90b47a Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Thu, 29 May 2014 19:26:26 +0900 Subject: [PATCH 023/694] [MS.Build] make env. properties are read only, and show initial properties in different manner. Now it's easier to see project properties and other properties. --- .../Microsoft.Build.Execution/ProjectInstance.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs index ee8b24f417d..00d9802134c 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Execution/ProjectInstance.cs @@ -164,7 +164,7 @@ void InitializeProperties (ProjectRootElement xml) // FIXME: this is kind of workaround for unavoidable issue that PLATFORM=* is actually given // on some platforms and that prevents setting default "PLATFORM=AnyCPU" property. if (!string.Equals ("PLATFORM", (string) p.Key, StringComparison.OrdinalIgnoreCase)) - this.properties [(string) p.Key] = new ProjectPropertyInstance ((string) p.Key, false, (string) p.Value); + this.properties [(string) p.Key] = new ProjectPropertyInstance ((string) p.Key, true, (string) p.Value); foreach (var p in global_properties) this.properties [p.Key] = new ProjectPropertyInstance (p.Key, false, p.Value); var tools = projects.GetToolset (tools_version) ?? projects.GetToolset (projects.DefaultToolsVersion); From 95405ddfdf12ac4a6fc71845d931599a9fad2c1f Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Thu, 29 May 2014 19:27:12 +0900 Subject: [PATCH 024/694] [MS.Build] simplify IBuildEngine.Build() implementation, and build the argument project, not the project that is being built by the BuildManager. That was wrong recursion. --- .../Microsoft.Build.Internal/BuildEngine4.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs index 844b44df502..249ac90cd55 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs @@ -37,6 +37,7 @@ using System.Globalization; using Microsoft.Build.Construction; using Microsoft.Build.Internal.Expressions; +using System.Xml; namespace Microsoft.Build.Internal { @@ -121,8 +122,10 @@ void BuildProject (InternalBuildArguments args) try { - var initialPropertiesFormatted = "Initial Properties:\n" + string.Join (Environment.NewLine, project.Properties.OrderBy (p => p.Name).Select (p => string.Format ("{0} = {1}", p.Name, p.EvaluatedValue)).ToArray ()); - LogMessageEvent (new BuildMessageEventArgs (initialPropertiesFormatted, null, null, MessageImportance.Low)); + var initialGlobalPropertiesFormatted = "Initial Global Properties:\n" + string.Join (Environment.NewLine, project.Properties.OrderBy (p => p.Name).Where (p => p.IsImmutable).Select (p => string.Format ("{0} = {1}", p.Name, p.EvaluatedValue)).ToArray ()); + LogMessageEvent (new BuildMessageEventArgs (initialGlobalPropertiesFormatted, null, null, MessageImportance.Low)); + var initialProjectPropertiesFormatted = "Initial Project Properties:\n" + string.Join (Environment.NewLine, project.Properties.OrderBy (p => p.Name).Where (p => !p.IsImmutable).Select (p => string.Format ("{0} = {1}", p.Name, p.EvaluatedValue)).ToArray ()); + LogMessageEvent (new BuildMessageEventArgs (initialProjectPropertiesFormatted, null, null, MessageImportance.Low)); var initialItemsFormatted = "Initial Items:\n" + string.Join (Environment.NewLine, project.Items.OrderBy (i => i.ItemType).Select (i => string.Format ("{0} : {1}", i.ItemType, i.EvaluatedInclude)).ToArray ()); LogMessageEvent (new BuildMessageEventArgs (initialItemsFormatted, null, null, MessageImportance.Low)); @@ -580,10 +583,12 @@ public bool BuildProjectFile (string projectFileName, string[] targetNames, IDic var globalPropertiesThatMakeSense = new Dictionary (); foreach (DictionaryEntry p in globalProperties) globalPropertiesThatMakeSense [(string) p.Key] = (string) p.Value; - var result = new BuildManager ().Build (this.submission.BuildManager.OngoingBuildParameters.Clone (), new BuildRequestData (projectFileName, globalPropertiesThatMakeSense, toolsVersion, targetNames ?? new String [0], this.submission.BuildRequest.HostServices)); - foreach (var p in result.ResultsByTarget) - targetOutputs [p.Key] = p.Value.Items; - return result.OverallResult == BuildResultCode.Success; + var projectToBuild = new ProjectInstance (ProjectRootElement.Create (XmlReader.Create (projectFileName)), globalPropertiesThatMakeSense, toolsVersion, Projects); + IDictionary outs; + var ret = projectToBuild.Build (targetNames ?? new string [] {"Build"}, Projects.Loggers, out outs); + foreach (var p in outs) + targetOutputs [p.Key] = p.Value.Items ?? new ITaskItem [0]; + return ret; } public bool BuildProjectFilesInParallel (string[] projectFileNames, string[] targetNames, IDictionary[] globalProperties, IDictionary[] targetOutputsPerProject, string[] toolsVersion, bool useResultsCache, bool unloadProjectsOnCompletion) From 331215cfb6618e5cc21dd32a89c718505cec3285 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Fri, 30 May 2014 14:05:34 +0900 Subject: [PATCH 025/694] [ms.build] make sure that we don't skip any other kind of child under target element. --- .../Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs index 249ac90cd55..3bdb9bb6f92 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs @@ -258,6 +258,7 @@ bool DoBuildTarget (ProjectTargetInstance target, TargetResult targetResult, Int var value = args.Project.ExpandString (p.Value); project.SetProperty (p.Name, value); } + continue; } var ii = child as ProjectItemGroupTaskInstance; @@ -269,6 +270,7 @@ bool DoBuildTarget (ProjectTargetInstance target, TargetResult targetResult, Int continue; project.AddItem (item.ItemType, project.ExpandString (item.Include)); } + continue; } var task = child as ProjectTaskInstance; @@ -280,7 +282,10 @@ bool DoBuildTarget (ProjectTargetInstance target, TargetResult targetResult, Int } if (!RunBuildTask (target, task, targetResult, args)) return false; + continue; } + + throw new NotSupportedException (string.Format ("Unexpected Target element children \"{0}\"", child.GetType ())); } } catch (Exception ex) { // fallback task specified by OnError element From c0cb2bee545c3da79683832193b2d1df8b64fc4b Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Fri, 30 May 2014 16:32:28 +0900 Subject: [PATCH 026/694] [MS.Build] fix function call expression parsing wrt nested refs: $(X('$(Y)','$(Z)')) Nested references inside quoted strings are not parsed correctly. To resolve this issue, parse quoted expressions in more complicated way. --- .../ExpressionConstructs.cs | 10 +++++ .../ExpressionEvaluator.cs | 28 ++++++++++++- .../ExpressionParserManual.cs | 42 +++++++++++++++++-- 3 files changed, 74 insertions(+), 6 deletions(-) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionConstructs.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionConstructs.cs index 587db749621..6cd0b1670e2 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionConstructs.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionConstructs.cs @@ -212,6 +212,16 @@ public string ExpressionString { get { return string.Format ("%([{0}].[{1}])", ItemType, Metadata); } } } + + partial class QuotedExpression : Expression + { + public char QuoteChar { get; set; } + public ExpressionList Contents { get; set; } + + public override string ExpressionString { + get { return QuoteChar + string.Concat (Contents.Select (e => e.ExpressionString)).Replace (QuoteChar.ToString (), "\\" + QuoteChar) + QuoteChar; } + } + } partial class StringLiteral : Expression { diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionEvaluator.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionEvaluator.cs index 696447c8842..51a9cc49f10 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionEvaluator.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionEvaluator.cs @@ -346,12 +346,12 @@ object DoEvaluateAsObject (EvaluationContext context) var args = Access.Arguments.Select (e => e.EvaluateAsObject (context)).ToArray (); var method = FindMethod (type, Access.Name.Name, args); if (method == null) - throw new InvalidProjectFileException (Location, string.Format ("access to undefined static method '{0}' of '{1}' at {2}", Access.Name.Name, Access.Target.EvaluateAsString (context), Location)); + throw new InvalidProjectFileException (Location, string.Format ("access to undefined static method '{0}' of '{1}' at {2}", Access.Name.Name, type, Location)); return method.Invoke (null, AdjustArgsForCall (method, args)); } else { var prop = type.GetProperty (Access.Name.Name); if (prop == null) - throw new InvalidProjectFileException (Location, string.Format ("access to undefined static property '{0}' of '{1}' at {2}", Access.Name.Name, Access.Target.EvaluateAsString (context), Location)); + throw new InvalidProjectFileException (Location, string.Format ("access to undefined static property '{0}' of '{1}' at {2}", Access.Name.Name, type, Location)); return prop.GetValue (null, null); } } @@ -491,6 +491,30 @@ public override object EvaluateAsObject (EvaluationContext context) return EvaluateAsString (context); } } + + partial class QuotedExpression : Expression + { + public override string EvaluateAsString (EvaluationContext context) + { + return QuoteChar + EvaluateAsStringWithoutQuote (context) + QuoteChar; + } + + public string EvaluateAsStringWithoutQuote (EvaluationContext context) + { + return string.Concat (Contents.Select (e => e.EvaluateAsString (context))); + } + + public override bool EvaluateAsBoolean (EvaluationContext context) + { + var ret = EvaluateAsStringWithoutQuote (context); + return EvaluateStringAsBoolean (context, ret); + } + + public override object EvaluateAsObject (EvaluationContext context) + { + return EvaluateAsString (context); + } + } partial class FunctionCallExpression : Expression { diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionParserManual.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionParserManual.cs index a8c7dc4d61d..44977abf9af 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionParserManual.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionParserManual.cs @@ -101,7 +101,23 @@ Expression ParseSingle (ref int start, int end) ret = EvaluateItemExpression (start, last); start = last + 1; return ret; - + + case '\'': + case '"': + var quoteChar = source [start]; + start++; + last = FindMatchingCloseQuote (quoteChar, start, end); + if (last < 0) { + if (validation_type == ExpressionValidationType.StrictBoolean) + throw new InvalidProjectFileException (string.Format ("expression did not have matching ')' since index {0} in \"{1}\"", start, source)); + else { + start--; + goto default; // treat as raw literal to the section end + } + } + ret = new QuotedExpression () { QuoteChar = quoteChar, Contents = Parse (start, last) }; + start = last + 1; + return ret; // Below (until default) are important only for Condition evaluation case '(': if (validation_type == ExpressionValidationType.LaxString) @@ -134,7 +150,7 @@ Expression ParseSingle (ref int start, int end) return ret; } } - + int FindMatchingCloseParen (int start, int end) { int n = 0; @@ -148,7 +164,21 @@ int FindMatchingCloseParen (int start, int end) } return -1; // invalid } - + + int FindMatchingCloseQuote (char quote, int start, int end) + { + int n = 0; + for (int i = start; i < end; i++) { + if (i < end + 1 && source [i] == '\\' && source [i + 1] == quote) + n += 2; + else if (source [i] == quote) { + if (n-- == 0) + return i; + } + } + return -1; // invalid + } + static readonly string spaces = " \t\r\n"; void SkipSpaces (ref int start) @@ -166,6 +196,7 @@ PropertyAccessExpression EvaluatePropertyExpression (int start, int end) // property access without member specification int parenAt = source.IndexOf ('(', start, end - start); string name = parenAt < 0 ? source.Substring (start, end - start) : source.Substring (start, parenAt - start); + name = name.Trim (); var access = new PropertyAccess () { Name = new NameToken () { Name = name }, TargetType = PropertyTargetType.Object @@ -181,6 +212,7 @@ PropertyAccessExpression EvaluatePropertyExpression (int start, int end) int mstart = dotAt + 1; int parenAt = source.IndexOf ('(', mstart, end - mstart); string name = parenAt < 0 ? source.Substring (mstart, end - mstart) : source.Substring (mstart, parenAt - mstart); + name = name.Trim (); var access = new PropertyAccess () { Name = new NameToken () { Name = name }, TargetType = PropertyTargetType.Object, @@ -196,10 +228,11 @@ PropertyAccessExpression EvaluatePropertyExpression (int start, int end) string type = source.Substring (start, colonsAt - start); if (type.Length < 2 || type [0] != '[' || type [type.Length - 1] != ']') throw new InvalidProjectFileException (string.Format ("Static function call misses appropriate type name surrounded by '[' and ']' at {0} in \"{1}\"", start, source)); - type = type.Substring (1, type.Length - 2); + type = type.Substring (1, type.Length - 2).Trim (); start = colonsAt + 2; int parenAt = source.IndexOf ('(', start, end - start); string member = parenAt < 0 ? source.Substring (start, end - start) : source.Substring (start, parenAt - start); + member = member.Trim (); if (member.Length == 0) throw new InvalidProjectFileException ("Static member name is missing"); var access = new PropertyAccess () { @@ -228,6 +261,7 @@ ExpressionList ParseFunctionArguments (ref int start, int end) if (source [start] != ',') throw new InvalidProjectFileException (string.Format ("invalid function call arguments specification. ',' is expected, got '{0}'", source [start])); start++; + SkipSpaces (ref start); } args.Add (ParseSingle (ref start, end)); } while (true); From 57370802bcd193562578639167c0f7529d69b318 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Fri, 30 May 2014 17:24:34 +0900 Subject: [PATCH 027/694] [MS.Build] '\\' is also escaped syntax, so parse it carefully too. --- .../Microsoft.Build.Internal/ExpressionParserManual.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionParserManual.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionParserManual.cs index 44977abf9af..bd01586c295 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionParserManual.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionParserManual.cs @@ -169,7 +169,7 @@ int FindMatchingCloseQuote (char quote, int start, int end) { int n = 0; for (int i = start; i < end; i++) { - if (i < end + 1 && source [i] == '\\' && source [i + 1] == quote) + if (i < end + 1 && source [i] == '\\' && (source [i + 1] == quote || source [i + 1] == '\\')) n += 2; else if (source [i] == quote) { if (n-- == 0) From 5a23a8263c6f0edbc49b1072f424b9ce782e37e6 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Fri, 30 May 2014 17:25:20 +0900 Subject: [PATCH 028/694] [MS.Build] add function call releated tests. --- .../ProjectInstanceTest.cs | 18 ++++++++++++++++++ .../ExpressionParserTest.cs | 16 ++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs b/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs index 44157a84444..c7a736436f6 100644 --- a/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs +++ b/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs @@ -291,6 +291,24 @@ public void Choose () Assert.IsNotNull (p, "#1"); Assert.AreEqual ("False", p.EvaluatedValue, "#2"); } + + [Test] + public void ConditionalExpression () + { + string project_xml = @" + + true + $(ResolveAssemblyReferencesDependsOn);_AddCorlibReference + +"; + var xml = XmlReader.Create (new StringReader (project_xml)); + var root = ProjectRootElement.Create (xml); + root.FullPath = "ProjectInstanceTest.ConditionalExpression.proj"; + var proj = new ProjectInstance (root); + var p = proj.GetProperty ("ResolveAssemblyReferencesDependsOn"); + Assert.IsNotNull (p, "#1"); + Assert.AreEqual (";_AddCorlibReference", p.EvaluatedValue, "#2"); + } } namespace SubNamespace diff --git a/mcs/class/Microsoft.Build/Test/Microsoft.Build.Internal/ExpressionParserTest.cs b/mcs/class/Microsoft.Build/Test/Microsoft.Build.Internal/ExpressionParserTest.cs index ebd662e249f..16694f76225 100644 --- a/mcs/class/Microsoft.Build/Test/Microsoft.Build.Internal/ExpressionParserTest.cs +++ b/mcs/class/Microsoft.Build/Test/Microsoft.Build.Internal/ExpressionParserTest.cs @@ -335,6 +335,22 @@ public void MultipleBinaryCondition () var result = p.Build (new ILogger [] { new ConsoleLogger (LoggerVerbosity.Minimal, sw.WriteLine, null, null)}); Assert.IsTrue (result, "#1: " + sw); } + + [Test] + public void FunctionCall () + { + string project_xml = @" + + + +"; + var xml = XmlReader.Create (new StringReader (project_xml)); + var root = ProjectRootElement.Create (xml); + var p = new ProjectInstance (root, null, "4.0", ProjectCollection.GlobalProjectCollection); + var sw = new StringWriter (); + var result = p.Build (new ILogger [] { new ConsoleLogger (LoggerVerbosity.Minimal, sw.WriteLine, null, null)}); + Assert.IsTrue (result, "#1: " + sw); + } } } From eb898301e57a5a88cc3908af09177d7c046ff47a Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Fri, 30 May 2014 20:20:32 +0900 Subject: [PATCH 029/694] [MS.Build] fix some issues around quoted string handling. Since the parser didn't really detect those quotation chars unless they are top of the next tokeniation, it was always starting from wrong position. --- .../Microsoft.Build.Internal/ExpressionParserManual.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionParserManual.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionParserManual.cs index bd01586c295..73bac64445e 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionParserManual.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionParserManual.cs @@ -60,14 +60,13 @@ ExpressionList Parse (int start, int end) while (start < end) { int bak = start; ret.Add (ParseSingle (ref start, end)); - SkipSpaces (ref start); if (bak == start) throw new Exception ("Parser failed to progress token position: " + source); } return ret; } - static readonly char [] token_starters = "$@%(),".ToCharArray (); + static readonly char [] token_starters = "$@%(),'\"".ToCharArray (); Expression ParseSingle (ref int start, int end) { From 867c2e5f31e0fe220a6742700483373a8b653728 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Mon, 2 Jun 2014 16:44:30 +0900 Subject: [PATCH 030/694] [xbuild] ToolLocationHelper.GetPathToStandardLibraries() skips "" too. Test is added too, but since it requires some environment setup, I didn't enable it so far. --- .../ToolLocationHelper.cs | 5 ++--- ...Microsoft.Build.Utilities_test.dll.sources | 1 + .../ToolLocationHelperTest.cs | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/ToolLocationHelperTest.cs diff --git a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolLocationHelper.cs b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolLocationHelper.cs index 7717a1f9ee0..f3aa310c09b 100644 --- a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolLocationHelper.cs +++ b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolLocationHelper.cs @@ -190,9 +190,9 @@ static string GetPathToStandardLibrariesWith (string xbuildFxDir, string targetFrameworkProfile) { var path = Path.Combine (xbuildFxDir, targetFrameworkIdentifier); - if (targetFrameworkVersion != null) { + if (!string.IsNullOrEmpty (targetFrameworkVersion)) { path = Path.Combine (path, targetFrameworkVersion); - if (targetFrameworkProfile != null) + if (!string.IsNullOrEmpty (targetFrameworkProfile)) path = Path.Combine (path, "Profile", targetFrameworkProfile); } if (!Directory.Exists (path)) @@ -200,7 +200,6 @@ static string GetPathToStandardLibrariesWith (string xbuildFxDir, var flist = Path.Combine (path, "RedistList", "FrameworkList.xml"); if (!File.Exists (flist)) return null; - var xml = XmlReader.Create (flist); xml.MoveToContent (); var targetFxDir = xml.GetAttribute ("TargetFrameworkDirectory"); diff --git a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities_test.dll.sources b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities_test.dll.sources index b1a3758e980..4e2248a2d48 100644 --- a/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities_test.dll.sources +++ b/mcs/class/Microsoft.Build.Utilities/Microsoft.Build.Utilities_test.dll.sources @@ -2,4 +2,5 @@ Microsoft.Build.Utilities/CommandLineBuilderTest.cs Microsoft.Build.Utilities/LoggerTest.cs Microsoft.Build.Utilities/TaskItemTest.cs Microsoft.Build.Utilities/TaskLoggingHelperTest.cs +Microsoft.Build.Utilities/ToolLocationHelperTest.cs Microsoft.Build.Utilities/ToolTaskTest.cs diff --git a/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/ToolLocationHelperTest.cs b/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/ToolLocationHelperTest.cs new file mode 100644 index 00000000000..574b282ac90 --- /dev/null +++ b/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/ToolLocationHelperTest.cs @@ -0,0 +1,19 @@ +using System; +using NUnit.Framework; +using Microsoft.Build.Utilities; + +namespace MonoTests.Microsoft.Build.Utilities +{ + [TestFixture] + public class ToolLocationHelperTest + { + [Test] + [Category ("NotWorking")] // this test needs extra xbuild testing settings, as the target framework path is different. + public void GetPathToStandardLibraries () + { + Assert.IsTrue (!string.IsNullOrEmpty (ToolLocationHelper.GetPathToStandardLibraries (".NETFramework", "v4.0", null)), "std path"); + Assert.IsTrue (!string.IsNullOrEmpty (ToolLocationHelper.GetPathToStandardLibraries (".NETFramework", "v4.0", string.Empty)), "empty Profile path"); + } + } +} + From 756f3740c2f4d8c7767099b485c4f719251da0da Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Mon, 2 Jun 2014 16:45:37 +0900 Subject: [PATCH 031/694] [MS.Build] when evaluated as object, do not add extra quotes. When the object is passed as argument to property function, it gets extra " or ' and could result in unexpected value. --- .../Microsoft.Build.Internal/ExpressionEvaluator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionEvaluator.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionEvaluator.cs index 51a9cc49f10..7fbd1cf5542 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionEvaluator.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/ExpressionEvaluator.cs @@ -512,7 +512,7 @@ public override bool EvaluateAsBoolean (EvaluationContext context) public override object EvaluateAsObject (EvaluationContext context) { - return EvaluateAsString (context); + return EvaluateAsStringWithoutQuote (context); } } From c29ae4c3e1bb5f62a243080898002cd6623ce92d Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Mon, 2 Jun 2014 16:47:38 +0900 Subject: [PATCH 032/694] [MS.Build] added test for ToolLocationHelper.GetPathToStandardLibraries() to add target item. It should be used in Microsoft.CSharp.targets to pass the path to mscorlib.dll but it's not working yet, so I'm making it to work step by step. --- .../ProjectInstanceTest.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs b/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs index c7a736436f6..6ee4cfe24c6 100644 --- a/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs +++ b/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs @@ -309,6 +309,37 @@ public void ConditionalExpression () Assert.IsNotNull (p, "#1"); Assert.AreEqual (";_AddCorlibReference", p.EvaluatedValue, "#2"); } + + [Test] + public void ItemsInTargets () + { + string project_xml = @" + + + <_ExplicitMSCorlibPath>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToStandardLibraries ('$(TargetFrameworkIdentifier)', '$(TargetFrameworkVersion)', '$(TargetFrameworkProfile)'))\mscorlib.dll + + + <_ExplicitReference + Include='$(_ExplicitMSCorlibPath)' + Condition='Exists($(_ExplicitMSCorlibPath))'> + false + + + + +"; + var xml = XmlReader.Create (new StringReader (project_xml)); + var root = ProjectRootElement.Create (xml); + root.FullPath = "ProjectInstanceTest.ConditionalExpression.proj"; + var proj = new ProjectInstance (root, null, "4.0", ProjectCollection.GlobalProjectCollection); + proj.Build (); + // make sure the property value expansion is done successfully. + Assert.IsTrue (!string.IsNullOrEmpty (proj.GetPropertyValue ("_ExplicitMSCorlibPath")), "premise: propertyValue by ToolLocationHelper func call"); + var items = proj.GetItems ("_ExplicitReference"); + // make sure items are stored after build. + Assert.IsTrue (items.Any (), "items.Any"); + Assert.IsTrue (!string.IsNullOrEmpty (items.First ().EvaluatedInclude), "item.EvaluatedInclude"); + } } namespace SubNamespace From 8498e0dbcc1a202266f9b50eaeac99b48fc83402 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Mon, 2 Jun 2014 17:48:00 +0900 Subject: [PATCH 033/694] [MS.Build] ProjectOnErrorInstance should not cause build failure. --- .../Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs index 3bdb9bb6f92..1f501683ce2 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs @@ -285,6 +285,10 @@ bool DoBuildTarget (ProjectTargetInstance target, TargetResult targetResult, Int continue; } + var onError = child as ProjectOnErrorInstance; + if (onError != null) + continue; // evaluated under catch clause. + throw new NotSupportedException (string.Format ("Unexpected Target element children \"{0}\"", child.GetType ())); } } catch (Exception ex) { From 001edf133e28d191463e466fb62100e00e82b4bd Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Fri, 30 May 2014 20:17:05 +0900 Subject: [PATCH 034/694] [msbuild] build the projects via MSBuild task with appropriate configuration, not the entire projects in the solution. --- mcs/tools/msbuild/Main.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mcs/tools/msbuild/Main.cs b/mcs/tools/msbuild/Main.cs index 2d20ebfc974..bc70334412c 100644 --- a/mcs/tools/msbuild/Main.cs +++ b/mcs/tools/msbuild/Main.cs @@ -160,9 +160,9 @@ public void Execute () if (string.Equals (Path.GetExtension (projectFile), ".sln", StringComparison.OrdinalIgnoreCase)) { var parser = new SolutionParser (); var root = ProjectRootElement.Create (project_collection); + root.FullPath = projectFile; parser.ParseSolution (projectFile, project_collection, root, LogWarning); - foreach (var p in project_collection.LoadedProjects) - projectInstances.Add (p.CreateProjectInstance ()); + projectInstances.Add (new Project (root, parameters.Properties, parameters.ToolsVersion, project_collection).CreateProjectInstance ()); } else { project = ProjectRootElement.Create (XmlReader.Create (projectFile, settings), project_collection); project.FullPath = projectFile; @@ -170,7 +170,7 @@ public void Execute () projectInstances.Add (pi); } foreach (var projectInstance in projectInstances) { - var targets = parameters.Targets.Length == 0 ? projectInstance.DefaultTargets.ToArray () : parameters.Targets; + var targets = parameters.Targets.Length > 0 ? parameters.Targets : projectInstance.DefaultTargets.ToArray (); result = projectInstance.Build (targets, parameters.Loggers.Count > 0 ? parameters.Loggers : project_collection.Loggers); if (!result) break; From 526557962830642f30c12c8ffa18cf29a9d21f75 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Mon, 2 Jun 2014 19:25:17 +0900 Subject: [PATCH 035/694] [xbuild] fix 4.0-only test condition. --- .../Test/Microsoft.Build.Utilities/ToolLocationHelperTest.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/ToolLocationHelperTest.cs b/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/ToolLocationHelperTest.cs index 574b282ac90..fbb567d2827 100644 --- a/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/ToolLocationHelperTest.cs +++ b/mcs/class/Microsoft.Build.Utilities/Test/Microsoft.Build.Utilities/ToolLocationHelperTest.cs @@ -1,4 +1,5 @@ -using System; +#if NET_4_0 +using System; using NUnit.Framework; using Microsoft.Build.Utilities; @@ -17,3 +18,4 @@ public void GetPathToStandardLibraries () } } +#endif From 1b41fd76350367453c8100f8bd0e7242105c6d39 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Mon, 2 Jun 2014 19:21:48 +0900 Subject: [PATCH 036/694] [MS.Build] add MS.Build.dll-specific well-known property, to differentiate from MS.Build.Engine. --- .../Microsoft.Build.Evaluation/ProjectCollection.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Evaluation/ProjectCollection.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Evaluation/ProjectCollection.cs index 4c776657334..4170fa00253 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Evaluation/ProjectCollection.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Evaluation/ProjectCollection.cs @@ -494,6 +494,11 @@ IEnumerable GetReservedProperties (Toolset toolset, ProjectRootElement pro }); yield return create ("MSBuildToolsPath", () => toolset.ToolsPath); yield return create ("MSBuildToolsVersion", () => toolset.ToolsVersion); + + // This is an implementation specific special property for this Microsoft.Build.dll to differentiate + // the build from Microsoft.Build.Engine.dll. It is significantly used in some *.targets file we share + // between old and new build engine. + yield return create ("MonoUseMicrosoftBuildDll", () => "True"); } // These are required for reserved property, represents dynamically changing property values. From 992fd970ebc464136b39a0aff930b70a30261dd5 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Mon, 2 Jun 2014 19:26:14 +0900 Subject: [PATCH 037/694] [msbuild/xbuild] use ToolLocationHelper.GetPathToStandardLibraries() to get corlib path, for new build engine. This is enabled only with Microsoft.Build.dll because property function support is not fully implemented in MS.Build.Engine.dll and simply fails. Since the targets files are shared between xbuild and msbuild, I added some well-known property for msbuild and used it in the targets file. --- mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets | 13 ++++++++++++- mcs/tools/xbuild/data/4.0/Microsoft.CSharp.targets | 13 ++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets b/mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets index 0936512b577..3212b77f41d 100644 --- a/mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets +++ b/mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets @@ -31,11 +31,22 @@ directories for mscorlib.dll by constructing a filtered item set, and assume it only has one item. --> - + <_ExplicitReference Include="@(_TargetFrameworkDirectories->'%(FullPath)\mscorlib.dll')" Condition="Exists('%(FullPath)\mscorlib.dll')"> false + + <_ExplicitMSCorlibPath>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToStandardLibraries ('$(TargetFrameworkIdentifier)', '$(TargetFrameworkVersion)', '$(TargetFrameworkProfile)'))\mscorlib.dll + + + <_ExplicitReference Include="@(_TargetFrameworkDirectories->'%(FullPath)\mscorlib.dll')" Condition="Exists('%(FullPath)\mscorlib.dll')"> + false + + + <_ExplicitReference Include="$(_ExplicitMSCorlibPath)" Condition="Exists($(_ExplicitMSCorlibPath))"> + false + - + <_ExplicitReference Include="@(_TargetFrameworkDirectories->'%(FullPath)\mscorlib.dll')" Condition="Exists('%(FullPath)\mscorlib.dll')"> false + + <_ExplicitMSCorlibPath>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToStandardLibraries ('$(TargetFrameworkIdentifier)', '$(TargetFrameworkVersion)', '$(TargetFrameworkProfile)'))\mscorlib.dll + + + <_ExplicitReference Include="@(_TargetFrameworkDirectories->'%(FullPath)\mscorlib.dll')" Condition="Exists('%(FullPath)\mscorlib.dll')"> + false + + + <_ExplicitReference Include="$(_ExplicitMSCorlibPath)" Condition="Exists($(_ExplicitMSCorlibPath))"> + false + Date: Fri, 30 May 2014 17:08:08 +0200 Subject: [PATCH 038/694] [mcs] Extend possible unintended reference comparison check --- mcs/errors/cs0253-3.cs | 15 +++++++++++++++ mcs/mcs/expression.cs | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 mcs/errors/cs0253-3.cs diff --git a/mcs/errors/cs0253-3.cs b/mcs/errors/cs0253-3.cs new file mode 100644 index 00000000000..0cf7968f7cb --- /dev/null +++ b/mcs/errors/cs0253-3.cs @@ -0,0 +1,15 @@ +// CS0253: Possible unintended reference comparison. Consider casting the right side expression to type `System.Action' to get value comparison +// Line: 13 +// Compiler options: -warnaserror + +using System; + +class MainClass +{ + public static void Main () + { + Action a = null; + object b = null; + var x = a == b; + } +} \ No newline at end of file diff --git a/mcs/mcs/expression.cs b/mcs/mcs/expression.cs index 01bbbafcf92..e7af0a6aa82 100644 --- a/mcs/mcs/expression.cs +++ b/mcs/mcs/expression.cs @@ -4094,12 +4094,12 @@ Expression ResolveEquality (ResolveContext ec, TypeSpec l, TypeSpec r, bool prim if (!TypeSpec.IsReferenceType (l) || !TypeSpec.IsReferenceType (r)) return null; - if (l.BuiltinType == BuiltinTypeSpec.Type.String || l.BuiltinType == BuiltinTypeSpec.Type.Delegate || MemberCache.GetUserOperator (l, CSharp.Operator.OpType.Equality, false) != null) + if (l.BuiltinType == BuiltinTypeSpec.Type.String || l.BuiltinType == BuiltinTypeSpec.Type.Delegate || l.IsDelegate || MemberCache.GetUserOperator (l, CSharp.Operator.OpType.Equality, false) != null) ec.Report.Warning (253, 2, loc, "Possible unintended reference comparison. Consider casting the right side expression to type `{0}' to get value comparison", l.GetSignatureForError ()); - if (r.BuiltinType == BuiltinTypeSpec.Type.String || r.BuiltinType == BuiltinTypeSpec.Type.Delegate || MemberCache.GetUserOperator (r, CSharp.Operator.OpType.Equality, false) != null) + if (r.BuiltinType == BuiltinTypeSpec.Type.String || r.BuiltinType == BuiltinTypeSpec.Type.Delegate || r.IsDelegate || MemberCache.GetUserOperator (r, CSharp.Operator.OpType.Equality, false) != null) ec.Report.Warning (252, 2, loc, "Possible unintended reference comparison. Consider casting the left side expression to type `{0}' to get value comparison", r.GetSignatureForError ()); From ed584e775162ce3c717a9162986134b74b1c0f13 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Mon, 2 Jun 2014 13:15:22 +0200 Subject: [PATCH 039/694] Fixes build --- mcs/class/corlib/System.Security.Claims/ClaimsPrincipal.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/corlib/System.Security.Claims/ClaimsPrincipal.cs b/mcs/class/corlib/System.Security.Claims/ClaimsPrincipal.cs index 76fb35f2976..9eea7eec8dc 100644 --- a/mcs/class/corlib/System.Security.Claims/ClaimsPrincipal.cs +++ b/mcs/class/corlib/System.Security.Claims/ClaimsPrincipal.cs @@ -68,7 +68,7 @@ public ClaimsPrincipal (IIdentity identity) throw new ArgumentNullException ("identity"); identities = new List (); - identities.Add (new ClaimsIdentity (identity)) + identities.Add (new ClaimsIdentity (identity)); } public ClaimsPrincipal (IPrincipal principal) From 4681266d9dd4aebd42eb04cea38702c0adab11b5 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Mon, 2 Jun 2014 14:53:12 +0200 Subject: [PATCH 040/694] [mcs] Add support for await in catch clause --- mcs/errors/cs1985-2.cs | 27 ------------ mcs/errors/cs1985.cs | 21 --------- mcs/errors/cs7094.cs | 15 +++++++ mcs/mcs/async.cs | 6 +-- mcs/mcs/statement.cs | 78 ++++++++++++++++++++++++++++----- mcs/tests/test-async-63.cs | 85 ++++++++++++++++++++++++++++++++++++ mcs/tests/ver-il-net_4_5.xml | 41 +++++++++++++++++ 7 files changed, 208 insertions(+), 65 deletions(-) delete mode 100644 mcs/errors/cs1985-2.cs delete mode 100644 mcs/errors/cs1985.cs create mode 100644 mcs/errors/cs7094.cs create mode 100644 mcs/tests/test-async-63.cs diff --git a/mcs/errors/cs1985-2.cs b/mcs/errors/cs1985-2.cs deleted file mode 100644 index 788d0e79ec5..00000000000 --- a/mcs/errors/cs1985-2.cs +++ /dev/null @@ -1,27 +0,0 @@ -// CS1985: The `await' operator cannot be used in a catch clause -// Line: 18 - -using System; -using System.Threading.Tasks; - -class X -{ - public static void Main () - { - } - - static async Task Test () - { - int x = 4; - try { - throw null; - } catch (NullReferenceException) if (await Foo ()) { - return; - } - } - - static Task Foo () - { - throw new NotImplementedException (); - } -} \ No newline at end of file diff --git a/mcs/errors/cs1985.cs b/mcs/errors/cs1985.cs deleted file mode 100644 index 62d3642f828..00000000000 --- a/mcs/errors/cs1985.cs +++ /dev/null @@ -1,21 +0,0 @@ -// CS1985: The `await' operator cannot be used in a catch clause -// Line: 13 - -using System; -using System.Threading.Tasks; - -class C -{ - public async Task Test () - { - try { - } catch { - await Call (); - } - } - - static Task Call () - { - return null; - } -} diff --git a/mcs/errors/cs7094.cs b/mcs/errors/cs7094.cs new file mode 100644 index 00000000000..93cd6372f8e --- /dev/null +++ b/mcs/errors/cs7094.cs @@ -0,0 +1,15 @@ +// CS7094: The `await' operator cannot be used in the filter expression of a catch clause +// Line: 12 + +using System.Threading.Tasks; + +class Test +{ + async static Task M1 () + { + try { + } + catch if (await Task.Factory.StartNew (() => false)) { + } + } +} \ No newline at end of file diff --git a/mcs/mcs/async.cs b/mcs/mcs/async.cs index 7ed03d2bad4..0c18052f91b 100644 --- a/mcs/mcs/async.cs +++ b/mcs/mcs/async.cs @@ -244,7 +244,7 @@ public void EmitPrologue (EmitContext ec) var fe_awaiter = new FieldExpr (awaiter, loc); fe_awaiter.InstanceExpression = new CompilerGeneratedThis (ec.CurrentType, loc); - Label skip_continuation = ec.DefineLabel (); + Label skip_continuation = ec.DefineLabel (); using (ec.With (BuilderContext.Options.OmitDebugInfo, true)) { // @@ -324,10 +324,6 @@ public override bool Resolve (BlockContext bc) return false; } - if (bc.HasSet (ResolveContext.Options.CatchScope)) { - bc.Report.Error (1985, loc, "The `await' operator cannot be used in a catch clause"); - } - if (!base.Resolve (bc)) return false; diff --git a/mcs/mcs/statement.cs b/mcs/mcs/statement.cs index cfcf3341971..07da0a80cbe 100644 --- a/mcs/mcs/statement.cs +++ b/mcs/mcs/statement.cs @@ -6316,9 +6316,16 @@ protected override bool DoFlowAnalysis (FlowAnalysisContext fc) public override bool Resolve (BlockContext bc) { ctch.Filter = ctch.Filter.Resolve (bc); - var c = ctch.Filter as Constant; - if (c != null && !c.IsDefaultValue) { - bc.Report.Warning (7095, 1, ctch.Filter.Location, "Exception filter expression is a constant"); + + if (ctch.Filter != null) { + if (ctch.Filter.ContainsEmitWithAwait ()) { + bc.Report.Error (7094, ctch.Filter.Location, "The `await' operator cannot be used in the filter expression of a catch clause"); + } + + var c = ctch.Filter as Constant; + if (c != null && !c.IsDefaultValue) { + bc.Report.Warning (7095, 1, ctch.Filter.Location, "Exception filter expression is a constant"); + } } return true; @@ -6403,7 +6410,8 @@ protected override void DoEmit (EmitContext ec) } } - Block.Emit (ec); + if (!Block.HasAwait) + Block.Emit (ec); } void EmitCatchVariableStore (EmitContext ec) @@ -6424,19 +6432,19 @@ void EmitCatchVariableStore (EmitContext ec) } } - public override bool Resolve (BlockContext ec) + public override bool Resolve (BlockContext bc) { - using (ec.Set (ResolveContext.Options.CatchScope)) { + using (bc.Set (ResolveContext.Options.CatchScope)) { if (type_expr != null) { - type = type_expr.ResolveAsType (ec); + type = type_expr.ResolveAsType (bc); if (type == null) return false; - if (type.BuiltinType != BuiltinTypeSpec.Type.Exception && !TypeSpec.IsBaseClass (type, ec.BuiltinTypes.Exception, false)) { - ec.Report.Error (155, loc, "The type caught or thrown must be derived from System.Exception"); + if (type.BuiltinType != BuiltinTypeSpec.Type.Exception && !TypeSpec.IsBaseClass (type, bc.BuiltinTypes.Exception, false)) { + bc.Report.Error (155, loc, "The type caught or thrown must be derived from System.Exception"); } else if (li != null) { li.Type = type; - li.PrepareAssignmentAnalysis (ec); + li.PrepareAssignmentAnalysis (bc); // source variable is at the top of the stack Expression source = new EmptyExpression (li.Type); @@ -6456,7 +6464,7 @@ public override bool Resolve (BlockContext ec) } Block.SetCatchBlock (); - return Block.Resolve (ec); + return Block.Resolve (bc); } } @@ -6602,6 +6610,7 @@ public class TryCatch : ExceptionStatement public Block Block; List clauses; readonly bool inside_try_finally; + List catch_sm; public TryCatch (Block block, List catch_clauses, Location l, bool inside_try_finally) : base (l) @@ -6646,6 +6655,13 @@ public override bool Resolve (BlockContext bc) ok &= c.Resolve (bc); + if (c.Block.HasAwait) { + if (catch_sm == null) + catch_sm = new List (); + + catch_sm.Add (c); + } + if (c.Filter != null) continue; @@ -6702,11 +6718,49 @@ protected sealed override void DoEmit (EmitContext ec) Block.Emit (ec); - foreach (Catch c in clauses) + LocalBuilder state_variable = null; + foreach (Catch c in clauses) { c.Emit (ec); + if (catch_sm != null) { + if (state_variable == null) + state_variable = ec.GetTemporaryLocal (ec.Module.Compiler.BuiltinTypes.Int); + + var index = catch_sm.IndexOf (c); + if (index < 0) + continue; + + ec.EmitInt (index + 1); + ec.Emit (OpCodes.Stloc, state_variable); + } + } + if (!inside_try_finally) ec.EndExceptionBlock (); + + if (state_variable != null) { + ec.Emit (OpCodes.Ldloc, state_variable); + + var labels = new Label [catch_sm.Count + 1]; + for (int i = 0; i < labels.Length; ++i) { + labels [i] = ec.DefineLabel (); + } + + var end = ec.DefineLabel (); + ec.Emit (OpCodes.Switch, labels); + + // 0 value is default label + ec.MarkLabel (labels [0]); + + for (int i = 0; i < catch_sm.Count; ++i) { + ec.Emit (OpCodes.Br, end); + + ec.MarkLabel (labels [i + 1]); + catch_sm [i].Block.Emit (ec); + } + + ec.MarkLabel (end); + } } protected override bool DoFlowAnalysis (FlowAnalysisContext fc) diff --git a/mcs/tests/test-async-63.cs b/mcs/tests/test-async-63.cs new file mode 100644 index 00000000000..bd3e5f0c317 --- /dev/null +++ b/mcs/tests/test-async-63.cs @@ -0,0 +1,85 @@ +using System; +using System.Threading.Tasks; + +class C +{ + static int counter; + public static async Task TestSingleAwait (bool throwException) + { + try { + if (throwException) + throw new ApplicationException (); + } catch (ApplicationException ex) { + Console.WriteLine ("x1a"); + ++counter; + await Call (); + Console.WriteLine ("x2a"); + ++counter; + } catch { + throw; + } + + Console.WriteLine ("end"); + } + + public static async Task TestDoubleAwait (bool throwException) + { + try { + if (throwException) + throw new ApplicationException (); + } catch (ApplicationException ex) { + Console.WriteLine ("x1a"); + ++counter; + await Call (); + Console.WriteLine ("x2a"); + ++counter; + } catch { + Console.WriteLine ("x1b"); + counter += 4; + await Call (); + Console.WriteLine ("x2b"); + counter += 7; + } + + Console.WriteLine ("end"); + } + + static Task Call () + { + return Task.Factory.StartNew (() => false); + } + + void HH () + { + try { + throw new ApplicationException (); + } catch { + throw; + } + } + + public static int Main () + { + TestSingleAwait (true).Wait (); + Console.WriteLine (counter); + if (counter != 2) + return 1; + + TestSingleAwait (false).Wait (); + if (counter != 2) + return 1; + + counter = 0; + + TestDoubleAwait (true).Wait (); + Console.WriteLine (counter); + if (counter != 2) + return 3; + + TestDoubleAwait (false).Wait (); + if (counter != 2) + return 4; + + return 0; + } +} diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index e6ca47f73d7..5b6cef1c610 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -62711,6 +62711,47 @@ + + + + 41 + + + 41 + + + 48 + + + 12 + + + 152 + + + 9 + + + 7 + + + + + 274 + + + 13 + + + + + 410 + + + 13 + + + From 1abe0a39b9e7aec9480616621c2e04c483e8cc26 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Mon, 2 Jun 2014 22:39:43 +0900 Subject: [PATCH 041/694] [xbuild/msbuild] fix build: fix Exists() argument. --- mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets | 2 +- mcs/tools/xbuild/data/4.0/Microsoft.CSharp.targets | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets b/mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets index 3212b77f41d..133a325a9b1 100644 --- a/mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets +++ b/mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets @@ -44,7 +44,7 @@ false - <_ExplicitReference Include="$(_ExplicitMSCorlibPath)" Condition="Exists($(_ExplicitMSCorlibPath))"> + <_ExplicitReference Include="$(_ExplicitMSCorlibPath)" Condition="Exists('$(_ExplicitMSCorlibPath)')"> false diff --git a/mcs/tools/xbuild/data/4.0/Microsoft.CSharp.targets b/mcs/tools/xbuild/data/4.0/Microsoft.CSharp.targets index 3212b77f41d..133a325a9b1 100644 --- a/mcs/tools/xbuild/data/4.0/Microsoft.CSharp.targets +++ b/mcs/tools/xbuild/data/4.0/Microsoft.CSharp.targets @@ -44,7 +44,7 @@ false - <_ExplicitReference Include="$(_ExplicitMSCorlibPath)" Condition="Exists($(_ExplicitMSCorlibPath))"> + <_ExplicitReference Include="$(_ExplicitMSCorlibPath)" Condition="Exists('$(_ExplicitMSCorlibPath)')"> false From bd13be55c2ed730dfb94652787f12c3100fd0679 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Mon, 2 Jun 2014 17:13:10 +0200 Subject: [PATCH 042/694] [mcs] Add more warnings for caller attributes --- mcs/errors/cs4017.cs | 2 +- mcs/errors/cs4024.cs | 17 +++++++++++++ mcs/errors/cs4025.cs | 17 +++++++++++++ mcs/errors/cs4026.cs | 17 +++++++++++++ mcs/errors/cs7080.cs | 12 +++++++++ mcs/errors/cs7081.cs | 12 +++++++++ mcs/errors/cs7082.cs | 12 +++++++++ mcs/mcs/parameter.cs | 59 +++++++++++++++++++++++++++++++++++++++++++- mcs/mcs/report.cs | 3 ++- 9 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 mcs/errors/cs4024.cs create mode 100644 mcs/errors/cs4025.cs create mode 100644 mcs/errors/cs4026.cs create mode 100644 mcs/errors/cs7080.cs create mode 100644 mcs/errors/cs7081.cs create mode 100644 mcs/errors/cs7082.cs diff --git a/mcs/errors/cs4017.cs b/mcs/errors/cs4017.cs index e0e7caa4fb8..f6ac27d07eb 100644 --- a/mcs/errors/cs4017.cs +++ b/mcs/errors/cs4017.cs @@ -1,4 +1,4 @@ -// CS4017: The CallerMemberName attribute cannot be applied because there is no standard conversion from `int' to `byte' +// CS4017: The CallerLineNumberAttribute attribute cannot be applied because there is no standard conversion from `int' to `byte' // Line: 8 using System.Runtime.CompilerServices; diff --git a/mcs/errors/cs4024.cs b/mcs/errors/cs4024.cs new file mode 100644 index 00000000000..d3360ed7cdf --- /dev/null +++ b/mcs/errors/cs4024.cs @@ -0,0 +1,17 @@ +// CS4024: The CallerLineNumberAttribute applied to parameter `x' will have no effect because it applies to a member that is used in context that do not allow optional arguments +// Line: 14 +// Compiler options: -warnaserror + +using System.Runtime.CompilerServices; + +partial class D +{ + partial void Foo (int x = 2); +} + +partial class D +{ + partial void Foo ([CallerLineNumber] int x) + { + } +} \ No newline at end of file diff --git a/mcs/errors/cs4025.cs b/mcs/errors/cs4025.cs new file mode 100644 index 00000000000..6e9f2030433 --- /dev/null +++ b/mcs/errors/cs4025.cs @@ -0,0 +1,17 @@ +// CS4025: The CallerFilePath applied to parameter `x' will have no effect because it applies to a member that is used in context that do not allow optional arguments +// Line: 14 +// Compiler options: -warnaserror + +using System.Runtime.CompilerServices; + +partial class D +{ + partial void Foo (string x = "x"); +} + +partial class D +{ + partial void Foo ([CallerFilePath] string x) + { + } +} \ No newline at end of file diff --git a/mcs/errors/cs4026.cs b/mcs/errors/cs4026.cs new file mode 100644 index 00000000000..94977002f3e --- /dev/null +++ b/mcs/errors/cs4026.cs @@ -0,0 +1,17 @@ +// CS4026: The CallerMemberName applied to parameter `x' will have no effect because it applies to a member that is used in context that do not allow optional arguments +// Line: 14 +// Compiler options: -warnaserror + +using System.Runtime.CompilerServices; + +partial class D +{ + partial void Foo (string x = "x"); +} + +partial class D +{ + partial void Foo ([CallerMemberName] string x) + { + } +} \ No newline at end of file diff --git a/mcs/errors/cs7080.cs b/mcs/errors/cs7080.cs new file mode 100644 index 00000000000..4da50751b92 --- /dev/null +++ b/mcs/errors/cs7080.cs @@ -0,0 +1,12 @@ +// CS7080: The CallerMemberNameAttribute applied to parameter `o' will have no effect. It is overridden by the CallerFilePathAttribute +// Line: 9 +// Compiler options: -warnaserror + +using System.Runtime.CompilerServices; + +class D +{ + void Foo ([CallerMemberName, CallerFilePath] object o = null) + { + } +} \ No newline at end of file diff --git a/mcs/errors/cs7081.cs b/mcs/errors/cs7081.cs new file mode 100644 index 00000000000..20597c1465c --- /dev/null +++ b/mcs/errors/cs7081.cs @@ -0,0 +1,12 @@ +// CS7081: The CallerMemberNameAttribute applied to parameter `o' will have no effect. It is overridden by the CallerLineNumberAttribute +// Line: 9 +// Compiler options: -warnaserror + +using System.Runtime.CompilerServices; + +class D +{ + void Foo ([CallerMemberName, CallerLineNumber] object o = null) + { + } +} \ No newline at end of file diff --git a/mcs/errors/cs7082.cs b/mcs/errors/cs7082.cs new file mode 100644 index 00000000000..1b02bd5c8d3 --- /dev/null +++ b/mcs/errors/cs7082.cs @@ -0,0 +1,12 @@ +// CS7082: The CallerFilePathAttribute applied to parameter `o' will have no effect. It is overridden by the CallerLineNumberAttribute +// Line: 9 +// Compiler options: -warnaserror + +using System.Runtime.CompilerServices; + +class D +{ + void Foo ([CallerFilePath, CallerLineNumber] object o = null) + { + } +} \ No newline at end of file diff --git a/mcs/mcs/parameter.cs b/mcs/mcs/parameter.cs index d95363c774c..45af1e9dd34 100644 --- a/mcs/mcs/parameter.cs +++ b/mcs/mcs/parameter.cs @@ -379,6 +379,15 @@ public virtual bool CheckAccessibility (InterfaceMemberBase member) return member.IsAccessibleAs (parameter_type); } + bool IsValidCallerContext (MemberCore memberContext) + { + var m = memberContext as Method; + if (m != null) + return !m.IsPartialImplementation; + + return true; + } + // // Resolve is used in method definitions // @@ -428,6 +437,7 @@ void ResolveCallerAttributes (ResolveContext rc) { var pa = rc.Module.PredefinedAttributes; TypeSpec caller_type; + Attribute callerMemberName = null, callerFilePath = null; foreach (var attr in attributes.Attrs) { var atype = attr.ResolveTypeForComparison (); @@ -442,7 +452,14 @@ void ResolveCallerAttributes (ResolveContext rc) caller_type.GetSignatureForError (), parameter_type.GetSignatureForError ()); } + if (!IsValidCallerContext (rc.CurrentMemberDefinition)) { + rc.Report.Warning (4026, 1, attr.Location, + "The CallerMemberName applied to parameter `{0}' will have no effect because it applies to a member that is used in context that do not allow optional arguments", + name); + } + modFlags |= Modifier.CallerMemberName; + callerMemberName = attr; continue; } @@ -450,10 +467,20 @@ void ResolveCallerAttributes (ResolveContext rc) caller_type = rc.BuiltinTypes.Int; if (caller_type != parameter_type && !Convert.ImplicitNumericConversionExists (caller_type, parameter_type)) { rc.Report.Error (4017, attr.Location, - "The CallerMemberName attribute cannot be applied because there is no standard conversion from `{0}' to `{1}'", + "The CallerLineNumberAttribute attribute cannot be applied because there is no standard conversion from `{0}' to `{1}'", caller_type.GetSignatureForError (), parameter_type.GetSignatureForError ()); } + if (!IsValidCallerContext (rc.CurrentMemberDefinition)) { + rc.Report.Warning (4024, 1, attr.Location, + "The CallerLineNumberAttribute applied to parameter `{0}' will have no effect because it applies to a member that is used in context that do not allow optional arguments", + name); + } + + if ((modFlags & Modifier.CallerLineNumber) != 0) { + //The CallerFilePathAttribute applied to parameter 'o' will have no effect. It is overridden by the CallerLineNumberAttribute. + } + modFlags |= Modifier.CallerLineNumber; continue; } @@ -466,10 +493,40 @@ void ResolveCallerAttributes (ResolveContext rc) caller_type.GetSignatureForError (), parameter_type.GetSignatureForError ()); } + if (!IsValidCallerContext (rc.CurrentMemberDefinition)) { + rc.Report.Warning (4025, 1, attr.Location, + "The CallerFilePath applied to parameter `{0}' will have no effect because it applies to a member that is used in context that do not allow optional arguments", + name); + } + modFlags |= Modifier.CallerFilePath; + callerFilePath = attr; continue; } } + + if ((modFlags & Modifier.CallerLineNumber) != 0) { + if (callerMemberName != null) { + rc.Report.Warning (7081, 1, callerMemberName.Location, + "The CallerMemberNameAttribute applied to parameter `{0}' will have no effect. It is overridden by the CallerLineNumberAttribute", + Name); + } + + if (callerFilePath != null) { + rc.Report.Warning (7082, 1, callerFilePath.Location, + "The CallerFilePathAttribute applied to parameter `{0}' will have no effect. It is overridden by the CallerLineNumberAttribute", + name); + } + } + + if ((modFlags & Modifier.CallerMemberName) != 0) { + if (callerFilePath != null) { + rc.Report.Warning (7080, 1, callerFilePath.Location, + "The CallerMemberNameAttribute applied to parameter `{0}' will have no effect. It is overridden by the CallerFilePathAttribute", + name); + } + + } } public void ResolveDefaultValue (ResolveContext rc) diff --git a/mcs/mcs/report.cs b/mcs/mcs/report.cs index 009007b0d52..3e022e5589f 100644 --- a/mcs/mcs/report.cs +++ b/mcs/mcs/report.cs @@ -56,7 +56,8 @@ public class Report 3000, 3001, 3002, 3003, 3005, 3006, 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, 3021, 3022, 3023, 3024, 3026, 3027, - 4014 + 4014, 4024, 4025, 4026, + 7080, 7081, 7082, 7095 }; static HashSet AllWarningsHashSet; From 22dc82012b8fcc7a2cb6bf9122aa03f2864c5b30 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Mon, 2 Jun 2014 17:19:51 +0200 Subject: [PATCH 043/694] [mcs] Remove wrong comment --- mcs/mcs/parameter.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mcs/mcs/parameter.cs b/mcs/mcs/parameter.cs index 45af1e9dd34..f1215173cb2 100644 --- a/mcs/mcs/parameter.cs +++ b/mcs/mcs/parameter.cs @@ -477,10 +477,6 @@ void ResolveCallerAttributes (ResolveContext rc) name); } - if ((modFlags & Modifier.CallerLineNumber) != 0) { - //The CallerFilePathAttribute applied to parameter 'o' will have no effect. It is overridden by the CallerLineNumberAttribute. - } - modFlags |= Modifier.CallerLineNumber; continue; } From 9494158a3d0559d50253ce52e376d2ad7bb5b3a4 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Tue, 3 Jun 2014 01:18:21 +0900 Subject: [PATCH 044/694] [xbuild/msbuild] fix previous ItemGroup definition (should be in ). --- mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets | 8 +++++--- mcs/tools/xbuild/data/4.0/Microsoft.CSharp.targets | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets b/mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets index 133a325a9b1..11b40d66a9b 100644 --- a/mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets +++ b/mcs/tools/xbuild/data/12.0/Microsoft.CSharp.targets @@ -44,9 +44,11 @@ false - <_ExplicitReference Include="$(_ExplicitMSCorlibPath)" Condition="Exists('$(_ExplicitMSCorlibPath)')"> - false - + + <_ExplicitReference Include="$(_ExplicitMSCorlibPath)" Condition="Exists('$(_ExplicitMSCorlibPath)')"> + false + + false - <_ExplicitReference Include="$(_ExplicitMSCorlibPath)" Condition="Exists('$(_ExplicitMSCorlibPath)')"> - false - + + <_ExplicitReference Include="$(_ExplicitMSCorlibPath)" Condition="Exists('$(_ExplicitMSCorlibPath)')"> + false + + Date: Mon, 2 Jun 2014 20:02:15 +0200 Subject: [PATCH 045/694] [llvm] Fix a native types problem. --- mono/mini/mini-llvm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mono/mini/mini-llvm.c b/mono/mini/mini-llvm.c index d09863f709b..f0dcc73e9b1 100644 --- a/mono/mini/mini-llvm.c +++ b/mono/mini/mini-llvm.c @@ -1071,11 +1071,13 @@ sig_to_llvm_sig_full (EmitContext *ctx, MonoMethodSignature *sig, LLVMCallInfo * int i, j, pindex, vret_arg_pindex = 0; int *pindexes; gboolean vretaddr = FALSE; + MonoType *rtype; if (sinfo) memset (sinfo, 0, sizeof (LLVMSigInfo)); - ret_type = type_to_llvm_type (ctx, sig->ret); + rtype = mini_replace_type (sig->ret); + ret_type = type_to_llvm_type (ctx, rtype); CHECK_FAILURE (ctx); if (cinfo && cinfo->ret.storage == LLVMArgVtypeInReg) { @@ -1088,7 +1090,7 @@ sig_to_llvm_sig_full (EmitContext *ctx, MonoMethodSignature *sig, LLVMCallInfo * } else { g_assert_not_reached (); } - } else if (cinfo && mini_type_is_vtype (ctx->cfg, sig->ret)) { + } else if (cinfo && mini_type_is_vtype (ctx->cfg, rtype)) { g_assert (cinfo->ret.storage == LLVMArgVtypeRetAddr); vretaddr = TRUE; ret_type = LLVMVoidType (); From 0b1ea4edc90eb46b9efa05c22f28ace3ff8c4f73 Mon Sep 17 00:00:00 2001 From: marcos henrich Date: Mon, 2 Jun 2014 19:04:43 +0100 Subject: [PATCH 046/694] Test WebClient asynchronous uploads cancellation. Tests that UploadStringAsync triggers UploadStringCompleted with Cancelled == true. Tests that UploadDataAsync triggers UploadDataCompleted with Cancelled == true. Tests that UploadValuesAsync triggers UploadValuesCompleted with Cancelled == true. Tests that UploadFileAsync triggers UploadFileCompleted with Cancelled == true. --- .../System/Test/System.Net/WebClientTest.cs | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/mcs/class/System/Test/System.Net/WebClientTest.cs b/mcs/class/System/Test/System.Net/WebClientTest.cs index 3505926f410..e39ca906b2f 100644 --- a/mcs/class/System/Test/System.Net/WebClientTest.cs +++ b/mcs/class/System/Test/System.Net/WebClientTest.cs @@ -2156,5 +2156,93 @@ public void DefaultProxy () // and return the same instance as WebRequest.DefaultWebProxy Assert.AreSame (wc.Proxy, WebRequest.DefaultWebProxy); } + + [Test] + public void UploadStringAsyncCancelEvent () + { + UploadAsyncCancelEventTest ((webClient, uri, cancelEvent) => + { + + webClient.UploadStringCompleted += (sender, args) => + { + if (args.Cancelled) + cancelEvent.Set (); + }; + + webClient.UploadStringAsync (uri, "PUT", "text"); + }); + } + + [Test] + public void UploadDataAsyncCancelEvent () + { + UploadAsyncCancelEventTest ((webClient, uri, cancelEvent) => + { + webClient.UploadDataCompleted += (sender, args) => + { + if (args.Cancelled) + cancelEvent.Set (); + }; + + webClient.UploadDataAsync (uri, "PUT", new byte[] { }); + }); + } + + [Test] + public void UploadValuesAsyncCancelEvent () + { + UploadAsyncCancelEventTest ((webClient, uri, cancelEvent) => + { + webClient.UploadValuesCompleted += (sender, args) => + { + if (args.Cancelled) + cancelEvent.Set (); + }; + + webClient.UploadValuesAsync (uri, "PUT", new NameValueCollection ()); + }); + } + + [Test] + public void UploadFileAsyncCancelEvent () + { + UploadAsyncCancelEventTest ((webClient, uri, cancelEvent) => + { + string tempFile = Path.Combine (_tempFolder, "upload.tmp"); + File.Create (tempFile).Close (); + + webClient.UploadFileCompleted += (sender, args) => + { + if (args.Cancelled) + cancelEvent.Set (); + }; + + webClient.UploadFileAsync (uri, "PUT", tempFile); + }); + } + + public void UploadAsyncCancelEventTest (Action uploadAction) + { + var ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + IPAddress.Loopback + ":8000/test/"; + + using (var responder = new SocketResponder (ep, EchoRequestHandler)) + { + responder.Start (); + + var webClient = new WebClient (); + + var cancellationTokenSource = new CancellationTokenSource (); + cancellationTokenSource.Token.Register (webClient.CancelAsync); + + var cancelEvent = new ManualResetEvent (false); + + uploadAction.Invoke (webClient, new Uri (url), cancelEvent); + + cancellationTokenSource.Cancel (); + + Assert.IsTrue (cancelEvent.WaitOne (1000)); + } + } } } From c1a76023943fbb32286ea22d69579e57e02fcec7 Mon Sep 17 00:00:00 2001 From: Tom Rathbone Date: Mon, 2 Jun 2014 23:12:54 +0100 Subject: [PATCH 047/694] Add new missing ClaimTypes entries Added 2008 and 2009 definitions and fixed Email definition --- .../System.Security.Claims/ClaimTypes.cs | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/mcs/class/corlib/System.Security.Claims/ClaimTypes.cs b/mcs/class/corlib/System.Security.Claims/ClaimTypes.cs index ca849bd6ad7..e1fa6e36ecd 100644 --- a/mcs/class/corlib/System.Security.Claims/ClaimTypes.cs +++ b/mcs/class/corlib/System.Security.Claims/ClaimTypes.cs @@ -32,30 +32,58 @@ namespace System.Security.Claims { public static class ClaimTypes { + public const string Actor = "http://schemas.xmlsoap.org/ws/2009/09/identity/claims/actor"; + public const string Anonymous = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/anonymous"; public const string Authentication = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/authentication"; + public const string AuthenticationInstant = "http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationinstant"; + + public const string AuthenticationMethod = "http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod"; + public const string AuthorizationDecision = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/authorizationdecision"; + public const string ClaimsType2005Namespace = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims"; + + public const string ClaimsType2009Namespace = "http://schemas.xmlsoap.org/ws/2009/09/identity/claims"; + + public const string ClaimsTypeNamespace = "http://schemas.microsoft.com/ws/2008/06/identity/claims"; + + public const string CookiePath = "http://schemas.microsoft.com/ws/2008/06/identity/claims/cookiepath"; + public const string Country = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/country"; public const string DateOfBirth = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth"; + public const string DenyOnlyPrimaryGroup = "http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlyprimarygroup"; + + public const string DenyOnlyPrimarySid = "http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlyprimarysid"; + public const string DenyOnlySid = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/denyonlysid"; public const string Dns = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dns"; - public const string Email = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"; + public const string Dsa = "http://schemas.microsoft.com/ws/2008/06/identity/claims/dsa"; + + public const string Email = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/email"; + + public const string Expiration = "http://schemas.microsoft.com/ws/2008/06/identity/claims/expiration"; + + public const string Expired = "http://schemas.microsoft.com/ws/2008/06/identity/claims/expired"; public const string Gender = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/gender"; public const string GivenName = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"; + public const string GroupSid = "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid"; + public const string Hash = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/hash"; public const string HomePhone = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/homephone"; + public const string IsPersistent = "http://schemas.microsoft.com/ws/2008/06/identity/claims/ispersistent"; + public const string Locality = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/locality"; public const string MobilePhone = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/mobilephone"; @@ -70,8 +98,16 @@ public static class ClaimTypes public const string PPID = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier"; + public const string PrimaryGroupSid = "http://schemas.microsoft.com/ws/2008/06/identity/claims/primarygroupsid"; + + public const string PrimarySid = "http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid"; + + public const string Role = "http://schemas.microsoft.com/ws/2008/06/identity/claims/role"; + public const string Rsa = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/rsa"; + public const string SerialNumber = "http://schemas.microsoft.com/ws/2008/06/identity/claims/serialnumber"; + public const string Sid = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid"; public const string Spn = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/spn"; @@ -90,9 +126,15 @@ public static class ClaimTypes public const string Uri = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/uri"; + public const string UserData = "http://schemas.microsoft.com/ws/2008/06/identity/claims/userdata"; + + public const string Version = "http://schemas.microsoft.com/ws/2008/06/identity/claims/version"; + public const string Webpage = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/webpage"; + public const string WindowsAccountName = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"; + public const string X500DistinguishedName = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/x500distinguishedname"; } } -#endif \ No newline at end of file +#endif From 6884bcd6b7606f0ab12fd59fd79273d5e2c58063 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Tue, 3 Jun 2014 11:31:24 +0200 Subject: [PATCH 048/694] [mcs] Better error reporting for incorrect async lambdas --- mcs/errors/cs1997-2.cs | 17 ----------------- mcs/errors/cs4029.cs | 19 +++++++++++++++++++ mcs/errors/cs8031.cs | 17 +++++++++++++++++ mcs/mcs/statement.cs | 13 ++++++------- 4 files changed, 42 insertions(+), 24 deletions(-) delete mode 100644 mcs/errors/cs1997-2.cs create mode 100644 mcs/errors/cs4029.cs create mode 100644 mcs/errors/cs8031.cs diff --git a/mcs/errors/cs1997-2.cs b/mcs/errors/cs1997-2.cs deleted file mode 100644 index 9f8c533f51a..00000000000 --- a/mcs/errors/cs1997-2.cs +++ /dev/null @@ -1,17 +0,0 @@ -// CS1997: `System.Func': A return keyword must not be followed by an expression when async delegate returns `Task'. Consider using `Task' return type -// Line: 12 - -using System; -using System.Threading.Tasks; - -class Test -{ - public static void Main() - { - Func t = async delegate { - return null; - }; - - return; - } -} diff --git a/mcs/errors/cs4029.cs b/mcs/errors/cs4029.cs new file mode 100644 index 00000000000..14fce4f458b --- /dev/null +++ b/mcs/errors/cs4029.cs @@ -0,0 +1,19 @@ +// CS4029: Cannot return an expression of type `void' +// Line: 15 + +using System; +using System.Threading.Tasks; + +class C +{ + static void Foo (Func> f) + { + } + + static void Main () + { + Foo (async () => { + return await Task.Factory.StartNew (() => { }); + }); + } +} \ No newline at end of file diff --git a/mcs/errors/cs8031.cs b/mcs/errors/cs8031.cs new file mode 100644 index 00000000000..dbb83bc1185 --- /dev/null +++ b/mcs/errors/cs8031.cs @@ -0,0 +1,17 @@ +// CS8031: Async lambda expression or anonymous method converted to a `Task' cannot return a value. Consider returning `Task' +// Line: 12 + +using System; +using System.Threading.Tasks; + +class Test +{ + public static void Main() + { + Func t = async delegate { + return null; + }; + + return; + } +} diff --git a/mcs/mcs/statement.cs b/mcs/mcs/statement.cs index 07da0a80cbe..80296bec456 100644 --- a/mcs/mcs/statement.cs +++ b/mcs/mcs/statement.cs @@ -1198,7 +1198,10 @@ protected override bool DoResolve (BlockContext ec) var async_type = storey.ReturnType; if (async_type == null && async_block.ReturnTypeInference != null) { - async_block.ReturnTypeInference.AddCommonTypeBoundAsync (expr.Type); + if (expr.Type.Kind == MemberKind.Void && !(this is ContextualReturn)) + ec.Report.Error (4029, loc, "Cannot return an expression of type `void'"); + else + async_block.ReturnTypeInference.AddCommonTypeBoundAsync (expr.Type); return true; } @@ -1214,18 +1217,14 @@ protected override bool DoResolve (BlockContext ec) if (this is ContextualReturn) return true; - // Same error code as .NET but better error message if (async_block.DelegateType != null) { - ec.Report.Error (1997, loc, - "`{0}': A return keyword must not be followed by an expression when async delegate returns `Task'. Consider using `Task' return type", - async_block.DelegateType.GetSignatureForError ()); + ec.Report.Error (8031, loc, + "Async lambda expression or anonymous method converted to a `Task' cannot return a value. Consider returning `Task'"); } else { ec.Report.Error (1997, loc, "`{0}': A return keyword must not be followed by an expression when async method returns `Task'. Consider using `Task' return type", ec.GetSignatureForError ()); - } - return false; } From 4e87c47d542cef174e2664040bd10b04dbb7abb7 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Tue, 3 Jun 2014 11:56:47 +0200 Subject: [PATCH 049/694] [corlib] Add CreateTypeInfo method --- .../System.Reflection.Emit/TypeBuilder.cs | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs b/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs index 578a7ab0576..64b5bf4bde5 100644 --- a/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs +++ b/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs @@ -44,19 +44,17 @@ using System.Security.Permissions; using System.Diagnostics.SymbolStore; +#if !NET_4_5 +using TypeInfo = System.Type; +#endif + namespace System.Reflection.Emit { [ComVisible (true)] [ComDefaultInterface (typeof (_TypeBuilder))] [ClassInterface (ClassInterfaceType.None)] [StructLayout (LayoutKind.Sequential)] - public sealed class TypeBuilder : -#if NET_4_5 - TypeInfo -#else - Type -#endif - , _TypeBuilder + public sealed class TypeBuilder : TypeInfo, _TypeBuilder { #pragma warning disable 169 #region Sync with reflection.h @@ -82,7 +80,7 @@ public sealed class TypeBuilder : private IntPtr generic_container; private GenericTypeParameterBuilder[] generic_params; private RefEmitPermissionSet[] permissions; - private Type created; + private TypeInfo created; #endregion #pragma warning restore 169 @@ -727,7 +725,7 @@ public ConstructorBuilder DefineTypeInitializer() } [MethodImplAttribute(MethodImplOptions.InternalCall)] - private extern Type create_runtime_class (TypeBuilder tb); + private extern TypeInfo create_runtime_class (TypeBuilder tb); private bool is_nested_in (Type t) { @@ -753,8 +751,16 @@ private bool has_ctor_method () { return false; } + + public Type CreateType () + { + return CreateTypeInfo (); + } - public Type CreateType() +#if NET_4_5 + public +#endif + TypeInfo CreateTypeInfo () { /* handle nesting_type */ if (createTypeCalled) From 5d0df9e2c0be5b2376d96bc90dee4edd43152afe Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Tue, 3 Jun 2014 16:07:40 +0200 Subject: [PATCH 050/694] [runtime] Applied patch from Kyle Edwards . Fix isinf () check with clang. Fixes #20244. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 27808ae439f..696bf15ead0 100644 --- a/configure.ac +++ b/configure.ac @@ -481,7 +481,7 @@ AC_CHECK_HEADERS(wchar.h) AC_CHECK_HEADERS(ieeefp.h) AC_MSG_CHECKING(for isinf) AC_TRY_LINK([#include ], [ - int f = isinf (1); + int f = isinf (1.0); ], [ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_ISINF, 1, [isinf available]) From 77d18f7661fe2388e547a62f8c897e496b139401 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Tue, 3 Jun 2014 16:52:04 +0200 Subject: [PATCH 051/694] [mcs] Update new error codes --- mcs/errors/{CS1607-3-lib.cs => CS8009-lib.cs} | 0 mcs/errors/Makefile | 3 +- mcs/errors/cs0591-2.cs | 9 ++++ mcs/errors/{cs0647-12.cs => cs0591-3.cs} | 2 +- mcs/errors/{cs0647-13.cs => cs0591-4.cs} | 2 +- mcs/errors/cs0591-5.cs | 12 +++++ mcs/errors/cs0591-6.cs | 12 +++++ mcs/errors/cs0591.cs | 2 +- mcs/errors/cs0647-15.cs | 12 ----- mcs/errors/cs0647-18.cs | 6 --- mcs/errors/cs0647-19.cs | 6 --- mcs/errors/cs0647-20.cs | 12 ----- mcs/errors/cs0647.cs | 9 ---- mcs/errors/cs1607-2.cs | 7 --- mcs/errors/cs1607-3.cs | 13 ----- mcs/errors/cs1700.cs | 2 +- mcs/errors/cs7023-2.cs | 10 ++++ mcs/errors/cs7023.cs | 10 ++++ mcs/errors/cs7025.cs | 13 +++++ mcs/errors/cs7030.cs | 6 +++ mcs/errors/cs7034-2.cs | 6 +++ mcs/errors/cs7034-3.cs | 6 +++ mcs/errors/{cs0647-17.cs => cs7034.cs} | 2 +- mcs/errors/cs7035.cs | 7 +++ mcs/errors/cs7042-2.cs | 10 ++++ mcs/errors/cs7042.cs | 10 ++++ mcs/errors/{cs0647-9.cs => cs7049.cs} | 4 +- mcs/errors/{cs0647-2.cs => cs7050.cs} | 4 +- mcs/errors/{cs0647-3.cs => cs7051.cs} | 4 +- mcs/errors/{cs0647-10.cs => cs7055-2.cs} | 2 +- mcs/errors/{cs0647-11.cs => cs7055.cs} | 2 +- mcs/errors/{cs0647-16.cs => cs7059.cs} | 2 +- mcs/errors/{cs0647-5.cs => cs7070-2.cs} | 4 +- mcs/errors/{cs0647-7.cs => cs7070-3.cs} | 4 +- mcs/errors/{cs0647-6.cs => cs7070-4.cs} | 4 +- mcs/errors/{cs0647-4.cs => cs7070.cs} | 4 +- mcs/errors/cs8009.cs | 13 +++++ mcs/errors/{cs0127-4.cs => cs8030-2.cs} | 2 +- mcs/errors/{cs0127-3.cs => cs8030.cs} | 2 +- mcs/mcs/assembly.cs | 18 ++++--- mcs/mcs/attribute.cs | 49 ++++++++++++------- mcs/mcs/class.cs | 28 ++++++----- mcs/mcs/expression.cs | 5 +- mcs/mcs/method.cs | 6 +++ mcs/mcs/report.cs | 3 +- mcs/mcs/statement.cs | 7 +-- mcs/tests/gtest-311.cs | 18 ------- 47 files changed, 222 insertions(+), 152 deletions(-) rename mcs/errors/{CS1607-3-lib.cs => CS8009-lib.cs} (100%) create mode 100644 mcs/errors/cs0591-2.cs rename mcs/errors/{cs0647-12.cs => cs0591-3.cs} (55%) rename mcs/errors/{cs0647-13.cs => cs0591-4.cs} (55%) create mode 100644 mcs/errors/cs0591-5.cs create mode 100644 mcs/errors/cs0591-6.cs delete mode 100644 mcs/errors/cs0647-15.cs delete mode 100644 mcs/errors/cs0647-18.cs delete mode 100644 mcs/errors/cs0647-19.cs delete mode 100644 mcs/errors/cs0647-20.cs delete mode 100644 mcs/errors/cs0647.cs delete mode 100644 mcs/errors/cs1607-2.cs delete mode 100644 mcs/errors/cs1607-3.cs create mode 100644 mcs/errors/cs7023-2.cs create mode 100644 mcs/errors/cs7023.cs create mode 100644 mcs/errors/cs7025.cs create mode 100644 mcs/errors/cs7030.cs create mode 100644 mcs/errors/cs7034-2.cs create mode 100644 mcs/errors/cs7034-3.cs rename mcs/errors/{cs0647-17.cs => cs7034.cs} (52%) create mode 100644 mcs/errors/cs7035.cs create mode 100644 mcs/errors/cs7042-2.cs create mode 100644 mcs/errors/cs7042.cs rename mcs/errors/{cs0647-9.cs => cs7049.cs} (56%) rename mcs/errors/{cs0647-2.cs => cs7050.cs} (50%) rename mcs/errors/{cs0647-3.cs => cs7051.cs} (57%) rename mcs/errors/{cs0647-10.cs => cs7055-2.cs} (59%) rename mcs/errors/{cs0647-11.cs => cs7055.cs} (59%) rename mcs/errors/{cs0647-16.cs => cs7059.cs} (57%) rename mcs/errors/{cs0647-5.cs => cs7070-2.cs} (76%) rename mcs/errors/{cs0647-7.cs => cs7070-3.cs} (76%) rename mcs/errors/{cs0647-6.cs => cs7070-4.cs} (75%) rename mcs/errors/{cs0647-4.cs => cs7070.cs} (73%) create mode 100644 mcs/errors/cs8009.cs rename mcs/errors/{cs0127-4.cs => cs8030-2.cs} (56%) rename mcs/errors/{cs0127-3.cs => cs8030.cs} (53%) delete mode 100644 mcs/tests/gtest-311.cs diff --git a/mcs/errors/CS1607-3-lib.cs b/mcs/errors/CS8009-lib.cs similarity index 100% rename from mcs/errors/CS1607-3-lib.cs rename to mcs/errors/CS8009-lib.cs diff --git a/mcs/errors/Makefile b/mcs/errors/Makefile index dc76a1cd6f7..e4660f8df86 100644 --- a/mcs/errors/Makefile +++ b/mcs/errors/Makefile @@ -32,9 +32,10 @@ TEST_SUPPORT_FILES = \ CS0730-lib.dll CS0731-1-lib.dll CS0731-2-lib.dll \ CS1070-lib.dll \ CS1540-15-lib.dll CS1540-17-lib.dll CS1542-lib.dll CS1577-lib.dll \ - CS1607-3-lib.dll CS1683-lib.dll CS1684-lib.dll CS1685-2-lib.dll \ + CS1683-lib.dll CS1684-lib.dll CS1685-2-lib.dll \ dlls/first/CS1701-lib.dll dlls/second/CS1701-lib.dll CS1701-lib.dll dlls/first/CS1702-lib.dll dlls/second/CS1702-lib.dll CS1702-lib.dll dlls/first/CS1705-lib.dll dlls/second/CS1705-lib.dll CS1705-lib.dll \ CS2015-lib.dll CS3005-16-lib.dll CS3013-module.dll CSExternAlias-lib.dll \ + CS8009-lib.dll \ CSFriendAssembly-lib.dll \ dlls/first/CS1703-lib.dll dlls/first/CS1704-lib.dll \ dlls/second/CS1703-lib.dll dlls/second/CS1704-lib.dll diff --git a/mcs/errors/cs0591-2.cs b/mcs/errors/cs0591-2.cs new file mode 100644 index 00000000000..31df0431f62 --- /dev/null +++ b/mcs/errors/cs0591-2.cs @@ -0,0 +1,9 @@ +// CS0591: Invalid value for argument to `System.Runtime.InteropServices.GuidAttribute' attribute +// Line: 6 + +using System.Runtime.InteropServices; + +[Guid ("aaa")] +class X { +static void Main () {} +} diff --git a/mcs/errors/cs0647-12.cs b/mcs/errors/cs0591-3.cs similarity index 55% rename from mcs/errors/cs0647-12.cs rename to mcs/errors/cs0591-3.cs index f1d83702356..8254a5b8198 100644 --- a/mcs/errors/cs0647-12.cs +++ b/mcs/errors/cs0591-3.cs @@ -1,4 +1,4 @@ -// CS0647: Error during emitting `System.Runtime.InteropServices.DllImportAttribute' attribute. The reason is `DllName cannot be empty or null' +// CS0591: Invalid value for argument to `System.Runtime.InteropServices.DllImportAttribute' attribute // Line: 8 using System.Runtime.InteropServices; diff --git a/mcs/errors/cs0647-13.cs b/mcs/errors/cs0591-4.cs similarity index 55% rename from mcs/errors/cs0647-13.cs rename to mcs/errors/cs0591-4.cs index 96751a139ae..adf1ff5aefd 100644 --- a/mcs/errors/cs0647-13.cs +++ b/mcs/errors/cs0591-4.cs @@ -1,4 +1,4 @@ -// CS0647: Error during emitting `System.Runtime.InteropServices.DllImportAttribute' attribute. The reason is `DllName cannot be empty or null' +// CS0591: Invalid value for argument to `System.Runtime.InteropServices.DllImportAttribute' attribute // Line: 8 using System.Runtime.InteropServices; diff --git a/mcs/errors/cs0591-5.cs b/mcs/errors/cs0591-5.cs new file mode 100644 index 00000000000..964dca945c4 --- /dev/null +++ b/mcs/errors/cs0591-5.cs @@ -0,0 +1,12 @@ +// CS0591: Invalid value for argument to `System.Runtime.CompilerServices.MethodImplAttribute' attribute +// Line: 8 + +using System.Runtime.CompilerServices; + +class Test +{ + [MethodImplAttribute(445)] + public void test () + { + } +} \ No newline at end of file diff --git a/mcs/errors/cs0591-6.cs b/mcs/errors/cs0591-6.cs new file mode 100644 index 00000000000..b9a4b2eac6d --- /dev/null +++ b/mcs/errors/cs0591-6.cs @@ -0,0 +1,12 @@ +// CS0591: Invalid value for argument to `System.Runtime.CompilerServices.MethodImplAttribute' attribute +// Line: 8 + +using System.Runtime.CompilerServices; + +class Program +{ + [MethodImpl((MethodImplOptions)255)] + void Foo() + { + } +} \ No newline at end of file diff --git a/mcs/errors/cs0591.cs b/mcs/errors/cs0591.cs index 8d5dc46a009..6ffbe846b0f 100644 --- a/mcs/errors/cs0591.cs +++ b/mcs/errors/cs0591.cs @@ -1,4 +1,4 @@ -// CS0591: Invalid value for argument to `System.AttributeUsage' attribute +// CS0591: Invalid value for argument to `System.AttributeUsageAttribute' attribute // Line: 4 [System.AttributeUsage(0)] diff --git a/mcs/errors/cs0647-15.cs b/mcs/errors/cs0647-15.cs deleted file mode 100644 index 104d2dbd0a6..00000000000 --- a/mcs/errors/cs0647-15.cs +++ /dev/null @@ -1,12 +0,0 @@ -// CS0647: Error during emitting `System.Runtime.CompilerServices.MethodImplAttribute' attribute. The reason is `Incorrect argument value' -// Line: 8 - -using System.Runtime.CompilerServices; - -class Test -{ - [MethodImplAttribute(445)] - public void test () - { - } -} \ No newline at end of file diff --git a/mcs/errors/cs0647-18.cs b/mcs/errors/cs0647-18.cs deleted file mode 100644 index ce57d73d60a..00000000000 --- a/mcs/errors/cs0647-18.cs +++ /dev/null @@ -1,6 +0,0 @@ -// CS0647: Error during emitting `System.Reflection.AssemblyVersionAttribute' attribute. The reason is `Specified version `2.0.*.*' is not valid' -// Line: 6 - -using System.Reflection; - -[assembly: AssemblyVersion("2.0.*.*")] diff --git a/mcs/errors/cs0647-19.cs b/mcs/errors/cs0647-19.cs deleted file mode 100644 index 25b040038e1..00000000000 --- a/mcs/errors/cs0647-19.cs +++ /dev/null @@ -1,6 +0,0 @@ -// CS0647: Error during emitting `System.Reflection.AssemblyVersionAttribute' attribute. The reason is `Specified version `2.*' is not valid' -// Line: 6 - -using System.Reflection; - -[assembly: AssemblyVersion("2.*")] diff --git a/mcs/errors/cs0647-20.cs b/mcs/errors/cs0647-20.cs deleted file mode 100644 index 2b03f1cbc11..00000000000 --- a/mcs/errors/cs0647-20.cs +++ /dev/null @@ -1,12 +0,0 @@ -// CS0647: Error during emitting `System.Runtime.CompilerServices.MethodImplAttribute' attribute. The reason is `Incorrect argument value' -// Line: 8 - -using System.Runtime.CompilerServices; - -class Program -{ - [MethodImpl((MethodImplOptions)255)] - void Foo() - { - } -} \ No newline at end of file diff --git a/mcs/errors/cs0647.cs b/mcs/errors/cs0647.cs deleted file mode 100644 index 154bfff54dd..00000000000 --- a/mcs/errors/cs0647.cs +++ /dev/null @@ -1,9 +0,0 @@ -// CS0647: Error during emitting `System.Runtime.InteropServices.GuidAttribute' attribute. The reason is `Invalid Guid format: aaa' -// Line: 6 - -using System.Runtime.InteropServices; - -[Guid ("aaa")] -class X { -static void Main () {} -} diff --git a/mcs/errors/cs1607-2.cs b/mcs/errors/cs1607-2.cs deleted file mode 100644 index 2d0c3de135e..00000000000 --- a/mcs/errors/cs1607-2.cs +++ /dev/null @@ -1,7 +0,0 @@ -// CS1607: The version number `1.*' specified for `AssemblyFileVersion' is invalid -// Line: 7 -// Compiler options: -warnaserror - -using System.Reflection; - -[assembly: AssemblyFileVersion ("1.*")] diff --git a/mcs/errors/cs1607-3.cs b/mcs/errors/cs1607-3.cs deleted file mode 100644 index 9268dfd04c8..00000000000 --- a/mcs/errors/cs1607-3.cs +++ /dev/null @@ -1,13 +0,0 @@ -// CS1607: Referenced assembly `CS1607-3-lib' has different culture setting of `en-US' -// Line: 0 -// Compiler options: -r:CS1607-3-lib.dll -warnaserror - -using System; - -class Program -{ - static void Main () - { - Console.WriteLine (typeof (Lang)); - } -} diff --git a/mcs/errors/cs1700.cs b/mcs/errors/cs1700.cs index 4b2021994cd..975a2f2c7ac 100644 --- a/mcs/errors/cs1700.cs +++ b/mcs/errors/cs1700.cs @@ -1,4 +1,4 @@ -// CS1700: Assembly reference `MyAssemblyName, Version=' is invalid and cannot be resolved +// CS1700: Friend assembly reference `MyAssemblyName, Version=' is invalid and cannot be resolved // Line: 8 // Compiler options: -warnaserror -warn:3 diff --git a/mcs/errors/cs7023-2.cs b/mcs/errors/cs7023-2.cs new file mode 100644 index 00000000000..ee14e24f96d --- /dev/null +++ b/mcs/errors/cs7023-2.cs @@ -0,0 +1,10 @@ +// CS7023: The second operand of `is' or `as' operator cannot be static type `X' +// Line: 8 + +static class X +{ + public static void Main () + { + var v = null is X; + } +} \ No newline at end of file diff --git a/mcs/errors/cs7023.cs b/mcs/errors/cs7023.cs new file mode 100644 index 00000000000..dae17caa411 --- /dev/null +++ b/mcs/errors/cs7023.cs @@ -0,0 +1,10 @@ +// CS7023: The second operand of `is' or `as' operator cannot be static type `X' +// Line: 8 + +static class X +{ + public static void Main () + { + var v = null as X; + } +} \ No newline at end of file diff --git a/mcs/errors/cs7025.cs b/mcs/errors/cs7025.cs new file mode 100644 index 00000000000..59eca472d26 --- /dev/null +++ b/mcs/errors/cs7025.cs @@ -0,0 +1,13 @@ +// CS7025: Inconsistent accessibility: event type `System.Action' is less accessible than event `C.E' +// Line: 8 + +using System; + +public class C +{ + public event Action E; +} + +interface I +{ +} \ No newline at end of file diff --git a/mcs/errors/cs7030.cs b/mcs/errors/cs7030.cs new file mode 100644 index 00000000000..01abf112887 --- /dev/null +++ b/mcs/errors/cs7030.cs @@ -0,0 +1,6 @@ +// CS7030: Friend assembly reference cannot have `null' value +// Line: 6 + +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo (null)] diff --git a/mcs/errors/cs7034-2.cs b/mcs/errors/cs7034-2.cs new file mode 100644 index 00000000000..b7698694367 --- /dev/null +++ b/mcs/errors/cs7034-2.cs @@ -0,0 +1,6 @@ +// CS7034: The specified version string `2.0.*.*' does not conform to the required format - major[.minor[.build[.revision]]] +// Line: 6 + +using System.Reflection; + +[assembly: AssemblyVersion("2.0.*.*")] diff --git a/mcs/errors/cs7034-3.cs b/mcs/errors/cs7034-3.cs new file mode 100644 index 00000000000..a406b0f7d6b --- /dev/null +++ b/mcs/errors/cs7034-3.cs @@ -0,0 +1,6 @@ +// CS7034: The specified version string `2.*' does not conform to the required format - major[.minor[.build[.revision]]] +// Line: 6 + +using System.Reflection; + +[assembly: AssemblyVersion("2.*")] diff --git a/mcs/errors/cs0647-17.cs b/mcs/errors/cs7034.cs similarity index 52% rename from mcs/errors/cs0647-17.cs rename to mcs/errors/cs7034.cs index 88117de831c..071535be253 100644 --- a/mcs/errors/cs0647-17.cs +++ b/mcs/errors/cs7034.cs @@ -1,4 +1,4 @@ -// Cs0647: Error during emitting `System.Reflection.AssemblyVersionAttribute' attribute. The reason is `Specified version `0.0.0.80420' is not valid' +// CS7034: The specified version string `0.0.0.80420' does not conform to the required format - major[.minor[.build[.revision]]] // Line: 7 using System; diff --git a/mcs/errors/cs7035.cs b/mcs/errors/cs7035.cs new file mode 100644 index 00000000000..0d27cb00be1 --- /dev/null +++ b/mcs/errors/cs7035.cs @@ -0,0 +1,7 @@ +// CS7035: The specified version string `1.*' does not conform to the recommended format major.minor.build.revision +// Line: 7 +// Compiler options: -warnaserror + +using System.Reflection; + +[assembly: AssemblyFileVersion ("1.*")] diff --git a/mcs/errors/cs7042-2.cs b/mcs/errors/cs7042-2.cs new file mode 100644 index 00000000000..a70c129019d --- /dev/null +++ b/mcs/errors/cs7042-2.cs @@ -0,0 +1,10 @@ +// CS7042: The DllImport attribute cannot be applied to a method that is generic or contained in a generic type +// Line: 9 + +using System.Runtime.InteropServices; + +public class C +{ + [DllImport ("my.dll")] + static extern void Foo (); +} \ No newline at end of file diff --git a/mcs/errors/cs7042.cs b/mcs/errors/cs7042.cs new file mode 100644 index 00000000000..efebf84dc61 --- /dev/null +++ b/mcs/errors/cs7042.cs @@ -0,0 +1,10 @@ +// CS7042: The DllImport attribute cannot be applied to a method that is generic or contained in a generic type +// Line: 9 + +using System.Runtime.InteropServices; + +public class C +{ + [DllImport ("my.dll")] + static extern void Foo (); +} \ No newline at end of file diff --git a/mcs/errors/cs0647-9.cs b/mcs/errors/cs7049.cs similarity index 56% rename from mcs/errors/cs0647-9.cs rename to mcs/errors/cs7049.cs index a7a1b38729f..91114e8afc0 100644 --- a/mcs/errors/cs0647-9.cs +++ b/mcs/errors/cs7049.cs @@ -1,5 +1,5 @@ -// CS0647: Error during emitting `System.Security.Permissions.PrincipalPermissionAttribute' attribute. The reason is `SecurityAction is out of range' -// Line : 10 +// CS7049: Security attribute `System.Security.Permissions.PrincipalPermissionAttribute' has an invalid SecurityAction value `100' +// Line: 10 using System; using System.Security; diff --git a/mcs/errors/cs0647-2.cs b/mcs/errors/cs7050.cs similarity index 50% rename from mcs/errors/cs0647-2.cs rename to mcs/errors/cs7050.cs index 5e05cfb18a2..6909f185000 100644 --- a/mcs/errors/cs0647-2.cs +++ b/mcs/errors/cs7050.cs @@ -1,5 +1,5 @@ -// CS0647: Error during emitting `System.Security.Permissions.SecurityPermissionAttribute' attribute. The reason is `SecurityAction `Demand' is not valid for this declaration' -// Line : 10 +// CS7050: SecurityAction value `System.Security.Permissions.SecurityAction' is invalid for security attributes applied to an assembly +// Line: 10 using System; using System.Security; diff --git a/mcs/errors/cs0647-3.cs b/mcs/errors/cs7051.cs similarity index 57% rename from mcs/errors/cs0647-3.cs rename to mcs/errors/cs7051.cs index 272855dcfcb..2d18f11b4ae 100644 --- a/mcs/errors/cs0647-3.cs +++ b/mcs/errors/cs7051.cs @@ -1,5 +1,5 @@ -// CS0647: Error during emitting `System.Security.Permissions.SecurityPermissionAttribute' attribute. The reason is `SecurityAction `RequestMinimum' is not valid for this declaration' -// Line : 10 +// CS7051: SecurityAction value `System.Security.Permissions.SecurityAction' is invalid for security attributes applied to a type or a method +// Line: 10 using System; using System.Security; diff --git a/mcs/errors/cs0647-10.cs b/mcs/errors/cs7055-2.cs similarity index 59% rename from mcs/errors/cs0647-10.cs rename to mcs/errors/cs7055-2.cs index aa5c0e3f959..f2c15a8d225 100644 --- a/mcs/errors/cs0647-10.cs +++ b/mcs/errors/cs7055-2.cs @@ -1,4 +1,4 @@ -// CS0647: Error during emitting `System.Runtime.InteropServices.MarshalAsAttribute' attribute. The reason is `Specified unmanaged type is only valid on fields' +// CS7055: Unmanaged type `ByValArray' is only valid for fields // Line: 10 using System; diff --git a/mcs/errors/cs0647-11.cs b/mcs/errors/cs7055.cs similarity index 59% rename from mcs/errors/cs0647-11.cs rename to mcs/errors/cs7055.cs index aa5c0e3f959..f2c15a8d225 100644 --- a/mcs/errors/cs0647-11.cs +++ b/mcs/errors/cs7055.cs @@ -1,4 +1,4 @@ -// CS0647: Error during emitting `System.Runtime.InteropServices.MarshalAsAttribute' attribute. The reason is `Specified unmanaged type is only valid on fields' +// CS7055: Unmanaged type `ByValArray' is only valid for fields // Line: 10 using System; diff --git a/mcs/errors/cs0647-16.cs b/mcs/errors/cs7059.cs similarity index 57% rename from mcs/errors/cs0647-16.cs rename to mcs/errors/cs7059.cs index 41c3e0572c6..f19fd02f366 100644 --- a/mcs/errors/cs0647-16.cs +++ b/mcs/errors/cs7059.cs @@ -1,4 +1,4 @@ -// CS0647: Error during emitting `System.Reflection.AssemblyCultureAttribute' attribute. The reason is `The executables cannot be satelite assemblies, remove the attribute or keep it empty' +// CS7059: Executables cannot be satellite assemblies. Remove the attribute or keep it empty // Line: 7 using System; diff --git a/mcs/errors/cs0647-5.cs b/mcs/errors/cs7070-2.cs similarity index 76% rename from mcs/errors/cs0647-5.cs rename to mcs/errors/cs7070-2.cs index 20917f3925d..e618405b3c9 100644 --- a/mcs/errors/cs0647-5.cs +++ b/mcs/errors/cs7070-2.cs @@ -1,5 +1,5 @@ -// CS0647: Error during emitting `DebugPermissionAttribute' attribute. The reason is `it is attached to invalid parent' -// Line : 11 +// CS7070: Security attribute `DebugPermissionAttribute' is not valid on this declaration type. Security attributes are only valid on assembly, type and method declarations +// Line: 11 using System; using System.Security; diff --git a/mcs/errors/cs0647-7.cs b/mcs/errors/cs7070-3.cs similarity index 76% rename from mcs/errors/cs0647-7.cs rename to mcs/errors/cs7070-3.cs index 314fafed73d..907993dd31e 100644 --- a/mcs/errors/cs0647-7.cs +++ b/mcs/errors/cs7070-3.cs @@ -1,5 +1,5 @@ -// CS0647: Error during emitting `DebugPermissionAttribute' attribute. The reason is `it is attached to invalid parent' -// Line : 11 +// CS7070: Security attribute `DebugPermissionAttribute' is not valid on this declaration type. Security attributes are only valid on assembly, type and method declarations +// Line: 11 using System; using System.Security; diff --git a/mcs/errors/cs0647-6.cs b/mcs/errors/cs7070-4.cs similarity index 75% rename from mcs/errors/cs0647-6.cs rename to mcs/errors/cs7070-4.cs index 9e7c37e96b4..a2c43a5d294 100644 --- a/mcs/errors/cs0647-6.cs +++ b/mcs/errors/cs7070-4.cs @@ -1,5 +1,5 @@ -// CS0647: Error during emitting `DebugPermissionAttribute' attribute. The reason is `it is attached to invalid parent' -// Line : 11 +// CS7070: Security attribute `DebugPermissionAttribute' is not valid on this declaration type. Security attributes are only valid on assembly, type and method declarations +// Line: 11 using System; using System.Security; diff --git a/mcs/errors/cs0647-4.cs b/mcs/errors/cs7070.cs similarity index 73% rename from mcs/errors/cs0647-4.cs rename to mcs/errors/cs7070.cs index d799ceee367..599a1808ffd 100644 --- a/mcs/errors/cs0647-4.cs +++ b/mcs/errors/cs7070.cs @@ -1,5 +1,5 @@ -// CS0647: Error during emitting `DebugPermissionAttribute' attribute. The reason is `it is attached to invalid parent' -// Line : 10 +// CS7070: Security attribute `DebugPermissionAttribute' is not valid on this declaration type. Security attributes are only valid on assembly, type and method declarations +// Line: 10 using System; using System.Security; diff --git a/mcs/errors/cs8009.cs b/mcs/errors/cs8009.cs new file mode 100644 index 00000000000..851e06653eb --- /dev/null +++ b/mcs/errors/cs8009.cs @@ -0,0 +1,13 @@ +// CS8009: Referenced assembly `CS8009-lib' has different culture setting of `en-US' +// Line: 0 +// Compiler options: -r:CS8009-lib.dll -warnaserror + +using System; + +class Program +{ + static void Main () + { + Console.WriteLine (typeof (Lang)); + } +} diff --git a/mcs/errors/cs0127-4.cs b/mcs/errors/cs8030-2.cs similarity index 56% rename from mcs/errors/cs0127-4.cs rename to mcs/errors/cs8030-2.cs index 64e3f96ae04..231f2113a50 100644 --- a/mcs/errors/cs0127-4.cs +++ b/mcs/errors/cs8030-2.cs @@ -1,4 +1,4 @@ -// CS0127: `D': A return keyword must not be followed by any expression when delegate returns void +// CS8030: Anonymous function or lambda expression converted to a void returning delegate cannot return a value // Line: 9 delegate void D (int x); diff --git a/mcs/errors/cs0127-3.cs b/mcs/errors/cs8030.cs similarity index 53% rename from mcs/errors/cs0127-3.cs rename to mcs/errors/cs8030.cs index 5e39cb9da7a..4f2751c6ea1 100644 --- a/mcs/errors/cs0127-3.cs +++ b/mcs/errors/cs8030.cs @@ -1,4 +1,4 @@ -// CS0127: `System.Action': A return keyword must not be followed by any expression when delegate returns void +// CS8030: Anonymous function or lambda expression converted to a void returning delegate cannot return a value // Line: 10 using System; diff --git a/mcs/mcs/assembly.cs b/mcs/mcs/assembly.cs index cd77ac26226..f93c0383962 100644 --- a/mcs/mcs/assembly.cs +++ b/mcs/mcs/assembly.cs @@ -207,7 +207,7 @@ public void ApplyAttributeBuilder (Attribute a, MethodSpec ctor, byte[] cdata, P return; if (Compiler.Settings.Target == Target.Exe) { - a.Error_AttributeEmitError ("The executables cannot be satelite assemblies, remove the attribute or keep it empty"); + Report.Error (7059, a.Location, "Executables cannot be satellite assemblies. Remove the attribute or keep it empty"); return; } @@ -231,7 +231,8 @@ public void ApplyAttributeBuilder (Attribute a, MethodSpec ctor, byte[] cdata, P var vinfo = IsValidAssemblyVersion (value, true); if (vinfo == null) { - a.Error_AttributeEmitError (string.Format ("Specified version `{0}' is not valid", value)); + Report.Error (7034, a.Location, "The specified version string `{0}' does not conform to the required format - major[.minor[.build[.revision]]]", + value); return; } @@ -322,13 +323,18 @@ public void ApplyAttributeBuilder (Attribute a, MethodSpec ctor, byte[] cdata, P if (a.Type == pa.InternalsVisibleTo) { string assembly_name = a.GetString (); + if (assembly_name == null) { + Report.Error (7030, a.Location, "Friend assembly reference cannot have `null' value"); + return; + } + if (assembly_name.Length == 0) return; #if STATIC ParsedAssemblyName aname; ParseAssemblyResult r = Fusion.ParseAssemblyName (assembly_name, out aname); if (r != ParseAssemblyResult.OK) { - Report.Warning (1700, 3, a.Location, "Assembly reference `{0}' is invalid and cannot be resolved", + Report.Warning (1700, 3, a.Location, "Friend assembly reference `{0}' is invalid and cannot be resolved", assembly_name); return; } @@ -353,7 +359,7 @@ public void ApplyAttributeBuilder (Attribute a, MethodSpec ctor, byte[] cdata, P } else if (a.Type == pa.AssemblyFileVersion) { vi_product_version = a.GetString (); if (string.IsNullOrEmpty (vi_product_version) || IsValidAssemblyVersion (vi_product_version, false) == null) { - Report.Warning (1607, 1, a.Location, "The version number `{0}' specified for `{1}' is invalid", + Report.Warning (7035, 1, a.Location, "The specified version string `{0}' does not conform to the recommended format major.minor.build.revision", vi_product_version, a.Name); return; } @@ -399,8 +405,8 @@ void CheckReferencesPublicToken () } var ci = a.Assembly.GetName ().CultureInfo; - if (!ci.Equals (System.Globalization.CultureInfo.InvariantCulture)) { - Report.Warning (1607, 1, "Referenced assembly `{0}' has different culture setting of `{1}'", + if (!ci.Equals (CultureInfo.InvariantCulture)) { + Report.Warning (8009, 1, "Referenced assembly `{0}' has different culture setting of `{1}'", a.Name, ci.Name); } diff --git a/mcs/mcs/attribute.cs b/mcs/mcs/attribute.cs index 2152674d2da..6838840d9e3 100644 --- a/mcs/mcs/attribute.cs +++ b/mcs/mcs/attribute.cs @@ -258,19 +258,22 @@ public void Error_MisusedDynamicAttribute () Report.Error (1970, loc, "Do not use `{0}' directly. Use `dynamic' keyword instead", GetSignatureForError ()); } - /// - /// This is rather hack. We report many emit attribute error with same error to be compatible with - /// csc. But because csc has to report them this way because error came from ilasm we needn't. - /// - public void Error_AttributeEmitError (string inner) + void Error_AttributeEmitError (string inner) { Report.Error (647, Location, "Error during emitting `{0}' attribute. The reason is `{1}'", Type.GetSignatureForError (), inner); } + public void Error_InvalidArgumentValue (TypeSpec attributeType) + { + Report.Error (591, Location, "Invalid value for argument to `{0}' attribute", attributeType.GetSignatureForError ()); + } + public void Error_InvalidSecurityParent () { - Error_AttributeEmitError ("it is attached to invalid parent"); + Report.Error (7070, Location, + "Security attribute `{0}' is not valid on this declaration type. Security attributes are only valid on assembly, type and method declarations", + Type.GetSignatureForError ()); } Attributable Owner { @@ -831,6 +834,7 @@ bool IsSecurityActionValid () { SecurityAction action = GetSecurityActionValue (); bool for_assembly = Target == AttributeTargets.Assembly || Target == AttributeTargets.Module; + var c = (Constant)pos_args [0].Expr; switch (action) { #pragma warning disable 618 @@ -853,11 +857,22 @@ bool IsSecurityActionValid () #pragma warning restore 618 default: - Error_AttributeEmitError ("SecurityAction is out of range"); + Report.Error (7049, c.Location, "Security attribute `{0}' has an invalid SecurityAction value `{1}'", + Type.GetSignatureForError (), c.GetValueAsLiteral()); return false; } - Error_AttributeEmitError (String.Concat ("SecurityAction `", action, "' is not valid for this declaration")); + switch (Target) { + case AttributeTargets.Assembly: + Report.Error (7050, c.Location, "SecurityAction value `{0}' is invalid for security attributes applied to an assembly", + c.GetSignatureForError ()); + break; + default: + Report.Error (7051, c.Location, "SecurityAction value `{0}' is invalid for security attributes applied to a type or a method", + c.GetSignatureForError ()); + break; + } + return false; } @@ -1026,38 +1041,36 @@ public void Emit (Dictionary> allEmitted) return; } } else if (Type == predefined.Guid) { + string v = ((StringConstant) arg_expr).Value; try { - string v = ((StringConstant) arg_expr).Value; new Guid (v); - } catch (Exception e) { - Error_AttributeEmitError (e.Message); + } catch { + Error_InvalidArgumentValue (Type); return; } } else if (Type == predefined.AttributeUsage) { int v = ((IntConstant) ((EnumConstant) arg_expr).Child).Value; - if (v == 0) { - context.Module.Compiler.Report.Error (591, Location, "Invalid value for argument to `{0}' attribute", - "System.AttributeUsage"); - } + if (v == 0) + Error_InvalidArgumentValue (Type); } else if (Type == predefined.MarshalAs) { if (pos_args.Count == 1) { var u_type = (UnmanagedType) System.Enum.Parse (typeof (UnmanagedType), ((Constant) pos_args[0].Expr).GetValue ().ToString ()); if (u_type == UnmanagedType.ByValArray && !(Owner is FieldBase)) { - Error_AttributeEmitError ("Specified unmanaged type is only valid on fields"); + Report.Error (7055, pos_args [0].Expr.Location, "Unmanaged type `ByValArray' is only valid for fields"); } } } else if (Type == predefined.DllImport) { if (pos_args.Count == 1 && pos_args[0].Expr is Constant) { var value = ((Constant) pos_args[0].Expr).GetValue () as string; if (string.IsNullOrEmpty (value)) - Error_AttributeEmitError ("DllName cannot be empty or null"); + Error_InvalidArgumentValue (Type); } } else if (Type == predefined.MethodImpl) { if (pos_args.Count == 1) { var value = (int) ((Constant) arg_expr).GetValueAsLong (); if (!IsValidMethodImplOption (value)) { - Error_AttributeEmitError ("Incorrect argument value"); + Error_InvalidArgumentValue (Type); } } } diff --git a/mcs/mcs/class.cs b/mcs/mcs/class.cs index 36761432a51..0cf97b22e94 100644 --- a/mcs/mcs/class.cs +++ b/mcs/mcs/class.cs @@ -3736,25 +3736,29 @@ protected virtual void DoMemberTypeDependentChecks () Report.SymbolRelatedToPreviousError (MemberType); if (this is Property) Report.Error (53, Location, - "Inconsistent accessibility: property type `" + - MemberType.GetSignatureForError () + "' is less " + - "accessible than property `" + GetSignatureForError () + "'"); + "Inconsistent accessibility: property type `" + + MemberType.GetSignatureForError () + "' is less " + + "accessible than property `" + GetSignatureForError () + "'"); else if (this is Indexer) Report.Error (54, Location, - "Inconsistent accessibility: indexer return type `" + - MemberType.GetSignatureForError () + "' is less " + - "accessible than indexer `" + GetSignatureForError () + "'"); + "Inconsistent accessibility: indexer return type `" + + MemberType.GetSignatureForError () + "' is less " + + "accessible than indexer `" + GetSignatureForError () + "'"); else if (this is MethodCore) { if (this is Operator) Report.Error (56, Location, - "Inconsistent accessibility: return type `" + - MemberType.GetSignatureForError () + "' is less " + - "accessible than operator `" + GetSignatureForError () + "'"); + "Inconsistent accessibility: return type `" + + MemberType.GetSignatureForError () + "' is less " + + "accessible than operator `" + GetSignatureForError () + "'"); else Report.Error (50, Location, - "Inconsistent accessibility: return type `" + - MemberType.GetSignatureForError () + "' is less " + - "accessible than method `" + GetSignatureForError () + "'"); + "Inconsistent accessibility: return type `" + + MemberType.GetSignatureForError () + "' is less " + + "accessible than method `" + GetSignatureForError () + "'"); + } else if (this is Event) { + Report.Error (7025, Location, + "Inconsistent accessibility: event type `{0}' is less accessible than event `{1}'", + MemberType.GetSignatureForError (), GetSignatureForError ()); } else { Report.Error (52, Location, "Inconsistent accessibility: field type `" + diff --git a/mcs/mcs/expression.cs b/mcs/mcs/expression.cs index e7af0a6aa82..df0adc49475 100644 --- a/mcs/mcs/expression.cs +++ b/mcs/mcs/expression.cs @@ -1429,8 +1429,9 @@ protected override Expression DoResolve (ResolveContext ec) return null; if (probe_type_expr.IsStatic) { - ec.Report.Error (-244, loc, "The `{0}' operator cannot be applied to an operand of a static type", - OperatorName); + ec.Report.Error (7023, loc, "The second operand of `is' or `as' operator cannot be static type `{0}'", + probe_type_expr.GetSignatureForError ()); + return null; } if (expr.Type.IsPointer || probe_type_expr.IsPointer) { diff --git a/mcs/mcs/method.cs b/mcs/mcs/method.cs index 58baf51b09e..c29ce97bea6 100644 --- a/mcs/mcs/method.cs +++ b/mcs/mcs/method.cs @@ -563,6 +563,12 @@ public override void ApplyAttributeBuilder (Attribute a, MethodSpec ctor, byte[] if ((ModFlags & extern_static) != extern_static) { Report.Error (601, a.Location, "The DllImport attribute must be specified on a method marked `static' and `extern'"); } + + if (MemberName.IsGeneric || Parent.IsGenericOrParentIsGeneric) { + Report.Error (7042, a.Location, + "The DllImport attribute cannot be applied to a method that is generic or contained in a generic type"); + } + is_external_implementation = true; } diff --git a/mcs/mcs/report.cs b/mcs/mcs/report.cs index 3e022e5589f..5ae47d8a0d0 100644 --- a/mcs/mcs/report.cs +++ b/mcs/mcs/report.cs @@ -57,7 +57,8 @@ public class Report 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, 3021, 3022, 3023, 3024, 3026, 3027, 4014, 4024, 4025, 4026, - 7080, 7081, 7082, 7095 + 7035, 7080, 7081, 7082, 7095, + 8009, }; static HashSet AllWarningsHashSet; diff --git a/mcs/mcs/statement.cs b/mcs/mcs/statement.cs index 80296bec456..9336ba73584 100644 --- a/mcs/mcs/statement.cs +++ b/mcs/mcs/statement.cs @@ -1240,12 +1240,9 @@ protected override bool DoResolve (BlockContext ec) } } } else { - // Same error code as .NET but better error message if (block_return_type.Kind == MemberKind.Void) { - ec.Report.Error (127, loc, - "`{0}': A return keyword must not be followed by any expression when delegate returns void", - am.GetSignatureForError ()); - + ec.Report.Error (8030, loc, + "Anonymous function or lambda expression converted to a void returning delegate cannot return a value"); return false; } diff --git a/mcs/tests/gtest-311.cs b/mcs/tests/gtest-311.cs deleted file mode 100644 index d9792d578a0..00000000000 --- a/mcs/tests/gtest-311.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Compiler options: -t:library - -using System; -using System.Runtime.InteropServices; - -class A -{ - [DllImport ("Dingus", CharSet=CharSet.Auto)] - extern static void Do (); - - [DllImport ("Dingus")] - extern static void Do2 (); - - public static void Main () - { - - } -} \ No newline at end of file From e2e64fada523d77272f5db50d6f2c19d0429cac2 Mon Sep 17 00:00:00 2001 From: marcos henrich Date: Tue, 3 Jun 2014 16:23:22 +0100 Subject: [PATCH 052/694] Changed UploadStringAsync to handle UploadString encapsulated exceptions. UploadString call UploadData that encapsulates all exceptions in a WebException. ThreadInterruptedException were encapsulated into a WebException, so UploadStringAsync now uses e.InnerException is ThreadInterruptedException instead of trying to catch it. --- mcs/class/System/System.Net/WebClient.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mcs/class/System/System.Net/WebClient.cs b/mcs/class/System/System.Net/WebClient.cs index 7ee338a0a26..97f9759dcc3 100644 --- a/mcs/class/System/System.Net/WebClient.cs +++ b/mcs/class/System/System.Net/WebClient.cs @@ -1405,10 +1405,12 @@ public void UploadStringAsync (Uri address, string method, string data, object u string data2 = UploadString ((Uri) args [0], (string) args [1], (string) args [2]); OnUploadStringCompleted ( new UploadStringCompletedEventArgs (data2, null, false, args [3])); - } catch (ThreadInterruptedException){ - OnUploadStringCompleted ( - new UploadStringCompletedEventArgs (null, null, true, args [3])); } catch (Exception e){ + if (e is ThreadInterruptedException || e.InnerException is ThreadInterruptedException) { + OnUploadStringCompleted ( + new UploadStringCompletedEventArgs (null, null, true, args [3])); + return; + } OnUploadStringCompleted ( new UploadStringCompletedEventArgs (null, e, false, args [3])); }}); From 5006b465ce2cbc5d872ca2dc1bf35d4e0547ab5f Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Tue, 3 Jun 2014 19:30:49 +0200 Subject: [PATCH 053/694] [bcl] Disable a test added by 3cf55e6016811ce115ef47fbb9636f10d4b62789, it depends on precise gc behaviour. --- .../System.Collections.Concurrent/ConcurrentQueueTests.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs b/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs index 80313356fe2..51aeeeb8e89 100644 --- a/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs +++ b/mcs/class/corlib/Test/System.Collections.Concurrent/ConcurrentQueueTests.cs @@ -215,13 +215,15 @@ public void ToExistingArray_Overflow () { queue.CopyTo (new int[3], 0); } - + static WeakReference CreateWeakReference (object obj) { return new WeakReference (obj); } - + [Test] + // This depends on precise stack scanning + [Category ("NotWorking")] public void TryDequeueReferenceTest () { var obj = new Object (); From 1feb13fe25d7467c00d6fcb00b670a3a3eb1b757 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Tue, 3 Jun 2014 20:19:33 +0200 Subject: [PATCH 054/694] [runtime] Add an EXTRA_DISABLED_TESTS make variable to disable tests on the command line. --- mono/tests/Makefile.am | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mono/tests/Makefile.am b/mono/tests/Makefile.am index ab18c9bdf08..097788b7100 100644 --- a/mono/tests/Makefile.am +++ b/mono/tests/Makefile.am @@ -551,7 +551,8 @@ DISABLED_TESTS= \ bug-348522.2.exe \ bug-459094.exe \ delegate-invoke.exe \ - $(PLATFORM_DISABLED_TESTS) + $(PLATFORM_DISABLED_TESTS) \ + $(EXTRA_DISABLED_TESTS) DISABLED_TESTS_WRENCH= \ $(DISABLED_TESTS) \ From 0828b8e574da37cf9247c2e0ce5968ede8ecab36 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Tue, 3 Jun 2014 22:29:12 +0200 Subject: [PATCH 055/694] [System.ServiceModel.Security] Exclude security forwarders from mobile builds --- .../Facades/System.ServiceModel.Security/TypeForwarders.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mcs/class/Facades/System.ServiceModel.Security/TypeForwarders.cs b/mcs/class/Facades/System.ServiceModel.Security/TypeForwarders.cs index e0cc880df29..b8424b6abaf 100644 --- a/mcs/class/Facades/System.ServiceModel.Security/TypeForwarders.cs +++ b/mcs/class/Facades/System.ServiceModel.Security/TypeForwarders.cs @@ -24,6 +24,7 @@ [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.ServiceModel.Channels.SecurityBindingElement))] [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.ServiceModel.Channels.SecurityHeaderLayout))] [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.ServiceModel.Channels.TransportSecurityBindingElement))] +#if !MOBILE [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.ServiceModel.DnsEndpointIdentity))] [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.ServiceModel.MessageSecurityVersion))] [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.ServiceModel.Security.BasicSecurityProfileVersion))] @@ -37,3 +38,4 @@ [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.ServiceModel.Security.TrustVersion))] [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.ServiceModel.SpnEndpointIdentity))] [assembly: System.Runtime.CompilerServices.TypeForwardedToAttribute(typeof(System.ServiceModel.UpnEndpointIdentity))] +#endif \ No newline at end of file From a0064f9d5a4f002622cc7e327d4cf031a29bb4d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Tue, 3 Jun 2014 23:33:30 +0200 Subject: [PATCH 056/694] [System] Fix WebClientTest build in net_2_0. CancellationTokenSource is a 4.0 thing. --- mcs/class/System/Test/System.Net/WebClientTest.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mcs/class/System/Test/System.Net/WebClientTest.cs b/mcs/class/System/Test/System.Net/WebClientTest.cs index e39ca906b2f..78bb45f6b6e 100644 --- a/mcs/class/System/Test/System.Net/WebClientTest.cs +++ b/mcs/class/System/Test/System.Net/WebClientTest.cs @@ -2221,6 +2221,7 @@ public void UploadFileAsyncCancelEvent () }); } +#if NET_4_0 public void UploadAsyncCancelEventTest (Action uploadAction) { var ep = new IPEndPoint (IPAddress.Loopback, 8000); @@ -2244,5 +2245,6 @@ public void UploadAsyncCancelEventTest (Action Assert.IsTrue (cancelEvent.WaitOne (1000)); } } +#endif } } From 63b64977bc900d48a656e277ea792e4724fdf090 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Wed, 4 Jun 2014 11:23:13 +0200 Subject: [PATCH 057/694] [msbuild] Implemented instance members on static property evaluation --- .../Microsoft.Build.BuildEngine/Expression.cs | 17 +++++++++++++++++ .../Test/various/Properties.cs | 15 +++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Expression.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Expression.cs index 1e0fda2fdd8..655224f89a8 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Expression.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Expression.cs @@ -528,6 +528,23 @@ static MemberInvocationReference ParseInvocation (string text, ref int p, Type t throw new InvalidProjectFileException (string.Format ("Invalid static method invocation syntax '{0}'", text.Substring (p))); name = text.Substring (p, end - p); + + // + // It can be instance member on static property + // + if (name.IndexOf ('.') > 0) { + var names = name.Split ('.'); + int i; + for (i = 0; i < names.Length - 1; ++i) { + instance = new MemberInvocationReference (type, names [i]) { + Instance = instance + }; + } + + type = null; + name = names [i]; + } + args = null; } diff --git a/mcs/class/Microsoft.Build.Engine/Test/various/Properties.cs b/mcs/class/Microsoft.Build.Engine/Test/various/Properties.cs index fba19683c18..b45bc39228b 100644 --- a/mcs/class/Microsoft.Build.Engine/Test/various/Properties.cs +++ b/mcs/class/Microsoft.Build.Engine/Test/various/Properties.cs @@ -160,6 +160,21 @@ public void InstanceMethodOnStaticProperty () Assert.AreEqual (DateTime.Now.ToString ("yyyy.MM.dd"), proj.GetEvaluatedProperty ("Prop1"), "#1"); } + [Test] + public void InstanceMemberOnStaticProperty () + { + string documentString = @" + + + $([System.DateTime]::Now.Year) + + + "; + + proj.LoadXml (documentString); + Assert.AreEqual (DateTime.Now.Year.ToString (), proj.GetEvaluatedProperty ("Prop1"), "#1"); + } + [Test] public void MSBuildPropertyFunctions () { From 92e321f26f21b690d3fb965f6e0e70584f643711 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Wed, 4 Jun 2014 11:24:34 +0200 Subject: [PATCH 058/694] [mcs] null coalescing operator cannot reduce constants --- mcs/errors/cs0133-6.cs | 10 ++++++++++ mcs/errors/cs0133-7.cs | 10 ++++++++++ mcs/mcs/nullable.cs | 23 +++++++++++------------ 3 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 mcs/errors/cs0133-6.cs create mode 100644 mcs/errors/cs0133-7.cs diff --git a/mcs/errors/cs0133-6.cs b/mcs/errors/cs0133-6.cs new file mode 100644 index 00000000000..a523169cdbd --- /dev/null +++ b/mcs/errors/cs0133-6.cs @@ -0,0 +1,10 @@ +// CS0133: The expression being assigned to `o' must be constant +// Line: 8 + +class X +{ + void Foo () + { + const object o = "" ?? null; + } +} \ No newline at end of file diff --git a/mcs/errors/cs0133-7.cs b/mcs/errors/cs0133-7.cs new file mode 100644 index 00000000000..10d82d9fe5e --- /dev/null +++ b/mcs/errors/cs0133-7.cs @@ -0,0 +1,10 @@ +// CS0133: The expression being assigned to `o' must be constant +// Line: 8 + +class X +{ + void Foo () + { + const object o = null ?? ""; + } +} \ No newline at end of file diff --git a/mcs/mcs/nullable.cs b/mcs/mcs/nullable.cs index 5f1822d0070..a0ace60b4e7 100644 --- a/mcs/mcs/nullable.cs +++ b/mcs/mcs/nullable.cs @@ -1158,26 +1158,25 @@ Expression ConvertExpression (ResolveContext ec) // Constant lc = left as Constant; if (lc != null && !lc.IsDefaultValue) - return ReducedExpression.Create (lc, this); + return ReducedExpression.Create (lc, this, false); // // Reduce (left ?? null) to left OR (null-constant ?? right) to right // - if (right.IsNull || lc != null) - return ReducedExpression.Create (lc != null ? right : left, this); + if (right.IsNull || lc != null) { + // + // Special case null ?? null + // + if (right.IsNull && ltype == right.Type) + return null; + + return ReducedExpression.Create (lc != null ? right : left, this, false); + } right = Convert.ImplicitConversion (ec, right, ltype, loc); type = ltype; return this; } - - // - // Special case null ?? null - // - if (ltype == right.Type) { - type = ltype; - return this; - } } else { return null; } @@ -1190,7 +1189,7 @@ Expression ConvertExpression (ResolveContext ec) // Reduce (null ?? right) to right // if (left.IsNull) - return ReducedExpression.Create (right, this).Resolve (ec); + return ReducedExpression.Create (right, this, false).Resolve (ec); left = Convert.ImplicitConversion (ec, unwrap ?? left, rtype, loc); type = rtype; From 5e76deaf725cc8dd29f71aecd0b7a0622f5e165c Mon Sep 17 00:00:00 2001 From: marcos henrich Date: Wed, 4 Jun 2014 10:18:43 +0100 Subject: [PATCH 059/694] Test JavaScriptSerializer.Deserialize with nullable enums. Covers #19287. --- .../JavaScriptSerializerTest.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/mcs/class/System.Web.Extensions/Test/System.Web.Script.Serialization/JavaScriptSerializerTest.cs b/mcs/class/System.Web.Extensions/Test/System.Web.Script.Serialization/JavaScriptSerializerTest.cs index 5883104a95e..995590eeb2e 100644 --- a/mcs/class/System.Web.Extensions/Test/System.Web.Script.Serialization/JavaScriptSerializerTest.cs +++ b/mcs/class/System.Web.Extensions/Test/System.Web.Script.Serialization/JavaScriptSerializerTest.cs @@ -1365,5 +1365,28 @@ public void DeserializeDictionaryOfArrayList () var ret2vad = (IDictionary) ret2va [0]; Assert.AreEqual ("subval", ret2vad ["subkey"], "#2.4"); } + + class ClassWithNullableEnum + { + public MyEnum? Value { get; set; } + } + + [Test] + public void DeserializeNullableEnum () + { + var jsonValues = new Dictionary { + { "{\"Value\":0}", MyEnum.AAA}, + { "{\"Value\":\"0\"}", MyEnum.AAA}, + { "{\"Value\":null}", null} + }; + + var ser = new JavaScriptSerializer (); + + foreach (var kv in jsonValues) + { + var obj = ser.Deserialize (kv.Key); + Assert.AreEqual (kv.Value, obj.Value); + } + } } } From e28d8783c5d06d8132768fa3b482aa8b71ca2cdd Mon Sep 17 00:00:00 2001 From: marcos henrich Date: Wed, 4 Jun 2014 11:11:36 +0100 Subject: [PATCH 060/694] Improved JavaScriptSerializer.ConvertToType Nullable handling. Fixes #19287. ConvertToType was returning null even when the object was not a string. When the target type is Nullable, ConvertToType returns null if the object is an empty string, if the object is not a string and the target type is obtainable from a string then the object is converted to a string and the string to the target type. --- .../JavaScriptSerializer.cs | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/mcs/class/System.Web.Extensions/System.Web.Script.Serialization/JavaScriptSerializer.cs b/mcs/class/System.Web.Extensions/System.Web.Script.Serialization/JavaScriptSerializer.cs index f8f65c52e8b..70e6fc9bebd 100644 --- a/mcs/class/System.Web.Extensions/System.Web.Script.Serialization/JavaScriptSerializer.cs +++ b/mcs/class/System.Web.Extensions/System.Web.Script.Serialization/JavaScriptSerializer.cs @@ -180,16 +180,20 @@ object ConvertToType (object obj, Type targetType) return c.ConvertFrom (obj); } - /* - * Take care of the special case whereas in JSON an empty string ("") really means - * an empty value - * (see: https://bugzilla.novell.com/show_bug.cgi?id=328836) - */ - if ((targetType.IsGenericType) && (targetType.GetGenericTypeDefinition() == typeof(Nullable<>))) - { - string s = obj as String; - if (String.IsNullOrEmpty(s)) + if ((targetType.IsGenericType) && (targetType.GetGenericTypeDefinition () == typeof (Nullable<>))) { + if (obj is String) { + /* + * Take care of the special case whereas in JSON an empty string ("") really means + * an empty value + * (see: https://bugzilla.novell.com/show_bug.cgi?id=328836) + */ + if(String.IsNullOrEmpty ((String)obj)) return null; + } else if (c.CanConvertFrom (typeof (string))) { + TypeConverter objConverter = TypeDescriptor.GetConverter (obj); + string s = objConverter.ConvertToInvariantString (obj); + return c.ConvertFromInvariantString (s); + } } return Convert.ChangeType (obj, targetType); From ca13dbf1e136b63b4c4369811613551a387f966e Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Wed, 4 Jun 2014 14:30:03 +0200 Subject: [PATCH 061/694] [mcs] Don't wrap enum constants during folding when result is reduced --- mcs/mcs/cfold.cs | 4 ++-- mcs/tests/test-894.cs | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 mcs/tests/test-894.cs diff --git a/mcs/mcs/cfold.cs b/mcs/mcs/cfold.cs index bea0ee06df0..72f3a9c3620 100644 --- a/mcs/mcs/cfold.cs +++ b/mcs/mcs/cfold.cs @@ -367,8 +367,8 @@ static public Constant BinaryFold (ResolveContext ec, Binary.Operator oper, return null; result = result.Reduce (ec, lt); - if (result == null) - return null; + if (result == null || lt.IsEnum) + return result; return new EnumConstant (result, lt); } diff --git a/mcs/tests/test-894.cs b/mcs/tests/test-894.cs new file mode 100644 index 00000000000..259a66cd03a --- /dev/null +++ b/mcs/tests/test-894.cs @@ -0,0 +1,19 @@ +using System; + +[AttributeUsage (AttributeTargets.All + 0xFFFFFE + 1)] +class A1Attribute : Attribute +{ +} + +[AttributeUsage ((AttributeTargets) 0xffff)] +class A2Attribute : Attribute +{ +} + +public class Test +{ + public static void Main () + { + + } +} \ No newline at end of file From 4f5ddeea8a1cfbc5f85486ae96ccad3569a4b8c9 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Wed, 4 Jun 2014 14:40:16 +0200 Subject: [PATCH 062/694] [mcs] Add more checks to dynamic logical operations when lhs is not of dynamic type --- mcs/errors/cs7083-2.cs | 10 ++++++++++ mcs/errors/cs7083.cs | 10 ++++++++++ mcs/mcs/expression.cs | 7 +++++++ mcs/tests/gtest-391.cs | 6 +----- mcs/tests/ver-il-net_4_5.xml | 22 +++++++++++++++++++++- 5 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 mcs/errors/cs7083-2.cs create mode 100644 mcs/errors/cs7083.cs diff --git a/mcs/errors/cs7083-2.cs b/mcs/errors/cs7083-2.cs new file mode 100644 index 00000000000..14d378fee81 --- /dev/null +++ b/mcs/errors/cs7083-2.cs @@ -0,0 +1,10 @@ +// CS7083: Expression must be implicitly convertible to Boolean or its type `C' must define operator `false' +// Line: 8 + +class C +{ + dynamic M (dynamic d) + { + return this && d; + } +} \ No newline at end of file diff --git a/mcs/errors/cs7083.cs b/mcs/errors/cs7083.cs new file mode 100644 index 00000000000..5f359c3df62 --- /dev/null +++ b/mcs/errors/cs7083.cs @@ -0,0 +1,10 @@ +// CS7083: Expression must be implicitly convertible to Boolean or its type `C' must define operator `true' +// Line: 8 + +class C +{ + dynamic M (dynamic d) + { + return this || d; + } +} \ No newline at end of file diff --git a/mcs/mcs/expression.cs b/mcs/mcs/expression.cs index df0adc49475..885ef2f4b76 100644 --- a/mcs/mcs/expression.cs +++ b/mcs/mcs/expression.cs @@ -3484,6 +3484,13 @@ Expression DoResolveDynamic (ResolveContext rc) } else { LocalVariable temp = LocalVariable.CreateCompilerGenerated (rc.BuiltinTypes.Bool, rc.CurrentBlock, loc); + if (!Convert.ImplicitConversionExists (rc, left, temp.Type) && (oper == Operator.LogicalAnd ? GetOperatorFalse (rc, left, loc) : GetOperatorTrue (rc, left, loc)) == null) { + rc.Report.Error (7083, left.Location, + "Expression must be implicitly convertible to Boolean or its type `{0}' must define operator `{1}'", + lt.GetSignatureForError (), oper == Operator.LogicalAnd ? "false" : "true"); + return null; + } + args.Add (new Argument (temp.CreateReferenceExpression (rc, loc).Resolve (rc))); args.Add (new Argument (right)); right = new DynamicExpressionStatement (this, args, loc); diff --git a/mcs/tests/gtest-391.cs b/mcs/tests/gtest-391.cs index bea361535af..fbc4644f46b 100644 --- a/mcs/tests/gtest-391.cs +++ b/mcs/tests/gtest-391.cs @@ -19,12 +19,8 @@ public static int Main () if (b != "a") return 1; - int? i = null ?? null; - if (i != null) - return 2; - object z = a ?? null; - if (i != null) + if (z != null) return 3; string p = default (string) ?? "a"; diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index 5b6cef1c610..c69c9f31048 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -13944,7 +13944,7 @@ 2 - 245 + 208 7 @@ -49903,6 +49903,26 @@ + + + + 7 + + + + + 7 + + + + + 2 + + + 7 + + + From 4dfae5ba82d30b9465f1ba5d82789b4748a23955 Mon Sep 17 00:00:00 2001 From: Neale Ferguson Date: Tue, 3 Jun 2014 11:52:00 -0400 Subject: [PATCH 063/694] Architectural level set to z10 instruction set --- mono/arch/s390x/s390x-codegen.h | 212 +++++++++- mono/mini/cpu-s390x.md | 28 +- mono/mini/mini-s390x.c | 704 ++++++++++---------------------- mono/mini/mini-s390x.h | 65 +-- mono/mini/support-s390x.h | 95 +++++ mono/mini/tramp-s390x.c | 169 ++++++-- mono/utils/mono-hwcap-s390x.c | 37 +- mono/utils/mono-hwcap-s390x.h | 80 +++- 8 files changed, 738 insertions(+), 652 deletions(-) create mode 100644 mono/mini/support-s390x.h diff --git a/mono/arch/s390x/s390x-codegen.h b/mono/arch/s390x/s390x-codegen.h index 3677b2d95b1..47e656422ee 100644 --- a/mono/arch/s390x/s390x-codegen.h +++ b/mono/arch/s390x/s390x-codegen.h @@ -6,6 +6,7 @@ #define S390X_H #include #include +#include #define FLOAT_REGS 2 /* No. float registers for parms */ #define GENERAL_REGS 5 /* No. general registers for parms */ @@ -136,13 +137,16 @@ typedef enum { s390_fpc = 256, } S390SpecialRegister; -#define s390_is_imm16(val) ((glong)val >= (glong)-(1<<15) && \ - (glong)val <= (glong)((1<<15)-1)) -#define s390_is_uimm16(val) ((glong)val >= 0 && (glong)val <= 65535) +#define s390_is_imm16(val) ((glong)val >= (glong) SHRT_MIN && \ + (glong)val <= (glong) SHRT_MAX) +#define s390_is_imm32(val) ((glong)val >= (glong) INT_MIN && \ + (glong)val <= (glong) INT_MAX) +#define s390_is_uimm16(val) ((glong)val >= 0 && (glong)val <= (glong) USHRT_MAX) +#define s390_is_uimm32(val) ((glong)val >= 0 && (glong)val <= (glong) UINT_MAX) #define s390_is_uimm20(val) ((glong)val >= 0 && (glong)val <= 1048575) #define s390_is_imm20(val) ((glong)val >= -524288 && (glong)val <= 524287) -#define s390_is_imm12(val) ((glong)val >= (glong)-(1<<11) && \ - (glong)val <= (glong)((1<<11)-1)) +#define s390_is_imm12(val) ((glong)val >= (glong)-4096 && \ + (glong)val <= (glong)4095) #define s390_is_uimm12(val) ((glong)val >= 0 && (glong)val <= 4095) #define STK_BASE s390_r15 @@ -349,7 +353,36 @@ typedef struct { short i2; char xx; char op2; -} RIE_Format; +} RIE_Format_1; + +typedef struct { + char op1; + char r1 : 4; + char r3 : 4; + short i2; + char m2 : 4; + char xx : 4; + char op2; +} RIE_Format_2; + +typedef struct { + char op1; + char r1 : 4; + char r3 : 4; + short d; + char i; + char op2; +} RIE_Format_3; + +typedef struct { + char op1; + char r1 : 4; + char yy : 4; + short i2; + char m3 : 4; + char xx : 4; + char op2; +} RIE_Format_4; typedef struct { char op1; @@ -427,12 +460,22 @@ typedef struct { typedef struct { short op; - char b1 : 4; + short tb1 : 4; short d1 : 12; - char b2 : 4; + short b2 : 4; short d2 : 12; } __attribute__ ((packed)) SSE_Format; +typedef struct { + short op; + char r3 : 4; + char o2 : 4; + short b1 : 4; + short d1 : 12; + short b2 : 4; + short d2 : 12; +} __attribute__ ((packed)) SSF_Format; + #define s390_emit16(c, x) do \ { \ *((guint16 *) c) = (guint16) x; \ @@ -509,12 +552,33 @@ typedef struct { #define S390_RI(c,opc,g1,m2) s390_emit32(c, ((opc >> 4) << 24 | (g1) << 20 | (opc & 0x0f) << 16 | (m2 & 0xffff))) -#define S390_RIE(c,opc,g1,g3,m2) do \ +#define S390_RIE_1(c,opc,g1,g3,m2) do \ { \ s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | g3)); \ s390_emit32(c, ((m2) << 16 | (opc & 0xff))); \ } while (0) +#define S390_RIE_2(c,opc,g1,g2,m3,v) do \ +{ \ + s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | g3)); \ + s390_emit16(c, (v)); \ + s390_emit16(c, ((m2) << 12 | (opc & 0xff))); \ +} while (0) + +#define S390_RIE_3(c,opc,g1,i,m3,d) do \ +{ \ + s390_emit16(c, ((opc & 0xff00) | (g1) << 4 | m3)); \ + s390_emit16(c, (d)); \ + s390_emit16(c, ((i) << 8 | (opc & 0xff))); \ +} while (0) + +#define S390_RIE_4(c,opc,g1,i2,m3) do \ +{ \ + s390_emit16(c, ((opc & 0xff00) | (g1) << 4); \ + s390_emit16(c, (i2)); \ + s390_emit16(c, ((m3) << 12 | (opc & 0xff))); \ +} while (0) + #define S390_RIL_1(c,opc,g1,m2) do \ { \ s390_emit16(c, ((opc >> 4) << 8 | (g1) << 4 | (opc & 0xf))); \ @@ -527,6 +591,20 @@ typedef struct { s390_emit32(c, m2); \ } while (0) +#define S390_RIS(c,opc,r,i,m3,b,d) do \ +{ \ + s390_emit16(c, ((opc, & 0xff00) | (r1) << 4) | (r2)); \ + s390_emit16(c, ((b) << 12) | (d)); \ + s390_emit16(c, ((i) << 4) | ((opc) & 0xff)); \ +} + +#define S390_RRS(c,opc,r1,r2,m3,b,d) do \ +{ \ + s390_emit16(c, ((opc, & 0xff00) | (r1) << 4) | (r2)); \ + s390_emit16(c, ((b) << 12) | (d)); \ + s390_emit16(c, ((m3) << 12) | ((opc) & 0xff)); \ +} + #define S390_SI(c,opc,s1,p1,m2) s390_emit32(c, (opc << 24 | (m2) << 16 | (s1) << 12 | ((p1) & 0xfff))); #define S390_SIY(c,opc,s1,p1,m2) do \ @@ -573,23 +651,60 @@ typedef struct { s390_emit16(c, ((s2) << 12 | ((p2) & 0xfff))); \ } while (0) +#define S390_SSF(c,opc,r3,s1,p1,s2,p2) do \ +{ \ + s390_emit16(c, (((opc) & 0xff00) << 8) | ((r3) << 4) | \ + ((opc) & 0xf)); \ + s390_emit16(c, ((s1) << 12 | ((p1) & 0xfff))); \ + s390_emit16(c, ((s2) << 12 | ((p2) & 0xfff))); \ +} while (0) + #define s390_a(c, r, x, b, d) S390_RX(c, 0x5a, r, x, b, d) #define s390_adb(c, r, x, b, d) S390_RXE(c, 0xed1a, r, x, b, d) #define s390_adbr(c, r1, r2) S390_RRE(c, 0xb31a, r1, r2) #define s390_aebr(c, r1, r2) S390_RRE(c, 0xb30a, r1, r2) +#define s390_afi(c, r, v) S390_RIL_1(c, 0xc29, r, v); #define s390_ag(c, r, x, b, d) S390_RXY(c, 0xe308, r, x, b, d) #define s390_agf(c, r, x, b, d) S390_RXY(c, 0xe318, r, x, b, d) +#define s390_agfi(c, r, v) S390_RIL_1(c, 0xc28, r, v) +#define s390_afgr(c, r1, r2) S390_RRE(c, 0xb918, r1, r2) #define s390_aghi(c, r, v) S390_RI(c, 0xa7b, r, v) +#define s390_aghik(c, r, v) S390_RIE_1(c, 0xecd9, r, v) #define s390_agr(c, r1, r2) S390_RRE(c, 0xb908, r1, r2) +#define s390_agrk(c, r1, r2, r3) S390_RRF_1(c, 0xb9e8, r1, r2, r3) +#define s390_agsi(c, r, v) S390_SIY(c, 0xeb7a, r v) +#define s390_ahhhr(c, r1, r2, r3) S390_RRF_1(c, 0xb9c8, r1, r2, r3) +#define s390_ahhlr(c, r1, r2, r3) S390_RRF_1(c, 0xb9d8, r1, r2, r3) #define s390_ahi(c, r, v) S390_RI(c, 0xa7a, r, v) +#define s390_ahik(c, r, v) S390_RIE_1(c, 0xecd8, r, v) +#define s390_ahy(c, r, x, b, d) S390_RXY(c, 0xe37a, r, b, d) +#define s390_aih(c, r, v) S390_RIL_1(c, 0xcc8, r, v) +#define s390_al(c, r, x, b, d) S390_RX(c, 0x5e, r, x, b, d) +#define s390_alc(c, r, x, b, d) S390_RXY(c, 0xe398, r, x, b, d) +#define s390_alcg(c, r, x, b, d) S390_RXY(c, 0xe388, r, x, b, d) #define s390_alcgr(c, r1, r2) S390_RRE(c, 0xb988, r1, r2) #define s390_alcr(c, r1, r2) S390_RRE(c, 0xb998, r1, r2) -#define s390_al(c, r, x, b, d) S390_RX(c, 0x5e, r, x, b, d) +#define s390_alfi(c, r, v) S390_RIL_1(c, 0xc2b, r, v) #define s390_alg(c, r, x, b, d) S390_RXY(c, 0xe30a, r, x, b, d) #define s390_algf(c, r, x, b, d) S390_RXY(c, 0xe31a, r, x, b, d) +#define s390_algfi(c, r, v) S390_RIL_1(c, 0xc2a, r, v) +#define s390_algfr(c, r1, r2) S390_RRE(c, 0xb91a, r1, r2) +#define s390_alghsik(c, r, v) S390_RIE_1(c, 0xecd8, r, v) #define s390_algr(c, r1, r2) S390_RRE(c, 0xb90a, r1, r2) +#define s390_algsi(c, r, v) S390_SIY(c, 0xeb7e, r, v) +#define s390_alhhhr(c, r1, r2, r3) S390_RRF_1(c, 0xb9ca, r1, r2, r3) +#define s390_alhhlr(c, r1, r2, r3) S390_RRF_1(c, 0xb9da, r1, r2, r3) +#define s390_alhsik(c, r, v) S390_RIE_1(c, 0xecda, r, v) #define s390_alr(c, r1, r2) S390_RR(c, 0x1e, r1, r2) +#define s390_alrk(c, r1, r2) S390_RRF(c, 0xb9fa, r1, r2) +#define s390_alsi(c, r, v) S390_SIY(c, 0xeb6e, r, v) +#define s390_alsih(c, r, v) S390_RIL_1(c, 0xcca, r, v) +#define s390_alsihn(c, r, v) S390_RIL_1(c, 0xccb, r, v) +#define s390_aly(c, r, x, b, d) S390_RXY(c, 0xe35e, r, x, b, d) #define s390_ar(c, r1, r2) S390_RR(c, 0x1a, r1, r2) +#define s390_ark(c, r1, r2, r3) S390_RRF_1(c, 0xb9f8, r1, r2, r3) +#define s390_asi(c, r, v) S390_SIY(c, 0xeb6a, r, v) +#define s390_ay(c, r, x, b, d) S390_RXY(c, 0xe35a, r, x, b, d) #define s390_basr(c, r1, r2) S390_RR(c, 0x0d, r1, r2) #define s390_bctr(c, r1, r2) S390_RR(c, 0x06, r1, r2) #define s390_bctrg(c, r1, r2) S390_RRE(c, 0xb946, r1, r2) @@ -610,19 +725,46 @@ typedef struct { #define s390_cdsg(c, r1, r2, b, d) S390_RSY_1(c, 0xeb3e, r1, r2, b, d) #define s390_cdsy(c, r1, r2, b, d) S390_RSY_1(c, 0xeb31, r1, r2, b, d) #define s390_cebr(c, r1, r2) S390_RRE(c, 0xb309, r1, r2) +#define s390_cegbr(c, r1, r2) S390_RRE(c, 0xb3a4, r1, r2) #define s390_cfdbr(c, r1, m, r2) S390_RRF_2(c, 0xb399, r1, m, r2) +#define s390_cfi(c, r, v) S390_RIL_1(c, 0xc2d, r, v) #define s390_cgdbr(c, r1, m, r2) S390_RRF_2(c, 0xb3a9, r1, m, r2) #define s390_cg(c, r, x, b, d) S390_RXY(c, 0xe320, r, x, b, d) +#define s390_cgfi(c, r, v) S390_RIL_1(c, 0xc2c, r, v) +#define s390_cgfrl(c, r, v) S390_RIL_1(c, 0xc6c, r, v) #define s390_cghi(c, r, i) S390_RI(c, 0xa7f, r, i) +#define s390_cgib(c, r, i, m, b, d) S390_RIS(c, 0xecfc, r, i, m, b, d) +#define s390_cgij(c, r, i, m, d) S390_RIE_3(c, 0xec7c, r, i, m, d) +#define s390_cgit(c, r, i, m) S390_RIE_4(c, 0xec70, r, i m); #define s390_cgr(c, r1, r2) S390_RRE(c, 0xb920, r1, r2) +#define s390_cgrb(c, r1, r2, m3, b, d) S390_RRS(c, 0xece4, r1, r2, m3, b, d) +#define s390_cgrj(c, r1, r2, m3, v) S390_RIE_2(c, 0xec64, r1, r2, m3, v) +#define s390_cgrl(c, r, v) S390_RIL_1(c, 0xc68, r, v) #define s390_chi(c, r, i) S390_RI(c, 0xa7e, r, i) +#define s390_cib(c, r, i, m, b, d) S390_RIS(c, 0xecfe, r, i, m, b, d) +#define s390_cij(c, r, i, m, d) S390_RIE_3(c, 0xec7e, r, i, m, d) +#define s390_cit(c, r, i, m) S390_RIE_4(c, 0xec72, r, i m); #define s390_cl(c, r, x, b, d) S390_RX(c, 0x55, r, x, b, d) #define s390_clg(c, r, x, b, d) S390_RXY(c, 0xe321, r, x, b, d) +#define s390_clgib(c, r, i, m, b, d) S390_RIS(c, 0xecfd, r, i, m, b, d) +#define s390_clgij(c, r, i, b) S390_RIE_3(c, 0xec7d, r, i, m, d) #define s390_clgr(c, r1, r2) S390_RRE(c, 0xb921, r1, r2) +#define s390_clgrj(c, r1, r2, m, v) S390_RIE_2(c, 0xec65, r1, r2, m, v) +#define s390_clgrb(c, r1, r2, m3, b, d) S390_RRS(c, 0xece5, r1, r2, m3, b, d) +#define s390_clib(c, r, i, m, b, d) S390_RIS(c, 0xecff, r, i, m, b, d) +#define s390_clij(c, r, i, b) S390_RIE_3(c, 0xec7f, r, i, m, d) #define s390_clr(c, r1, r2) S390_RR(c, 0x15, r1, r2) +#define s390_clrb(c, r1, r2, m3, b, d) S390_RRS(c, 0xecf7, r1, r2, m3, b, d) +#define s390_clrj(c, r1, r2, m, v) S390_RIE_2(c, 0xec77, r1, r2, m, v) #define s390_cr(c, r1, r2) S390_RR(c, 0x19, r1, r2) +#define s390_crb(c, r1, r2, m3, b, d) S390_RRS(c, 0xecf6, r1, r2, m3, b, d) +#define s390_crj(c, r1, r2, m3, v) S390_RIE_2(c, 0xec76, r1, r2, m3, v) +#define s390_crl(c, r, v) S390_RIL_1(c, 0xc6d, r, v) +#define s390_crt(c, r1, r2, m3) S390_RRF_2(c, 0xb972, r1, r2, m3); +#define s390_cgrt(c, r1, r2, m3) S390_RRF_2(c, 0xb960, r1, r2, m3); #define s390_cs(c, r1, r2, b, d) S390_RX(c, 0xba, r1, r2, b, d) #define s390_csg(c, r1, r2, b, d) S390_RSY_1(c, 0xeb30, r1, r2, b, d) +#define s390_csst(c, d1, b1, d2, b2, r) S390_SSF(c, 0xc82, b1, d1, b2, d2, r) #define s390_csy(c, r1, r2, b, d) S390_RSY_1(c, 0xeb14, r1, r2, b, d) #define s390_ddbr(c, r1, r2) S390_RRE(c, 0xb31d, r1, r2) #define s390_debr(c, r1, r2) S390_RRE(c, 0xb30d, r1, r2) @@ -637,6 +779,12 @@ typedef struct { #define s390_icm(c, r, m, b, d) S390_RX(c, 0xbf, r, m, b, d) #define s390_icmy(c, r, x, b, d) S390_RXY(c, 0xeb81, r, x, b, d) #define s390_icy(c, r, x, b, d) S390_RXY(c, 0xe373, r, x, b, d) +#define s390_iihf(c, r, v) S390_RIL_1(c, 0xc08, r, v) +#define s390_iihh(c, r, v) S390_RI(c, 0xa50, r, v) +#define s390_iihl(c, r, v) S390_RI(c, 0xa51, r, v) +#define s390_iilf(c, r, v) S390_RIL_1(c, 0xc09, r, v) +#define s390_iilh(c, r, v) S390_RI(c, 0xa52, r, v) +#define s390_iill(c, r, v) S390_RI(c, 0xa53, r, v) #define s390_j(c,d) s390_brc(c, S390_CC_UN, d) #define s390_jc(c, m, d) s390_brc(c, m, d) #define s390_jcl(c, m, d) s390_brcl(c, m, d) @@ -690,23 +838,28 @@ typedef struct { #define s390_ldy(c, r, x, b, d) S390_RXY(c, 0xed65, r, x, b, d) #define s390_ldeb(c, r, x, b, d) S390_RXE(c, 0xed04, r, x, b, d) #define s390_ldebr(c, r1, r2) S390_RRE(c, 0xb304, r1, r2) +#define s390_ldgr(c, r1, r2) S390_RRE(c, 0xb3c1, r1, r2) #define s390_ldr(c, r1, r2) S390_RR(c, 0x28, r1, r2) #define s390_le(c, f, x, b, d) S390_RX(c, 0x78, f, x, b, d) #define s390_ledbr(c, r1, r2) S390_RRE(c, 0xb344, r1, r2) #define s390_ler(c, r1, r2) S390_RR(c, 0x38, r1, r2) #define s390_ley(c, r, x, b, d) S390_RXY(c, 0xed64, r, x, b, d) +#define s390_lg(c, r, x, b, d) S390_RXY(c, 0xe304, r, x, b, d) #define s390_lgb(c, r, x, b, d) S390_RXY(c, 0xe377, r, x, b, d) #define s390_lgbr(c, r1, r2) S390_RRE(c, 0xb906, r1, r2) -#define s390_lg(c, r, x, b, d) S390_RXY(c, 0xe304, r, x, b, d) +#define s390_lgdr(c, r1, r2) S390_RRE(c, 0xb3cd, r1, r2) #define s390_lgf(c, r, x, b, d) S390_RXY(c, 0xe314, r, x, b, d) +#define s390_lgfi(c, r, v) S390_RIL_1(c, 0xc01, r, v) +#define s390_lgfrl(c, r1, d) S390_RIL_1(c, 0xc4c, r1, d) #define s390_lgfr(c, r1, r2) S390_RRE(c, 0xb914, r1, r2) #define s390_lgh(c, r, x, b, d) S390_RXY(c, 0xe315, r, x, b, d) #define s390_lghi(c, r, v) S390_RI(c, 0xa79, r, v) +#define s390_lghr(c, r1, r2) S390_RRE(c, 0xb907, r1, r2) #define s390_lgr(c, r1, r2) S390_RRE(c, 0xb904, r1, r2) +#define s390_lgrl(c, r1, d) S390_RIL_1(c, 0xc48, r1, d) #define s390_lh(c, r, x, b, d) S390_RX(c, 0x48, r, x, b, d) #define s390_lhr(c, r1, r2) S390_RRE(c, 0xb927, r1, r2) #define s390_lhg(c, r, x, b, d) S390_RXY(c, 0xe315, r, x, b, d) -#define s390_lghr(c, r1, r2) S390_RRE(c, 0xb907, r1, r2) #define s390_lhi(c, r, v) S390_RI(c, 0xa78, r, v) #define s390_lhy(c, r, x, b, d) S390_RXY(c, 0xe378, r, x, b, d) #define s390_llcr(c, r1, r2) S390_RRE(c, 0xb994, r1, r2) @@ -717,6 +870,12 @@ typedef struct { #define s390_llgh(c, r, x, b, d) S390_RXY(c, 0xe391, r, x, b, d) #define s390_llghr(c, r1, r2) S390_RRE(c, 0xb985, r1, r2) #define s390_llhr(c, r1, r2) S390_RRE(c, 0xb995, r1, r2) +#define s390_llihf(c, r, v) S390_RIL_1(c, 0xc0e, r, v) +#define s390_llihh(c, r, v) S390_RI(c, 0xa5c, r, v) +#define s390_llihl(c, r, v) S390_RI(c, 0xa5d, r, v) +#define s390_llilf(c, r, v) S390_RIL_1(c, 0xc0f, r, v) +#define s390_llilh(c, r, v) S390_RI(c, 0xa5e, r, v) +#define s390_llill(c, r, v) S390_RI(c, 0xa5f, r, v) #define s390_lm(c, r1, r2, b, d) S390_RS_1(c, 0x98, r1, r2, b, d) #define s390_lmg(c, r1, r2, b, d) S390_RSY_1(c, 0xeb04, r1, r2, b, d) #define s390_lndbr(c, r1, r2) S390_RRE(c, 0xb311, r1, r2) @@ -726,6 +885,7 @@ typedef struct { #define s390_lpgr(c, r1, r2) S390_RRE(c, 0xb900, r1, r2) #define s390_lpr(c, r1, r2) S390_RR(c, 0x10, r1, r2) #define s390_lr(c, r1, r2) S390_RR(c, 0x18, r1, r2) +#define s390_lrl(c, r1, d) S390_RIL_1(c, 0xc4d, r1, d) #define s390_ltgfr(c, r1, r2) S390_RRE(c, 0xb912, r1, r2) #define s390_ltgr(c, r1, r2) S390_RRE(c, 0xb902, r1, r2) #define s390_ltr(c, r1, r2) S390_RR(c, 0x12, r1, r2) @@ -734,24 +894,44 @@ typedef struct { #define s390_m(c, r, x, b, d) S390_RX(c, 0x5c, r, x, b, d) #define s390_mdbr(c, r1, r2) S390_RRE(c, 0xb31c, r1, r2) #define s390_meebr(c, r1, r2) S390_RRE(c, 0xb317, r1, r2) +#define s390_mfy(c, r, x, b, d) S390_RXY(c, 0xe35c, r, x, b, d) #define s390_mlgr(c, r1, r2) S390_RRE(c, 0xb986, r1, r2) #define s390_mlr(c, r1, r2) S390_RRE(c, 0xb996, r1, r2) #define s390_mr(c, r1, r2) S390_RR(c, 0x1c, r1, r2) #define s390_ms(c, r, x, b, d) S390_RX(c, 0x71, r, x, b, d) +#define s390_msi(c, r, v) S390_RIL_1(c, 0xc21, r, v) #define s390_msgfr(c, r1, r2) S390_RRE(c, 0xb91c, r1, r2) +#define s390_msgi(c, r, v) S390_RIL_1(c, 0xc20, r, v) #define s390_msgr(c, r1, r2) S390_RRE(c, 0xb90c, r1, r2) #define s390_msr(c, r1, r2) S390_RRE(c, 0xb252, r1, r2) #define s390_mvc(c, l, b1, d1, b2, d2) S390_SS_1(c, 0xd2, l, b1, d1, b2, d2) #define s390_mvcl(c, r1, r2) S390_RR(c, 0x0e, r1, r2) #define s390_mvcle(c, r1, r3, d2, b2) S390_RS_1(c, 0xa8, r1, r3, d2, b2) #define s390_n(c, r, x, b, d) S390_RX(c, 0x54, r, x, b, d) +#define s390_nc(c, l, b1, d1, b2, d2) S390_SS_1(c, 0xd4, l, b1, d1, b2, d2) #define s390_ng(c, r, x, b, d) S390_RXY(c, 0xe380, r, x, b, d) #define s390_ngr(c, r1, r2) S390_RRE(c, 0xb980, r1, r2) +#define s390_ngrk(c, r1, r2, r3) S390_RRF_1(c, 0xb9e4, r1, r2, r3) +#define s390_ni(c, b, d, v) S390_SI(c, 0x94, b, d, v) +#define s390_nihf(c, r, v) S390_RIL_1(c, 0xc0a, r, v) +#define s390_nihh(c, r, v) S390_RI(c, 0xa54, r, v) +#define s390_nihl(c, r, v) S390_RI(c, 0xa55, r, v) +#define s390_nilf(c, r, v) S390_RIL_1(c, 0xc0b, r, v) #define s390_nilh(c, r, v) S390_RI(c, 0xa56, r, v) #define s390_nill(c, r, v) S390_RI(c, 0xa57, r, v) +#define s390_niy(c, b, d, v) S390_SIY(c, 0xeb54, b, d, v) #define s390_nop(c) S390_RR(c, 0x07, 0x0, 0) #define s390_nr(c, r1, r2) S390_RR(c, 0x14, r1, r2) +#define s390_nrk(c, r1, r2) S390_RRF_1(c, 0xb9f4, r1, r2) +#define s390_ny(c, r, x, b, d) S390_RRY(c, 0xe354, r1, r2) #define s390_o(c, r, x, b, d) S390_RX(c, 0x56, r, x, b, d) +#define s390_oihf(c, r, v) S390_RIL_1(c, 0xc0c, r, v) +#define s390_oihh(c, r, v) S390_RI(c, 0xa58, r, v) +#define s390_oihl(c, r, v) S390_RI(c, 0xa59, r, v) +#define s390_oilf(c, r, v) S390_RIL_1(c, 0xc0d, r, v) +#define s390_oilh(c, r, v) S390_RI(c, 0xa5a, r, v) +#define s390_oill(c, r, v) S390_RI(c, 0xa5b` r, v) +#define s390_oiy(c, b, d, v) S390_SIY(c, 0xeb56 b, d, v) #define s390_og(c, r, x, b, d) S390_RXY(c, 0xe381, r, x, b, d) #define s390_ogr(c, r1, r2) S390_RRE(c, 0xb981, r1, r2) #define s390_or(c, r1, r2) S390_RR(c, 0x16, r1, r2) @@ -762,16 +942,19 @@ typedef struct { #define s390_sg(c, r, x, b, d) S390_RXY(c, 0xe309, r, x, b, d) #define s390_sgf(c, r, x, b, d) S390_RXY(c, 0xe319, r, x, b, d) #define s390_sgr(c, r1, r2) S390_RRE(c, 0xb909, r1, r2) +#define s390_sl(c, r, x, b, d) S390_RX(c, 0x5f, r, x, b, d) #define s390_sla(c, r, b, d) S390_RS_3(c, 0x8b, r, b, d) #define s390_slag(c, r1, r2, b, d) S390_RSY_1(c, 0xeb0b, r1, r2, b, d) #define s390_slbg(c, r, x, b, d) S390_RXY(c, 0xe389, r, x, b, d) #define s390_slbgr(c, r1, r2) S390_RRE(c, 0xb989, r1, r2) #define s390_slbr(c, r1, r2) S390_RRE(c, 0xb999, r1, r2) -#define s390_sl(c, r, x, b, d) S390_RX(c, 0x5f, r, x, b, d) #define s390_slda(c, r, b, d) S390_RS_3(c, 0x8f, r, b, d) #define s390_sldl(c, r, b, d) S390_RS_3(c, 0x8d, r, b, d) +#define s390_slfi(c, r, v) S390_RIL_1(c, 0xc25, r, v) #define s390_slg(c, r, x, b, d) S390_RXY(c, 0xe30b, r, x, b, d) #define s390_slgf(c, r, x, b, d) S390_RXY(c, 0xe31b, r, x, b, d) +#define s390_slgfr(c, r1, r2) S390_RRE(c, 0xb91b, r1, r2) +#define s390_slgfi(c, r, v) S390_RIL_1(c, 0xc24, r, v) #define s390_slgr(c, r1, r2) S390_RRE(c, 0xb90b, r1, r2) #define s390_sll(c, r, b, d) S390_RS_3(c, 0x89, r, b, d) #define s390_sllg(c, r1, r2, b, d) S390_RSY_1(c, 0xeb0d, r1, r2, b, d) @@ -805,7 +988,10 @@ typedef struct { #define s390_tcdb(c, r, x, b, d) S390_RXE(c, 0xed11, r, x, b, d) #define s390_tceb(c, r, x, b, d) S390_RXE(c, 0xed10, r, x, b, d) #define s390_x(c, r, x, b, d) S390_RX(c, 0x57, r, x, b, d) +#define s390_xihf(c, r, v) S390_RIL_1(c, 0xc06, r, v) +#define s390_xilf(c, r, v) S390_RIL_1(c, 0xc07, r, v) #define s390_xg(c, r, x, b, d) S390_RXY(c, 0xe382, r, x, b, d) #define s390_xgr(c, r1, r2) S390_RRE(c, 0xb982, r1, r2) #define s390_xr(c, r1, r2) S390_RR(c, 0x17, r1, r2) +#define s390_xy(c, r, x, b, d) S390_RXY(c, 0xe357, r, x, b, d) #endif diff --git a/mono/mini/cpu-s390x.md b/mono/mini/cpu-s390x.md index be6a3509d1d..34b6cdb271e 100644 --- a/mono/mini/cpu-s390x.md +++ b/mono/mini/cpu-s390x.md @@ -118,11 +118,11 @@ float_conv_to_i2: dest:i src1:f len:50 float_conv_to_i4: dest:i src1:f len:50 float_conv_to_i8: dest:l src1:f len:50 float_conv_to_i: dest:i src1:f len:52 -float_conv_to_r4: dest:f src1:f len:4 -float_conv_to_u1: dest:i src1:f len:66 -float_conv_to_u2: dest:i src1:f len:66 -float_conv_to_u4: dest:i src1:f len:66 -float_conv_to_u8: dest:i src1:f len:66 +float_conv_to_r4: dest:f src1:f len:8 +float_conv_to_u1: dest:i src1:f len:72 +float_conv_to_u2: dest:i src1:f len:72 +float_conv_to_u4: dest:i src1:f len:72 +float_conv_to_u8: dest:i src1:f len:72 float_conv_to_u: dest:i src1:f len:36 float_div: dest:f src1:f src2:f len:6 float_div_un: dest:f src1:f src2:f len:6 @@ -135,27 +135,25 @@ float_sub: dest:f src1:f src2:f len:6 fmove: dest:f src1:f len:4 i8const: dest:i len:20 icompare: src1:i src2:i len:4 -icompare_imm: src1:i len:14 +icompare_imm: src1:i len:18 iconst: dest:i len:40 - - jmp: len:46 label: len:0 lcall: dest:o len:22 clob:c lcall_membase: dest:o src1:b len:12 clob:c lcall_reg: dest:o src1:i len:8 clob:c lcompare: src1:i src2:i len:4 -load_membase: dest:i src1:b len:26 +load_membase: dest:i src1:b len:30 loadi1_membase: dest:i src1:b len:40 -loadi2_membase: dest:i src1:b len:26 -loadi4_membase: dest:i src1:b len:26 -loadi8_membase: dest:i src1:b len:26 +loadi2_membase: dest:i src1:b len:30 +loadi4_membase: dest:i src1:b len:30 +loadi8_membase: dest:i src1:b len:30 loadr4_membase: dest:f src1:b len:28 loadr8_membase: dest:f src1:b len:28 -loadu1_membase: dest:i src1:b len:26 -loadu2_membase: dest:i src1:b len:26 +loadu1_membase: dest:i src1:b len:30 +loadu2_membase: dest:i src1:b len:30 loadu4_mem: dest:i len:8 -loadu4_membase: dest:i src1:b len:26 +loadu4_membase: dest:i src1:b len:30 localloc: dest:i src1:i len:106 memory_barrier: len: 10 move: dest:i src1:i len:4 diff --git a/mono/mini/mini-s390x.c b/mono/mini/mini-s390x.c index 5374adc8b02..5d88174bac1 100644 --- a/mono/mini/mini-s390x.c +++ b/mono/mini/mini-s390x.c @@ -59,7 +59,7 @@ if (ins->inst_target_bb->native_offset) { \ #define EMIT_COND_SYSTEM_EXCEPTION(cond,exc_name) \ do { \ mono_add_patch_info (cfg, code - cfg->native_code, \ - MONO_PATCH_INFO_EXC, exc_name); \ + MONO_PATCH_INFO_EXC, exc_name); \ s390_jcl (code, cond, 0); \ } while (0); @@ -257,6 +257,8 @@ if (ins->inst_target_bb->native_offset) { \ #include "mini.h" #include +#include +#include #include #include @@ -267,6 +269,7 @@ if (ins->inst_target_bb->native_offset) { \ #include "mini-s390x.h" #include "cpu-s390x.h" +#include "support-s390x.h" #include "jit-icalls.h" #include "ir-emit.h" #include "trace.h" @@ -381,7 +384,7 @@ static __inline__ void emit_unwind_regs(MonoCompile *, guint8 *, int, int, long) int mono_exc_esp_offset = 0; -static int indent_level = 0; +__thread int indent_level = 0; static gint appdomain_tls_offset = -1, lmf_tls_offset = -1, @@ -393,14 +396,6 @@ gboolean lmf_addr_key_inited = FALSE; facilityList_t facs; -#if 0 - -extern __thread MonoDomain *tls_appdomain; -extern __thread MonoThread *tls_current_object; -extern __thread gpointer mono_lmf_addr; - -#endif - /* * The code generated for sequence points reads from this location, * which is made read-only when single stepping is enabled. @@ -626,7 +621,7 @@ indent (int diff) { if (diff < 0) indent_level += diff; v = indent_level; - printf("[%3d] ",v); + printf("%p [%3d] ",pthread_self(),v); while (v-- > 0) { printf (". "); } @@ -1262,21 +1257,6 @@ mono_arch_init (void) { guint8 *code; -#if 0 - /* - * When we do an architectural level set at z9 or better - * we can use the STFLE instruction to show us - * what hardware facilities are available - */ - int lFacility = sizeof(facs) % 8; - - memset((char *) &facs, 0, sizeof(facs)); - - __asm__ (" lgfr 0,%1\n" - " stfle %0\n" - : "=m" (facs) : "r" (lFacility) : "0", "cc"); -#endif - ss_trigger_page = mono_valloc (NULL, mono_pagesize (), MONO_MMAP_READ); bp_trigger_page = mono_valloc (NULL, mono_pagesize (), MONO_MMAP_READ); mono_mprotect (bp_trigger_page, mono_pagesize (), 0); @@ -2608,54 +2588,23 @@ mono_arch_instrument_prolog (MonoCompile *cfg, void *func, void *p, if (cfg->method->save_lmf) parmOffset -= sizeof(MonoLMF); fpOffset = parmOffset + (5*sizeof(gpointer)); - if ((!mono_hwcap_s390x_has_ld) && (fpOffset > 4096)) { - s390_lgr (code, s390_r12, STK_BASE); - baseReg = s390_r12; - while (fpOffset > 4096) { - s390_aghi (code, baseReg, 4096); - fpOffset -= 4096; - parmOffset -= 4096; - } - } else { - baseReg = STK_BASE; - } + baseReg = STK_BASE; s390_stmg (code, s390_r2, s390_r6, STK_BASE, parmOffset); - if (mono_hwcap_s390x_has_ld) { - s390_stdy (code, s390_f0, 0, STK_BASE, fpOffset); - s390_stdy (code, s390_f2, 0, STK_BASE, fpOffset+sizeof(gdouble)); - s390_stdy (code, s390_f4, 0, STK_BASE, fpOffset+2*sizeof(gdouble)); - s390_stdy (code, s390_f6, 0, STK_BASE, fpOffset+3*sizeof(gdouble)); - } else { - s390_std (code, s390_f0, 0, baseReg, fpOffset); - s390_std (code, s390_f2, 0, baseReg, fpOffset+sizeof(gdouble)); - s390_std (code, s390_f4, 0, baseReg, fpOffset+2*sizeof(gdouble)); - s390_std (code, s390_f6, 0, baseReg, fpOffset+3*sizeof(gdouble)); - } - s390_basr (code, s390_r13, 0); - s390_j (code, 10); - s390_llong(code, cfg->method); - s390_llong(code, func); - s390_lg (code, s390_r2, 0, s390_r13, 4); - if (mono_hwcap_s390x_has_ld) - s390_lay (code, s390_r3, 0, STK_BASE, parmOffset); - else - s390_la (code, s390_r3, 0, baseReg, parmOffset); + s390_stdy (code, s390_f0, 0, STK_BASE, fpOffset); + s390_stdy (code, s390_f2, 0, STK_BASE, fpOffset+sizeof(gdouble)); + s390_stdy (code, s390_f4, 0, STK_BASE, fpOffset+2*sizeof(gdouble)); + s390_stdy (code, s390_f6, 0, STK_BASE, fpOffset+3*sizeof(gdouble)); + S390_SET (code, s390_r1, func); + S390_SET (code, s390_r2, cfg->method); + s390_lay (code, s390_r3, 0, STK_BASE, parmOffset); s390_lgr (code, s390_r4, STK_BASE); s390_aghi (code, s390_r4, cfg->stack_usage); - s390_lg (code, s390_r1, 0, s390_r13, 12); s390_basr (code, s390_r14, s390_r1); - if (mono_hwcap_s390x_has_ld) { - s390_ldy (code, s390_f6, 0, STK_BASE, fpOffset+3*sizeof(gdouble)); - s390_ldy (code, s390_f4, 0, STK_BASE, fpOffset+2*sizeof(gdouble)); - s390_ldy (code, s390_f2, 0, STK_BASE, fpOffset+sizeof(gdouble)); - s390_ldy (code, s390_f0, 0, STK_BASE, fpOffset); - } else { - s390_ld (code, s390_f6, 0, baseReg, fpOffset+3*sizeof(gdouble)); - s390_ld (code, s390_f4, 0, baseReg, fpOffset+2*sizeof(gdouble)); - s390_ld (code, s390_f2, 0, baseReg, fpOffset+sizeof(gdouble)); - s390_ld (code, s390_f0, 0, baseReg, fpOffset); - } + s390_ldy (code, s390_f6, 0, STK_BASE, fpOffset+3*sizeof(gdouble)); + s390_ldy (code, s390_f4, 0, STK_BASE, fpOffset+2*sizeof(gdouble)); + s390_ldy (code, s390_f2, 0, STK_BASE, fpOffset+sizeof(gdouble)); + s390_ldy (code, s390_f0, 0, STK_BASE, fpOffset); s390_lmg (code, s390_r2, s390_r6, STK_BASE, parmOffset); return code; @@ -2756,12 +2705,8 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea break; } - s390_basr (code, s390_r13, 0); - s390_j (code, 10); - s390_llong(code, cfg->method); - s390_llong(code, func); - s390_lg (code, s390_r2, 0, s390_r13, 4); - s390_lg (code, s390_r1, 0, s390_r13, 12); + S390_SET (code, s390_r1, func); + S390_SET (code, s390_r2, cfg->method); s390_basr (code, s390_r14, s390_r1); switch (save_mode) { @@ -2890,14 +2835,14 @@ emit_float_to_int (MonoCompile *cfg, guchar *code, int dreg, int sreg, int size, } } else { short *o[1]; - s390_basr (code, s390_r13, 0); - s390_j (code, 10); - s390_llong (code, 0x41e0000000000000llu); - s390_llong (code, 0x41f0000000000000llu); + S390_SET (code, s390_r13, 0x41e0000000000000llu); + s390_ldgr (code, s390_f14, s390_r13); s390_ldr (code, s390_f15, sreg); - s390_cdb (code, s390_f15, 0, s390_r13, 4); + s390_cdbr (code, s390_f15, s390_f14); s390_jl (code, 0); CODEPTR (code, o[0]); - s390_sdb (code, s390_f15, 0, s390_r13, 12); + S390_SET (code, s390_r13, 0x41f0000000000000llu); + s390_ldgr (code, s390_f14, s390_r13); + s390_sdbr (code, s390_f15, s390_f14); s390_cfdbr (code, dreg, 7, s390_f15); s390_j (code, 4); PTRSLOT (code, o[0]); @@ -3017,28 +2962,14 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } break; case OP_STOREI4_MEMBASE_IMM: { - if (s390_is_imm16(ins->inst_imm)) { - s390_lghi (code, s390_r0, ins->inst_imm); - } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - s390_lg (code, s390_r0, 0, s390_r13, 4); - } + s390_lgfi (code, s390_r0, ins->inst_imm); S390_LONG (code, sty, st, s390_r0, 0, ins->inst_destbasereg, ins->inst_offset); } break; case OP_STORE_MEMBASE_IMM: case OP_STOREI8_MEMBASE_IMM: { - if (s390_is_imm16(ins->inst_imm)) { - s390_lghi (code, s390_r0, ins->inst_imm); - } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - s390_lg (code, s390_r0, 0, s390_r13, 4); - } + S390_SET (code, s390_r0, ins->inst_imm); S390_LONG (code, stg, stg, s390_r0, 0, ins->inst_destbasereg, ins->inst_offset); } @@ -3104,90 +3035,35 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } break; case OP_LCONV_TO_I1: { -#if 0 s390_lgbr (code, ins->dreg, ins->sreg1); -#else - s390_sllg (code, ins->dreg, ins->sreg1, 0, 56); - s390_srag (code, ins->dreg, ins->dreg, 0, 56); -#endif } break; case OP_LCONV_TO_I2: { -#if 0 s390_lghr (code, ins->dreg, ins->sreg1); -#else - s390_sllg (code, ins->dreg, ins->sreg1, 0, 48); - s390_srag (code, ins->dreg, ins->dreg, 0, 48); -#endif } break; case OP_LCONV_TO_U1: { -#if 0 - s390_llghr (code, ins->dreg, ins->sreg1); -#else - if (ins->dreg != ins->sreg1) - s390_lgr (code, ins->dreg, ins->sreg1); - s390_lghi (code, s390_r0, 0xff); - s390_ngr (code, ins->dreg, s390_r0); -#endif + s390_llgcr (code, ins->dreg, ins->sreg1); } break; case OP_LCONV_TO_U2: { -#if 0 s390_llghr (code, ins->dreg, ins->sreg1); -#else - if (ins->dreg != ins->sreg1) - s390_lgr (code, ins->dreg, ins->sreg1); - s390_lghi (code, s390_r0, -1); - s390_srlg (code, s390_r0, s390_r0, 0, 48); - s390_ngr (code, ins->dreg, s390_r0); -#endif } break; case OP_ICONV_TO_I1: { -#if 0 - s390_lbr (code, ins->dreg, ins->sreg1); -#else - if (ins->dreg != ins->sreg1) - s390_lr (code, ins->dreg, ins->sreg1); - s390_sll (code, ins->dreg, 0, 24); - s390_sra (code, ins->dreg, 0, 24); - -#endif + s390_lgbr (code, ins->dreg, ins->sreg1); } break; case OP_ICONV_TO_I2: { -#if 0 - s390_lhr (code, ins->dreg, ins->sreg1); -#else - if (ins->dreg != ins->sreg1) - s390_lr (code, ins->dreg, ins->sreg1); - s390_sll (code, ins->dreg, 0, 16); - s390_sra (code, ins->dreg, 0, 16); -#endif + s390_lghr (code, ins->dreg, ins->sreg1); } break; case OP_ICONV_TO_U1: { -#if 0 - s390_llcr (code, ins->dreg, ins->sreg1); -#else - if (ins->dreg != ins->sreg1) - s390_lr (code, ins->dreg, ins->sreg1); - s390_lhi (code, s390_r0, 0xff); - s390_nr (code, ins->dreg, s390_r0); -#endif + s390_llgcr (code, ins->dreg, ins->sreg1); } break; case OP_ICONV_TO_U2: { -#if 0 - s390_llhr (code, ins->dreg, ins->sreg1); -#else - if (ins->dreg != ins->sreg1) - s390_lr (code, ins->dreg, ins->sreg1); - s390_lhi (code, s390_r0, -1); - s390_srl (code, s390_r0, 0, 16); - s390_nr (code, ins->dreg, s390_r0); -#endif + s390_llghr (code, ins->dreg, ins->sreg1); } break; case OP_COMPARE: @@ -3207,50 +3083,25 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; case OP_COMPARE_IMM: case OP_LCOMPARE_IMM: { - if (s390_is_imm16 (ins->inst_imm)) { - s390_lghi (code, s390_r0, ins->inst_imm); - if (is_unsigned (ins->next)) - s390_clgr (code, ins->sreg1, s390_r0); - else - s390_cgr (code, ins->sreg1, s390_r0); - } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - if (is_unsigned (ins->next)) - s390_clg (code, ins->sreg1, 0, s390_r13, 4); - else - s390_cg (code, ins->sreg1, 0, s390_r13, 4); - } + S390_SET (code, s390_r0, ins->inst_imm); + if (is_unsigned (ins->next)) + s390_clgr (code, ins->sreg1, s390_r0); + else + s390_cgr (code, ins->sreg1, s390_r0); } break; case OP_ICOMPARE_IMM: { - if (s390_is_imm16 (ins->inst_imm)) { - s390_lghi (code, s390_r0, ins->inst_imm); - if (is_unsigned (ins->next)) - s390_clr (code, ins->sreg1, s390_r0); - else - s390_cr (code, ins->sreg1, s390_r0); - } - else { - s390_basr (code, s390_r13, 0); - s390_j (code, 4); - s390_word (code, ins->inst_imm); - if (is_unsigned (ins->next)) - s390_cl (code, ins->sreg1, 0, s390_r13, 4); - else - s390_c (code, ins->sreg1, 0, s390_r13, 4); - } + S390_SET (code, s390_r0, ins->inst_imm); + if (is_unsigned (ins->next)) + s390_clr (code, ins->sreg1, s390_r0); + else + s390_cr (code, ins->sreg1, s390_r0); } break; case OP_BREAK: { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_ABS, mono_break); - s390_llong (code, mono_break); - s390_lg (code, s390_r14, 0, s390_r13, 4); - s390_basr (code, s390_r14, s390_r14); + S390_CALL_TEMPLATE (code, s390_r14); } break; case OP_ADDCC: { @@ -3274,11 +3125,11 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } if (s390_is_imm16 (ins->inst_imm)) { s390_aghi (code, ins->dreg, ins->inst_imm); + } else if (s390_is_imm32 (ins->inst_imm)) { + s390_agfi (code, ins->dreg, ins->inst_imm); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - s390_ag (code, ins->dreg, 0, s390_r13, 4); + S390_SET (code, s390_r0, ins->inst_imm); + s390_agr (code, ins->dreg, s390_r0); } } break; @@ -3298,11 +3149,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) s390_lghi (code, s390_r0, ins->inst_imm); s390_alcgr (code, ins->dreg, s390_r0); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong (code, ins->inst_imm); - s390_lg (code, s390_r13, 0, s390_r13, 4); - s390_alcgr (code, ins->dreg, s390_r13); + S390_SET (code, s390_r0, ins->inst_imm); + s390_alcgr (code, ins->dreg, s390_r0); } } break; @@ -3359,13 +3207,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) s390_lgr (code, ins->dreg, ins->sreg1); } if (s390_is_imm16 (-ins->inst_imm)) { - s390_lghi (code, s390_r0, ins->inst_imm); - s390_slgr (code, ins->dreg, s390_r0); + s390_aghi (code, ins->dreg, -ins->inst_imm); + } else if (s390_is_imm32 (-ins->inst_imm)) { + s390_slgfi (code, ins->dreg, ins->inst_imm); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - s390_slg (code, ins->dreg, 0, s390_r13, 4); + S390_SET (code, s390_r0, ins->inst_imm); + s390_slgr (code, ins->dreg, s390_r0); } } break; @@ -3374,13 +3221,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) s390_lgr (code, ins->dreg, ins->sreg1); } if (s390_is_imm16 (-ins->inst_imm)) { - s390_lghi (code, s390_r0, ins->inst_imm); - s390_slgr (code, ins->dreg, s390_r0); + s390_aghi (code, ins->dreg, -ins->inst_imm); + } else if (s390_is_imm32 (-ins->inst_imm)) { + s390_slgfi (code, ins->dreg, ins->inst_imm); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - s390_slg (code, ins->dreg, 0, s390_r13, 4); + S390_SET (code, s390_r0, ins->inst_imm); + s390_slgr (code, ins->dreg, s390_r0); } } break; @@ -3392,10 +3238,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) s390_lghi (code, s390_r0, ins->inst_imm); s390_slbgr (code, ins->dreg, s390_r0); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - s390_slbg (code, ins->dreg, 0, s390_r13, 4); + S390_SET (code, s390_r0, ins->inst_imm); + s390_slbgr(code, ins->dreg, s390_r0); } } break; @@ -3435,15 +3279,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (ins->dreg != ins->sreg1) { s390_lgr (code, ins->dreg, ins->sreg1); } - if (s390_is_imm16 (ins->inst_imm)) { - s390_lghi (code, s390_r0, ins->inst_imm); - s390_ngr (code, ins->dreg, s390_r0); - } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - s390_ng (code, ins->dreg, 0, s390_r13, 4); - } + S390_SET_MASK (code, s390_r0, ins->inst_imm); + s390_ngr (code, ins->dreg, s390_r0); } break; case OP_LDIV: { @@ -3491,15 +3328,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (ins->dreg != ins->sreg1) { s390_lgr (code, ins->dreg, ins->sreg1); } - if (s390_is_imm16 (ins->inst_imm)) { - s390_lghi (code, s390_r0, ins->inst_imm); - s390_ogr (code, ins->dreg, s390_r0); - } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - s390_og (code, ins->dreg, 0, s390_r13, 4); - } + S390_SET_MASK(code, s390_r0, ins->inst_imm); + s390_ogr (code, ins->dreg, s390_r0); } break; case OP_LXOR: { @@ -3521,15 +3351,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (ins->dreg != ins->sreg1) { s390_lgr (code, ins->dreg, ins->sreg1); } - if (s390_is_imm16 (ins->inst_imm)) { - s390_lghi (code, s390_r0, ins->inst_imm); - s390_xgr (code, ins->dreg, s390_r0); - } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - s390_xg (code, ins->dreg, 0, s390_r13, 4); - } + S390_SET_MASK (code, s390_r0, ins->inst_imm); + s390_xgr (code, ins->dreg, s390_r0); } break; case OP_LSHL: { @@ -3595,11 +3418,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } if (s390_is_imm16 (ins->inst_imm)) { s390_lghi (code, s390_r13, ins->inst_imm); + } else if (s390_is_imm32 (ins->inst_imm)) { + s390_lgfi (code, s390_r13, ins->inst_imm); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - s390_lg (code, s390_r13, 0, s390_r13, 4); + S390_SET (code, s390_r13, ins->inst_imm); } s390_msgr (code, ins->dreg, s390_r13); } @@ -3654,12 +3476,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) s390_lgfr (code, ins->dreg, ins->sreg1); } if (s390_is_imm16 (ins->inst_imm)) { - s390_aghi(code, ins->dreg, ins->inst_imm); + s390_aghi (code, ins->dreg, ins->inst_imm); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 4); - s390_word (code, ins->inst_imm); - s390_agf (code, ins->dreg, 0, s390_r13, 4); + s390_afi (code, ins->dreg, ins->inst_imm); } } break; @@ -3671,11 +3490,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) s390_lghi (code, s390_r0, ins->inst_imm); s390_alcgr (code, ins->dreg, s390_r0); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 4); - s390_word (code, ins->inst_imm); - s390_lgf (code, s390_r13, 0, s390_r13, 4); - s390_alcgr (code, ins->dreg, s390_r13); + S390_SET (code, s390_r0, ins->inst_imm); + s390_alcgr (code, ins->dreg, s390_r0); } } break; @@ -3715,18 +3531,13 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (s390_is_imm16 (-ins->inst_imm)) { s390_aghi (code, ins->dreg, -ins->inst_imm); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 4); - s390_word (code, ins->inst_imm); - s390_sgf (code, ins->dreg, 0, s390_r13, 4); + s390_agfi (code, ins->dreg, -ins->inst_imm); } } break; case OP_ISBB_IMM: { - s390_basr (code, s390_r13, 0); - s390_j (code, 4); - s390_word (code, ins->inst_imm); - s390_slgf (code, ins->dreg, 0, s390_r13, 4); + S390_SET (code, s390_r0, ins->inst_imm); + s390_slgfr (code, ins->dreg, s390_r0); } break; case OP_ISUB_OVF: @@ -3768,15 +3579,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (ins->dreg != ins->sreg1) { s390_lgfr (code, ins->dreg, ins->sreg1); } - if (s390_is_imm16 (ins->inst_imm)) { - s390_lghi (code, s390_r0, ins->inst_imm); - s390_ngr (code, ins->dreg, s390_r0); - } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - s390_ng (code, ins->dreg, 0, s390_r13, 4); - } + S390_SET_MASK (code, s390_r0, ins->inst_imm); + s390_ngr (code, ins->dreg, s390_r0); } break; case OP_IDIV: { @@ -3796,14 +3600,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_IDIV_IMM: { if (s390_is_imm16 (ins->inst_imm)) { s390_lghi (code, s390_r13, ins->inst_imm); - s390_lgfr (code, s390_r0, ins->sreg1); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 4); - s390_word (code, ins->inst_imm); - s390_lgfr (code, s390_r0, ins->sreg1); - s390_lgf (code, s390_r13, 0, s390_r13, 4); + s390_lgfi (code, s390_r13, ins->inst_imm); } + s390_lgfr (code, s390_r0, ins->sreg1); s390_srda (code, s390_r0, 0, 32); s390_dr (code, s390_r0, ins->sreg2); s390_lgfr (code, ins->dreg, s390_r1); @@ -3825,14 +3625,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_IREM_IMM: { if (s390_is_imm16 (ins->inst_imm)) { s390_lghi (code, s390_r13, ins->inst_imm); - s390_lgfr (code, s390_r0, ins->sreg1); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 4); - s390_word (code, ins->inst_imm); - s390_lgfr (code, s390_r0, ins->sreg1); - s390_lgf (code, s390_r13, 0, s390_r13, 4); + s390_lgfi (code, s390_r13, ins->inst_imm); } + s390_lgfr (code, s390_r0, ins->sreg1); s390_srda (code, s390_r0, 0, 32); s390_dr (code, s390_r0, ins->sreg2); s390_lgfr (code, ins->dreg, s390_r0); @@ -3847,15 +3643,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (ins->dreg != ins->sreg1) { s390_lgfr (code, ins->dreg, ins->sreg1); } - if (s390_is_imm16 (ins->inst_imm)) { - s390_lghi (code, s390_r0, ins->inst_imm); - s390_ogr (code, ins->dreg, s390_r0); - } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - s390_og (code, ins->dreg, 0, s390_r13, 4); - } + S390_SET_MASK (code, s390_r0, ins->inst_imm); + s390_ogr (code, ins->dreg, s390_r0); } break; case OP_IXOR: { @@ -3867,15 +3656,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (ins->dreg != ins->sreg1) { s390_lgfr (code, ins->dreg, ins->sreg1); } - if (s390_is_imm16 (ins->inst_imm)) { - s390_lghi (code, s390_r0, ins->inst_imm); - s390_xgr (code, ins->dreg, s390_r0); - } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - s390_xg (code, ins->dreg, 0, s390_r13, 4); - } + S390_SET_MASK (code, s390_r0, ins->inst_imm); + s390_xgr (code, ins->dreg, s390_r0); } break; case OP_ISHL: { @@ -3936,14 +3718,11 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) s390_lgfr (code, ins->dreg, ins->sreg1); } if (s390_is_imm16 (ins->inst_imm)) { - s390_lghi (code, s390_r13, ins->inst_imm); + s390_lghi (code, s390_r0, ins->inst_imm); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 4); - s390_word (code, ins->inst_imm); - s390_lgf (code, s390_r13, 0, s390_r13, 4); + s390_lgfi (code, s390_r0, ins->inst_imm); } - s390_msr (code, ins->dreg, s390_r13); + s390_msr (code, ins->dreg, s390_r0); } break; case OP_IMUL_OVF: { @@ -3976,32 +3755,19 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; case OP_ICONST: case OP_I8CONST: { - if (s390_is_imm16(ins->inst_c0)) { - s390_lghi (code, ins->dreg, ins->inst_c0); - } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_c0); - s390_lg (code, ins->dreg, 0, s390_r13, 4); - } + S390_SET (code, ins->dreg, ins->inst_c0); } break; case OP_AOTCONST: { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); mono_add_patch_info (cfg, code - cfg->native_code, (MonoJumpInfoType)ins->inst_i1, ins->inst_p0); - s390_llong(code, 0); - s390_lg (code,ins->dreg, 0, s390_r13, 4); + S390_LOAD_TEMPLATE (code, ins->dreg); } break; case OP_JUMP_TABLE: { mono_add_patch_info (cfg, code - cfg->native_code, (MonoJumpInfoType)ins->inst_i1, ins->inst_p0); - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong (code, 0); - s390_lg (code, ins->dreg, 0, s390_r13, 4); + S390_LOAD_TEMPLATE (code, ins->dreg); } break; case OP_MOVE: @@ -4024,32 +3790,32 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) s390_llgfr (code, ins->dreg, ins->sreg1); break; case OP_LCONV_TO_OVF_U4: - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, 4294967295); - s390_clg (code, ins->sreg1, 0, s390_r13, 4); + S390_SET (code, s390_r0, 4294967295); + s390_clgr (code, ins->sreg1, s390_r0); EMIT_COND_SYSTEM_EXCEPTION (S390_CC_GT, "OverflowException"); s390_ltgr (code, ins->sreg1, ins->sreg1); EMIT_COND_SYSTEM_EXCEPTION (S390_CC_LT, "OverflowException"); s390_llgfr(code, ins->dreg, ins->sreg1); break; case OP_LCONV_TO_OVF_I4_UN: - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, 2147483647); - s390_cg (code, ins->sreg1, 0, s390_r13, 4); + S390_SET (code, s390_r0, 2147483647); + s390_cgr (code, ins->sreg1, s390_r0); EMIT_COND_SYSTEM_EXCEPTION (S390_CC_GT, "OverflowException"); s390_ltgr (code, ins->sreg1, ins->sreg1); EMIT_COND_SYSTEM_EXCEPTION (S390_CC_LT, "OverflowException"); s390_lgfr (code, ins->dreg, ins->sreg1); break; - case OP_FMOVE: - case OP_FCONV_TO_R4: { + case OP_FMOVE: { if (ins->dreg != ins->sreg1) { s390_ldr (code, ins->dreg, ins->sreg1); } } break; + case OP_FCONV_TO_R4: { + s390_ledbr (code, ins->dreg, ins->sreg1); + s390_ldebr (code, ins->dreg, ins->dreg); + } + break; case OP_S390_SETF4RET: { s390_ledbr (code, ins->dreg, ins->sreg1); } @@ -4057,11 +3823,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_TLS_GET: { if (s390_is_imm16 (ins->inst_offset)) { s390_lghi (code, s390_r13, ins->inst_offset); + } else if (s390_is_imm32 (ins->inst_offset)) { + s390_lgfi (code, s390_r13, ins->inst_offset); } else { - s390_bras (code, s390_r13, 0); - s390_j (code, 4); - s390_llong(code, ins->inst_offset); - s390_lg (code, s390_r13, 0, s390_r13, 4); + S390_SET (code, s390_r13, ins->inst_offset); } s390_ear (code, s390_r1, 0); s390_sllg(code, s390_r1, s390_r1, 0, 32); @@ -4095,21 +3860,18 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_ARGLIST: { int offset = cfg->sig_cookie + cfg->stack_usage; - if (s390_is_imm16 (offset)) + if (s390_is_imm16 (offset)) { s390_lghi (code, s390_r0, offset); - else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, offset); - s390_lg (code, s390_r0, 0, s390_r13, 0); + } else if (s390_is_imm32 (offset)) { + s390_lgfi (code, s390_r0, offset); + } else { + S390_SET (code, s390_r0, offset); } s390_agr (code, s390_r0, cfg->frame_reg); s390_stg (code, s390_r0, 0, ins->sreg1, 0); } break; case OP_FCALL: { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); call = (MonoCallInst*)ins; if (ins->flags & MONO_INST_HAS_METHOD) mono_add_patch_info (cfg, code-cfg->native_code, @@ -4119,9 +3881,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) mono_add_patch_info (cfg, code-cfg->native_code, MONO_PATCH_INFO_ABS, call->fptr); - s390_llong(code, 0); - s390_lg (code, s390_r14, 0, s390_r13, 4); - s390_basr (code, s390_r14, s390_r14); + S390_CALL_TEMPLATE (code, s390_r14); if (call->signature->ret->type == MONO_TYPE_R4) s390_ldebr (code, s390_f0, s390_f0); } @@ -4131,8 +3891,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_VCALL2: case OP_VOIDCALL: case OP_CALL: { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); call = (MonoCallInst*)ins; if (ins->flags & MONO_INST_HAS_METHOD) mono_add_patch_info (cfg, code-cfg->native_code, @@ -4142,9 +3900,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) mono_add_patch_info (cfg, code-cfg->native_code, MONO_PATCH_INFO_ABS, call->fptr); - s390_llong(code, 0); - s390_lg (code, s390_r14, 0, s390_r13, 4); - s390_basr (code, s390_r14, s390_r14); + S390_CALL_TEMPLATE (code, s390_r14); } break; case OP_FCALL_REG: { @@ -4204,13 +3960,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) int lmfOffset = cfg->stack_usage - sizeof(MonoLMF); s390_lgr (code, s390_r13, cfg->frame_reg); - if (s390_is_imm16(lmfOffset)) + if (s390_is_imm16(lmfOffset)) { s390_aghi (code, s390_r13, lmfOffset); - else { - s390_basr (code, s390_r14, 0); - s390_j (code, 4); - s390_word (code, lmfOffset); - s390_agf (code, s390_r13, 0, s390_r14, 4); + } else if (s390_is_imm32(lmfOffset)) { + s390_agfi (code, s390_r13, lmfOffset); + } else { + S390_SET (code, s390_r13, lmfOffset); } s390_lgr (code, s390_r14, STK_BASE); s390_sgr (code, s390_r14, s390_r1); @@ -4236,24 +3991,16 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; case OP_THROW: { s390_lgr (code, s390_r2, ins->sreg1); - s390_basr (code, s390_r13, 0); - s390_j (code, 6); mono_add_patch_info (cfg, code-cfg->native_code, MONO_PATCH_INFO_INTERNAL_METHOD, (gpointer) "mono_arch_throw_exception"); - s390_llong(code, 0); - s390_lg (code, s390_r14, 0, s390_r13, 4); - s390_basr (code, s390_r14, s390_r14); + S390_CALL_TEMPLATE(code, s390_r14); } break; case OP_RETHROW: { s390_lgr (code, s390_r2, ins->sreg1); - s390_basr (code, s390_r13, 0); - s390_j (code, 6); mono_add_patch_info (cfg, code-cfg->native_code, MONO_PATCH_INFO_INTERNAL_METHOD, (gpointer) "mono_arch_rethrow_exception"); - s390_llong(code, 0); - s390_lg (code, s390_r14, 0, s390_r13, 4); - s390_basr (code, s390_r14, s390_r14); + S390_CALL_TEMPLATE(code, s390_r14); } break; case OP_START_HANDLER: { @@ -4465,11 +4212,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (*((double *) ins->inst_p0) == 0) { s390_lzdr (code, ins->dreg); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong (code, ins->inst_p0); - s390_lg (code, s390_r13, 0, s390_r13, 4); - s390_ld (code, ins->dreg, 0, s390_r13, 0); + S390_SET (code, s390_r13, ins->inst_p0); + s390_ld (code, ins->dreg, 0, s390_r13, 0); } } break; @@ -4477,10 +4221,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (*((float *) ins->inst_p0) == 0) { s390_lzdr (code, ins->dreg); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_p0); - s390_lg (code, s390_r13, 0, s390_r13, 4); + S390_SET (code, s390_r13, ins->inst_p0); s390_ldeb (code, ins->dreg, 0, s390_r13, 0); } } @@ -4510,28 +4251,25 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_ICONV_TO_R_UN: { s390_cdfbr (code, ins->dreg, ins->sreg1); s390_ltr (code, ins->sreg1, ins->sreg1); - s390_jnl (code, 12); - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_word (code, 0x41f00000); - s390_word (code, 0); - s390_adb (code, ins->dreg, 0, s390_r13, 4); + s390_jnl (code, 8); + S390_SET (code, s390_r13, 0x41f0000000000000llu); + s390_ldgr (code, s390_f15, s390_r13); + s390_adbr (code, ins->dreg, s390_f15); } break; case OP_LCONV_TO_R_UN: { s390_cdgbr (code, ins->dreg, ins->sreg1); s390_ltgr (code, ins->sreg1, ins->sreg1); - s390_jnl (code, 12); - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_word (code, 0x41f00000); - s390_word (code, 0); - s390_adb (code, ins->dreg, 0, s390_r13, 4); + s390_jnl (code, 8); + S390_SET (code, s390_r13, 0x41f0000000000000llu); + s390_ldgr (code, s390_f15, s390_r13); + s390_adbr (code, ins->dreg, s390_f15); } break; case OP_LCONV_TO_R4: case OP_ICONV_TO_R4: { - s390_cdgbr (code, ins->dreg, ins->sreg1); + s390_cegbr (code, ins->dreg, ins->sreg1); + s390_ldebr (code, ins->dreg, ins->dreg); } break; case OP_LCONV_TO_R8: @@ -4733,31 +4471,31 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (ins->inst_offset > 0) { if (s390_is_imm16 (ins->inst_offset)) { s390_aghi (code, s390_r0, ins->inst_offset); + } else if (s390_is_imm32 (ins->inst_offset)) { + s390_agfi (code, s390_r0, ins->inst_offset); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_offset); - s390_ag (code, s390_r0, 0, s390_r13, 4); + S390_SET (code, s390_r13, ins->inst_offset); + s390_agr (code, s390_r0, s390_r13); } } s390_lgr (code, s390_r12, ins->sreg1); if (ins->inst_imm > 0) { if (s390_is_imm16 (ins->inst_imm)) { s390_aghi (code, s390_r12, ins->inst_imm); + } else if (s390_is_imm32 (ins->inst_imm)) { + s390_agfi (code, s390_r12, ins->inst_imm); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->inst_imm); - s390_ag (code, s390_r12, 0, s390_r13, 4); + S390_SET (code, s390_r13, ins->inst_imm); + s390_agr (code, s390_r12, s390_r13); } } if (s390_is_imm16 (ins->backend.size)) { s390_lghi (code, s390_r1, ins->backend.size); + } else if (s390_is_imm32 (ins->inst_offset)) { + s390_agfi (code, s390_r1, ins->backend.size); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, ins->backend.size); - s390_lg (code, s390_r1, 0, s390_r13, 4); + S390_SET (code, s390_r13, ins->backend.size); + s390_agr (code, s390_r1, s390_r13); } s390_lgr (code, s390_r13, s390_r1); s390_mvcle(code, s390_r0, s390_r12, 0, 0); @@ -4820,11 +4558,11 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) s390_lgr (code, ins->dreg, ins->sreg1); if (s390_is_imm16 (cfg->stack_offset)) { s390_aghi (code, ins->dreg, cfg->stack_offset); + } else if (s390_is_imm32 (cfg->stack_offset)) { + s390_agfi (code, ins->dreg, cfg->stack_offset); } else { - s390_basr (code, s390_r13, 0); - s390_j (code, 6); - s390_llong(code, cfg->stack_offset); - s390_ag (code, ins->dreg, 0, s390_r13, 4); + S390_SET (code, s390_r13, cfg->stack_offset); + s390_agr (code, ins->dreg, s390_r13); } } break; @@ -4901,33 +4639,36 @@ mono_arch_patch_code (MonoMethod *method, MonoDomain *domain, switch (patch_info->type) { case MONO_PATCH_INFO_IP: - case MONO_PATCH_INFO_EXC_NAME: case MONO_PATCH_INFO_LDSTR: case MONO_PATCH_INFO_TYPE_FROM_HANDLE: case MONO_PATCH_INFO_LDTOKEN: case MONO_PATCH_INFO_EXC: - case MONO_PATCH_INFO_ABS: + s390_patch_addr (ip, (guint64) target); + continue; case MONO_PATCH_INFO_METHOD: - case MONO_PATCH_INFO_RGCTX_FETCH: case MONO_PATCH_INFO_INTERNAL_METHOD: - case MONO_PATCH_INFO_CLASS_INIT: case MONO_PATCH_INFO_JIT_ICALL_ADDR: + case MONO_PATCH_INFO_CLASS_INIT: case MONO_PATCH_INFO_GENERIC_CLASS_INIT: - s390_patch_addr (ip, (guint64) target); + case MONO_PATCH_INFO_RGCTX_FETCH: + case MONO_PATCH_INFO_ABS: { + S390_EMIT_CALL (ip, target); continue; + } case MONO_PATCH_INFO_SWITCH: /*----------------------------------*/ /* ip points at the basr r13,0/j +4 */ /* instruction the vtable value */ /* follows this (i.e. ip+6) */ /*----------------------------------*/ - *((gconstpointer *)(ip+6)) = target; + S390_EMIT_LOAD (ip, target); continue; case MONO_PATCH_INFO_METHODCONST: case MONO_PATCH_INFO_CLASS: case MONO_PATCH_INFO_IMAGE: case MONO_PATCH_INFO_FIELD: case MONO_PATCH_INFO_IID: + case MONO_PATCH_INFO_EXC_NAME: target = S390_RELATIVE(target, ip); s390_patch_rel (ip, (guint64) target); continue; @@ -5109,13 +4850,15 @@ mono_arch_emit_prolog (MonoCompile *cfg) s390_lgr (code, s390_r11, STK_BASE); if (s390_is_imm16 (alloc_size)) { s390_aghi (code, STK_BASE, -alloc_size); - } else { + } else if (s390_is_imm32 (alloc_size)) { + s390_agfi (code, STK_BASE, -alloc_size); + } else { int stackSize = alloc_size; - while (stackSize > 32767) { - s390_aghi (code, STK_BASE, -32767); - stackSize -= 32767; + while (stackSize > INT_MAX) { + s390_agfi (code, STK_BASE, -INT_MAX); + stackSize -= INT_MAX; } - s390_aghi (code, STK_BASE, -stackSize); + s390_agfi (code, STK_BASE, -stackSize); } s390_stg (code, s390_r11, 0, STK_BASE, 0); @@ -5282,14 +5025,10 @@ mono_arch_emit_prolog (MonoCompile *cfg) /* On return from this call r2 have the address of the &lmf */ /*---------------------------------------------------------------*/ if (lmf_addr_tls_offset == -1) { - s390_basr(code, s390_r14, 0); - s390_j (code, 6); mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_INTERNAL_METHOD, (gpointer)"mono_get_lmf_addr"); - s390_llong(code, 0); - s390_lg (code, s390_r1, 0, s390_r14, 4); - s390_basr (code, s390_r14, s390_r1); + S390_CALL_TEMPLATE(code, s390_r1); } else { /*-------------------------------------------------------*/ /* Get LMF by getting value from thread level storage */ @@ -5325,10 +5064,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) /*---------------------------------------------------------------*/ /* save method info */ /*---------------------------------------------------------------*/ - s390_basr (code, s390_r1, 0); - s390_j (code, 6); - s390_llong (code, method); - s390_lg (code, s390_r1, 0, s390_r1, 4); + S390_SET (code, s390_r1, method); s390_stg (code, s390_r1, 0, s390_r13, G_STRUCT_OFFSET(MonoLMF, method)); @@ -5499,27 +5235,19 @@ mono_arch_emit_exceptions (MonoCompile *cfg) /*---------------------------------------------*/ /* Patch the parameter passed to the handler */ /*---------------------------------------------*/ - s390_basr (code, s390_r13, 0); - s390_j (code, 6); -// s390_llong(code, patch_info->data.target); - s390_llong(code, exc_class->type_token); + S390_SET (code, s390_r2, exc_class->type_token); /*---------------------------------------------*/ /* Load return address & parameter register */ /*---------------------------------------------*/ s390_larl (code, s390_r14, (guint64)S390_RELATIVE((patch_info->ip.i + cfg->native_code + 8), code)); - s390_lg (code, s390_r2, 0, s390_r13, 4); /*---------------------------------------------*/ /* Reuse the current patch to set the jump */ /*---------------------------------------------*/ - s390_basr (code, s390_r13, 0); - s390_j (code, 6); patch_info->type = MONO_PATCH_INFO_INTERNAL_METHOD; patch_info->data.name = "mono_arch_throw_corlib_exception"; patch_info->ip.i = code - cfg->native_code; - s390_llong(code, 0); - s390_lg (code, s390_r1, 0, s390_r13, 4); - s390_br (code, s390_r1); + S390_BR_TEMPLATE (code, s390_r1); } break; } @@ -5572,7 +5300,7 @@ mono_arch_free_jit_tls_data (MonoJitTlsData *tls) /*------------------------------------------------------------------*/ /* */ -/* Name - mono_arch_emit_inst_for_method */ +/* Name - mono_arch_emit_inst_for_method */ /* */ /*------------------------------------------------------------------*/ @@ -5745,7 +5473,7 @@ mono_arch_flush_register_windows (void) gboolean mono_arch_is_inst_imm (gint64 imm) { - return s390_is_imm16 (imm); + return s390_is_imm32 (imm); } /*========================= End of Function ========================*/ @@ -5819,7 +5547,40 @@ mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code) } /*========================= End of Function ========================*/ + +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_install_handler_block_guard */ +/* */ +/* Function - */ +/* */ +/*------------------------------------------------------------------*/ + +gpointer +mono_arch_install_handler_block_guard (MonoJitInfo *ji, MonoJitExceptionInfo *clause, + MonoContext *ctx, gpointer new_value) +{ + int offset; + gpointer *sp, old_value; + char *bp; + + offset = clause->exvar_offset; + + /*Load the spvar*/ + bp = MONO_CONTEXT_GET_BP (ctx); + sp = *(gpointer*)(bp + offset); + + old_value = *sp; + if (old_value < ji->code_start || (char*)old_value > ((char*)ji->code_start + ji->code_size)) + return old_value; + + *sp = new_value; + + return old_value; +} +/*========================= End of Function ========================*/ + /*------------------------------------------------------------------*/ /* */ /* Name - get_delegate_invoke_impl. */ @@ -6027,55 +5788,39 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, if (item->is_equals) { if (item->check_target_idx) { if (!item->compare_done) { - s390_basr (code, s390_r13, s390_r0); - s390_j (code, 6); - s390_llong(code, item->key); - s390_lg (code, s390_r0, 0, s390_r13, 4); + S390_SET (code, s390_r0, item->key); s390_cgr (code, s390_r0, MONO_ARCH_IMT_REG); } item->jmp_code = (guint8*) code; s390_jcl (code, S390_CC_NE, 0); - s390_basr (code, s390_r13, s390_r0); - s390_j (code, 6); - if (item->has_target_code) { - s390_llong(code, item->value.target_code); - s390_lg (code, s390_r1, 0, s390_r13, 4); - } else { - s390_llong(code, (&(vtable->vtable [item->value.vtable_slot]))); - s390_lg (code, s390_r1, 0, s390_r13, 4); - s390_lg (code, s390_r1, 0, s390_r1, 0); + if (item->has_target_code) { + S390_SET (code, s390_r1, item->value.target_code); + } else { + S390_SET (code, s390_r1, (&(vtable->vtable [item->value.vtable_slot]))); + s390_lg (code, s390_r1, 0, s390_r1, 0); } s390_br (code, s390_r1); } else { if (fail_tramp) { gint64 target; - s390_basr (code, s390_r13, s390_r0); - s390_j (code, 6); - s390_llong(code, item->key); - s390_lg (code, s390_r0, 0, s390_r13, 4); + S390_SET (code, s390_r0, item->key); s390_cgr (code, s390_r0, MONO_ARCH_IMT_REG); item->jmp_code = (guint8*) code; s390_jcl (code, S390_CC_NE, 0); - s390_basr (code, s390_r13, s390_r0); - s390_j (code, 6); if (item->has_target_code) { - s390_llong(code, item->value.target_code); - s390_lg (code, s390_r1, 0, s390_r13, 4); + S390_SET (code, s390_r1, item->value.target_code); } else { g_assert (vtable); - s390_llong(code, (&(vtable->vtable [item->value.vtable_slot]))); - s390_lg (code, s390_r1, 0, s390_r13, 4); + S390_SET (code, s390_r1, + (&(vtable->vtable [item->value.vtable_slot]))); s390_lg (code, s390_r1, 0, s390_r1, 0); } s390_br (code, s390_r1); target = S390_RELATIVE(code, item->jmp_code); s390_patch_rel(item->jmp_code+2, target); - s390_basr (code, s390_r13, s390_r0); - s390_j (code, 6); - s390_llong(code, fail_tramp); - s390_lg (code, s390_r1, 0, s390_r13, 4); + S390_SET (code, s390_r1, fail_tramp); s390_br (code, s390_r1); item->jmp_code = NULL; } else { @@ -6083,28 +5828,21 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, #if ENABLE_WRONG_METHOD_CHECK g_assert_not_reached (); #endif - s390_basr (code, s390_r13, s390_r0); - s390_j (code, 6); - s390_llong(code, (&(vtable->vtable [item->value.vtable_slot]))); - s390_lg (code, s390_r1, 0, s390_r13, 4); + S390_SET (code, s390_r1, (&(vtable->vtable [item->value.vtable_slot]))); s390_lg (code, s390_r1, 0, s390_r1, 0); s390_br (code, s390_r1); -#if ENABLE_WRONG_METHOD_CHECK - g_assert_not_reached (); -#endif } } } else { - s390_basr (code, s390_r13, s390_r0); - s390_j (code, 6); - s390_llong(code, item->key); - s390_lg (code, s390_r0, 0, s390_r13, 4); + S390_SET (code, s390_r0, item->key); s390_cgr (code, MONO_ARCH_IMT_REG, s390_r0); item->jmp_code = (guint8 *) code; s390_jcl (code, S390_CC_GE, 0); } } - /* patch the branches to get to the target items */ + /* + * patch the branches to get to the target items + */ for (i = 0; i < count; ++i) { MonoIMTCheckItem *item = imt_entries [i]; if (item->jmp_code) { diff --git a/mono/mini/mini-s390x.h b/mono/mini/mini-s390x.h index a5be8f01087..8ca5fb27ad2 100644 --- a/mono/mini/mini-s390x.h +++ b/mono/mini/mini-s390x.h @@ -14,29 +14,6 @@ /* Parameters used by the register allocator */ /*-------------------------------------------*/ -#define S390_LONG(loc, opy, op, r, ix, br, off) \ - if (mono_hwcap_s390x_has_ld) { \ - if (s390_is_imm20(off)) { \ - s390_##opy (loc, r, ix, br, off); \ - } else { \ - s390_basr (code, s390_r13, 0); \ - s390_j (code, 6); \ - s390_llong(code, off); \ - s390_lg (code, s390_r13, 0, s390_r13, 4); \ - s390_##op (code, r, s390_r13, br, 0); \ - } \ - } else { \ - if (s390_is_uimm12(off)) { \ - s390_##op (loc, r, ix, br, off); \ - } else { \ - s390_basr (code, s390_r13, 0); \ - s390_j (code, 6); \ - s390_llong(code, off); \ - s390_lg (code, s390_r13, 0, s390_r13, 4); \ - s390_##op (code, r, s390_r13, br, 0); \ - } \ - } - struct MonoLMF { gpointer previous_lmf; gpointer lmf_addr; @@ -62,46 +39,6 @@ typedef struct void *return_address; } MonoS390StackFrame; -typedef struct -{ - char n3:1; // N3 instructions present - char zArch:1; // z/Architecture mode installed - char zAct:1; // z/Architecture mode active - char date:1; // DATE enhancement facility - char idte1:1; // IDTE present (PST) - char idte2:1; // IDTE present (REG) - char asnlx:1; // ASN and LX reuse facility - char stfle:1; // STFLE installed - char zDATe:1; // Enhanced DAT in z mode - char srstat:1; // Sense running status facility - char cSSKE:1; // Conditional SSKE facility - char topo:1; // COnfiguration topology facility - char xTrans2:1; // Extended translation facility 2 - char msgSec:1; // Message security facility - char longDsp:1; // Long displacement facility - char hiPerfLD:1; // High performance long displacement facility - char hfpMAS:1; // HFP multiply-and-add/subtrace facility - char xImm:1; // Extended immediate facility - char xTrans3:1; // Extended translation facility 3 - char hfpUnX:1; // HFP unnormalized extension facility - char etf2:1; // ETF2-enhancement facility - char stckf:1; // Store-clock-fast facility - char parse:1; // Parsing enhancement facility - char mvcos:1; // MVCOS facility - char todSteer:1; // TOD-clock steering facility - char etf3:1; // ETF3-enhancement facility - char xCPUtm:1; // Extract CPU time facility - char csst:1; // Compare-swap-and-store facility - char csst2:1; // Compare-swap-and-store facility 2 - char giX:1; // General instructions extension facility - char exX:1; // Execute extensions facility - char ibm:1; // IBM internal use - char fps:1; // Floating point support enhancement - char dfp:1; // Decimal floating point facility - char hiDFP:1; // High Performance DFP facility - char pfpo:1; // PFPO instruction facility -} __attribute__((aligned(8))) facilityList_t; - // #define MONO_ARCH_SIGSEGV_ON_ALTSTACK 1 #define MONO_ARCH_EMULATE_LCONV_TO_R8_UN 1 #define MONO_ARCH_NO_EMULATE_LONG_MUL_OPTS 1 @@ -128,6 +65,8 @@ typedef struct #define MONO_ARCH_GC_MAPS_SUPPORTED 1 #define MONO_ARCH_GSHARED_SUPPORTED 1 #define MONO_ARCH_MONITOR_ENTER_ADJUSTMENT 1 +#define MONO_ARCH_HAVE_HANDLER_BLOCK_GUARD 1 +#define MONO_ARCH_HAVE_INVALIDATE_METHOD 1 #define S390_STACK_ALIGNMENT 8 #define S390_FIRST_ARG_REG s390_r2 diff --git a/mono/mini/support-s390x.h b/mono/mini/support-s390x.h new file mode 100644 index 00000000000..3ae4c48572a --- /dev/null +++ b/mono/mini/support-s390x.h @@ -0,0 +1,95 @@ +#ifndef __MONO_SUPPORT_S390X_H__ +#define __MONO_SUPPORT_S390X_H__ + +#define S390_SET(loc, dr, v) \ + do { \ + guint64 val = (guint64) v; \ + if (s390_is_uimm16(val)) { \ + s390_llill(loc, dr, val); \ + } else if (s390_is_uimm32(val)) { \ + s390_llilf(loc, dr, val); \ + } else { \ + guint32 hi = (val) >> 32; \ + guint32 lo = (val) & 0xffffffff; \ + s390_iihf(loc, dr, hi); \ + s390_iilf(loc, dr, lo); \ + } \ + } while (0) + +#define S390_LONG(loc, opy, op, r, ix, br, off) \ + if (s390_is_imm20(off)) { \ + s390_##opy (loc, r, ix, br, off); \ + } else { \ + if (ix == 0) { \ +fprintf(stderr,"\nS390_LONG - no index - r: %d br: %d off: %d\n",r,br,off); \ + S390_SET(loc, s390_r13, off); \ + s390_la (loc, s390_r13, s390_r13, br, 0); \ + } else { \ +fprintf(stderr,"\nS390_LONG - index - r: %d br: %d ix: %d off: %d\n",r,br,ix,off); \ + s390_la (loc, s390_r13, ix, br, 0); \ + S390_SET (loc, s390_r0, off); \ + s390_agr (loc, s390_r13, s390_r0); \ + } \ + s390_##op (loc, r, 0, s390_r13, 0); \ + } + +#define S390_SET_MASK(loc, dr, v) \ + do { \ + if (s390_is_imm16 (v)) { \ + s390_lghi (loc, dr, v); \ + } else if (s390_is_imm32 (v)) { \ + s390_lgfi (loc, dr, v); \ + } else { \ + gint64 val = (gint64) v; \ + guint32 hi = (val) >> 32; \ + guint32 lo = (val) & 0xffffffff; \ + s390_iilf(loc, dr, lo); \ + s390_iihf(loc, dr, hi); \ + } \ + } while (0) + +#define S390_CALL_TEMPLATE(loc, r) \ + do { \ + s390_iihf (loc, r, 0); \ + s390_iilf (loc, r, 0); \ + s390_basr (loc, s390_r14, r); \ + } while (0) + +#define S390_BR_TEMPLATE(loc, r) \ + do { \ + s390_iihf (loc, r, 0); \ + s390_iilf (loc, r, 0); \ + s390_br (loc, r); \ + } while (0) + +#define S390_LOAD_TEMPLATE(loc, r) \ + do { \ + s390_iihf (loc, r, 0); \ + s390_iilf (loc, r, 0); \ + } while (0) + +#define S390_EMIT_CALL(loc, t) \ + do { \ + gint64 val = (gint64) t; \ + guint32 hi = (val) >> 32; \ + guint32 lo = (val) & 0xffffffff; \ + uintptr_t p = (uintptr_t) loc; \ + p += 2; \ + *(guint32 *) p = hi; \ + p += 6; \ + *(guint32 *) p = lo; \ + } while (0) + +#define S390_EMIT_LOAD(loc, v) \ + do { \ + gint64 val = (gint64) v; \ + guint32 hi = (val) >> 32; \ + guint32 lo = (val) & 0xffffffff; \ + uintptr_t p = (uintptr_t) loc; \ + p += 2; \ + *(guint32 *) p = hi; \ + p += 6; \ + *(guint32 *) p = lo; \ + } while (0) + +#endif /* __MONO_SUPPORT_S390X_H__ */ diff --git a/mono/mini/tramp-s390x.c b/mono/mini/tramp-s390x.c index 8f2875afdff..d694c70f01d 100644 --- a/mono/mini/tramp-s390x.c +++ b/mono/mini/tramp-s390x.c @@ -53,6 +53,7 @@ #include "mini.h" #include "mini-s390x.h" +#include "support-s390x.h" /*========================= End of Includes ========================*/ @@ -99,10 +100,7 @@ mono_arch_get_unbox_trampoline (MonoMethod *method, gpointer addr) start = code = mono_domain_code_reserve (domain, 28); - s390_basr (code, s390_r1, 0); - s390_j (code, 6); - s390_llong(code, addr); - s390_lg (code, s390_r1, 0, s390_r1, 4); + S390_SET (code, s390_r1, addr); s390_aghi (code, this_pos, sizeof(MonoObject)); s390_br (code, s390_r1); @@ -129,27 +127,20 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr) gint32 displace; unsigned short opcode; - opcode = *((unsigned short *) (orig_code - 6)); - if (opcode == 0xc0e5) { + opcode = *((unsigned short *) (orig_code - 2)); + if (opcode == 0x0dee) { + /* This should be a 'iihf/iilf' sequence */ + S390_EMIT_CALL((orig_code - 14), addr); + mono_arch_flush_icache (orig_code - 14, 12); + } else { +fprintf(stderr, "%p %02x %02x %02x %02x\n", +&orig_code[-14], orig_code[-12], orig_code[-11], orig_code[-6], orig_code[-5]); +fflush(stderr); /* This is the 'brasl' instruction */ orig_code -= 4; displace = ((gssize) addr - (gssize) (orig_code - 2)) / 2; s390_patch_rel (orig_code, displace); mono_arch_flush_icache (orig_code, 4); - } else { - /* This should be a 'lg %r14,4(%r13)' then a 'basr r14, r14' instruction */ - g_assert (orig_code [-8] == 0xe3); - g_assert (orig_code [-7] == 0xe0); - g_assert (orig_code [-6] == 0xd0); - g_assert (orig_code [-5] == 0x04); - g_assert (orig_code [-4] == 0x00); - g_assert (orig_code [-3] == 0x04); - opcode = *((unsigned short*) (orig_code - 2)); - g_assert (opcode == 0x0dee); - - /* The call address is stored in the 8 bytes preceeding the basr instruction */ - s390_patch_addr(orig_code - 16, (gssize)addr); - mono_arch_flush_icache (orig_code - 16, 8); } } @@ -231,7 +222,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf { char *tramp_name; guint8 *buf, *tramp, *code; - int i, offset, lmfOffset; + int i, offset, lmfOffset, has_caller; GSList *unwind_ops = NULL; MonoJumpInfo *ji = NULL; @@ -242,6 +233,12 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf code = buf = mono_global_codeman_reserve(512); + if ((tramp_type == MONO_TRAMPOLINE_JUMP) || + (tramp_type == MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD)) + has_caller = 0; + else + has_caller = 1; + /*----------------------------------------------------------- STEP 0: First create a non-standard function prologue with a stack size big enough to save our registers. @@ -268,10 +265,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf method. ----------------------------------------------------------*/ - s390_basr (buf, s390_r13, 0); - s390_j (buf, 6); - s390_llong(buf, mono_get_lmf_addr); - s390_lg (buf, s390_r1, 0, s390_r13, 4); + S390_SET (buf, s390_r1, mono_get_lmf_addr); s390_basr (buf, s390_r14, s390_r1); /*---------------------------------------------------------------*/ @@ -321,11 +315,10 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf /*---------------------------------------------------------------*/ /* save the current IP */ /*---------------------------------------------------------------*/ - if (tramp_type == MONO_TRAMPOLINE_JUMP) { - s390_lghi (buf, s390_r1, 0); - } else { + if (has_caller) { s390_lg (buf, s390_r1, 0, s390_r1, S390_RET_ADDR_OFFSET); - // s390_la (buf, s390_r1, 0, s390_r1, 0); + } else { + s390_lghi (buf, s390_r1, 0); } s390_stg (buf, s390_r1, 0, s390_r13, G_STRUCT_OFFSET(MonoLMF, eip)); @@ -351,10 +344,10 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf s390_la (buf, s390_r2, 0, STK_BASE, CREATE_STACK_SIZE); /* Arg 2: code (next address to the instruction that called us) */ - if (tramp_type == MONO_TRAMPOLINE_JUMP) { - s390_lghi (buf, s390_r3, 0); - } else { + if (has_caller) { s390_lg (buf, s390_r3, 0, s390_r11, S390_RET_ADDR_OFFSET); + } else { + s390_lghi (buf, s390_r3, 0); } /* Arg 3: Trampoline argument */ @@ -366,11 +359,8 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf /* Arg 4: trampoline address. Ignore for now */ /* Calculate call address and call the C trampoline. Return value will be in r2 */ - s390_basr (buf, s390_r13, 0); - s390_j (buf, 6); tramp = (guint8*)mono_get_trampoline_func (tramp_type); - s390_llong (buf, tramp); - s390_lg (buf, s390_r1, 0, s390_r13, 4); + S390_SET (buf, s390_r1, tramp); s390_basr (buf, s390_r14, s390_r1); /* OK, code address is now on r2. Move it to r1, so that we @@ -426,6 +416,28 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf /*========================= End of Function ========================*/ +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_invalidate_method */ +/* */ +/* Function - */ +/* */ +/*------------------------------------------------------------------*/ + +void +mono_arch_invalidate_method (MonoJitInfo *ji, void *func, gpointer func_arg) +{ + /* FIXME: This is not thread safe */ + guint8 *code = ji->code_start; + + S390_SET (code, s390_r1, func); + S390_SET (code, s390_r2, func_arg); + s390_br (code, s390_r1); + +} + +/*========================= End of Function ========================*/ + /*------------------------------------------------------------------*/ /* */ /* Name - mono_arch_create_specific_trampoline */ @@ -449,10 +461,7 @@ mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_ty /*----------------------------------------------------------*/ code = buf = mono_domain_code_reserve (domain, SPECIFIC_TRAMPOLINE_SIZE); - s390_basr (buf, s390_r1, 0); - s390_j (buf, 6); - s390_llong(buf, arg1); - s390_lg (buf, s390_r1, 0, s390_r1, 4); + S390_SET (buf, s390_r1, arg1); displace = (tramp - buf) / 2; s390_jg (buf, displace); @@ -615,10 +624,7 @@ mono_arch_get_static_rgctx_trampoline (MonoMethod *m, start = code = mono_domain_code_reserve (domain, buf_len); - s390_basr (code, s390_r1, 0); - s390_j (code, 6); - s390_llong(code, mrgctx); - s390_lg (code, MONO_ARCH_RGCTX_REG, 0, s390_r1, 4); + S390_SET (code, MONO_ARCH_RGCTX_REG, mrgctx); displace = ((uintptr_t) addr - (uintptr_t) code) / 2; s390_jg (code, displace); g_assert ((code - start) < buf_len); @@ -630,6 +636,80 @@ mono_arch_get_static_rgctx_trampoline (MonoMethod *m, /*========================= End of Function ========================*/ +/*------------------------------------------------------------------*/ +/* */ +/* Name - handler_block_trampoline_helper */ +/* */ +/* Function - */ +/* */ +/*------------------------------------------------------------------*/ + +static void +handler_block_trampoline_helper (gpointer *ptr) +{ + MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id); + *ptr = jit_tls->handler_block_return_address; +} + +/*========================= End of Function ========================*/ + +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_create_handler_block_trampoline */ +/* */ +/* Function - */ +/* */ +/*------------------------------------------------------------------*/ + +gpointer +mono_arch_create_handler_block_trampoline (MonoTrampInfo **info, gboolean aot) +{ + guint8 *tramp = mono_get_trampoline_code (MONO_TRAMPOLINE_HANDLER_BLOCK_GUARD); + guint8 *code, *buf; + int tramp_size = 64; + MonoJumpInfo *ji = NULL; + GSList *unwind_ops = NULL; + + g_assert (!aot); + + code = buf = mono_global_codeman_reserve (tramp_size); + + /* + * This trampoline restore the call chain of the handler block + * then jumps into the code that deals with it. + */ + + if (mono_get_jit_tls_offset () != -1) { + s390_ear (code, s390_r1, 0); + s390_sllg (code, s390_r1, s390_r1, 0, 32); + s390_ear (code, s390_r1, 1); + S390_SET (code, s390_r14, mono_get_jit_tls_offset()); + s390_lg (code, s390_r14, s390_r1, 0, G_STRUCT_OFFSET(MonoJitTlsData, handler_block_return_address)); + /* + * Simulate a call + */ + S390_SET (code, s390_r1, tramp); + s390_br (code, s390_r1); + } else { + /* + * Slow path uses a C helper + */ + S390_SET (code, s390_r2, tramp); + S390_SET (code, s390_r1, handler_block_trampoline_helper); + s390_br (code, s390_r1); + } + + mono_arch_flush_icache (buf, code - buf); + g_assert (code - buf <= tramp_size); + + if (info) + *info = mono_tramp_info_create ("handler_block_trampoline", buf, code - buf, ji, unwind_ops); + + return buf; +} + +/*========================= End of Function ========================*/ + /*------------------------------------------------------------------*/ /* */ /* Name - mono_arch_create_generic_class_init_trampoline */ @@ -645,7 +725,6 @@ mono_arch_create_generic_class_init_trampoline (MonoTrampInfo **info, gboolean a guint8 *code, *buf; static int byte_offset = -1; static guint8 bitmask; - guint8 *jump; gint32 displace; int tramp_size; GSList *unwind_ops = NULL; diff --git a/mono/utils/mono-hwcap-s390x.c b/mono/utils/mono-hwcap-s390x.c index d2f2bc5a4a9..d5c9d254c3c 100644 --- a/mono/utils/mono-hwcap-s390x.c +++ b/mono/utils/mono-hwcap-s390x.c @@ -19,48 +19,21 @@ */ #include "mono/utils/mono-hwcap-s390x.h" - #include -gboolean mono_hwcap_s390x_has_ld = FALSE; - -static void -catch_sigill (int sig_no, siginfo_t *info, gpointer act) -{ - mono_hwcap_s390x_has_ld = FALSE; -} +facilityList_t facs; void mono_hwcap_arch_init (void) { - mono_hwcap_s390x_has_ld = TRUE; - - struct sigaction sa, *old_sa; - - /* Determine if we have a long displacement facility - * by executing the STY instruction. If it fails, we - * catch the SIGILL and assume the answer is no. - */ - sa.sa_sigaction = catch_sigill; - sigemptyset (&sa.sa_mask); - sa.sa_flags = SA_SIGINFO; - - sigaction (SIGILL, &sa, old_sa); - - __asm__ __volatile__ ( - "LGHI\t0,1\n\t" - "LA\t1,%0\n\t" - ".byte\t0xe3,0x00,0x10,0x00,0x00,0x50\n\t" - : "=m" (mono_hwcap_s390x_has_ld) - : - : "0", "1" - ); + int lFacs = sizeof(facs) / 8; - sigaction (SIGILL, old_sa, NULL); + __asm__ (" lgfr 0,%1\n" + " .insn s,0xb2b00000,%0\n" + : "=m" (facs) : "r" (lFacs) : "0", "cc"); } void mono_hwcap_print (FILE *f) { - g_fprintf (f, "mono_hwcap_s390x_has_ld = %i\n", mono_hwcap_s390x_has_ld); } diff --git a/mono/utils/mono-hwcap-s390x.h b/mono/utils/mono-hwcap-s390x.h index 24c76a28545..313aca8bcb4 100644 --- a/mono/utils/mono-hwcap-s390x.h +++ b/mono/utils/mono-hwcap-s390x.h @@ -3,6 +3,84 @@ #include "mono/utils/mono-hwcap.h" -extern gboolean mono_hwcap_s390x_has_ld; +typedef struct +{ + char n3:1; // N3 instructions present + char zArch:1; // z/Architecture mode installed + char zAct:1; // z/Architecture mode active + char date:1; // DAT enhancement facility + char idte1:1; // IDTE present (PST) + char idte2:1; // IDTE present (REG) + char asnlx:1; // ASN and LX reuse facility + char stfle:1; // STFLE installed + char zDATe:1; // Enhanced DAT in z mode + char srstat:1; // Sense running status facility + char cSSKE:1; // Conditional SSKE facility + char topo:1; // Configuration topology facility + char rv1:1; // Reserved + char xTrans2:1; // Extended translation facility 2 + char msgSec:1; // Message security facility + char longDsp:1; // Long displacement facility + char hiPerfLD:1; // High performance long displacement facility + char hfpMAS:1; // HFP multiply-and-add/subtrace facility + char xImm:1; // Extended immediate facility + char xTrans3:1; // Extended translation facility 3 + char hfpUnX:1; // HFP unnormalized extension facility + char etf2:1; // ETF2-enhancement facility + char stckf:1; // Store-clock-fast facility + char parse:1; // Parsing enhancement facility + char mvcos:1; // MVCOS facility + char todSteer:1; // TOD-clock steering facility + char etf3:1; // ETF3-enhancement facility + char xCPUtm:1; // Extract CPU time facility + char csst:1; // Compare-swap-and-store facility + char csst2:1; // Compare-swap-and-store facility 2 + char giX:1; // General instructions extension facility + char exX:1; // Execute extensions facility + char em:1; // Enhanced monitor + char rv2:1; // Reserved + char spp:1; // Set program parameters + char fps:1; // Floating point support enhancement + char dfp:1; // Decimal floating point facility + char hiDFP:1; // High Performance DFP facility + char pfpo:1; // PFPO instruction facility + char doclpkia:1; // DO/Fast BCR/CL/PK/IA + char rv3:1; // Reserved + char cmpsce:1; // CMPSC enhancement + char dfpzc:1; // DFP zoned-conversion + char eh:1; // Execution hint + char lt:1; // Load and trap + char mi:1; // Miscellaneous instruction enhancements + char pa:1; // Processor assist + char cx:1; // Constrained transactional execution + char ltlb:1; // Local TLB clearing + char ia2:1; // Interlocked access 2 + char rv4:1; // Reserved; + char rv5:1; // Reserved; + char rv6:1; // Reserved; + char rv7:1; // Reserved; + char rv8:1; // Reserved; + char rv9:1; // Reserved; + char rva:1; // Reserved; + char rvb:1; // Reserved; + char rvc:1; // Reserved; + char rvd:1; // Reserved; + char rve:1; // Reserved; + char rvf:1; // Reserved; + char rvg:1; // Reserved; + char rb:1; // RRB multiple + char cmc:1; // CPU measurement counter + char cms:1; // CPU measurement sampling + char rvh:4; // Reserved + char tx:1; // Transactional execution + char rvi:1; // Reserved + char axsi:1; // Access exception/store indication + char m3:1; // Message security extension 3 + char m4:1; // Message security extension 4 + char ed2:1; // Enhanced DAT 2 + int64_t end[0]; // End on a double word +} __attribute__((aligned(8))) facilityList_t; + +extern facilityList_t facs; #endif /* __MONO_UTILS_HWCAP_S390X_H__ */ From a2920353b6b90576cecf16c5a83d3f4c2ff869dd Mon Sep 17 00:00:00 2001 From: Neale Ferguson Date: Wed, 4 Jun 2014 10:47:37 -0400 Subject: [PATCH 064/694] Fix s390x soft debug --- mono/mini/mini-s390x.c | 29 +++++++++++++++++++++++++---- mono/mini/support-s390x.h | 2 -- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/mono/mini/mini-s390x.c b/mono/mini/mini-s390x.c index 5d88174bac1..fbc6278a342 100644 --- a/mono/mini/mini-s390x.c +++ b/mono/mini/mini-s390x.c @@ -232,7 +232,7 @@ if (ins->inst_target_bb->native_offset) { \ #define S390_TRACE_STACK_SIZE (5*sizeof(gpointer)+4*sizeof(gdouble)) #define BREAKPOINT_SIZE sizeof(breakpoint_t) -#define S390X_NOP_SIZE sizeof(I_Format) +#define S390X_NOP_SIZE sizeof(RR_Format) #define MAX(a, b) ((a) > (b) ? (a) : (b)) @@ -409,6 +409,8 @@ static gpointer bp_trigger_page; breakpoint_t breakpointCode; +static CRITICAL_SECTION mini_arch_mutex; + /*====================== End of Global Variables ===================*/ /*------------------------------------------------------------------*/ @@ -1257,6 +1259,8 @@ mono_arch_init (void) { guint8 *code; + InitializeCriticalSection (&mini_arch_mutex); + ss_trigger_page = mono_valloc (NULL, mono_pagesize (), MONO_MMAP_READ); bp_trigger_page = mono_valloc (NULL, mono_pagesize (), MONO_MMAP_READ); mono_mprotect (bp_trigger_page, mono_pagesize (), 0); @@ -1282,6 +1286,11 @@ mono_arch_init (void) void mono_arch_cleanup (void) { + if (ss_trigger_page) + mono_vfree (ss_trigger_page, mono_pagesize ()); + if (bp_trigger_page) + mono_vfree (bp_trigger_page, mono_pagesize ()); + DeleteCriticalSection (&mini_arch_mutex); } /*========================= End of Function ========================*/ @@ -4076,6 +4085,13 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) */ for (i = 0; i < (BREAKPOINT_SIZE / S390X_NOP_SIZE); ++i) s390_nop (code); + + /* + * Add an additional nop so skipping the bp doesn't cause the ip to point + * to another IL offset. + */ + s390_nop (code); + break; } @@ -5980,7 +5996,10 @@ gboolean mono_arch_is_breakpoint_event (void *info, void *sigctx) { siginfo_t* sinfo = (siginfo_t*) info; - /* Sometimes the address is off by 4 */ + + /* + * Sometimes the address is off by 4 + */ if (sinfo->si_addr >= bp_trigger_page && (guint8*)sinfo->si_addr <= (guint8*)bp_trigger_page + 128) return TRUE; else @@ -6002,7 +6021,7 @@ mono_arch_is_breakpoint_event (void *info, void *sigctx) void mono_arch_skip_breakpoint (MonoContext *ctx, MonoJitInfo *ji) { - MONO_CONTEXT_SET_IP (ctx, (guint8*)MONO_CONTEXT_GET_IP (ctx) + BREAKPOINT_SIZE); + MONO_CONTEXT_SET_IP (ctx, ((guint8*)MONO_CONTEXT_GET_IP (ctx) + sizeof(RXY_Format))); } /*========================= End of Function ========================*/ @@ -6053,7 +6072,9 @@ mono_arch_is_single_step_event (void *info, void *sigctx) { siginfo_t* sinfo = (siginfo_t*) info; - /* Sometimes the address is off by 4 */ + /* + * Sometimes the address is off by 4 + */ if (sinfo->si_addr >= ss_trigger_page && (guint8*)sinfo->si_addr <= (guint8*)ss_trigger_page + 128) return TRUE; else diff --git a/mono/mini/support-s390x.h b/mono/mini/support-s390x.h index 3ae4c48572a..62edcc4e7e9 100644 --- a/mono/mini/support-s390x.h +++ b/mono/mini/support-s390x.h @@ -21,11 +21,9 @@ s390_##opy (loc, r, ix, br, off); \ } else { \ if (ix == 0) { \ -fprintf(stderr,"\nS390_LONG - no index - r: %d br: %d off: %d\n",r,br,off); \ S390_SET(loc, s390_r13, off); \ s390_la (loc, s390_r13, s390_r13, br, 0); \ } else { \ -fprintf(stderr,"\nS390_LONG - index - r: %d br: %d ix: %d off: %d\n",r,br,ix,off); \ s390_la (loc, s390_r13, ix, br, 0); \ S390_SET (loc, s390_r0, off); \ s390_agr (loc, s390_r13, s390_r0); \ From 5348a0dacabfe6b6e9cabfb8a6547870e2d40f9b Mon Sep 17 00:00:00 2001 From: Neale Ferguson Date: Wed, 4 Jun 2014 10:50:03 -0400 Subject: [PATCH 065/694] Correct op_seqpoint length --- mono/mini/cpu-s390x.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/mini/cpu-s390x.md b/mono/mini/cpu-s390x.md index 34b6cdb271e..4bcfa33bafb 100644 --- a/mono/mini/cpu-s390x.md +++ b/mono/mini/cpu-s390x.md @@ -175,7 +175,7 @@ s390_move: len:48 dest:b src1:b s390_setf4ret: dest:f src1:f len:4 sbb: dest:i src1:i src2:i len:6 sbb_imm: dest:i src1:i len:14 -seq_point: len:36 +seq_point: len:54 sext_i4: dest:i src1:i len:4 zext_i4: dest:i src1:i len:4 shl_imm: dest:i src1:i len:10 From d82542fb001f9afdab060d9d19a2735302a85e4e Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Wed, 4 Jun 2014 18:24:28 +0200 Subject: [PATCH 066/694] [mcs] Emit result type conversion for null coalescing operator on nullable type --- mcs/mcs/nullable.cs | 2 +- mcs/tests/gtest-614.cs | 28 ++++++++++++++++++++++++++++ mcs/tests/ver-il-net_4_5.xml | 18 ++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 mcs/tests/gtest-614.cs diff --git a/mcs/mcs/nullable.cs b/mcs/mcs/nullable.cs index a0ace60b4e7..566c62af3aa 100644 --- a/mcs/mcs/nullable.cs +++ b/mcs/mcs/nullable.cs @@ -1237,7 +1237,7 @@ public override void Emit (EmitContext ec) // When both expressions are nullable the unwrap // is needed only for null check not for value uwrap // - if (type.IsNullableType) + if (type.IsNullableType && TypeSpecComparer.IsEqual (NullableInfo.GetUnderlyingType (type), unwrap.Type)) unwrap.Load (ec); else left.Emit (ec); diff --git a/mcs/tests/gtest-614.cs b/mcs/tests/gtest-614.cs new file mode 100644 index 00000000000..d68193ad0bf --- /dev/null +++ b/mcs/tests/gtest-614.cs @@ -0,0 +1,28 @@ +using System; + +struct S +{ + public static explicit operator int? (S? s) + { + throw new ApplicationException (); + } + + public static implicit operator int (S? s) + { + return 2; + } +} + +class C +{ + public static int Main() + { + int? nn = 3; + S? s = new S (); + int? ret = s ?? nn; + if (ret != 2) + return 1; + + return 0; + } +} diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index c69c9f31048..60dda9db30a 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -19137,6 +19137,24 @@ + + + + 7 + + + 10 + + + + + 100 + + + 7 + + + From 9e5d5e5c90fce0374447b81111b5d6b08773c55a Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Wed, 4 Jun 2014 18:26:54 +0200 Subject: [PATCH 067/694] [mcs] Better error message for attribute value used for unsupported parameter type --- mcs/errors/{cs0182-10.cs => cs0181-2.cs} | 2 +- mcs/errors/{cs0182-12.cs => cs0181-3.cs} | 2 +- mcs/errors/{cs0182-13.cs => cs0181-4.cs} | 2 +- mcs/errors/{cs0182-2.cs => cs0181.cs} | 2 +- mcs/mcs/attribute.cs | 12 +++---- mcs/mcs/constant.cs | 30 ++++++++--------- mcs/mcs/ecore.cs | 42 ++++++++++++++++-------- mcs/mcs/expression.cs | 12 +++---- 8 files changed, 60 insertions(+), 44 deletions(-) rename mcs/errors/{cs0182-10.cs => cs0181-2.cs} (68%) rename mcs/errors/{cs0182-12.cs => cs0181-3.cs} (56%) rename mcs/errors/{cs0182-13.cs => cs0181-4.cs} (57%) rename mcs/errors/{cs0182-2.cs => cs0181.cs} (60%) diff --git a/mcs/errors/cs0182-10.cs b/mcs/errors/cs0181-2.cs similarity index 68% rename from mcs/errors/cs0182-10.cs rename to mcs/errors/cs0181-2.cs index 1ce2d2f48df..6334606fae7 100644 --- a/mcs/errors/cs0182-10.cs +++ b/mcs/errors/cs0181-2.cs @@ -1,4 +1,4 @@ -// CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression +// CS0181: Attribute constructor parameter has type `int[][]', which is not a valid attribute parameter type // Line: 13 using System; diff --git a/mcs/errors/cs0182-12.cs b/mcs/errors/cs0181-3.cs similarity index 56% rename from mcs/errors/cs0182-12.cs rename to mcs/errors/cs0181-3.cs index 2827f63c7bd..6e2f5b6ff00 100644 --- a/mcs/errors/cs0182-12.cs +++ b/mcs/errors/cs0181-3.cs @@ -1,4 +1,4 @@ -// CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression +// CS0181: Attribute constructor parameter has type `System.Enum', which is not a valid attribute parameter type // Line: 18 using System; diff --git a/mcs/errors/cs0182-13.cs b/mcs/errors/cs0181-4.cs similarity index 57% rename from mcs/errors/cs0182-13.cs rename to mcs/errors/cs0181-4.cs index 8c764b28d09..80ed5629a9f 100644 --- a/mcs/errors/cs0182-13.cs +++ b/mcs/errors/cs0181-4.cs @@ -1,4 +1,4 @@ -// CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression +// CS0181: Attribute constructor parameter has type `System.Attribute', which is not a valid attribute parameter type // Line: 6 using System; diff --git a/mcs/errors/cs0182-2.cs b/mcs/errors/cs0181.cs similarity index 60% rename from mcs/errors/cs0182-2.cs rename to mcs/errors/cs0181.cs index b988a04a1ec..f04342c4a8b 100644 --- a/mcs/errors/cs0182-2.cs +++ b/mcs/errors/cs0181.cs @@ -1,4 +1,4 @@ -// CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression +// CS0181: Attribute constructor parameter has type `int[,]', which is not a valid attribute parameter type // Line: 13 using System; diff --git a/mcs/mcs/attribute.cs b/mcs/mcs/attribute.cs index 6838840d9e3..7318f260593 100644 --- a/mcs/mcs/attribute.cs +++ b/mcs/mcs/attribute.cs @@ -415,7 +415,7 @@ static bool IsValidMethodImplOption (int value) return ((MethodImplOptions) value | all) == all; } - static bool IsValidArgumentType (TypeSpec t) + public static bool IsValidArgumentType (TypeSpec t) { if (t.IsArray) { var ac = (ArrayContainer) t; @@ -1076,7 +1076,7 @@ public void Emit (Dictionary> allEmitted) } } - arg_expr.EncodeAttributeValue (context, encoder, pt); + arg_expr.EncodeAttributeValue (context, encoder, pt, pt); } } @@ -1090,7 +1090,7 @@ public void Emit (Dictionary> allEmitted) encoder.Encode (na.Key.Type); encoder.Encode (na.Value.Name); - na.Value.Expr.EncodeAttributeValue (context, encoder, na.Key.Type); + na.Value.Expr.EncodeAttributeValue (context, encoder, na.Key.Type, na.Key.Type); } } else { encoder.EncodeEmptyNamedArguments (); @@ -1540,7 +1540,7 @@ public void EncodeNamedPropertyArgument (PropertySpec property, Constant value) Encode ((byte) 0x54); // property Encode (property.MemberType); Encode (property.Name); - value.EncodeAttributeValue (null, this, property.MemberType); + value.EncodeAttributeValue (null, this, property.MemberType, property.MemberType); } // @@ -1552,7 +1552,7 @@ public void EncodeNamedFieldArgument (FieldSpec field, Constant value) Encode ((byte) 0x53); // field Encode (field.MemberType); Encode (field.Name); - value.EncodeAttributeValue (null, this, field.MemberType); + value.EncodeAttributeValue (null, this, field.MemberType, field.MemberType); } public void EncodeNamedArguments (T[] members, Constant[] values) where T : MemberSpec, IInterfaceMemberSpec @@ -1572,7 +1572,7 @@ public void EncodeNamedArguments (T[] members, Constant[] values) where T : M Encode (member.MemberType); Encode (member.Name); - values [i].EncodeAttributeValue (null, this, member.MemberType); + values [i].EncodeAttributeValue (null, this, member.MemberType, member.MemberType); } } diff --git a/mcs/mcs/constant.cs b/mcs/mcs/constant.cs index d37e0f01bf3..8935fde6b98 100644 --- a/mcs/mcs/constant.cs +++ b/mcs/mcs/constant.cs @@ -522,7 +522,7 @@ public override long GetValueAsLong () return Value ? 1 : 0; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { enc.Encode (Value); } @@ -573,7 +573,7 @@ public ByteConstant (TypeSpec type, byte v, Location loc) Value = v; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { enc.Encode (Value); } @@ -673,7 +673,7 @@ public CharConstant (TypeSpec type, char v, Location loc) Value = v; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { enc.Encode ((ushort) Value); } @@ -801,7 +801,7 @@ public SByteConstant (TypeSpec type, sbyte v, Location loc) Value = v; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { enc.Encode (Value); } @@ -904,7 +904,7 @@ public ShortConstant (TypeSpec type, short v, Location loc) Value = v; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { enc.Encode (Value); } @@ -1017,7 +1017,7 @@ public UShortConstant (TypeSpec type, ushort v, Location loc) Value = v; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { enc.Encode (Value); } @@ -1126,7 +1126,7 @@ public IntConstant (TypeSpec type, int v, Location loc) Value = v; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { enc.Encode (Value); } @@ -1302,7 +1302,7 @@ public UIntConstant (TypeSpec type, uint v, Location loc) Value = v; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { enc.Encode (Value); } @@ -1419,7 +1419,7 @@ public LongConstant (TypeSpec type, long v, Location loc) Value = v; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { enc.Encode (Value); } @@ -1550,7 +1550,7 @@ public ULongConstant (TypeSpec type, ulong v, Location loc) Value = v; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { enc.Encode (Value); } @@ -1674,7 +1674,7 @@ public override Constant ConvertImplicitly (TypeSpec type) return base.ConvertImplicitly (type); } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { enc.Encode (Value); } @@ -1803,7 +1803,7 @@ public DoubleConstant (TypeSpec type, double v, Location loc) Value = v; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { enc.Encode (Value); } @@ -2088,7 +2088,7 @@ public override void Emit (EmitContext ec) ec.Emit (OpCodes.Ldstr, Value); } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { // cast to object if (type != targetType) @@ -2153,7 +2153,7 @@ public override Expression CreateExpressionTree (ResolveContext ec) return base.CreateExpressionTree (ec); } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { switch (targetType.BuiltinType) { case BuiltinTypeSpec.Type.Object: @@ -2174,7 +2174,7 @@ public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder e break; } - base.EncodeAttributeValue (rc, enc, targetType); + base.EncodeAttributeValue (rc, enc, targetType, parameterType); } public override void Emit (EmitContext ec) diff --git a/mcs/mcs/ecore.cs b/mcs/mcs/ecore.cs index 86c7931f13a..586afa5ec49 100644 --- a/mcs/mcs/ecore.cs +++ b/mcs/mcs/ecore.cs @@ -415,8 +415,8 @@ public Expression ProbeIdenticalTypeName (ResolveContext rc, Expression left, Si // In a member access of the form E.I, if E is a single identifier, and if the meaning of E as a simple-name is // a constant, field, property, local variable, or parameter with the same type as the meaning of E as a type-name - - if (left is MemberExpr || left is VariableReference) { + // LAMESPEC: By constant + if (IsSimpleNameExpression (left)) { var identical_type = rc.LookupNamespaceOrType (name.Name, 0, LookupMode.Probing, loc) as TypeExpr; if (identical_type != null && identical_type.Type == left.Type) return identical_type; @@ -425,6 +425,16 @@ public Expression ProbeIdenticalTypeName (ResolveContext rc, Expression left, Si return left; } + static bool IsSimpleNameExpression (Expression left) + { + if (left is MemberExpr || left is VariableReference) + return true; + + var c = left as Constant; + return c != null && !c.IsLiteral; + } + + public virtual string GetSignatureForError () { return type.GetDefinition ().GetSignatureForError (); @@ -540,10 +550,16 @@ public Constant ResolveLabelConstant (ResolveContext rc) return c; } - public virtual void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public virtual void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { - rc.Module.Compiler.Report.Error (182, loc, - "An attribute argument must be a constant expression, typeof expression or array creation expression"); + if (Attribute.IsValidArgumentType (parameterType)) { + rc.Module.Compiler.Report.Error (182, loc, + "An attribute argument must be a constant expression, typeof expression or array creation expression"); + } else { + rc.Module.Compiler.Report.Error (181, loc, + "Attribute constructor parameter has type `{0}', which is not a valid attribute parameter type", + targetType.GetSignatureForError ()); + } } /// @@ -1582,9 +1598,9 @@ public override void Emit (EmitContext ec) Child.Emit (ec); } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { - Child.EncodeAttributeValue (rc, enc, Child.Type); + Child.EncodeAttributeValue (rc, enc, Child.Type, parameterType); } public override void EmitBranchable (EmitContext ec, Label label, bool on_true) @@ -1702,16 +1718,16 @@ protected override Expression DoResolve (ResolveContext ec) return this; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { // Only boxing to object type is supported if (targetType.BuiltinType != BuiltinTypeSpec.Type.Object) { - base.EncodeAttributeValue (rc, enc, targetType); + base.EncodeAttributeValue (rc, enc, targetType, parameterType); return; } enc.Encode (child.Type); - child.EncodeAttributeValue (rc, enc, child.Type); + child.EncodeAttributeValue (rc, enc, child.Type, parameterType); } public override void Emit (EmitContext ec) @@ -2113,15 +2129,15 @@ public override Constant ConvertExplicitly (bool in_checked_context, TypeSpec ta return c; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { // // LAMESPEC: Reduced conditional expression is allowed as an attribute argument // if (orig_expr is Conditional) - child.EncodeAttributeValue (rc, enc, targetType); + child.EncodeAttributeValue (rc, enc, targetType,parameterType); else - base.EncodeAttributeValue (rc, enc, targetType); + base.EncodeAttributeValue (rc, enc, targetType, parameterType); } } diff --git a/mcs/mcs/expression.cs b/mcs/mcs/expression.cs index 885ef2f4b76..6a750145162 100644 --- a/mcs/mcs/expression.cs +++ b/mcs/mcs/expression.cs @@ -7623,18 +7623,18 @@ protected sealed override FieldExpr EmitToFieldSource (EmitContext ec) return await_stack_field; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { // no multi dimensional or jagged arrays if (arguments.Count != 1 || array_element_type.IsArray) { - base.EncodeAttributeValue (rc, enc, targetType); + base.EncodeAttributeValue (rc, enc, targetType, parameterType); return; } // No array covariance, except for array -> object if (type != targetType) { if (targetType.BuiltinType != BuiltinTypeSpec.Type.Object) { - base.EncodeAttributeValue (rc, enc, targetType); + base.EncodeAttributeValue (rc, enc, targetType, parameterType); return; } @@ -7648,7 +7648,7 @@ public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder e if (array_data == null) { IntConstant ic = arguments[0] as IntConstant; if (ic == null || !ic.IsDefaultValue) { - base.EncodeAttributeValue (rc, enc, targetType); + base.EncodeAttributeValue (rc, enc, targetType, parameterType); } else { enc.Encode (0); } @@ -7658,7 +7658,7 @@ public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder e enc.Encode (array_data.Count); foreach (var element in array_data) { - element.EncodeAttributeValue (rc, enc, array_element_type); + element.EncodeAttributeValue (rc, enc, array_element_type, parameterType); } } @@ -8382,7 +8382,7 @@ static bool ContainsDynamicType (TypeSpec type) return false; } - public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType) + public override void EncodeAttributeValue (IMemberContext rc, AttributeEncoder enc, TypeSpec targetType, TypeSpec parameterType) { // Target type is not System.Type therefore must be object // and we need to use different encoding sequence From 22ca1862ee1cf5016d205385ccb2d62e794b1670 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Wed, 4 Jun 2014 19:02:18 +0200 Subject: [PATCH 068/694] Fixes build --- mcs/class/System/Test/System.Net/WebClientTest.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mcs/class/System/Test/System.Net/WebClientTest.cs b/mcs/class/System/Test/System.Net/WebClientTest.cs index 78bb45f6b6e..48722d45510 100644 --- a/mcs/class/System/Test/System.Net/WebClientTest.cs +++ b/mcs/class/System/Test/System.Net/WebClientTest.cs @@ -2156,7 +2156,8 @@ public void DefaultProxy () // and return the same instance as WebRequest.DefaultWebProxy Assert.AreSame (wc.Proxy, WebRequest.DefaultWebProxy); } - + +#if NET_4_5 [Test] public void UploadStringAsyncCancelEvent () { @@ -2220,6 +2221,7 @@ public void UploadFileAsyncCancelEvent () webClient.UploadFileAsync (uri, "PUT", tempFile); }); } +#endif #if NET_4_0 public void UploadAsyncCancelEventTest (Action uploadAction) From f7834aa3cf08c23ed561b1b8a82847b655216c4c Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Wed, 4 Jun 2014 19:06:59 +0200 Subject: [PATCH 069/694] [mcs] Revert unwanted change from 9e5d5e5c90fce0374447b81111b5d6b08773c55a --- mcs/mcs/ecore.cs | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/mcs/mcs/ecore.cs b/mcs/mcs/ecore.cs index 586afa5ec49..788b9e1dee5 100644 --- a/mcs/mcs/ecore.cs +++ b/mcs/mcs/ecore.cs @@ -415,8 +415,8 @@ public Expression ProbeIdenticalTypeName (ResolveContext rc, Expression left, Si // In a member access of the form E.I, if E is a single identifier, and if the meaning of E as a simple-name is // a constant, field, property, local variable, or parameter with the same type as the meaning of E as a type-name - // LAMESPEC: By constant - if (IsSimpleNameExpression (left)) { + + if (left is MemberExpr || left is VariableReference) { var identical_type = rc.LookupNamespaceOrType (name.Name, 0, LookupMode.Probing, loc) as TypeExpr; if (identical_type != null && identical_type.Type == left.Type) return identical_type; @@ -425,16 +425,6 @@ public Expression ProbeIdenticalTypeName (ResolveContext rc, Expression left, Si return left; } - static bool IsSimpleNameExpression (Expression left) - { - if (left is MemberExpr || left is VariableReference) - return true; - - var c = left as Constant; - return c != null && !c.IsLiteral; - } - - public virtual string GetSignatureForError () { return type.GetDefinition ().GetSignatureForError (); From 3fd79bd70e9949cf38e890b38319d6fb084e5ee8 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Fri, 30 May 2014 14:11:46 -0400 Subject: [PATCH 070/694] fix win thread size calc. --- mono/utils/mono-threads-windows.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mono/utils/mono-threads-windows.c b/mono/utils/mono-threads-windows.c index 605ebf58a76..2da72f92a94 100644 --- a/mono/utils/mono-threads-windows.c +++ b/mono/utils/mono-threads-windows.c @@ -190,6 +190,7 @@ __readfsdword (unsigned long offset) void mono_threads_core_get_stack_bounds (guint8 **staddr, size_t *stsize) { + MEMORY_BASIC_INFORMATION meminfo; #ifdef TARGET_AMD64 /* win7 apis */ NT_TIB* tib = (NT_TIB*)NtCurrentTeb(); @@ -201,9 +202,17 @@ mono_threads_core_get_stack_bounds (guint8 **staddr, size_t *stsize) guint8 *stackTop = (guint8*)*(int*)((char*)tib + 4); guint8 *stackBottom = (guint8*)*(int*)((char*)tib + 8); #endif + /* + Windows stacks are expanded on demand, one page at time. The TIB reports + only the currently allocated amount. + VirtualQuery will return the actual limit for the bottom, which is what we want. + */ + if (VirtualQuery (&meminfo, &meminfo, sizeof (meminfo)) == sizeof (meminfo)) + stackBottom = MIN (stackBottom, (guint8*)meminfo.AllocationBase); *staddr = stackBottom; *stsize = stackTop - stackBottom; + } gboolean From d1882a4dc3f9a0ee9dfce7d0500fd5150f354f30 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Tue, 3 Jun 2014 16:52:14 -0400 Subject: [PATCH 071/694] [runtime] Replace gulong with size_t so it works on win64. --- mono/utils/lock-free-alloc.c | 2 +- mono/utils/mono-codeman.c | 6 +++--- mono/utils/mono-mmap.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mono/utils/lock-free-alloc.c b/mono/utils/lock-free-alloc.c index 1e5cad6498e..4befb3b86a0 100644 --- a/mono/utils/lock-free-alloc.c +++ b/mono/utils/lock-free-alloc.c @@ -127,7 +127,7 @@ struct _MonoLockFreeAllocDescriptor { #define SB_HEADER_SIZE 16 #define SB_USABLE_SIZE (SB_SIZE - SB_HEADER_SIZE) -#define SB_HEADER_FOR_ADDR(a) ((gpointer)((gulong)(a) & ~(gulong)(SB_SIZE-1))) +#define SB_HEADER_FOR_ADDR(a) ((gpointer)((size_t)(a) & ~(size_t)(SB_SIZE-1))) #define DESCRIPTOR_FOR_ADDR(a) (*(Descriptor**)SB_HEADER_FOR_ADDR (a)) /* Taken from SGen */ diff --git a/mono/utils/mono-codeman.c b/mono/utils/mono-codeman.c index abdcda69972..c8f74682535 100644 --- a/mono/utils/mono-codeman.c +++ b/mono/utils/mono-codeman.c @@ -28,9 +28,9 @@ #endif static uintptr_t code_memory_used = 0; -static gulong dynamic_code_alloc_count; -static gulong dynamic_code_bytes_count; -static gulong dynamic_code_frees_count; +static size_t dynamic_code_alloc_count; +static size_t dynamic_code_bytes_count; +static size_t dynamic_code_frees_count; /* * AMD64 processors maintain icache coherency only for pages which are diff --git a/mono/utils/mono-mmap.c b/mono/utils/mono-mmap.c index fe8a98079f8..402b82e2f95 100644 --- a/mono/utils/mono-mmap.c +++ b/mono/utils/mono-mmap.c @@ -65,8 +65,8 @@ malloc_shared_area (int pid) static char* aligned_address (char *mem, size_t size, size_t alignment) { - char *aligned = (char*)((gulong)(mem + (alignment - 1)) & ~(alignment - 1)); - g_assert (aligned >= mem && aligned + size <= mem + size + alignment && !((gulong)aligned & (alignment - 1))); + char *aligned = (char*)((size_t)(mem + (alignment - 1)) & ~(alignment - 1)); + g_assert (aligned >= mem && aligned + size <= mem + size + alignment && !((size_t)aligned & (alignment - 1))); return aligned; } From c9ef61d47ac7528a3280af2a1527f7b204267593 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Tue, 3 Jun 2014 16:53:22 -0400 Subject: [PATCH 072/694] [runtime] Fix warnings in mono-threads. --- mono/utils/mono-threads.c | 4 ++-- mono/utils/mono-threads.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mono/utils/mono-threads.c b/mono/utils/mono-threads.c index dad8850711a..0258e2aa28f 100644 --- a/mono/utils/mono-threads.c +++ b/mono/utils/mono-threads.c @@ -38,7 +38,7 @@ when it is in fact not. */ static MonoSemType global_suspend_semaphore; -static int thread_info_size; +static size_t thread_info_size; static MonoThreadInfoCallbacks threads_callbacks; static MonoThreadInfoRuntimeCallbacks runtime_callbacks; static MonoNativeTlsKey thread_info_key, small_id_key; @@ -741,7 +741,7 @@ mono_threads_create_thread (LPTHREAD_START_ROUTINE start, gpointer arg, guint32 void mono_thread_info_get_stack_bounds (guint8 **staddr, size_t *stsize) { - return mono_threads_core_get_stack_bounds (staddr, stsize); + mono_threads_core_get_stack_bounds (staddr, stsize); } gboolean diff --git a/mono/utils/mono-threads.h b/mono/utils/mono-threads.h index 457a268ad17..dbd25a8f778 100644 --- a/mono/utils/mono-threads.h +++ b/mono/utils/mono-threads.h @@ -28,7 +28,7 @@ typedef HANDLE MonoNativeThreadHandle; /* unused */ typedef DWORD mono_native_thread_return_t; #define MONO_NATIVE_THREAD_ID_TO_UINT(tid) (tid) -#define MONO_UINT_TO_NATIVE_THREAD_ID(tid) (tid) +#define MONO_UINT_TO_NATIVE_THREAD_ID(tid) ((MonoNativeThreadId)(tid)) #else From d248c1516b3e572aeb78827a508bb6f8800ef82a Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Tue, 3 Jun 2014 17:28:01 -0400 Subject: [PATCH 073/694] [VS] Fix the solutions to work with win64. Update the file list to include some new sgen files. --- msvc/libmono.vcxproj | 6 +- msvc/libmonoruntime.vcxproj | 8 +- msvc/libmonoutils.vcxproj | 2 +- msvc/mono.props | 6 +- msvc/monosgen64.def | 866 ++++++++++++++++++++++++++++++++++++ 5 files changed, 879 insertions(+), 9 deletions(-) create mode 100644 msvc/monosgen64.def diff --git a/msvc/libmono.vcxproj b/msvc/libmono.vcxproj index 73d376b45ba..9cf8db7acee 100644 --- a/msvc/libmono.vcxproj +++ b/msvc/libmono.vcxproj @@ -414,9 +414,9 @@ false - libgc.lib;libmonoruntime.lib;libmonoutils.lib;eglib.lib;%(AdditionalDependencies) + libgc.lib;libmonoruntimesgen.lib;libmonoutils.lib;eglib.lib;%(AdditionalDependencies) $(Platform)\lib;%(AdditionalLibraryDirectories) - monosgen.def + monosgen64.def true $(Platform)\lib\$(TargetName).lib MachineX64 @@ -567,7 +567,7 @@ libgc.lib;libmonoruntime.lib;libmonoutils.lib;eglib.lib;%(AdditionalDependencies) $(Platform)\lib;%(AdditionalLibraryDirectories) - monosgen.def + monosgen64.def $(Platform)\lib\$(TargetName).lib MachineX64 true diff --git a/msvc/libmonoruntime.vcxproj b/msvc/libmonoruntime.vcxproj index 634c160525f..cb098592678 100644 --- a/msvc/libmonoruntime.vcxproj +++ b/msvc/libmonoruntime.vcxproj @@ -1,5 +1,5 @@  - + Debug_SGen @@ -102,7 +102,9 @@ + + @@ -111,6 +113,7 @@ + @@ -378,7 +381,8 @@ Level3 Disabled WIN32;$(SGEN_DEFINES);_DEBUG;_LIB;%(PreprocessorDefinitions) - $(top_srcdir);$(top_srcdir)/mono;$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE) + false + $(top_srcdir);$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE);$(top_srcdir)\mono Windows diff --git a/msvc/libmonoutils.vcxproj b/msvc/libmonoutils.vcxproj index b52f26a5525..e0deda357a7 100644 --- a/msvc/libmonoutils.vcxproj +++ b/msvc/libmonoutils.vcxproj @@ -214,7 +214,7 @@ Level3 Disabled WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - $(top_srcdir);$(top_srcdir)/mono;$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE) + $(top_srcdir);$(top_srcdir)/eglib/src;$(top_srcdir)/mono;$(LIBGC_CPPFLAGS_INCLUDE);$(GLIB_CFLAGS_INCLUDE) Windows diff --git a/msvc/mono.props b/msvc/mono.props index b8f3c4fd165..7fe3206e248 100644 --- a/msvc/mono.props +++ b/msvc/mono.props @@ -1,9 +1,9 @@  - $(MSBuildProjectDirectory)/.. - $(top_srcdir)/libgc/include - $(top_srcdir)/eglib/src + $(MSBuildProjectDirectory)\.. + $(top_srcdir)\libgc\include + $(top_srcdir)\eglib\src HAVE_BOEHM_GC;HAVE_GC_H;USE_INCLUDED_LIBGC;HAVE_GC_GCJ_MALLOC;HAVE_GC_ENABLE HAVE_SGEN_GC;HAVE_MOVING_COLLECTOR;HAVE_WRITE_BARRIERS diff --git a/msvc/monosgen64.def b/msvc/monosgen64.def new file mode 100644 index 00000000000..84f306ab796 --- /dev/null +++ b/msvc/monosgen64.def @@ -0,0 +1,866 @@ +; file generated by create-windef.pl +LIBRARY monosgen-2.0.dll +EXPORTS +MonoFixupCorEE +mono_add_internal_call +mono_aot_register_globals +mono_aot_register_module +mono_array_addr_with_size +mono_array_class_get +mono_array_clone +mono_array_element_size +mono_array_length +mono_array_new +mono_array_new_full +mono_array_new_specific +mono_assemblies_cleanup +mono_assemblies_init +mono_assembly_close +mono_assembly_fill_assembly_name +mono_assembly_foreach +mono_assembly_get_assemblyref +mono_assembly_get_image +mono_assembly_get_main +mono_assembly_get_object +mono_assembly_getrootdir +mono_assembly_invoke_load_hook +mono_assembly_invoke_search_hook +mono_assembly_load +mono_assembly_load_from +mono_assembly_load_from_full +mono_assembly_load_full +mono_assembly_load_module +mono_assembly_load_reference +mono_assembly_load_references +mono_assembly_load_with_partial_name +mono_assembly_loaded +mono_assembly_loaded_full +mono_assembly_name_free +mono_assembly_name_get_culture +mono_assembly_name_get_name +mono_assembly_name_get_pubkeytoken +mono_assembly_name_get_version +mono_assembly_name_new +mono_assembly_names_equal +mono_assembly_open +mono_assembly_open_full +mono_assembly_set_main +mono_assembly_setrootdir +mono_binary_search +mono_bitset_alloc_size +mono_bitset_clear +mono_bitset_clear_all +mono_bitset_clone +mono_bitset_copyto +mono_bitset_count +mono_bitset_equal +mono_bitset_find_first +mono_bitset_find_first_unset +mono_bitset_find_last +mono_bitset_find_start +mono_bitset_foreach +mono_bitset_free +mono_bitset_intersection +mono_bitset_intersection_2 +mono_bitset_invert +mono_bitset_mem_new +mono_bitset_new +mono_bitset_set +mono_bitset_set_all +mono_bitset_size +mono_bitset_sub +mono_bitset_test +mono_bitset_test_bulk +mono_bitset_union +mono_bounded_array_class_get +mono_breakpoint_clean_code +mono_check_corlib_version +mono_class_array_element_size +mono_class_data_size +mono_class_describe_statics +mono_class_enum_basetype +mono_class_from_generic_parameter +mono_class_from_mono_type +mono_class_from_name +mono_class_from_name_case +mono_class_from_typeref +mono_class_get +mono_class_get_byref_type +mono_class_get_com_object_class +mono_class_get_element_class +mono_class_get_event_token +mono_class_get_events +mono_class_get_field +mono_class_get_field_from_name +mono_class_get_field_token +mono_class_get_fields +mono_class_get_flags +mono_class_get_full +mono_class_get_idispatch_class +mono_class_get_image +mono_class_get_interfaces +mono_class_get_interop_proxy_class +mono_class_get_iunknown_class +mono_class_get_method_from_name +mono_class_get_method_from_name_flags +mono_class_get_methods +mono_class_get_name +mono_class_get_namespace +mono_class_get_nested_types +mono_class_get_nesting_type +mono_class_get_parent +mono_class_get_properties +mono_class_get_property_from_name +mono_class_get_property_token +mono_class_get_rank +mono_class_get_type +mono_class_get_type_token +mono_class_get_variant_class +mono_class_implements_interface +mono_class_inflate_generic_method +mono_class_inflate_generic_type +mono_class_init +mono_class_instance_size +mono_class_interface_offset +mono_class_is_assignable_from +mono_class_is_delegate +mono_class_is_enum +mono_class_is_subclass_of +mono_class_is_valid_enum +mono_class_is_valuetype +mono_class_min_align +mono_class_name_from_token +mono_class_num_events +mono_class_num_fields +mono_class_num_methods +mono_class_num_properties +mono_class_value_size +mono_class_vtable +mono_cli_rva_image_map +mono_code_manager_cleanup +mono_code_manager_commit +mono_code_manager_destroy +mono_code_manager_foreach +mono_code_manager_init +mono_code_manager_invalidate +mono_code_manager_new +mono_code_manager_new_dynamic +mono_code_manager_reserve +mono_code_manager_reserve_align +mono_code_manager_set_read_only +mono_code_manager_size +mono_compile_method +mono_config_cleanup +mono_config_for_assembly +mono_config_is_server_mode +mono_config_parse +mono_config_parse_memory +mono_config_set_server_mode +mono_config_string_for_assembly_file +mono_context_get +mono_context_get_desc +mono_context_init +mono_context_set +mono_counters_cleanup +mono_counters_dump +mono_counters_enable +mono_counters_register +mono_custom_attrs_construct +mono_custom_attrs_free +mono_custom_attrs_from_assembly +mono_custom_attrs_from_class +mono_custom_attrs_from_event +mono_custom_attrs_from_field +mono_custom_attrs_from_index +mono_custom_attrs_from_method +mono_custom_attrs_from_param +mono_custom_attrs_from_property +mono_custom_attrs_get_attr +mono_custom_attrs_has_attr +mono_debug_add_delegate_trampoline +mono_debug_add_method +mono_debug_cleanup +mono_debug_close_image +mono_debug_close_mono_symbol_file +mono_debug_domain_create +mono_debug_domain_unload +mono_debug_enabled +mono_debug_find_method +mono_debug_free_method_jit_info +mono_debug_free_source_location +mono_debug_il_offset_from_address +mono_debug_init +mono_debug_list_add +mono_debug_list_remove +mono_debug_lookup_locals +mono_debug_lookup_method +mono_debug_lookup_method_addresses +mono_debug_lookup_source_location +mono_debug_open_image_from_memory +mono_debug_open_mono_symbols +mono_debug_print_stack_frame +mono_debug_print_vars +mono_debug_remove_method +mono_debug_symfile_free_locals +mono_debug_symfile_free_location +mono_debug_symfile_get_line_numbers +mono_debug_symfile_get_line_numbers_full +mono_debug_symfile_is_loaded +mono_debug_symfile_lookup_locals +mono_debug_symfile_lookup_location +mono_debug_symfile_lookup_method +mono_debugger_insert_breakpoint +mono_debugger_method_has_breakpoint +mono_debugger_run_finally +mono_declsec_flags_from_assembly +mono_declsec_flags_from_class +mono_declsec_flags_from_method +mono_declsec_get_assembly_action +mono_declsec_get_class_action +mono_declsec_get_demands +mono_declsec_get_inheritdemands_class +mono_declsec_get_inheritdemands_method +mono_declsec_get_linkdemands +mono_declsec_get_method_action +mono_digest_get_public_token +mono_disasm_code +mono_disasm_code_one +mono_dl_fallback_register +mono_dl_fallback_unregister +mono_dllmap_insert +mono_domain_add_class_static_data +mono_domain_assembly_open +mono_domain_create +mono_domain_create_appdomain +mono_domain_finalize +mono_domain_foreach +mono_domain_free +mono_domain_from_appdomain +mono_domain_get +mono_domain_get_by_id +mono_domain_get_id +mono_domain_has_type_resolve +mono_domain_is_unloading +mono_domain_owns_vtable_slot +mono_domain_set +mono_domain_set_internal +mono_domain_try_type_resolve +mono_domain_try_unload +mono_domain_unload +mono_dwarf_escape_path +mono_emit_native_call +mono_environment_exitcode_get +mono_environment_exitcode_set +mono_error_cleanup +mono_error_get_error_code +mono_error_get_message +mono_error_init +mono_error_init_flags +mono_error_ok +mono_escape_uri_string +mono_event_get_add_method +mono_event_get_flags +mono_event_get_name +mono_event_get_object +mono_event_get_parent +mono_event_get_raise_method +mono_event_get_remove_method +mono_exception_from_name +mono_exception_from_name_domain +mono_exception_from_name_msg +mono_exception_from_name_two_strings +mono_exception_from_token +mono_exception_from_token_two_strings +mono_exception_walk_trace +mono_field_from_token +mono_field_full_name +mono_field_get_data +mono_field_get_flags +mono_field_get_name +mono_field_get_object +mono_field_get_offset +mono_field_get_parent +mono_field_get_type +mono_field_get_value +mono_field_get_value_object +mono_field_set_value +mono_field_static_get_value +mono_field_static_set_value +mono_file_map +mono_file_map_close +mono_file_map_fd +mono_file_map_open +mono_file_map_size +mono_file_unmap +mono_free +mono_free_bstr +mono_free_method +mono_free_verify_list +mono_g_hash_table_destroy +mono_g_hash_table_find +mono_g_hash_table_foreach +mono_g_hash_table_foreach_remove +mono_g_hash_table_insert +mono_g_hash_table_lookup +mono_g_hash_table_lookup_extended +mono_g_hash_table_new +mono_g_hash_table_new_full +mono_g_hash_table_new_type +mono_g_hash_table_print_stats +mono_g_hash_table_remove +mono_g_hash_table_replace +mono_g_hash_table_size +mono_gc_collect +mono_gc_collection_count +mono_gc_enable_events +mono_gc_get_generation +mono_gc_get_heap_size +mono_gc_get_used_size +mono_gc_invoke_finalizers +mono_gc_is_finalizer_thread +mono_gc_make_root_descr_user +mono_gc_max_generation +mono_gc_out_of_memory +mono_gc_reference_queue_add +mono_gc_reference_queue_free +mono_gc_reference_queue_new +mono_gc_toggleref_add +mono_gc_toggleref_register_callback +mono_gc_walk_heap +mono_gc_wbarrier_arrayref_copy +mono_gc_wbarrier_generic_nostore +mono_gc_wbarrier_generic_store +mono_gc_wbarrier_generic_store_atomic +mono_gc_wbarrier_object_copy +mono_gc_wbarrier_set_arrayref +mono_gc_wbarrier_set_field +mono_gc_wbarrier_value_copy +mono_gchandle_free +mono_gchandle_get_target +mono_gchandle_new +mono_gchandle_new_weakref +mono_get_array_class +mono_get_boolean_class +mono_get_byte_class +mono_get_char_class +mono_get_config_dir +mono_get_corlib +mono_get_dbnull_object +mono_get_delegate_begin_invoke +mono_get_delegate_end_invoke +mono_get_delegate_invoke +mono_get_double_class +mono_get_enum_class +mono_get_exception_appdomain_unloaded +mono_get_exception_argument +mono_get_exception_argument_null +mono_get_exception_argument_out_of_range +mono_get_exception_arithmetic +mono_get_exception_array_type_mismatch +mono_get_exception_bad_image_format +mono_get_exception_bad_image_format2 +mono_get_exception_cannot_unload_appdomain +mono_get_exception_class +mono_get_exception_divide_by_zero +mono_get_exception_execution_engine +mono_get_exception_field_access +mono_get_exception_file_not_found +mono_get_exception_file_not_found2 +mono_get_exception_index_out_of_range +mono_get_exception_invalid_cast +mono_get_exception_invalid_operation +mono_get_exception_io +mono_get_exception_method_access +mono_get_exception_missing_field +mono_get_exception_missing_method +mono_get_exception_not_implemented +mono_get_exception_not_supported +mono_get_exception_null_reference +mono_get_exception_out_of_memory +mono_get_exception_overflow +mono_get_exception_reflection_type_load +mono_get_exception_runtime_wrapped +mono_get_exception_security +mono_get_exception_serialization +mono_get_exception_stack_overflow +mono_get_exception_synchronization_lock +mono_get_exception_thread_abort +mono_get_exception_thread_interrupted +mono_get_exception_thread_state +mono_get_exception_type_initialization +mono_get_exception_type_load +mono_get_inflated_method +mono_get_int16_class +mono_get_int32_class +mono_get_int64_class +mono_get_intptr_class +mono_get_machine_config +mono_get_method +mono_get_method_constrained +mono_get_method_full +mono_get_object_class +mono_get_root_domain +mono_get_runtime_build_info +mono_get_sbyte_class +mono_get_single_class +mono_get_string_class +mono_get_thread_class +mono_get_trampoline_func +mono_get_uint16_class +mono_get_uint32_class +mono_get_uint64_class +mono_get_uintptr_class +mono_get_void_class +mono_guid_to_string +mono_image_add_to_name_cache +mono_image_addref +mono_image_close +mono_image_ensure_section +mono_image_ensure_section_idx +mono_image_fixup_vtable +mono_image_get_assembly +mono_image_get_entry_point +mono_image_get_filename +mono_image_get_guid +mono_image_get_name +mono_image_get_public_key +mono_image_get_resource +mono_image_get_strong_name +mono_image_get_table_info +mono_image_get_table_rows +mono_image_has_authenticode_entry +mono_image_init +mono_image_init_name_cache +mono_image_is_dynamic +mono_image_load_file_for_image +mono_image_load_module +mono_image_loaded +mono_image_loaded_by_guid +mono_image_loaded_by_guid_full +mono_image_loaded_full +mono_image_lookup_resource +mono_image_open +mono_image_open_from_data +mono_image_open_from_data_full +mono_image_open_from_data_with_name +mono_image_open_full +mono_image_rva_map +mono_image_strerror +mono_image_strong_name_position +mono_images_cleanup +mono_images_init +mono_init +mono_init_from_assembly +mono_init_version +mono_inst_name +mono_install_assembly_load_hook +mono_install_assembly_postload_refonly_search_hook +mono_install_assembly_postload_search_hook +mono_install_assembly_preload_hook +mono_install_assembly_refonly_preload_hook +mono_install_assembly_refonly_search_hook +mono_install_assembly_search_hook +mono_install_runtime_cleanup +mono_install_threadpool_item_hooks +mono_install_threadpool_thread_hooks +mono_install_unhandled_exception_hook +mono_invoke_unhandled_exception_hook +mono_is_debugger_attached +mono_jit_cleanup +mono_jit_exec +mono_jit_info_get_code_size +mono_jit_info_get_code_start +mono_jit_info_get_method +mono_jit_info_table_find +mono_jit_init +mono_jit_init_version +mono_jit_parse_options +mono_jit_set_aot_only +mono_jit_set_domain +mono_jit_set_trace_options +mono_jit_thread_attach +mono_ldstr +mono_ldtoken +mono_lls_init +mono_load_remote_field +mono_load_remote_field_new +mono_local_deadce +mono_locks_dump +mono_lookup_icall_symbol +mono_lookup_internal_call +mono_lookup_pinvoke_call +mono_main +mono_marshal_string_to_utf16 +mono_md5_final +mono_md5_get_digest +mono_md5_get_digest_from_file +mono_md5_init +mono_md5_update +mono_mempool_alloc +mono_mempool_alloc0 +mono_mempool_contains_addr +mono_mempool_destroy +mono_mempool_empty +mono_mempool_get_allocated +mono_mempool_invalidate +mono_mempool_new +mono_mempool_new_size +mono_mempool_stats +mono_mempool_strdup +mono_metadata_blob_heap +mono_metadata_cleanup +mono_metadata_compute_size +mono_metadata_custom_attrs_from_index +mono_metadata_declsec_from_index +mono_metadata_decode_blob_size +mono_metadata_decode_row +mono_metadata_decode_row_col +mono_metadata_decode_signed_value +mono_metadata_decode_table_row +mono_metadata_decode_table_row_col +mono_metadata_decode_value +mono_metadata_encode_value +mono_metadata_events_from_typedef +mono_metadata_field_info +mono_metadata_field_info_with_mempool +mono_metadata_free_array +mono_metadata_free_inflated_signature +mono_metadata_free_marshal_spec +mono_metadata_free_method_signature +mono_metadata_free_mh +mono_metadata_free_type +mono_metadata_generic_class_is_valuetype +mono_metadata_get_constant_index +mono_metadata_get_generic_param_row +mono_metadata_get_inflated_signature +mono_metadata_get_marshal_info +mono_metadata_guid_heap +mono_metadata_implmap_from_method +mono_metadata_init +mono_metadata_interfaces_from_typedef +mono_metadata_load_generic_param_constraints +mono_metadata_load_generic_params +mono_metadata_locate +mono_metadata_locate_token +mono_metadata_methods_from_event +mono_metadata_methods_from_property +mono_metadata_nested_in_typedef +mono_metadata_nesting_typedef +mono_metadata_packing_from_typedef +mono_metadata_parse_array +mono_metadata_parse_custom_mod +mono_metadata_parse_field_type +mono_metadata_parse_marshal_spec +mono_metadata_parse_method_signature +mono_metadata_parse_method_signature_full +mono_metadata_parse_mh +mono_metadata_parse_mh_full +mono_metadata_parse_param +mono_metadata_parse_signature +mono_metadata_parse_type +mono_metadata_parse_type_full +mono_metadata_parse_typedef_or_ref +mono_metadata_properties_from_typedef +mono_metadata_signature_alloc +mono_metadata_signature_dup +mono_metadata_signature_equal +mono_metadata_string_heap +mono_metadata_token_from_dor +mono_metadata_translate_token_index +mono_metadata_type_equal +mono_metadata_type_hash +mono_metadata_typedef_from_field +mono_metadata_typedef_from_method +mono_metadata_user_string +mono_method_body_get_object +mono_method_can_access_field +mono_method_can_access_method +mono_method_desc_free +mono_method_desc_from_method +mono_method_desc_full_match +mono_method_desc_match +mono_method_desc_new +mono_method_desc_search_in_class +mono_method_desc_search_in_image +mono_method_full_name +mono_method_get_class +mono_method_get_flags +mono_method_get_generic_container +mono_method_get_header +mono_method_get_index +mono_method_get_last_managed +mono_method_get_marshal_info +mono_method_get_name +mono_method_get_object +mono_method_get_param_names +mono_method_get_param_token +mono_method_get_signature +mono_method_get_signature_full +mono_method_get_token +mono_method_get_unmanaged_thunk +mono_method_has_marshal_info +mono_method_header_get_clauses +mono_method_header_get_code +mono_method_header_get_locals +mono_method_header_get_num_clauses +mono_method_signature +mono_method_verify +mono_mlist_alloc +mono_mlist_append +mono_mlist_get_data +mono_mlist_last +mono_mlist_length +mono_mlist_next +mono_mlist_prepend +mono_mlist_remove_item +mono_mlist_set_data +mono_mlist_set_next +mono_module_file_get_object +mono_module_get_object +mono_monitor_enter +mono_monitor_exit +mono_monitor_try_enter +mono_mprotect +mono_mutex_init_suspend_safe +mono_object_castclass_mbyref +mono_object_castclass_with_cache +mono_object_clone +mono_object_describe +mono_object_describe_fields +mono_object_get_class +mono_object_get_domain +mono_object_get_size +mono_object_get_virtual_method +mono_object_hash +mono_object_is_alive +mono_object_isinst +mono_object_isinst_mbyref +mono_object_isinst_with_cache +mono_object_new +mono_object_new_alloc_specific +mono_object_new_fast +mono_object_new_from_token +mono_object_new_specific +mono_object_to_string +mono_object_unbox +mono_op_to_op_imm_noemul +mono_opcode_name +mono_opcode_value +mono_pagesize +mono_param_get_objects +mono_parse_default_optimizations +mono_path_canonicalize +mono_path_resolve_symlinks +mono_pe_file_open +mono_perfcounters_init +mono_pmip +mono_poll +mono_print_method_from_ip +mono_print_thread_dump +mono_print_thread_dump_from_ctx +mono_print_unhandled_exception +mono_profiler_coverage_get +mono_profiler_get_events +mono_profiler_install +mono_profiler_install_allocation +mono_profiler_install_appdomain +mono_profiler_install_assembly +mono_profiler_install_class +mono_profiler_install_code_buffer_new +mono_profiler_install_code_chunk_destroy +mono_profiler_install_code_chunk_new +mono_profiler_install_coverage_filter +mono_profiler_install_enter_leave +mono_profiler_install_exception +mono_profiler_install_gc +mono_profiler_install_gc_moves +mono_profiler_install_gc_roots +mono_profiler_install_iomap +mono_profiler_install_jit_compile +mono_profiler_install_jit_end +mono_profiler_install_method_free +mono_profiler_install_method_invoke +mono_profiler_install_module +mono_profiler_install_monitor +mono_profiler_install_runtime_initialized +mono_profiler_install_statistical +mono_profiler_install_statistical_call_chain +mono_profiler_install_thread +mono_profiler_install_thread_name +mono_profiler_install_transition +mono_profiler_load +mono_profiler_set_events +mono_property_get_flags +mono_property_get_get_method +mono_property_get_name +mono_property_get_object +mono_property_get_parent +mono_property_get_set_method +mono_property_get_value +mono_property_hash_destroy +mono_property_hash_insert +mono_property_hash_lookup +mono_property_hash_new +mono_property_hash_remove_object +mono_property_set_value +mono_ptr_class_get +mono_raise_exception +mono_realloc_native_code +mono_reflection_free_type_info +mono_reflection_get_custom_attrs +mono_reflection_get_custom_attrs_blob +mono_reflection_get_custom_attrs_by_type +mono_reflection_get_custom_attrs_data +mono_reflection_get_custom_attrs_info +mono_reflection_get_token +mono_reflection_get_type +mono_reflection_parse_type +mono_reflection_type_from_name +mono_reflection_type_get_type +mono_register_bundled_assemblies +mono_register_config_for_assembly +mono_register_machine_config +mono_register_symfile_for_assembly +mono_replace_ins +mono_runtime_class_init +mono_runtime_cleanup +mono_runtime_delegate_invoke +mono_runtime_exec_main +mono_runtime_exec_managed_code +mono_runtime_get_main_args +mono_runtime_init +mono_runtime_invoke +mono_runtime_invoke_array +mono_runtime_is_shutting_down +mono_runtime_object_init +mono_runtime_quit +mono_runtime_resource_check_limit +mono_runtime_resource_limit +mono_runtime_resource_set_callback +mono_runtime_run_main +mono_runtime_set_shutting_down +mono_security_core_clr_get_options +mono_security_core_clr_require_elevated_permissions +mono_security_core_clr_set_options +mono_security_enable_core_clr +mono_security_set_core_clr_platform_callback +mono_sem_post +mono_sem_timedwait +mono_sem_wait +mono_set_assemblies_path +mono_set_break_policy +mono_set_config_dir +mono_set_defaults +mono_set_dirs +mono_set_is_debugger_attached +mono_set_rootdir +mono_set_signal_chaining +mono_sha1_final +mono_sha1_get_digest +mono_sha1_get_digest_from_file +mono_sha1_init +mono_sha1_update +mono_shared_area +mono_shared_area_for_pid +mono_shared_area_instances +mono_shared_area_remove +mono_shared_area_unload +mono_signature_explicit_this +mono_signature_get_call_conv +mono_signature_get_desc +mono_signature_get_param_count +mono_signature_get_params +mono_signature_get_return_type +mono_signature_hash +mono_signature_is_instance +mono_signature_param_is_out +mono_signature_vararg_start +mono_signbit_double +mono_signbit_float +mono_stack_walk +mono_stack_walk_no_il +mono_store_remote_field +mono_store_remote_field_new +mono_string_chars +mono_string_equal +mono_string_from_bstr +mono_string_from_utf16 +mono_string_hash +mono_string_intern +mono_string_is_interned +mono_string_length +mono_string_new +mono_string_new_len +mono_string_new_size +mono_string_new_utf16 +mono_string_new_wrapper +mono_string_to_utf16 +mono_string_to_utf8 +mono_string_to_utf8_checked +mono_stringify_assembly_name +mono_table_info_get_rows +mono_thread_attach +mono_thread_cleanup +mono_thread_create +mono_thread_current +mono_thread_detach +mono_thread_exit +mono_thread_get_main +mono_thread_get_undeniable_exception +mono_thread_init +mono_thread_is_foreign +mono_thread_manage +mono_thread_new_init +mono_thread_set_main +mono_thread_set_manage_callback +mono_thread_stop +mono_threads_get_default_stacksize +mono_threads_request_thread_dump +mono_threads_set_default_stacksize +mono_tls_key_get_offset +mono_tls_key_set_offset +mono_trace_set_level_string +mono_trace_set_mask_string +mono_type_create_from_typespec +mono_type_full_name +mono_type_generic_inst_is_valuetype +mono_type_get_array_type +mono_type_get_class +mono_type_get_desc +mono_type_get_modifiers +mono_type_get_name +mono_type_get_object +mono_type_get_ptr_type +mono_type_get_signature +mono_type_get_type +mono_type_get_underlying_type +mono_type_is_byref +mono_type_is_pointer +mono_type_is_reference +mono_type_is_struct +mono_type_is_valid_enum_basetype +mono_type_is_void +mono_type_size +mono_type_stack_size +mono_type_to_unmanaged +mono_unhandled_exception +mono_unicode_from_external +mono_unicode_to_external +mono_upgrade_remote_class_wrapper +mono_utf8_from_external +mono_utf8_validate_and_len +mono_utf8_validate_and_len_with_bounds +mono_valloc +mono_valloc_aligned +mono_value_box +mono_value_copy +mono_value_copy_array +mono_value_describe_fields +mono_verify_corlib +mono_vfree +mono_vtable_get_static_field_data +mono_win32_compat_CopyMemory +mono_win32_compat_FillMemory +mono_win32_compat_MoveMemory +mono_win32_compat_ZeroMemory +mono_xdebug_flush From 1505c43d70a0b6d46e676f1fa63a4380f75b517e Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Tue, 3 Jun 2014 17:31:18 -0400 Subject: [PATCH 074/694] [win64] Windows64 MSVC compiler dropped support for inline assembly. Move that code into a .asm file. --- mono/utils/mono-context.h | 6 +++++- mono/utils/win64.asm | 42 +++++++++++++++++++++++++++++++++++++++ msvc/libmonoutils.vcxproj | 10 ++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 mono/utils/win64.asm diff --git a/mono/utils/mono-context.h b/mono/utils/mono-context.h index 258199018b3..a84b5b5096a 100755 --- a/mono/utils/mono-context.h +++ b/mono/utils/mono-context.h @@ -180,7 +180,11 @@ typedef struct { #define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->rbp)) #define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->rsp)) -#if defined(__native_client__) +#if defined (HOST_WIN32) +extern void mono_context_get_current (void *); +#define MONO_CONTEXT_GET_CURRENT(ctx) do { mono_context_get_current((void*)&(ctx)); } while (0) + +#elif defined(__native_client__) #define MONO_CONTEXT_GET_CURRENT(ctx) \ __asm__ __volatile__( \ "movq $0x0, %%nacl:0x00(%%r15, %0, 1)\n" \ diff --git a/mono/utils/win64.asm b/mono/utils/win64.asm new file mode 100644 index 00000000000..ba9f979b164 --- /dev/null +++ b/mono/utils/win64.asm @@ -0,0 +1,42 @@ +ifndef X64 + +.386 +.model flat, c + +endif + +.code + +ifdef X64 + +PUBLIC mono_context_get_current + +mono_context_get_current PROC +;rdi has the ctx ptr + mov [rcx + 00h], rax + mov [rcx + 08h], rbx + mov [rcx + 10h], rcx + mov [rcx + 18h], rdx + mov [rcx + 20h], rbp + mov [rcx + 28h], rsp + mov [rcx + 30h], rsi + mov [rcx + 38h], rdi + mov [rcx + 40h], r8 + mov [rcx + 48h], r9 + mov [rcx + 50h], r10 + mov [rcx + 58h], r11 + mov [rcx + 60h], r12 + mov [rcx + 68h], r13 + mov [rcx + 70h], r14 + mov [rcx + 78h], r15 + + lea rax, __mono_current_ip +__mono_current_ip: + mov [rcx + 80h], rax + ret + +mono_context_get_current endP + +endif + +end diff --git a/msvc/libmonoutils.vcxproj b/msvc/libmonoutils.vcxproj index e0deda357a7..b760ab76971 100644 --- a/msvc/libmonoutils.vcxproj +++ b/msvc/libmonoutils.vcxproj @@ -128,6 +128,11 @@ + + + Document + + {8FC2B0C8-51AD-49DF-851F-5D01A77A75E4} Win32Proj @@ -160,6 +165,7 @@ + @@ -223,6 +229,9 @@ winsetup.bat + + X64 + @@ -268,5 +277,6 @@ + \ No newline at end of file From 00643150c5f49364cf7bfa05b78a03b75ff19629 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Tue, 3 Jun 2014 17:34:36 -0400 Subject: [PATCH 075/694] [runtime] Replace gulong with size_t to fix counter sizes in win64. --- mono/metadata/class-internals.h | 64 ++++++++++++++++----------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/mono/metadata/class-internals.h b/mono/metadata/class-internals.h index 2160b117418..1dce9bf7e7a 100644 --- a/mono/metadata/class-internals.h +++ b/mono/metadata/class-internals.h @@ -712,38 +712,38 @@ typedef struct { typedef struct { guint64 new_object_count; - gulong initialized_class_count; - gulong generic_vtable_count; - gulong used_class_count; - gulong method_count; - gulong class_vtable_size; - gulong class_static_data_size; - gulong generic_instance_count; - gulong generic_class_count; - gulong inflated_method_count; - gulong inflated_method_count_2; - gulong inflated_type_count; - gulong generics_metadata_size; - gulong delegate_creations; - gulong imt_tables_size; - gulong imt_number_of_tables; - gulong imt_number_of_methods; - gulong imt_used_slots; - gulong imt_slots_with_collisions; - gulong imt_max_collisions_in_slot; - gulong imt_method_count_when_max_collisions; - gulong imt_thunks_size; - gulong jit_info_table_insert_count; - gulong jit_info_table_remove_count; - gulong jit_info_table_lookup_count; - gulong generics_sharable_methods; - gulong generics_unsharable_methods; - gulong generics_shared_methods; - gulong gsharedvt_methods; - gulong minor_gc_count; - gulong major_gc_count; - gulong minor_gc_time_usecs; - gulong major_gc_time_usecs; + size_t initialized_class_count; + size_t generic_vtable_count; + size_t used_class_count; + size_t method_count; + size_t class_vtable_size; + size_t class_static_data_size; + size_t generic_instance_count; + size_t generic_class_count; + size_t inflated_method_count; + size_t inflated_method_count_2; + size_t inflated_type_count; + size_t generics_metadata_size; + size_t delegate_creations; + size_t imt_tables_size; + size_t imt_number_of_tables; + size_t imt_number_of_methods; + size_t imt_used_slots; + size_t imt_slots_with_collisions; + size_t imt_max_collisions_in_slot; + size_t imt_method_count_when_max_collisions; + size_t imt_thunks_size; + size_t jit_info_table_insert_count; + size_t jit_info_table_remove_count; + size_t jit_info_table_lookup_count; + size_t generics_sharable_methods; + size_t generics_unsharable_methods; + size_t generics_shared_methods; + size_t gsharedvt_methods; + size_t minor_gc_count; + size_t major_gc_count; + size_t minor_gc_time_usecs; + size_t major_gc_time_usecs; gboolean enabled; } MonoStats; From c670b35edc0fa675b30810a4f56e6119a8d8b426 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Tue, 3 Jun 2014 17:35:22 -0400 Subject: [PATCH 076/694] [verifier] Silence a size mismatch warning in the verifier. --- mono/metadata/verify.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mono/metadata/verify.c b/mono/metadata/verify.c index aa4435c8e85..64111ea7c11 100644 --- a/mono/metadata/verify.c +++ b/mono/metadata/verify.c @@ -5003,7 +5003,7 @@ mono_method_verify (MonoMethod *method, int level) while (ip < end && ctx.valid) { int op_size; - ip_offset = ip - code_start; + ip_offset = (guint) (ip - code_start); { const unsigned char *ip_copy = ip; int op; @@ -5034,7 +5034,7 @@ mono_method_verify (MonoMethod *method, int level) } } - ctx.ip_offset = ip_offset = ip - code_start; + ctx.ip_offset = ip_offset = (guint) (ip - code_start); /*We need to check against fallthrou in and out of protected blocks. * For fallout we check the once a protected block ends, if the start flag is not set. From 16fe0d24af6b7333f970c6d4cc93a1a1d746fbbc Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Tue, 3 Jun 2014 17:39:33 -0400 Subject: [PATCH 077/694] [runtime] Fix a bunch of warnings in threads.c related to int64 -> int32 lossy casts. --- mono/metadata/threads.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/mono/metadata/threads.c b/mono/metadata/threads.c index 689e4e29488..c85082d033e 100755 --- a/mono/metadata/threads.c +++ b/mono/metadata/threads.c @@ -1345,7 +1345,7 @@ mono_wait_uninterrupted (MonoInternalThread *thread, gboolean multiple, guint32 continue; /* Re-calculate ms according to the time passed */ - diff_ms = (mono_100ns_ticks () - start) / 10000; + diff_ms = (gint32)((mono_100ns_ticks () - start) / 10000); if (diff_ms >= ms) { ret = WAIT_TIMEOUT; break; @@ -1369,7 +1369,8 @@ gboolean ves_icall_System_Threading_WaitHandle_WaitAll_internal(MonoArray *mono_ /* Do this WaitSleepJoin check before creating objects */ mono_thread_current_check_pending_interrupt (); - numhandles = mono_array_length(mono_handles); + /* We fail in managed if the array has more than 64 elements */ + numhandles = (guint32)mono_array_length(mono_handles); handles = g_new0(HANDLE, numhandles); for(i = 0; i < numhandles; i++) { @@ -1404,7 +1405,7 @@ gboolean ves_icall_System_Threading_WaitHandle_WaitAll_internal(MonoArray *mono_ gint32 ves_icall_System_Threading_WaitHandle_WaitAny_internal(MonoArray *mono_handles, gint32 ms, gboolean exitContext) { HANDLE handles [MAXIMUM_WAIT_OBJECTS]; - guint32 numhandles; + uintptr_t numhandles; guint32 ret; guint32 i; MonoObject *waitHandle; @@ -3746,6 +3747,12 @@ search_tls_slot_in_freelist (StaticDataInfo *static_data, guint32 size, guint32 return NULL; } +#if SIZEOF_VOID_P == 4 +#define ONE_P 1 +#else +#define ONE_P 1ll +#endif + static void update_tls_reference_bitmap (guint32 offset, uintptr_t *bitmap, int numbits) { @@ -3759,8 +3766,8 @@ update_tls_reference_bitmap (guint32 offset, uintptr_t *bitmap, int numbits) offset /= sizeof (gpointer); /* offset is now the bitmap offset */ for (i = 0; i < numbits; ++i) { - if (bitmap [i / sizeof (uintptr_t)] & (1L << (i & (sizeof (uintptr_t) * 8 -1)))) - rb [(offset + i) / (sizeof (uintptr_t) * 8)] |= (1L << ((offset + i) & (sizeof (uintptr_t) * 8 -1))); + if (bitmap [i / sizeof (uintptr_t)] & (ONE_P << (i & (sizeof (uintptr_t) * 8 -1)))) + rb [(offset + i) / (sizeof (uintptr_t) * 8)] |= (ONE_P << ((offset + i) & (sizeof (uintptr_t) * 8 -1))); } } @@ -4561,7 +4568,6 @@ abort_thread_internal (MonoInternalThread *thread, gboolean can_raise_exception, mono_thread_info_setup_async_call (info, self_interrupt_thread, NULL); mono_thread_info_finish_suspend_and_resume (info); } else { - gpointer interrupt_handle; /* * This will cause waits to be broken. * It will also prevent the thread from entering a wait, so if the thread returns @@ -4570,6 +4576,7 @@ abort_thread_internal (MonoInternalThread *thread, gboolean can_raise_exception, * make it return. */ #ifndef HOST_WIN32 + gpointer interrupt_handle; interrupt_handle = wapi_prepare_interrupt_thread (thread->handle); #endif mono_thread_info_finish_suspend_and_resume (info); From 955c2e1010349a44d5437f3628cb70718c434187 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Tue, 3 Jun 2014 17:45:50 -0400 Subject: [PATCH 078/694] [sgen] Fix win64 issues with longs and inline assembly. --- mono/metadata/sgen-fin-weak-hash.c | 2 +- mono/metadata/sgen-gc.h | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/mono/metadata/sgen-fin-weak-hash.c b/mono/metadata/sgen-fin-weak-hash.c index bb350a9e91f..3793c9435be 100644 --- a/mono/metadata/sgen-fin-weak-hash.c +++ b/mono/metadata/sgen-fin-weak-hash.c @@ -41,7 +41,7 @@ int num_ready_finalizers = 0; static int no_finalize = 0; #define DISLINK_OBJECT(l) (REVEAL_POINTER (*(void**)(l))) -#define DISLINK_TRACK(l) ((~(gulong)(*(void**)(l))) & 1) +#define DISLINK_TRACK(l) ((~(size_t)(*(void**)(l))) & 1) /* * The finalizable hash has the object as the key, the diff --git a/mono/metadata/sgen-gc.h b/mono/metadata/sgen-gc.h index 0e37c90f430..0c2a12f3b8d 100644 --- a/mono/metadata/sgen-gc.h +++ b/mono/metadata/sgen-gc.h @@ -239,13 +239,19 @@ extern int num_ready_finalizers; #define SGEN_CAN_ALIGN_UP(s) ((s) <= SIZE_MAX - (SGEN_ALLOC_ALIGN - 1)) #define SGEN_ALIGN_UP(s) (((s)+(SGEN_ALLOC_ALIGN-1)) & ~(SGEN_ALLOC_ALIGN-1)) +#if SIZEOF_VOID_P == 4 +#define ONE_P 1 +#else +#define ONE_P 1ll +#endif + /* * The link pointer is hidden by negating each bit. We use the lowest * bit of the link (before negation) to store whether it needs * resurrection tracking. */ -#define HIDE_POINTER(p,t) ((gpointer)(~((gulong)(p)|((t)?1:0)))) -#define REVEAL_POINTER(p) ((gpointer)((~(gulong)(p))&~3L)) +#define HIDE_POINTER(p,t) ((gpointer)(~((size_t)(p)|((t)?1:0)))) +#define REVEAL_POINTER(p) ((gpointer)((~(size_t)(p))&~3L)) #ifdef SGEN_ALIGN_NURSERY #define SGEN_PTR_IN_NURSERY(p,bits,start,end) (((mword)(p) & ~((1 << (bits)) - 1)) == (mword)(start)) @@ -1098,10 +1104,8 @@ sgen_dummy_use (gpointer v) { #if defined(__GNUC__) __asm__ volatile ("" : "=r"(v) : "r"(v)); #elif defined(_MSC_VER) - __asm { - mov eax, v; - and eax, eax; - }; + static volatile gpointer ptr; + ptr = v; #else #error "Implement sgen_dummy_use for your compiler" #endif From a5593126ad44077b5433eebe25181b7a6bb0560e Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Tue, 3 Jun 2014 18:02:19 -0400 Subject: [PATCH 079/694] [sgen] Fix small localized warnings. --- mono/metadata/sgen-marksweep.c | 6 +++--- mono/metadata/sgen-tarjan-bridge.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mono/metadata/sgen-marksweep.c b/mono/metadata/sgen-marksweep.c index d409df58720..c205d970677 100755 --- a/mono/metadata/sgen-marksweep.c +++ b/mono/metadata/sgen-marksweep.c @@ -187,9 +187,9 @@ static LOCK_DECLARE (ms_block_list_mutex); #endif static gboolean *evacuate_block_obj_sizes; -static float evacuation_threshold = 0.666; +static float evacuation_threshold = 0.666f; #ifdef SGEN_HAVE_CONCURRENT_MARK -static float concurrent_evacuation_threshold = 0.666; +static float concurrent_evacuation_threshold = 0.666f; static gboolean want_evacuation = FALSE; #endif @@ -2132,7 +2132,7 @@ major_handle_gc_param (const char *opt) fprintf (stderr, "evacuation-threshold must be an integer in the range 0-100.\n"); exit (1); } - evacuation_threshold = (float)percentage / 100.0; + evacuation_threshold = (float)percentage / 100.0f; return TRUE; } else if (!strcmp (opt, "lazy-sweep")) { lazy_sweep = TRUE; diff --git a/mono/metadata/sgen-tarjan-bridge.c b/mono/metadata/sgen-tarjan-bridge.c index 1abcda6b2e1..afa4f42a957 100644 --- a/mono/metadata/sgen-tarjan-bridge.c +++ b/mono/metadata/sgen-tarjan-bridge.c @@ -502,7 +502,7 @@ static HashEntry merge_cache [COLOR_CACHE_SIZE][ELEMENTS_PER_BUCKET]; static int mix_hash (size_t hash) { - return ((hash * 215497) >> 16) ^ (hash * 1823231) + hash; + return (int)(((hash * 215497) >> 16) ^ (hash * 1823231) + hash); } static void From ba95eaba43ce9449f4b4f888f9ae8cf918f09f7b Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 4 Jun 2014 10:58:15 -0400 Subject: [PATCH 080/694] [sgen] Move the pinning code to use size_t internally. This makes this code 64bits clean. --- mono/metadata/sgen-gc.c | 26 +++++++++++++------------- mono/metadata/sgen-gc.h | 6 +++--- mono/metadata/sgen-marksweep.c | 2 +- mono/metadata/sgen-pinning.c | 26 +++++++++++++------------- mono/metadata/sgen-pinning.h | 6 +++--- 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index 359ce01471d..5ef77e783c9 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -1020,10 +1020,10 @@ pin_objects_from_addresses (GCMemSection *section, void **start, void **end, voi void sgen_pin_objects_in_section (GCMemSection *section, ScanCopyContext ctx) { - int num_entries = section->pin_queue_num_entries; + size_t num_entries = section->pin_queue_num_entries; if (num_entries) { void **start = section->pin_queue_start; - int reduced_to; + size_t reduced_to; reduced_to = pin_objects_from_addresses (section, start, start + num_entries, section->data, section->next_data, ctx); section->pin_queue_num_entries = reduced_to; @@ -1097,15 +1097,15 @@ sgen_parallel_pin_or_update (void **ptr, void *obj, MonoVTable *vt, SgenGrayQueu * Done using a by-the book heap sort. Which has decent and stable performance, is pretty cache efficient. */ void -sgen_sort_addresses (void **array, int size) +sgen_sort_addresses (void **array, size_t size) { - int i; + size_t i; void *tmp; for (i = 1; i < size; ++i) { - int child = i; + size_t child = i; while (child > 0) { - int parent = (child - 1) / 2; + size_t parent = (child - 1) / 2; if (array [parent] >= array [child]) break; @@ -1119,7 +1119,7 @@ sgen_sort_addresses (void **array, int size) } for (i = size - 1; i > 0; --i) { - int end, root; + size_t end, root; tmp = array [i]; array [i] = array [0]; array [0] = tmp; @@ -1128,7 +1128,7 @@ sgen_sort_addresses (void **array, int size) root = 0; while (root * 2 + 1 <= end) { - int child = root * 2 + 1; + size_t child = root * 2 + 1; if (child < end && array [child] < array [child + 1]) ++child; @@ -2479,7 +2479,7 @@ scan_nursery_objects (ScanCopyContext ctx) } static void -major_copy_or_mark_from_roots (int *old_next_pin_slot, gboolean finish_up_concurrent_mark, gboolean scan_mod_union) +major_copy_or_mark_from_roots (size_t *old_next_pin_slot, gboolean finish_up_concurrent_mark, gboolean scan_mod_union) { LOSObject *bigobj; TV_DECLARE (atv); @@ -2595,7 +2595,7 @@ major_copy_or_mark_from_roots (int *old_next_pin_slot, gboolean finish_up_concur /* identify possible pointers to the insize of large objects */ SGEN_LOG (6, "Pinning from large objects"); for (bigobj = los_object_list; bigobj; bigobj = bigobj->next) { - int dummy; + size_t dummy; if (sgen_find_optimized_pin_queue_area (bigobj->data, (char*)bigobj->data + sgen_los_object_size (bigobj), &dummy)) { binary_protocol_pin (bigobj->data, (gpointer)LOAD_VTABLE (bigobj->data), safe_object_get_size (((MonoObject*)(bigobj->data)))); @@ -2752,7 +2752,7 @@ major_copy_or_mark_from_roots (int *old_next_pin_slot, gboolean finish_up_concur } static void -major_start_collection (gboolean concurrent, int *old_next_pin_slot) +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); @@ -2818,7 +2818,7 @@ join_workers (void) } static void -major_finish_collection (const char *reason, int old_next_pin_slot, gboolean scan_mod_union) +major_finish_collection (const char *reason, size_t old_next_pin_slot, gboolean scan_mod_union) { LOSObject *bigobj, *prevbo; TV_DECLARE (atv); @@ -2979,7 +2979,7 @@ major_do_collection (const char *reason) { TV_DECLARE (all_atv); TV_DECLARE (all_btv); - int old_next_pin_slot; + size_t old_next_pin_slot; if (disable_major_collections) return FALSE; diff --git a/mono/metadata/sgen-gc.h b/mono/metadata/sgen-gc.h index 0c2a12f3b8d..cc1ffb1daa6 100644 --- a/mono/metadata/sgen-gc.h +++ b/mono/metadata/sgen-gc.h @@ -143,7 +143,7 @@ struct _GCMemSection { char **scan_starts; /* in major collections indexes in the pin_queue for objects that pin this section */ void **pin_queue_start; - int pin_queue_num_entries; + size_t pin_queue_num_entries; size_t num_scan_start; }; @@ -497,7 +497,7 @@ void sgen_free_internal (void *addr, int type) MONO_INTERNAL; void* sgen_alloc_internal_dynamic (size_t size, int type, gboolean assert_on_failure) MONO_INTERNAL; void sgen_free_internal_dynamic (void *addr, size_t size, int type) MONO_INTERNAL; -void** sgen_find_optimized_pin_queue_area (void *start, void *end, int *num) MONO_INTERNAL; +void** sgen_find_optimized_pin_queue_area (void *start, void *end, size_t *num) MONO_INTERNAL; void sgen_find_section_pin_queue_start_end (GCMemSection *section) MONO_INTERNAL; void sgen_pin_objects_in_section (GCMemSection *section, ScanCopyContext ctx) MONO_INTERNAL; @@ -505,7 +505,7 @@ void sgen_pin_stats_register_object (char *obj, size_t size); void sgen_pin_stats_register_global_remset (char *obj); void sgen_pin_stats_print_class_stats (void); -void sgen_sort_addresses (void **array, int size) MONO_INTERNAL; +void sgen_sort_addresses (void **array, size_t size) MONO_INTERNAL; void sgen_add_to_global_remset (gpointer ptr, gpointer obj) MONO_INTERNAL; int sgen_get_current_collection_generation (void) MONO_INTERNAL; diff --git a/mono/metadata/sgen-marksweep.c b/mono/metadata/sgen-marksweep.c index c205d970677..8a770e2efd1 100755 --- a/mono/metadata/sgen-marksweep.c +++ b/mono/metadata/sgen-marksweep.c @@ -83,7 +83,7 @@ typedef struct _MSBlockInfo MSBlockInfo; struct _MSBlockInfo { int obj_size; int obj_size_index; - int pin_queue_num_entries; + size_t pin_queue_num_entries; unsigned int pinned : 1; unsigned int has_references : 1; unsigned int has_pinned : 1; /* means cannot evacuate */ diff --git a/mono/metadata/sgen-pinning.c b/mono/metadata/sgen-pinning.c index d0a38ef426e..4f07518e35a 100644 --- a/mono/metadata/sgen-pinning.c +++ b/mono/metadata/sgen-pinning.c @@ -27,9 +27,9 @@ #include "metadata/sgen-protocol.h" static void** pin_queue; -static int pin_queue_size = 0; -static int next_pin_slot = 0; -static int last_num_pinned = 0; +static size_t pin_queue_size = 0; +static size_t next_pin_slot = 0; +static size_t last_num_pinned = 0; #define PIN_HASH_SIZE 1024 static void *pin_hash_filter [PIN_HASH_SIZE]; @@ -50,7 +50,7 @@ sgen_finish_pinning (void) static void realloc_pin_queue (void) { - int new_size = pin_queue_size? pin_queue_size + pin_queue_size/2: 1024; + size_t new_size = pin_queue_size? pin_queue_size + pin_queue_size/2: 1024; void **new_pin = sgen_alloc_internal_dynamic (sizeof (void*) * new_size, INTERNAL_MEM_PIN_QUEUE, TRUE); memcpy (new_pin, pin_queue, sizeof (void*) * next_pin_slot); sgen_free_internal_dynamic (pin_queue, sizeof (void*) * pin_queue_size, INTERNAL_MEM_PIN_QUEUE); @@ -75,12 +75,12 @@ sgen_pin_stage_ptr (void *ptr) pin_queue [next_pin_slot++] = ptr; } -static int +static size_t optimized_pin_queue_search (void *addr) { - int first = 0, last = next_pin_slot; + size_t first = 0, last = next_pin_slot; while (first < last) { - int middle = first + ((last - first) >> 1); + size_t middle = first + ((last - first) >> 1); if (addr <= pin_queue [middle]) last = middle; else @@ -91,9 +91,9 @@ optimized_pin_queue_search (void *addr) } void** -sgen_find_optimized_pin_queue_area (void *start, void *end, int *num) +sgen_find_optimized_pin_queue_area (void *start, void *end, size_t *num) { - int first, last; + size_t first, last; first = optimized_pin_queue_search (start); last = optimized_pin_queue_search (end); *num = last - first; @@ -125,7 +125,7 @@ sgen_pinning_trim_queue_to_section (GCMemSection *section) } void -sgen_pin_queue_clear_discarded_entries (GCMemSection *section, int max_pin_slot) +sgen_pin_queue_clear_discarded_entries (GCMemSection *section, size_t max_pin_slot) { void **start = section->pin_queue_start + section->pin_queue_num_entries; void **end = pin_queue + max_pin_slot; @@ -144,7 +144,7 @@ sgen_pin_queue_clear_discarded_entries (GCMemSection *section, int max_pin_slot) /* reduce the info in the pin queue, removing duplicate pointers and sorting them */ void -sgen_optimize_pin_queue (int start_slot) +sgen_optimize_pin_queue (size_t start_slot) { void **start, **cur, **end; /* sort and uniq pin_queue: we just sort and we let the rest discard multiple values */ @@ -164,7 +164,7 @@ sgen_optimize_pin_queue (int start_slot) SGEN_LOG (5, "Pin queue reduced to size: %d", next_pin_slot); } -int +size_t sgen_get_pinned_count (void) { return next_pin_slot; @@ -311,7 +311,7 @@ sgen_cement_lookup_or_register (char *obj) vt->klass->name_space, vt->klass->name); } binary_protocol_cement (obj, (gpointer)SGEN_LOAD_VTABLE (obj), - sgen_safe_object_get_size ((MonoObject*)obj)); + (int)sgen_safe_object_get_size ((MonoObject*)obj)); } return FALSE; diff --git a/mono/metadata/sgen-pinning.h b/mono/metadata/sgen-pinning.h index f141cd68399..ef41df24d2f 100644 --- a/mono/metadata/sgen-pinning.h +++ b/mono/metadata/sgen-pinning.h @@ -28,11 +28,11 @@ enum { }; void sgen_pin_stage_ptr (void *ptr) MONO_INTERNAL; -void sgen_optimize_pin_queue (int start_slot) MONO_INTERNAL; +void sgen_optimize_pin_queue (size_t start_slot) MONO_INTERNAL; void sgen_init_pinning (void) MONO_INTERNAL; void sgen_finish_pinning (void) MONO_INTERNAL; -void sgen_pin_queue_clear_discarded_entries (GCMemSection *section, int max_pin_slot) MONO_INTERNAL; -int sgen_get_pinned_count (void) MONO_INTERNAL; +void sgen_pin_queue_clear_discarded_entries (GCMemSection *section, size_t max_pin_slot) MONO_INTERNAL; +size_t sgen_get_pinned_count (void) MONO_INTERNAL; void sgen_pinning_setup_section (GCMemSection *section) MONO_INTERNAL; void sgen_pinning_trim_queue_to_section (GCMemSection *section) MONO_INTERNAL; From a066f0d94b34c15a43e86578425ed7c406315390 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 4 Jun 2014 12:10:01 -0400 Subject: [PATCH 081/694] [sgen] Use size_t consistently in the nursery code. --- mono/metadata/sgen-gc.h | 14 +++++++------- mono/metadata/sgen-nursery-allocator.c | 14 +++++++------- mono/metadata/sgen-simple-nursery.c | 2 +- mono/metadata/sgen-split-nursery.c | 14 +++++++------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/mono/metadata/sgen-gc.h b/mono/metadata/sgen-gc.h index cc1ffb1daa6..eb9566017b3 100644 --- a/mono/metadata/sgen-gc.h +++ b/mono/metadata/sgen-gc.h @@ -566,14 +566,14 @@ Test 1 (compiling corlib): #define SGEN_TO_SPACE_GRANULE_IN_BYTES (1 << SGEN_TO_SPACE_GRANULE_BITS) extern char *sgen_space_bitmap MONO_INTERNAL; -extern int sgen_space_bitmap_size MONO_INTERNAL; +extern size_t sgen_space_bitmap_size MONO_INTERNAL; static inline gboolean sgen_nursery_is_to_space (char *object) { - int idx = (object - sgen_nursery_start) >> SGEN_TO_SPACE_GRANULE_BITS; - int byte = idx / 8; - int bit = idx & 0x7; + size_t idx = (object - sgen_nursery_start) >> SGEN_TO_SPACE_GRANULE_BITS; + size_t byte = idx / 8; + size_t bit = idx & 0x7; SGEN_ASSERT (4, sgen_ptr_in_nursery (object), "object %p is not in nursery [%p - %p]", object, sgen_get_nursery_start (), sgen_get_nursery_end ()); SGEN_ASSERT (4, byte < sgen_space_bitmap_size, "byte index %d out of range", byte, sgen_space_bitmap_size); @@ -611,7 +611,7 @@ typedef struct { SgenObjectOperations serial_ops; SgenObjectOperations parallel_ops; - void (*prepare_to_space) (char *to_space_bitmap, int space_bitmap_size); + void (*prepare_to_space) (char *to_space_bitmap, size_t space_bitmap_size); void (*clear_fragments) (void); SgenFragment* (*build_fragments_get_exclude_head) (void); void (*build_fragments_release_exclude_head) (void); @@ -959,7 +959,7 @@ gboolean sgen_los_object_is_pinned (char *obj) MONO_INTERNAL; void sgen_clear_nursery_fragments (void) MONO_INTERNAL; void sgen_nursery_allocator_prepare_for_pinning (void) MONO_INTERNAL; void sgen_nursery_allocator_set_nursery_bounds (char *nursery_start, char *nursery_end) MONO_INTERNAL; -mword sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, int num_entries, SgenGrayQueue *unpin_queue) MONO_INTERNAL; +mword sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_t num_entries, SgenGrayQueue *unpin_queue) MONO_INTERNAL; void sgen_init_nursery_allocator (void) MONO_INTERNAL; void sgen_nursery_allocator_init_heavy_stats (void) MONO_INTERNAL; void sgen_alloc_init_heavy_stats (void) MONO_INTERNAL; @@ -1056,7 +1056,7 @@ extern int do_pin_stats; static inline void sgen_set_nursery_scan_start (char *p) { - int idx = (p - (char*)nursery_section->data) / SGEN_SCAN_START_SIZE; + size_t idx = (p - (char*)nursery_section->data) / SGEN_SCAN_START_SIZE; char *old = nursery_section->scan_starts [idx]; if (!old || old > p) nursery_section->scan_starts [idx] = p; diff --git a/mono/metadata/sgen-nursery-allocator.c b/mono/metadata/sgen-nursery-allocator.c index 189a60b5297..baa94ab2e44 100644 --- a/mono/metadata/sgen-nursery-allocator.c +++ b/mono/metadata/sgen-nursery-allocator.c @@ -108,7 +108,7 @@ int sgen_nursery_bits = 22; #endif char *sgen_space_bitmap MONO_INTERNAL; -int sgen_space_bitmap_size MONO_INTERNAL; +size_t sgen_space_bitmap_size MONO_INTERNAL; #ifdef HEAVY_STATISTICS @@ -471,7 +471,7 @@ sgen_fragment_allocator_par_alloc (SgenFragmentAllocator *allocator, size_t size for (frag = unmask (allocator->alloc_head); unmask (frag); frag = unmask (frag->next)) { HEAVY_STAT (InterlockedIncrement (&stat_alloc_iterations)); - if (size <= (frag->fragment_end - frag->fragment_next)) { + if (size <= (size_t)(frag->fragment_end - frag->fragment_next)) { void *p = par_alloc_from_fragment (allocator, frag, size); if (!p) { HEAVY_STAT (InterlockedIncrement (&stat_alloc_retries)); @@ -579,7 +579,7 @@ sgen_fragment_allocator_par_range_alloc (SgenFragmentAllocator *allocator, size_ #endif for (frag = unmask (allocator->alloc_head); frag; frag = unmask (frag->next)) { - int frag_size = frag->fragment_end - frag->fragment_next; + size_t frag_size = frag->fragment_end - frag->fragment_next; HEAVY_STAT (InterlockedIncrement (&stat_alloc_range_iterations)); @@ -608,7 +608,7 @@ sgen_fragment_allocator_par_range_alloc (SgenFragmentAllocator *allocator, size_ if (min_frag) { void *p; - int frag_size; + size_t frag_size; frag_size = min_frag->fragment_end - min_frag->fragment_next; if (frag_size < minimum_size) @@ -745,11 +745,11 @@ fragment_list_reverse (SgenFragmentAllocator *allocator) } mword -sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, int num_entries, SgenGrayQueue *unpin_queue) +sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_t num_entries, SgenGrayQueue *unpin_queue) { char *frag_start, *frag_end; size_t frag_size; - int i = 0; + size_t i = 0; SgenFragment *frags_ranges; #ifdef NALLOC_DEBUG @@ -860,7 +860,7 @@ sgen_can_alloc_size (size_t size) size = SGEN_ALIGN_UP (size); for (frag = unmask (mutator_allocator.alloc_head); frag; frag = unmask (frag->next)) { - if ((frag->fragment_end - frag->fragment_next) >= size) + if ((size_t)(frag->fragment_end - frag->fragment_next) >= size) return TRUE; } return FALSE; diff --git a/mono/metadata/sgen-simple-nursery.c b/mono/metadata/sgen-simple-nursery.c index 3a0c57e0224..f2f7066c301 100644 --- a/mono/metadata/sgen-simple-nursery.c +++ b/mono/metadata/sgen-simple-nursery.c @@ -58,7 +58,7 @@ build_fragments_finish (SgenFragmentAllocator *allocator) } static void -prepare_to_space (char *to_space_bitmap, int space_bitmap_size) +prepare_to_space (char *to_space_bitmap, size_t space_bitmap_size) { } diff --git a/mono/metadata/sgen-split-nursery.c b/mono/metadata/sgen-split-nursery.c index fc741cfc05b..1f62d14b703 100644 --- a/mono/metadata/sgen-split-nursery.c +++ b/mono/metadata/sgen-split-nursery.c @@ -139,7 +139,7 @@ static float alloc_ratio = 60.f/100.f; static char *region_age; -static int region_age_size; +static size_t region_age_size; static AgeAllocationBuffer age_alloc_buffers [MAX_AGE]; /* The collector allocs from here. */ @@ -150,14 +150,14 @@ static LOCK_DECLARE (par_alloc_buffer_refill_mutex); static inline int get_object_age (char *object) { - int idx = (object - sgen_nursery_start) >> SGEN_TO_SPACE_GRANULE_BITS; + size_t idx = (object - sgen_nursery_start) >> SGEN_TO_SPACE_GRANULE_BITS; return region_age [idx]; } static inline void set_object_age (char *object, int age) { - int idx = (object - sgen_nursery_start) >> SGEN_TO_SPACE_GRANULE_BITS; + size_t idx = (object - sgen_nursery_start) >> SGEN_TO_SPACE_GRANULE_BITS; region_age [idx] = age; } @@ -165,7 +165,7 @@ static void set_age_in_range (char *start, char *end, int age) { char *region_start; - int region_idx, length; + size_t region_idx, length; region_idx = (start - sgen_nursery_start) >> SGEN_TO_SPACE_GRANULE_BITS; region_start = ®ion_age [region_idx]; length = (end - start) >> SGEN_TO_SPACE_GRANULE_BITS; @@ -175,8 +175,8 @@ set_age_in_range (char *start, char *end, int age) static inline void mark_bit (char *space_bitmap, char *pos) { - int idx = (pos - sgen_nursery_start) >> SGEN_TO_SPACE_GRANULE_BITS; - int byte = idx / 8; + size_t idx = (pos - sgen_nursery_start) >> SGEN_TO_SPACE_GRANULE_BITS; + size_t byte = idx / 8; int bit = idx & 0x7; g_assert (byte < sgen_space_bitmap_size); @@ -420,7 +420,7 @@ build_fragments_finish (SgenFragmentAllocator *allocator) } static void -prepare_to_space (char *to_space_bitmap, int space_bitmap_size) +prepare_to_space (char *to_space_bitmap, size_t space_bitmap_size) { SgenFragment **previous, *frag; From 828d4c9e608f7a3a09dc8d6f5bc2843c6b87c1ef Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 4 Jun 2014 12:15:54 -0400 Subject: [PATCH 082/694] [sgen] Use size_t consistently in the major collector for object sizes and number of memory blocks. --- mono/metadata/sgen-gc.h | 4 ++-- mono/metadata/sgen-marksweep.c | 40 ++++++++++++++++++---------------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/mono/metadata/sgen-gc.h b/mono/metadata/sgen-gc.h index eb9566017b3..313e6ae6c8f 100644 --- a/mono/metadata/sgen-gc.h +++ b/mono/metadata/sgen-gc.h @@ -668,8 +668,8 @@ struct _SgenMajorCollector { SgenObjectOperations major_ops; SgenObjectOperations major_concurrent_ops; - void* (*alloc_object) (MonoVTable *vtable, int size, gboolean has_references); - void* (*par_alloc_object) (MonoVTable *vtable, int size, gboolean has_references); + void* (*alloc_object) (MonoVTable *vtable, size_t size, gboolean has_references); + void* (*par_alloc_object) (MonoVTable *vtable, size_t size, gboolean has_references); void (*free_pinned_object) (char *obj, size_t size); void (*iterate_objects) (IterateObjectsFlags flags, IterateObjectCallbackFunc callback, void *data); void (*free_non_pinned_object) (char *obj, size_t size); diff --git a/mono/metadata/sgen-marksweep.c b/mono/metadata/sgen-marksweep.c index 8a770e2efd1..d036c751822 100755 --- a/mono/metadata/sgen-marksweep.c +++ b/mono/metadata/sgen-marksweep.c @@ -130,10 +130,12 @@ typedef struct { #define MS_BLOCK_FOR_OBJ(o) (((MSBlockHeader*)MS_BLOCK_DATA_FOR_OBJ ((o)))->info) #endif -#define MS_BLOCK_OBJ_INDEX(o,b) (((char*)(o) - ((b)->block + MS_BLOCK_SKIP)) / (b)->obj_size) +/* object index will always be small */ +#define MS_BLOCK_OBJ_INDEX(o,b) ((int)(((char*)(o) - ((b)->block + MS_BLOCK_SKIP)) / (b)->obj_size)) +//casting to int is fine since blocks are 32k #define MS_CALC_MARK_BIT(w,b,o) do { \ - int i = ((char*)(o) - MS_BLOCK_DATA_FOR_OBJ ((o))) >> SGEN_ALLOC_ALIGN_BITS; \ + int i = ((int)((char*)(o) - MS_BLOCK_DATA_FOR_OBJ ((o)))) >> SGEN_ALLOC_ALIGN_BITS; \ if (sizeof (mword) == 4) { \ (w) = i >> 5; \ (b) = i & 31; \ @@ -143,11 +145,11 @@ typedef struct { } \ } while (0) -#define MS_MARK_BIT(bl,w,b) ((bl)->mark_words [(w)] & (1L << (b))) -#define MS_SET_MARK_BIT(bl,w,b) ((bl)->mark_words [(w)] |= (1L << (b))) +#define MS_MARK_BIT(bl,w,b) ((bl)->mark_words [(w)] & (ONE_P << (b))) +#define MS_SET_MARK_BIT(bl,w,b) ((bl)->mark_words [(w)] |= (ONE_P << (b))) #define MS_PAR_SET_MARK_BIT(was_marked,bl,w,b) do { \ mword __old = (bl)->mark_words [(w)]; \ - mword __bitmask = 1L << (b); \ + mword __bitmask = ONE_P << (b); \ if (__old & __bitmask) { \ was_marked = TRUE; \ break; \ @@ -209,7 +211,7 @@ static MSBlockInfo *empty_blocks = NULL; #else /* non-allocated block free-list */ static void *empty_blocks = NULL; -static int num_empty_blocks = 0; +static size_t num_empty_blocks = 0; #endif #define FOREACH_BLOCK(bl) for ((bl) = all_blocks; (bl); (bl) = (bl)->next) { @@ -250,7 +252,7 @@ static void sweep_block (MSBlockInfo *block, gboolean during_major_collection); static int -ms_find_block_obj_size_index (int size) +ms_find_block_obj_size_index (size_t size) { int i; SGEN_ASSERT (9, size <= SGEN_MAX_SMALL_OBJ_SIZE, "size %d is bigger than max small object size %d", size, SGEN_MAX_SMALL_OBJ_SIZE); @@ -397,7 +399,7 @@ ms_get_empty_block (void) p += MS_BLOCK_SIZE; } - SGEN_ATOMIC_ADD (num_empty_blocks, alloc_num); + SGEN_ATOMIC_ADD_P (num_empty_blocks, alloc_num); stat_major_blocks_alloced += alloc_num; #if SIZEOF_VOID_P != 8 @@ -414,7 +416,7 @@ ms_get_empty_block (void) next = *(void**)block; } while (SGEN_CAS_PTR (&empty_blocks, next, empty) != empty); - SGEN_ATOMIC_ADD (num_empty_blocks, -1); + SGEN_ATOMIC_ADD_P (num_empty_blocks, -1); *(void**)block = NULL; @@ -436,7 +438,7 @@ ms_free_block (void *block) *(void**)block = empty; } while (SGEN_CAS_PTR (&empty_blocks, block, empty) != empty); - SGEN_ATOMIC_ADD (num_empty_blocks, 1); + SGEN_ATOMIC_ADD_P (num_empty_blocks, 1); } #endif @@ -476,7 +478,7 @@ check_empty_blocks (void) { #ifndef FIXED_HEAP void *p; - int i = 0; + size_t i = 0; for (p = empty_blocks; p; p = *(void**)p) ++i; g_assert (i == num_empty_blocks); @@ -728,14 +730,14 @@ alloc_obj_par (MonoVTable *vtable, int size, gboolean pinned, gboolean has_refer } static void* -major_par_alloc_object (MonoVTable *vtable, int size, gboolean has_references) +major_par_alloc_object (MonoVTable *vtable, size_t size, gboolean has_references) { return alloc_obj_par (vtable, size, FALSE, has_references); } #endif static void* -alloc_obj (MonoVTable *vtable, int size, gboolean pinned, gboolean has_references) +alloc_obj (MonoVTable *vtable, size_t size, gboolean pinned, gboolean has_references) { int size_index = MS_BLOCK_OBJ_SIZE_INDEX (size); MSBlockInfo **free_blocks = FREE_BLOCKS (pinned, has_references); @@ -759,7 +761,7 @@ alloc_obj (MonoVTable *vtable, int size, gboolean pinned, gboolean has_reference } static void* -major_alloc_object (MonoVTable *vtable, int size, gboolean has_references) +major_alloc_object (MonoVTable *vtable, size_t size, gboolean has_references) { return alloc_obj (vtable, size, FALSE, has_references); } @@ -1812,7 +1814,7 @@ ms_calculate_block_obj_sizes (double factor, int *arr) int last_size = 0; do { - int target_count = ceil (MS_BLOCK_FREE / target_size); + int target_count = (int)ceil (MS_BLOCK_FREE / target_size); int size = MIN ((MS_BLOCK_FREE / target_count) & ~(SGEN_ALLOC_ALIGN - 1), SGEN_MAX_SMALL_OBJ_SIZE); if (size != last_size) { @@ -1904,7 +1906,7 @@ static void major_have_computer_minor_collection_allowance (void) { #ifndef FIXED_HEAP - int section_reserve = sgen_get_minor_collection_allowance () / MS_BLOCK_SIZE; + size_t section_reserve = sgen_get_minor_collection_allowance () / MS_BLOCK_SIZE; g_assert (have_swept); @@ -2283,7 +2285,7 @@ major_scan_card_table (gboolean mod_union, SgenGrayQueue *queue) base = sgen_card_table_align_pointer (obj); while (obj < end) { - int card_offset; + size_t card_offset; if (!block->swept) sweep_block (block, FALSE); @@ -2337,8 +2339,8 @@ major_scan_card_table (gboolean mod_union, SgenGrayQueue *queue) card_data_end = card_data + CARDS_PER_BLOCK; for (card_data = initial_skip_card (card_data); card_data < card_data_end; ++card_data) { //card_data = skip_card (card_data + 1, card_data_end)) { - int index; - int idx = card_data - card_base; + size_t index; + size_t idx = card_data - card_base; char *start = (char*)(block_start + idx * CARD_SIZE_IN_BYTES); char *end = start + CARD_SIZE_IN_BYTES; char *first_obj, *obj; From 238f52088becd6ad1121bb4b16b29e6bdb2deb40 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 4 Jun 2014 12:27:22 -0400 Subject: [PATCH 083/694] [sgen] Make los usage of size_t cosnsitent. --- mono/metadata/sgen-los.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mono/metadata/sgen-los.c b/mono/metadata/sgen-los.c index c04da2545f5..1e38006cac7 100644 --- a/mono/metadata/sgen-los.c +++ b/mono/metadata/sgen-los.c @@ -67,7 +67,7 @@ struct _LOSFreeChunks { typedef struct _LOSSection LOSSection; struct _LOSSection { LOSSection *next; - int num_free_chunks; + size_t num_free_chunks; unsigned char *free_chunk_map; }; @@ -143,7 +143,7 @@ los_consistency_check (void) static void add_free_chunk (LOSFreeChunks *free_chunks, size_t size) { - int num_chunks = size >> LOS_CHUNK_BITS; + size_t num_chunks = size >> LOS_CHUNK_BITS; free_chunks->size = size; @@ -158,7 +158,8 @@ get_from_size_list (LOSFreeChunks **list, size_t size) { LOSFreeChunks *free_chunks = NULL; LOSSection *section; - int num_chunks, i, start_index; + size_t i, num_chunks, start_index; + g_assert ((size & (LOS_CHUNK_SIZE - 1)) == 0); @@ -198,7 +199,7 @@ get_los_section_memory (size_t size) { LOSSection *section; LOSFreeChunks *free_chunks; - int num_chunks; + size_t num_chunks; size += LOS_CHUNK_SIZE - 1; size &= ~(LOS_CHUNK_SIZE - 1); @@ -212,7 +213,7 @@ get_los_section_memory (size_t size) if (num_chunks >= LOS_NUM_FAST_SIZES) { free_chunks = get_from_size_list (&los_fast_free_lists [0], size); } else { - int i; + size_t i; for (i = num_chunks; i < LOS_NUM_FAST_SIZES; ++i) { free_chunks = get_from_size_list (&los_fast_free_lists [i], size); if (free_chunks) @@ -257,7 +258,7 @@ static void free_los_section_memory (LOSObject *obj, size_t size) { LOSSection *section = LOS_SECTION_FOR_OBJ (obj); - int num_chunks, i, start_index; + size_t num_chunks, i, start_index; size += LOS_CHUNK_SIZE - 1; size &= ~(LOS_CHUNK_SIZE - 1); From f50822f39cfa742f4b3308412e2e99de0b1a28c1 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 4 Jun 2014 12:32:15 -0400 Subject: [PATCH 084/694] [sgen] Make degrated_mode a size_t. --- mono/metadata/sgen-alloc.c | 2 +- mono/metadata/sgen-gc.c | 2 +- mono/metadata/sgen-gc.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mono/metadata/sgen-alloc.c b/mono/metadata/sgen-alloc.c index 6eb71c13c34..2608f460afe 100644 --- a/mono/metadata/sgen-alloc.c +++ b/mono/metadata/sgen-alloc.c @@ -125,7 +125,7 @@ alloc_degraded (MonoVTable *vtable, size_t size, gboolean for_mature) mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_GC, "Warning: Repeated degraded allocation. Consider increasing nursery-size."); last_major_gc_warned = stat_major_gcs; } - InterlockedExchangeAdd (°raded_mode, size); + SGEN_ATOMIC_ADD_P (degraded_mode, size); sgen_ensure_free_space (size); } else { if (sgen_need_major_collection (size)) diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index 5ef77e783c9..dca117e602d 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -409,7 +409,7 @@ gboolean sgen_try_free_some_memory; #define SCAN_START_SIZE SGEN_SCAN_START_SIZE static mword pagesize = 4096; -int degraded_mode = 0; +size_t degraded_mode = 0; static mword bytes_pinned_from_failed_allocation = 0; diff --git a/mono/metadata/sgen-gc.h b/mono/metadata/sgen-gc.h index 313e6ae6c8f..49b6d08650b 100644 --- a/mono/metadata/sgen-gc.h +++ b/mono/metadata/sgen-gc.h @@ -1041,7 +1041,7 @@ extern int stat_major_gcs; extern guint32 collect_before_allocs; extern guint32 verify_before_allocs; extern gboolean has_per_allocation_action; -extern int degraded_mode; +extern size_t degraded_mode; extern int default_nursery_size; extern guint32 tlab_size; extern NurseryClearPolicy nursery_clear_policy; From 6c268d316c8bd9cd0a96930c5c19e333d488dc6b Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 4 Jun 2014 12:33:54 -0400 Subject: [PATCH 085/694] [sgen] Silence warnings when big arrays are not in use on 64bits. --- mono/metadata/sgen-alloc.c | 8 ++++---- mono/metadata/sgen-nursery-allocator.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mono/metadata/sgen-alloc.c b/mono/metadata/sgen-alloc.c index 2608f460afe..71406de673f 100644 --- a/mono/metadata/sgen-alloc.c +++ b/mono/metadata/sgen-alloc.c @@ -508,7 +508,7 @@ mono_gc_alloc_vector (MonoVTable *vtable, size_t size, uintptr_t max_length) arr = mono_gc_try_alloc_obj_nolock (vtable, size); if (arr) { /*This doesn't require fencing since EXIT_CRITICAL_REGION already does it for us*/ - arr->max_length = max_length; + arr->max_length = (mono_array_size_t)max_length; EXIT_CRITICAL_REGION; return arr; } @@ -523,7 +523,7 @@ mono_gc_alloc_vector (MonoVTable *vtable, size_t size, uintptr_t max_length) return mono_gc_out_of_memory (size); } - arr->max_length = max_length; + arr->max_length = (mono_array_size_t)max_length; UNLOCK_GC; @@ -545,7 +545,7 @@ mono_gc_alloc_array (MonoVTable *vtable, size_t size, uintptr_t max_length, uint arr = mono_gc_try_alloc_obj_nolock (vtable, size); if (arr) { /*This doesn't require fencing since EXIT_CRITICAL_REGION already does it for us*/ - arr->max_length = max_length; + arr->max_length = (mono_array_size_t)max_length; bounds = (MonoArrayBounds*)((char*)arr + size - bounds_size); arr->bounds = bounds; @@ -563,7 +563,7 @@ mono_gc_alloc_array (MonoVTable *vtable, size_t size, uintptr_t max_length, uint return mono_gc_out_of_memory (size); } - arr->max_length = max_length; + arr->max_length = (mono_array_size_t)max_length; bounds = (MonoArrayBounds*)((char*)arr + size - bounds_size); arr->bounds = bounds; diff --git a/mono/metadata/sgen-nursery-allocator.c b/mono/metadata/sgen-nursery-allocator.c index baa94ab2e44..21ac7f6d44e 100644 --- a/mono/metadata/sgen-nursery-allocator.c +++ b/mono/metadata/sgen-nursery-allocator.c @@ -685,7 +685,7 @@ sgen_clear_range (char *start, char *end) /* Mark this as not a real object */ o->obj.synchronisation = GINT_TO_POINTER (-1); o->bounds = NULL; - o->max_length = size - sizeof (MonoArray); + o->max_length = (mono_array_size_t)(size - sizeof (MonoArray)); sgen_set_nursery_scan_start (start); g_assert (start + sgen_safe_object_get_size ((MonoObject*)o) == end); } From 4d958ad0a007610936fe0b162f1f0afdcf179d30 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 4 Jun 2014 12:36:00 -0400 Subject: [PATCH 086/694] [sgen] Fix size warnings in the descriptor code. --- mono/metadata/sgen-descriptor.c | 4 ++-- mono/metadata/sgen-descriptor.h | 8 ++++---- mono/metadata/sgen-gc.c | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mono/metadata/sgen-descriptor.c b/mono/metadata/sgen-descriptor.c index 1e3bc152e79..c578a91cfb2 100644 --- a/mono/metadata/sgen-descriptor.c +++ b/mono/metadata/sgen-descriptor.c @@ -87,7 +87,7 @@ alloc_complex_descriptor (gsize *bitmap, int numbits) return i; } } - i += complex_descriptors [i]; + i += (int)complex_descriptors [i]; } if (complex_descriptors_next + nwords > complex_descriptors_size) { int new_size = complex_descriptors_size * 2 + nwords; @@ -266,7 +266,7 @@ mono_gc_get_bitmap_for_descr (void *descr, int *numbits) case DESC_TYPE_COMPLEX: { gsize *bitmap_data = sgen_get_complex_descriptor (d); - int bwords = (*bitmap_data) - 1; + int bwords = (int)(*bitmap_data) - 1;//Max scalar object size is 1Mb, which means up to 32k descriptor words int i; bitmap = g_new0 (gsize, bwords); diff --git a/mono/metadata/sgen-descriptor.h b/mono/metadata/sgen-descriptor.h index f07ad4a6ba0..366c7667778 100644 --- a/mono/metadata/sgen-descriptor.h +++ b/mono/metadata/sgen-descriptor.h @@ -235,7 +235,7 @@ sgen_gc_descr_has_references (mword desc) /* there are pointers */ \ void **_objptr = (void**)(obj); \ gsize *bitmap_data = sgen_get_complex_descriptor ((desc)); \ - int bwords = (*bitmap_data) - 1; \ + gsize bwords = (*bitmap_data) - 1; \ void **start_run = _objptr; \ bitmap_data++; \ if (0) { \ @@ -261,8 +261,8 @@ sgen_gc_descr_has_references (mword desc) #define OBJ_COMPLEX_ARR_FOREACH_PTR(vt,obj) do { \ /* there are pointers */ \ gsize *mbitmap_data = sgen_get_complex_descriptor ((vt)->desc); \ - int mbwords = (*mbitmap_data++) - 1; \ - int el_size = mono_array_element_size (vt->klass); \ + gsize mbwords = (*mbitmap_data++) - 1; \ + gsize el_size = mono_array_element_size (vt->klass); \ char *e_start = (char*)(obj) + G_STRUCT_OFFSET (MonoArray, vector); \ char *e_end = e_start + el_size * mono_array_length_fast ((MonoArray*)(obj)); \ if (0) \ @@ -270,7 +270,7 @@ sgen_gc_descr_has_references (mword desc) while (e_start < e_end) { \ void **_objptr = (void**)e_start; \ gsize *bitmap_data = mbitmap_data; \ - unsigned int bwords = mbwords; \ + gsize bwords = mbwords; \ while (bwords-- > 0) { \ gsize _bmap = *bitmap_data++; \ void **start_run = _objptr; \ diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index dca117e602d..5274e84d431 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -1290,7 +1290,7 @@ precisely_scan_objects_from (void** start_root, void** end_root, char* n_start, return; case ROOT_DESC_COMPLEX: { gsize *bitmap_data = sgen_get_complex_descriptor_bitmap (desc); - int bwords = (*bitmap_data) - 1; + gsize bwords = (*bitmap_data) - 1; void **start_run = start_root; bitmap_data++; while (bwords-- > 0) { @@ -1478,7 +1478,7 @@ precisely_report_roots_from (GCRootReport *report, void** start_root, void** end return; case ROOT_DESC_COMPLEX: { gsize *bitmap_data = sgen_get_complex_descriptor_bitmap (desc); - int bwords = (*bitmap_data) - 1; + gsize bwords = (*bitmap_data) - 1; void **start_run = start_root; bitmap_data++; while (bwords-- > 0) { From 137d0578d24e66740fec8245fa0c6c3ee9cea676 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 4 Jun 2014 12:41:32 -0400 Subject: [PATCH 087/694] [sgen] Use size_t for all heap limits. --- mono/metadata/sgen-gc.h | 2 +- mono/metadata/sgen-marksweep.c | 8 ++++---- mono/metadata/sgen-memory-governor.c | 18 +++++++++--------- mono/metadata/sgen-memory-governor.h | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/mono/metadata/sgen-gc.h b/mono/metadata/sgen-gc.h index 49b6d08650b..9cd8e9e96b7 100644 --- a/mono/metadata/sgen-gc.h +++ b/mono/metadata/sgen-gc.h @@ -692,7 +692,7 @@ struct _SgenMajorCollector { gboolean (*ptr_is_in_non_pinned_space) (char *ptr, char **start); gboolean (*obj_is_from_pinned_alloc) (char *obj); void (*report_pinned_memory_usage) (void); - int (*get_num_major_sections) (void); + size_t (*get_num_major_sections) (void); gboolean (*handle_gc_param) (const char *opt); void (*print_gc_param_usage) (void); gboolean (*is_worker_thread) (MonoNativeThreadId thread); diff --git a/mono/metadata/sgen-marksweep.c b/mono/metadata/sgen-marksweep.c index d036c751822..fda177a07d4 100755 --- a/mono/metadata/sgen-marksweep.c +++ b/mono/metadata/sgen-marksweep.c @@ -217,7 +217,7 @@ static size_t num_empty_blocks = 0; #define FOREACH_BLOCK(bl) for ((bl) = all_blocks; (bl); (bl) = (bl)->next) { #define END_FOREACH_BLOCK } -static int num_major_sections = 0; +static size_t num_major_sections = 0; /* one free block list for each block object size */ static MSBlockInfo **free_block_lists [MS_BLOCK_TYPE_MAX]; @@ -833,7 +833,7 @@ static void* major_alloc_degraded (MonoVTable *vtable, size_t size) { void *obj; - int old_num_sections; + size_t old_num_sections; old_num_sections = num_major_sections; @@ -1831,7 +1831,7 @@ ms_calculate_block_obj_sizes (double factor, int *arr) } /* only valid during minor collections */ -static int old_num_major_sections; +static mword old_num_major_sections; static void major_start_nursery_collection (void) @@ -2107,7 +2107,7 @@ major_get_used_size (void) return size; } -static int +static size_t get_num_major_sections (void) { return num_major_sections; diff --git a/mono/metadata/sgen-memory-governor.c b/mono/metadata/sgen-memory-governor.c index 2081de4fc73..448ebef3f05 100644 --- a/mono/metadata/sgen-memory-governor.c +++ b/mono/metadata/sgen-memory-governor.c @@ -57,14 +57,14 @@ static gboolean debug_print_allowance = FALSE; /* use this to tune when to do a major/minor collection */ static mword memory_pressure = 0; static mword minor_collection_allowance; -static int minor_collection_sections_alloced = 0; +static mword minor_collection_sections_alloced = 0; -static int last_major_num_sections = 0; -static int last_los_memory_usage = 0; +static mword last_major_num_sections = 0; +static mword last_los_memory_usage = 0; static gboolean need_calculate_minor_collection_allowance; -static int last_collection_old_num_major_sections; +static mword last_collection_old_num_major_sections; static mword last_collection_los_memory_usage = 0; static mword last_collection_old_los_memory_usage; static mword last_collection_los_memory_alloced; @@ -85,7 +85,7 @@ double_to_mword_with_saturation (double value) static void sgen_memgov_try_calculate_minor_collection_allowance (gboolean overwrite) { - int num_major_sections, num_major_sections_saved; + size_t num_major_sections, num_major_sections_saved; mword los_memory_saved, new_major, new_heap_size, save_target, allowance_target; if (overwrite) @@ -210,7 +210,7 @@ static void log_timming (GGTimingInfo *info) { //unsigned long stw_time, unsigned long bridge_time, gboolean is_overflow - int num_major_sections = major_collector.get_num_major_sections (); + mword num_major_sections = major_collector.get_num_major_sections (); char full_timing_buff [1024]; full_timing_buff [0] = '\0'; @@ -248,7 +248,7 @@ sgen_memgov_collection_end (int generation, GGTimingInfo* info, int info_count) } void -sgen_register_major_sections_alloced (int num_sections) +sgen_register_major_sections_alloced (size_t num_sections) { minor_collection_sections_alloced += num_sections; } @@ -342,7 +342,7 @@ sgen_free_os_memory (void *addr, size_t size, SgenAllocFlags flags) g_assert (!(flags & ~SGEN_ALLOC_HEAP)); mono_vfree (addr, size); - SGEN_ATOMIC_ADD_P (total_alloc, -size); + SGEN_ATOMIC_ADD_P (total_alloc, -(gssize)size); if (flags & SGEN_ALLOC_HEAP) MONO_GC_HEAP_FREE ((mword)addr, size); } @@ -369,7 +369,7 @@ sgen_memgov_available_free_space (void) void sgen_memgov_release_space (mword size, int space) { - SGEN_ATOMIC_ADD_P (allocated_heap, -size); + SGEN_ATOMIC_ADD_P (allocated_heap, -(gssize)size); } gboolean diff --git a/mono/metadata/sgen-memory-governor.h b/mono/metadata/sgen-memory-governor.h index 497ecb05765..08b1e082f5d 100644 --- a/mono/metadata/sgen-memory-governor.h +++ b/mono/metadata/sgen-memory-governor.h @@ -39,7 +39,7 @@ void sgen_memgov_major_collection_end (void) MONO_INTERNAL; void sgen_memgov_collection_start (int generation) MONO_INTERNAL; void sgen_memgov_collection_end (int generation, GGTimingInfo* info, int info_count) MONO_INTERNAL; -void sgen_register_major_sections_alloced (int num_sections) MONO_INTERNAL; +void sgen_register_major_sections_alloced (mword num_sections) MONO_INTERNAL; mword sgen_get_minor_collection_allowance (void) MONO_INTERNAL; gboolean sgen_need_major_collection (mword space_needed) MONO_INTERNAL; From 429f9ca6db0b4da799336cb049ab0abd0d9cf8ab Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 4 Jun 2014 13:17:26 -0400 Subject: [PATCH 088/694] [sgen] Ensure the cardtable code is 64bits clean. --- mono/metadata/sgen-cardtable.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mono/metadata/sgen-cardtable.c b/mono/metadata/sgen-cardtable.c index 51f72fe87a4..131bdbee32a 100644 --- a/mono/metadata/sgen-cardtable.c +++ b/mono/metadata/sgen-cardtable.c @@ -238,7 +238,7 @@ sgen_card_table_get_card_data (guint8 *data_dest, mword address, mword cards) #endif } - return mask; + return mask != 0; } void* @@ -585,7 +585,7 @@ sgen_cardtable_scan_object (char *obj, mword block_obj_size, guint8 *cards, gboo mword obj_size = sgen_par_object_get_size (vt, (MonoObject*)obj); char *obj_end = obj + obj_size; size_t card_count; - int extra_idx = 0; + size_t extra_idx = 0; MonoArray *arr = (MonoArray*)obj; mword desc = (mword)klass->element_class->gc_descr; @@ -624,8 +624,8 @@ sgen_cardtable_scan_object (char *obj, mword block_obj_size, guint8 *cards, gboo card_data = find_next_card (card_data, card_data_end); for (; card_data < card_data_end; card_data = find_next_card (card_data + 1, card_data_end)) { - int index; - int idx = (card_data - card_base) + extra_idx; + size_t index; + size_t idx = (card_data - card_base) + extra_idx; char *start = (char*)(obj_start + idx * CARD_SIZE_IN_BYTES); char *card_end = start + CARD_SIZE_IN_BYTES; char *first_elem, *elem; From 222eea0a55eca72c3c1e38b109326af3a0dc2496 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 4 Jun 2014 13:21:58 -0400 Subject: [PATCH 089/694] [sgen] Fix the object size functions to be 64bits clean. --- mono/metadata/sgen-gc.c | 2 +- mono/metadata/sgen-gc.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index 5274e84d431..6ebe08ac129 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -1721,7 +1721,7 @@ sgen_check_section_scan_starts (GCMemSection *section) size_t i; for (i = 0; i < section->num_scan_start; ++i) { if (section->scan_starts [i]) { - guint size = safe_object_get_size ((MonoObject*) section->scan_starts [i]); + mword size = safe_object_get_size ((MonoObject*) section->scan_starts [i]); g_assert (size >= sizeof (MonoObject) && size <= MAX_SMALL_OBJ_SIZE); } } diff --git a/mono/metadata/sgen-gc.h b/mono/metadata/sgen-gc.h index 9cd8e9e96b7..5f77d2b638c 100644 --- a/mono/metadata/sgen-gc.h +++ b/mono/metadata/sgen-gc.h @@ -737,7 +737,7 @@ typedef struct { SgenRemeberedSet *sgen_get_remset (void) MONO_INTERNAL; -static guint /*__attribute__((noinline)) not sure if this hint is a good idea*/ +static mword /*__attribute__((noinline)) not sure if this hint is a good idea*/ slow_object_get_size (MonoVTable *vtable, MonoObject* o) { MonoClass *klass = vtable->klass; @@ -768,7 +768,7 @@ slow_object_get_size (MonoVTable *vtable, MonoObject* o) * vtable field, is not intact. This is necessary for the parallel * collector. */ -static inline guint +static inline mword sgen_par_object_get_size (MonoVTable *vtable, MonoObject* o) { mword descr = (mword)vtable->gc_descr; @@ -795,7 +795,7 @@ sgen_par_object_get_size (MonoVTable *vtable, MonoObject* o) return slow_object_get_size (vtable, o); } -static inline guint +static inline mword sgen_safe_object_get_size (MonoObject *obj) { char *forwarded; From 94784f434255bcdcdf5359a32ac20be8aba97e93 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 4 Jun 2014 13:24:24 -0400 Subject: [PATCH 090/694] [sgen] Fix nursery size calculation and the managed write barrier to be 64bits clean. --- mono/metadata/sgen-gc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index 6ebe08ac129..960aa0d9619 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -4768,7 +4768,7 @@ mono_gc_base_init (void) sgen_nursery_size = val; sgen_nursery_bits = 0; - while (1 << (++ sgen_nursery_bits) != sgen_nursery_size) + while (ONE_P << (++ sgen_nursery_bits) != sgen_nursery_size) ; #else sgen_nursery_size = val; @@ -5070,7 +5070,7 @@ emit_nursery_check (MonoMethodBuilder *mb, int *nursery_check_return_labels) mono_mb_emit_ldarg (mb, 0); mono_mb_emit_icon (mb, DEFAULT_NURSERY_BITS); mono_mb_emit_byte (mb, CEE_SHR_UN); - mono_mb_emit_icon (mb, (mword)sgen_get_nursery_start () >> DEFAULT_NURSERY_BITS); + mono_mb_emit_ptr (mb, (gpointer)((mword)sgen_get_nursery_start () >> DEFAULT_NURSERY_BITS)); nursery_check_return_labels [0] = mono_mb_emit_branch (mb, CEE_BEQ); if (!major_collector.is_concurrent) { @@ -5079,7 +5079,7 @@ emit_nursery_check (MonoMethodBuilder *mb, int *nursery_check_return_labels) mono_mb_emit_byte (mb, CEE_LDIND_I); mono_mb_emit_icon (mb, DEFAULT_NURSERY_BITS); mono_mb_emit_byte (mb, CEE_SHR_UN); - mono_mb_emit_icon (mb, (mword)sgen_get_nursery_start () >> DEFAULT_NURSERY_BITS); + mono_mb_emit_ptr (mb, (gpointer)((mword)sgen_get_nursery_start () >> DEFAULT_NURSERY_BITS)); nursery_check_return_labels [1] = mono_mb_emit_branch (mb, CEE_BNE_UN); } #else From c68e59600ef703da8103af245c438f33043d57e6 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 4 Jun 2014 13:24:44 -0400 Subject: [PATCH 091/694] [sgen] Fix a few warnings related to lossy conversion of size_t to int on 64bits. --- mono/metadata/sgen-alloc.c | 8 ++++---- mono/metadata/sgen-debug.c | 12 ++++++------ mono/metadata/sgen-new-bridge.c | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/mono/metadata/sgen-alloc.c b/mono/metadata/sgen-alloc.c index 71406de673f..7ac72db6df0 100644 --- a/mono/metadata/sgen-alloc.c +++ b/mono/metadata/sgen-alloc.c @@ -283,7 +283,7 @@ mono_gc_alloc_obj_nolock (MonoVTable *vtable, size_t size) if (degraded_mode && degraded_mode < DEFAULT_NURSERY_SIZE) return alloc_degraded (vtable, size, FALSE); - available_in_tlab = TLAB_REAL_END - TLAB_NEXT; + available_in_tlab = (int)(TLAB_REAL_END - TLAB_NEXT);//We'll never have tlabs > 2Gb if (size > tlab_size || available_in_tlab > SGEN_MAX_NURSERY_WASTE) { /* Allocate directly from the nursery */ do { @@ -396,7 +396,7 @@ mono_gc_try_alloc_obj_nolock (MonoVTable *vtable, size_t size) new_next = (char*)p + size; real_end = TLAB_REAL_END; - available_in_tlab = real_end - (char*)p; + available_in_tlab = (int)(real_end - (char*)p);//We'll never have tlabs > 2Gb if (G_LIKELY (new_next < real_end)) { TLAB_NEXT = new_next; @@ -997,7 +997,7 @@ create_allocator (int atype) /*The tlab store must be visible before the the vtable store. This could be replaced with a DDS but doing it with IL would be tricky. */ mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); - mono_mb_emit_op (mb, CEE_MONO_MEMORY_BARRIER, StoreStoreBarrier); + mono_mb_emit_op (mb, CEE_MONO_MEMORY_BARRIER, (gpointer)StoreStoreBarrier); /* *p = vtable; */ mono_mb_emit_ldloc (mb, p_var); @@ -1036,7 +1036,7 @@ create_allocator (int atype) We must make sure both vtable and max_length are globaly visible before returning to managed land. */ mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); - mono_mb_emit_op (mb, CEE_MONO_MEMORY_BARRIER, StoreStoreBarrier); + mono_mb_emit_op (mb, CEE_MONO_MEMORY_BARRIER, (gpointer)StoreStoreBarrier); /* return p */ mono_mb_emit_ldloc (mb, p_var); diff --git a/mono/metadata/sgen-debug.c b/mono/metadata/sgen-debug.c index e084b5ffee1..54245bb51cd 100644 --- a/mono/metadata/sgen-debug.c +++ b/mono/metadata/sgen-debug.c @@ -160,7 +160,7 @@ static gboolean missing_remsets; if (*(ptr) && sgen_ptr_in_nursery ((char*)*(ptr))) { \ if (!sgen_get_remset ()->find_address ((char*)(ptr)) && !sgen_cement_lookup (*(ptr))) { \ SGEN_LOG (0, "Oldspace->newspace reference %p at offset %td in object %p (%s.%s) not found in remsets.", *(ptr), (char*)(ptr) - (char*)(obj), (obj), ((MonoObject*)(obj))->vtable->klass->name_space, ((MonoObject*)(obj))->vtable->klass->name); \ - binary_protocol_missing_remset ((obj), (gpointer)LOAD_VTABLE ((obj)), (char*)(ptr) - (char*)(obj), *(ptr), (gpointer)LOAD_VTABLE(*(ptr)), object_is_pinned (*(ptr))); \ + binary_protocol_missing_remset ((obj), (gpointer)LOAD_VTABLE ((obj)), (int) ((char*)(ptr) - (char*)(obj)), *(ptr), (gpointer)LOAD_VTABLE(*(ptr)), object_is_pinned (*(ptr))); \ if (!object_is_pinned (*(ptr))) \ missing_remsets = TRUE; \ } \ @@ -220,7 +220,7 @@ is_major_or_los_object_marked (char *obj) if (*(ptr) && !sgen_ptr_in_nursery ((char*)*(ptr)) && !is_major_or_los_object_marked ((char*)*(ptr))) { \ if (!sgen_get_remset ()->find_address_with_cards (start, cards, (char*)(ptr))) { \ SGEN_LOG (0, "major->major reference %p at offset %td in object %p (%s.%s) not found in remsets.", *(ptr), (char*)(ptr) - (char*)(obj), (obj), ((MonoObject*)(obj))->vtable->klass->name_space, ((MonoObject*)(obj))->vtable->klass->name); \ - binary_protocol_missing_remset ((obj), (gpointer)LOAD_VTABLE ((obj)), (char*)(ptr) - (char*)(obj), *(ptr), (gpointer)LOAD_VTABLE(*(ptr)), object_is_pinned (*(ptr))); \ + binary_protocol_missing_remset ((obj), (gpointer)LOAD_VTABLE ((obj)), (int) ((char*)(ptr) - (char*)(obj)), *(ptr), (gpointer)LOAD_VTABLE(*(ptr)), object_is_pinned (*(ptr))); \ missing_remsets = TRUE; \ } \ } \ @@ -669,7 +669,7 @@ scan_roots_for_specific_ref (MonoObject *key, int root_type) return; case ROOT_DESC_COMPLEX: { gsize *bitmap_data = sgen_get_complex_descriptor_bitmap (desc); - int bwords = (*bitmap_data) - 1; + int bwords = (int) ((*bitmap_data) - 1); void **start_run = start_root; bitmap_data++; while (bwords-- > 0) { @@ -761,7 +761,7 @@ sgen_scan_for_registered_roots_in_domain (MonoDomain *domain, int root_type) break; case ROOT_DESC_COMPLEX: { gsize *bitmap_data = sgen_get_complex_descriptor_bitmap (desc); - int bwords = (*bitmap_data) - 1; + int bwords = (int)((*bitmap_data) - 1); void **start_run = start_root; bitmap_data++; while (bwords-- > 0) { @@ -797,7 +797,7 @@ is_xdomain_ref_allowed (gpointer *ptr, char *obj, MonoDomain *domain) { MonoObject *o = (MonoObject*)(obj); MonoObject *ref = (MonoObject*)*(ptr); - int offset = (char*)(ptr) - (char*)o; + size_t offset = (char*)(ptr) - (char*)o; if (o->vtable->klass == mono_defaults.thread_class && offset == G_STRUCT_OFFSET (MonoThread, internal_thread)) return TRUE; @@ -846,7 +846,7 @@ check_reference_for_xdomain (gpointer *ptr, char *obj, MonoDomain *domain) { MonoObject *o = (MonoObject*)(obj); MonoObject *ref = (MonoObject*)*(ptr); - int offset = (char*)(ptr) - (char*)o; + size_t offset = (char*)(ptr) - (char*)o; MonoClass *class; MonoClassField *field; char *str; diff --git a/mono/metadata/sgen-new-bridge.c b/mono/metadata/sgen-new-bridge.c index c322e649b75..2f3449751ee 100644 --- a/mono/metadata/sgen-new-bridge.c +++ b/mono/metadata/sgen-new-bridge.c @@ -881,7 +881,7 @@ dump_graph (void) MonoObject *obj; HashEntry *entry; - int prefix_len = strlen (dump_prefix); + size_t prefix_len = strlen (dump_prefix); char *filename = alloca(prefix_len + 64); FILE *file; int edge_id = 0; From 9c1bd5b6ee6639455241d1287a513017fe2b47cf Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 4 Jun 2014 14:30:29 -0400 Subject: [PATCH 092/694] [sgen] Fix clang compilation. --- mono/metadata/sgen-memory-governor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/metadata/sgen-memory-governor.h b/mono/metadata/sgen-memory-governor.h index 08b1e082f5d..fffe906f5bf 100644 --- a/mono/metadata/sgen-memory-governor.h +++ b/mono/metadata/sgen-memory-governor.h @@ -39,7 +39,7 @@ void sgen_memgov_major_collection_end (void) MONO_INTERNAL; void sgen_memgov_collection_start (int generation) MONO_INTERNAL; void sgen_memgov_collection_end (int generation, GGTimingInfo* info, int info_count) MONO_INTERNAL; -void sgen_register_major_sections_alloced (mword num_sections) MONO_INTERNAL; +void sgen_register_major_sections_alloced (size_t num_sections) MONO_INTERNAL; mword sgen_get_minor_collection_allowance (void) MONO_INTERNAL; gboolean sgen_need_major_collection (mword space_needed) MONO_INTERNAL; From 3f977bc61d75722dc4c02ef27793b589ad6ff716 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Wed, 4 Jun 2014 20:32:59 +0200 Subject: [PATCH 093/694] [runtime] Add another test for passing many small arguments. --- mono/mini/basic-calls.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mono/mini/basic-calls.cs b/mono/mini/basic-calls.cs index 41cb62405cb..bc3a617e181 100644 --- a/mono/mini/basic-calls.cs +++ b/mono/mini/basic-calls.cs @@ -129,12 +129,12 @@ public static int test_21_sparc_byte_argument_passing () { return pass_bytes (0, 1, 2, 3, 4, 5, 6); } - static int pass_sbytes (sbyte a, sbyte b, sbyte c, sbyte d, sbyte e, sbyte f, sbyte g) { - return (int)(a + b + c + d + e + f + g); + static int pass_sbytes (sbyte a, sbyte b, sbyte c, sbyte d, sbyte e, sbyte f, sbyte g, sbyte h1, sbyte h2, sbyte h3, sbyte h4) { + return (int)(a + b + c + d + e + f + g + h1 + h2 + h3 + h4); } - public static int test_21_sparc_sbyte_argument_passing () { - return pass_sbytes (0, 1, 2, 3, 4, 5, 6); + public static int test_55_sparc_sbyte_argument_passing () { + return pass_sbytes (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); } static int pass_shorts (short a, short b, short c, short d, short e, short f, short g) { From 956ec8a589b64184f28d8b36706e0158f0abbf59 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Wed, 4 Jun 2014 14:35:59 -0400 Subject: [PATCH 094/694] [sgen] Fix logging due to changes in a lot of size types. --- mono/metadata/sgen-gc.c | 12 ++++++------ mono/metadata/sgen-nursery-allocator.c | 2 +- mono/metadata/sgen-pinning.c | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index 960aa0d9619..cb02da7a807 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -2288,8 +2288,8 @@ collect_nursery (SgenGrayQueue *unpin_queue, gboolean finish_up_concurrent_mark) TV_GETTIME (atv); time_minor_pinning += TV_ELAPSED (btv, atv); - SGEN_LOG (2, "Finding pinned pointers: %d in %d usecs", sgen_get_pinned_count (), TV_ELAPSED (btv, atv)); - SGEN_LOG (4, "Start scan with %d pinned objects", sgen_get_pinned_count ()); + SGEN_LOG (2, "Finding pinned pointers: %zd in %d usecs", sgen_get_pinned_count (), TV_ELAPSED (btv, atv)); + SGEN_LOG (4, "Start scan with %zd pinned objects", sgen_get_pinned_count ()); MONO_GC_CHECKPOINT_3 (GENERATION_NURSERY); @@ -2662,8 +2662,8 @@ major_copy_or_mark_from_roots (size_t *old_next_pin_slot, gboolean finish_up_con TV_GETTIME (btv); time_major_pinning += TV_ELAPSED (atv, btv); - SGEN_LOG (2, "Finding pinned pointers: %d in %d usecs", sgen_get_pinned_count (), TV_ELAPSED (atv, btv)); - SGEN_LOG (4, "Start scan with %d pinned objects", sgen_get_pinned_count ()); + SGEN_LOG (2, "Finding pinned pointers: %zd in %d usecs", sgen_get_pinned_count (), TV_ELAPSED (atv, btv)); + SGEN_LOG (4, "Start scan with %zd pinned objects", sgen_get_pinned_count ()); major_collector.init_to_space (); @@ -3226,7 +3226,7 @@ sgen_perform_collection (size_t requested_size, int generation_to_collect, const /* this also sets the proper pointers for the next allocation */ if (generation_to_collect == GENERATION_NURSERY && !sgen_can_alloc_size (requested_size)) { /* TypeBuilder and MonoMethod are killing mcs with fragmentation */ - SGEN_LOG (1, "nursery collection didn't find enough room for %zd alloc (%d pinned)", requested_size, sgen_get_pinned_count ()); + SGEN_LOG (1, "nursery collection didn't find enough room for %zd alloc (%zd pinned)", requested_size, sgen_get_pinned_count ()); sgen_dump_pin_queue (); degraded_mode = 1; } @@ -3746,7 +3746,7 @@ scan_thread_data (void *start_nursery, void *end_nursery, gboolean precise, Gray SGEN_LOG (3, "Skipping non-running thread %p, range: %p-%p, size: %td (state %d)", info, info->stack_start, info->stack_end, (char*)info->stack_end - (char*)info->stack_start, mono_thread_info_run_state (info)); continue; } - SGEN_LOG (3, "Scanning thread %p, range: %p-%p, size: %td, pinned=%d", info, info->stack_start, info->stack_end, (char*)info->stack_end - (char*)info->stack_start, sgen_get_pinned_count ()); + 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); diff --git a/mono/metadata/sgen-nursery-allocator.c b/mono/metadata/sgen-nursery-allocator.c index 21ac7f6d44e..af33a097686 100644 --- a/mono/metadata/sgen-nursery-allocator.c +++ b/mono/metadata/sgen-nursery-allocator.c @@ -827,7 +827,7 @@ sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_ sgen_minor_collector.build_fragments_finish (&mutator_allocator); if (!unmask (mutator_allocator.alloc_head)) { - SGEN_LOG (1, "Nursery fully pinned (%d)", num_entries); + SGEN_LOG (1, "Nursery fully pinned (%zd)", num_entries); for (i = 0; i < num_entries; ++i) { SGEN_LOG (3, "Bastard pinning obj %p (%s), size: %d", start [i], sgen_safe_name (start [i]), sgen_safe_object_get_size (start [i])); } diff --git a/mono/metadata/sgen-pinning.c b/mono/metadata/sgen-pinning.c index 4f07518e35a..85ee6e9f400 100644 --- a/mono/metadata/sgen-pinning.c +++ b/mono/metadata/sgen-pinning.c @@ -56,7 +56,7 @@ realloc_pin_queue (void) sgen_free_internal_dynamic (pin_queue, sizeof (void*) * pin_queue_size, INTERNAL_MEM_PIN_QUEUE); pin_queue = new_pin; pin_queue_size = new_size; - SGEN_LOG (4, "Reallocated pin queue to size: %d", new_size); + SGEN_LOG (4, "Reallocated pin queue to size: %zd", new_size); } void @@ -107,7 +107,7 @@ sgen_find_section_pin_queue_start_end (GCMemSection *section) { SGEN_LOG (6, "Pinning from section %p (%p-%p)", section, section->data, section->end_data); section->pin_queue_start = sgen_find_optimized_pin_queue_area (section->data, section->end_data, §ion->pin_queue_num_entries); - SGEN_LOG (6, "Found %d pinning addresses in section %p", section->pin_queue_num_entries, section); + SGEN_LOG (6, "Found %zd pinning addresses in section %p", section->pin_queue_num_entries, section); } /*This will setup the given section for the while pin queue. */ @@ -149,7 +149,7 @@ sgen_optimize_pin_queue (size_t start_slot) void **start, **cur, **end; /* sort and uniq pin_queue: we just sort and we let the rest discard multiple values */ /* it may be better to keep ranges of pinned memory instead of individually pinning objects */ - SGEN_LOG (5, "Sorting pin queue, size: %d", next_pin_slot); + SGEN_LOG (5, "Sorting pin queue, size: %zd", next_pin_slot); if ((next_pin_slot - start_slot) > 1) sgen_sort_addresses (pin_queue + start_slot, next_pin_slot - start_slot); start = cur = pin_queue + start_slot; @@ -161,7 +161,7 @@ sgen_optimize_pin_queue (size_t start_slot) start++; }; next_pin_slot = start - pin_queue; - SGEN_LOG (5, "Pin queue reduced to size: %d", next_pin_slot); + SGEN_LOG (5, "Pin queue reduced to size: %zd", next_pin_slot); } size_t @@ -176,7 +176,7 @@ sgen_dump_pin_queue (void) int i; for (i = 0; i < last_num_pinned; ++i) { - SGEN_LOG (3, "Bastard pinning obj %p (%s), size: %d", pin_queue [i], sgen_safe_name (pin_queue [i]), sgen_safe_object_get_size (pin_queue [i])); + SGEN_LOG (3, "Bastard pinning obj %p (%s), size: %zd", pin_queue [i], sgen_safe_name (pin_queue [i]), sgen_safe_object_get_size (pin_queue [i])); } } From 7d93575e587aa2bfa0d57a3b448a8c5716d9e0b2 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Wed, 4 Jun 2014 19:37:17 +0100 Subject: [PATCH 095/694] Added g_unreachable to explicitly notify the compiler of unreachable code. --- eglib/src/glib.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/eglib/src/glib.h b/eglib/src/glib.h index 6d6dadff448..363a33dfe7d 100644 --- a/eglib/src/glib.h +++ b/eglib/src/glib.h @@ -727,6 +727,14 @@ GUnicodeBreakType g_unichar_break_type (gunichar c); #define G_UNLIKELY(x) (x) #endif +#if defined(_MSC_VER) +#define eg_unreachable() __assume(0) +#elif defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && (__GNUC_MINOR__ >= 5))) +#define eg_unreachable() __builtin_unreachable() +#else +#define eg_unreachable() +#endif + #define g_assert(x) G_STMT_START { if (G_UNLIKELY (!(x))) g_assertion_message ("* Assertion at %s:%d, condition `%s' not met\n", __FILE__, __LINE__, #x); } G_STMT_END #define g_assert_not_reached() G_STMT_START { g_assertion_message ("* Assertion: should not be reached at %s:%d\n", __FILE__, __LINE__); } G_STMT_END From facf8c8ad9b64ac889e538bd722b08e8c3163c5e Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Wed, 4 Jun 2014 19:38:13 +0100 Subject: [PATCH 096/694] Modified g_assert_not_reached to use g_unreachable. --- eglib/src/glib.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eglib/src/glib.h b/eglib/src/glib.h index 363a33dfe7d..cf54676312d 100644 --- a/eglib/src/glib.h +++ b/eglib/src/glib.h @@ -736,7 +736,7 @@ GUnicodeBreakType g_unichar_break_type (gunichar c); #endif #define g_assert(x) G_STMT_START { if (G_UNLIKELY (!(x))) g_assertion_message ("* Assertion at %s:%d, condition `%s' not met\n", __FILE__, __LINE__, #x); } G_STMT_END -#define g_assert_not_reached() G_STMT_START { g_assertion_message ("* Assertion: should not be reached at %s:%d\n", __FILE__, __LINE__); } G_STMT_END +#define g_assert_not_reached() G_STMT_START { g_assertion_message ("* Assertion: should not be reached at %s:%d\n", __FILE__, __LINE__); eg_unreachable(); } G_STMT_END /* * Unicode conversion From a2c3c36768846236bc78bf857458701f317399ec Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Wed, 4 Jun 2014 19:39:38 +0100 Subject: [PATCH 097/694] Fixed unreachable methods in mono-thread-windows to use g_assert_not_reached. This fixes a couple warnings. --- mono/utils/mono-threads-windows.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mono/utils/mono-threads-windows.c b/mono/utils/mono-threads-windows.c index 2da72f92a94..2ab2e6596e5 100644 --- a/mono/utils/mono-threads-windows.c +++ b/mono/utils/mono-threads-windows.c @@ -40,19 +40,19 @@ mono_threads_core_needs_abort_syscall (void) void mono_threads_core_self_suspend (MonoThreadInfo *info) { - g_assert (0); + g_assert_not_reached (); } gboolean mono_threads_core_suspend (MonoThreadInfo *info) { - g_assert (0); + g_assert_not_reached (); } gboolean mono_threads_core_resume (MonoThreadInfo *info) { - g_assert (0); + g_assert_not_reached (); } void From 9932336e7b298c2b411aa9ac0d9ab28cc0d049bd Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Thu, 5 Jun 2014 01:56:12 +0200 Subject: [PATCH 098/694] [jit] Avoid licm for volatile variables, ssa ignores them so we can't detect whenever they are loop invariant by looking at phi nodes. --- mono/mini/ssa.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mono/mini/ssa.c b/mono/mini/ssa.c index 023d2778009..801826b96e8 100644 --- a/mono/mini/ssa.c +++ b/mono/mini/ssa.c @@ -1424,7 +1424,7 @@ mono_ssa_loop_invariant_code_motion (MonoCompile *cfg) else sreg = -1; if (sreg != -1) { - MonoInst *tins; + MonoInst *tins, *var; skip = FALSE; for (tins = ins->prev; tins; tins = tins->prev) { @@ -1439,6 +1439,9 @@ mono_ssa_loop_invariant_code_motion (MonoCompile *cfg) } if (skip) continue; + var = get_vreg_to_inst (cfg, sreg); + if (var && (var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT))) + continue; ins->sreg1 = sreg; } From 5ed465d94bc52d23de9bba5e71dc30a077745337 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Wed, 4 Jun 2014 18:41:03 +0900 Subject: [PATCH 099/694] [MS.Build] metadata is also replaced its windows path separators. --- .../Microsoft.Build.Internal/BuildEngine4.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs index 1f501683ce2..4dc8b32c94d 100644 --- a/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs +++ b/mcs/class/Microsoft.Build/Microsoft.Build.Internal/BuildEngine4.cs @@ -135,8 +135,10 @@ void BuildProject (InternalBuildArguments args) if (request.TargetNames == null) args.Result.OverallResult = args.CheckCancel () ? BuildResultCode.Failure : args.Result.ResultsByTarget.Any (p => p.Value.ResultCode == TargetResultCode.Failure) ? BuildResultCode.Failure : BuildResultCode.Success; else { - foreach (var targetName in (args.TargetNames ?? request.TargetNames).Where (t => t != null)) - BuildTargetByName (targetName, args); + foreach (var targetName in (args.TargetNames ?? request.TargetNames).Where (t => t != null)) { + if (!BuildTargetByName (targetName, args)) + break; + } // FIXME: check .NET behavior, whether cancellation always results in failure. args.Result.OverallResult = args.CheckCancel () ? BuildResultCode.Failure : args.Result.ResultsByTarget.Any (p => p.Value.ResultCode == TargetResultCode.Failure) ? BuildResultCode.Failure : BuildResultCode.Success; @@ -466,7 +468,7 @@ public string GetMetadataValueEscaped (string metadataName) } public void SetMetadataValueLiteral (string metadataName, string metadataValue) { - metadata [metadataName] = ProjectCollection.Unescape (metadataValue); + metadata [metadataName] = WindowsCompatibilityExtensions.NormalizeFilePath (ProjectCollection.Unescape (metadataValue)); } public IDictionary CloneCustomMetadataEscaped () { @@ -504,7 +506,7 @@ public void RemoveMetadata (string metadataName) } public void SetMetadata (string metadataName, string metadataValue) { - metadata [metadataName] = metadataValue; + metadata [metadataName] = WindowsCompatibilityExtensions.NormalizeFilePath (metadataValue); } public string ItemSpec { get; set; } public int MetadataCount { From 939fa58ae9040ef74b0986b1ea04f2cd064e432e Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Thu, 5 Jun 2014 13:01:00 +0900 Subject: [PATCH 100/694] [MS.Build] disable failing test. It somehow passes on my dev. environment so I cannot reproduce... --- .../Test/Microsoft.Build.Execution/ProjectInstanceTest.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs b/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs index 6ee4cfe24c6..30524ffd278 100644 --- a/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs +++ b/mcs/class/Microsoft.Build/Test/Microsoft.Build.Execution/ProjectInstanceTest.cs @@ -311,6 +311,7 @@ public void ConditionalExpression () } [Test] + [Category ("NotWorking")] // until we figure out why it fails on wrench. public void ItemsInTargets () { string project_xml = @" From 76b08f12ef69c180733a0cad99ea89b2a225ec51 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Thu, 5 Jun 2014 13:02:50 +0900 Subject: [PATCH 101/694] [msbuild] fix some weird local result variable initialization issue. I cannot explain why, but this affects building solution that has more than one projects for MS.Build.dll. task returns false for successful builds without this change. Most likely codegen or runtime issue, but a bit too high level to drill down. --- mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/MSBuild.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/MSBuild.cs b/mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/MSBuild.cs index 4200cca1daf..690b5decbbb 100644 --- a/mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/MSBuild.cs +++ b/mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/MSBuild.cs @@ -104,6 +104,7 @@ public override bool Execute () result = false; } + all_result = true; if (!result) all_result = false; From 5e43e5d6dbdc61c173e05e9ce89f141e795c9f1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Hu=CC=88ning?= Date: Thu, 5 Jun 2014 14:09:11 +0200 Subject: [PATCH 102/694] - ADDED: Support to read out Interface flags on OS X - ADDED: Implemented NetworkInterface property "OperationalStatus" to be UP, in case the IFF_UP flag is set - ADDED: Implemented NetworkInterface property "SupportsMulticast" to be true, in case the IFF_MULTICAST flag is set This change is released under the MIT license. --- .../MacOsNetworkInterfaceMarshal.cs | 19 +++++++++++++++++++ .../NetworkInterface.cs | 19 ++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/mcs/class/System/System.Net.NetworkInformation/MacOsNetworkInterfaceMarshal.cs b/mcs/class/System/System.Net.NetworkInformation/MacOsNetworkInterfaceMarshal.cs index 940a993f7c7..840fc531030 100644 --- a/mcs/class/System/System.Net.NetworkInformation/MacOsNetworkInterfaceMarshal.cs +++ b/mcs/class/System/System.Net.NetworkInformation/MacOsNetworkInterfaceMarshal.cs @@ -79,4 +79,23 @@ internal enum MacOsArpHardware { LOOPBACK = 0x18, FDDI = 0xf } + + internal enum MacOsInterfaceFlags { + IFF_UP = 0x1, /* interface is up */ + IFF_BROADCAST = 0x2, /* broadcast address valid */ + IFF_DEBUG = 0x4, /* turn on debugging */ + IFF_LOOPBACK = 0x8, /* is a loopback net */ + IFF_POINTOPOINT = 0x10, /* interface is point-to-point link */ + IFF_NOTRAILERS = 0x20, /* avoid use of trailers */ + IFF_RUNNING = 0x40, /* resources allocated */ + IFF_NOARP = 0x80, /* no address resolution protocol */ + IFF_PROMISC = 0x100, /* receive all packets */ + IFF_ALLMULTI = 0x200, /* receive all multicast packets */ + IFF_OACTIVE = 0x400, /* transmission in progress */ + IFF_SIMPLEX = 0x800, /* can't hear own transmissions */ + IFF_LINK0 = 0x1000, /* per link layer defined bit */ + IFF_LINK1 = 0x2000, /* per link layer defined bit */ + IFF_LINK2 = 0x4000, /* per link layer defined bit */ + IFF_MULTICAST = 0x8000 /* supports multicast */ + } } diff --git a/mcs/class/System/System.Net.NetworkInformation/NetworkInterface.cs b/mcs/class/System/System.Net.NetworkInformation/NetworkInterface.cs index 4ad2720909f..18b3b471642 100644 --- a/mcs/class/System/System.Net.NetworkInformation/NetworkInterface.cs +++ b/mcs/class/System/System.Net.NetworkInformation/NetworkInterface.cs @@ -446,6 +446,8 @@ class MacOsNetworkInterface : UnixNetworkInterface const int AF_INET = 2; const int AF_INET6 = 30; const int AF_LINK = 18; + + private uint _ifa_flags; public static NetworkInterface [] ImplGetAllNetworkInterfaces () { @@ -465,6 +467,7 @@ public static NetworkInterface [] ImplGetAllNetworkInterfaces () NetworkInterfaceType type = NetworkInterfaceType.Unknown; if (addr.ifa_addr != IntPtr.Zero) { + // optain IPAddress MacOsStructs.sockaddr sockaddr = (MacOsStructs.sockaddr) Marshal.PtrToStructure (addr.ifa_addr, typeof (MacOsStructs.sockaddr)); if (sockaddr.sa_family == AF_INET6) { @@ -478,7 +481,10 @@ public static NetworkInterface [] ImplGetAllNetworkInterfaces () sockaddrdl.Read (addr.ifa_addr); macAddress = new byte [(int) sockaddrdl.sdl_alen]; + // copy mac address from sdl_data field starting at last index pos of interface name into array macaddress, starting + // at index 0 Array.Copy (sockaddrdl.sdl_data, sockaddrdl.sdl_nlen, macAddress, 0, Math.Min (macAddress.Length, sockaddrdl.sdl_data.Length - sockaddrdl.sdl_nlen)); + index = sockaddrdl.sdl_index; int hwtype = (int) sockaddrdl.sdl_type; @@ -515,14 +521,17 @@ public static NetworkInterface [] ImplGetAllNetworkInterfaces () MacOsNetworkInterface iface = null; + // create interface if not already present if (!interfaces.TryGetValue (name, out iface)) { - iface = new MacOsNetworkInterface (name); + iface = new MacOsNetworkInterface (name, addr.ifa_flags); interfaces.Add (name, iface); } + // if a new address has been found, add it if (!address.Equals (IPAddress.None)) iface.AddAddress (address); + // set link layer info, if iface has macaddress or is loopback device if (macAddress != null || type == NetworkInterfaceType.Loopback) iface.SetLinkLayerInfo (index, macAddress, type); @@ -541,9 +550,10 @@ public static NetworkInterface [] ImplGetAllNetworkInterfaces () return result; } - MacOsNetworkInterface (string name) + MacOsNetworkInterface (string name, uint ifa_flags) : base (name) { + _ifa_flags = ifa_flags; } public override IPInterfaceProperties GetIPProperties () @@ -562,13 +572,16 @@ public override IPv4InterfaceStatistics GetIPv4Statistics () public override OperationalStatus OperationalStatus { get { + if(((MacOsInterfaceFlags)_ifa_flags & MacOsInterfaceFlags.IFF_UP) == MacOsInterfaceFlags.IFF_UP){ + return OperationalStatus.Up; + } return OperationalStatus.Unknown; } } public override bool SupportsMulticast { get { - return false; + return ((MacOsInterfaceFlags)_ifa_flags & MacOsInterfaceFlags.IFF_MULTICAST) == MacOsInterfaceFlags.IFF_MULTICAST; } } } From 770c5536e9c92369328ccc21654ee5d6a120fa9f Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:09:01 +0100 Subject: [PATCH 103/694] Fixed warning in MSVC by prefixing the macros, MEM_FREE is already defined in winnt.h. --- mono/metadata/verify.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/mono/metadata/verify.c b/mono/metadata/verify.c index 64111ea7c11..b23a830dbcb 100644 --- a/mono/metadata/verify.c +++ b/mono/metadata/verify.c @@ -306,8 +306,8 @@ enum { #ifdef ENABLE_VERIFIER_STATS -#define MEM_ALLOC(amt) do { allocated_memory += (amt); working_set += (amt); } while (0) -#define MEM_FREE(amt) do { working_set -= (amt); } while (0) +#define _MEM_ALLOC(amt) do { allocated_memory += (amt); working_set += (amt); } while (0) +#define _MEM_FREE(amt) do { working_set -= (amt); } while (0) static int allocated_memory; static int working_set; @@ -338,8 +338,8 @@ init_verifier_stats (void) #else -#define MEM_ALLOC(amt) do {} while (0) -#define MEM_FREE(amt) do { } while (0) +#define _MEM_ALLOC(amt) do {} while (0) +#define _MEM_FREE(amt) do { } while (0) #define finish_collect_stats() #define init_verifier_stats() @@ -378,7 +378,7 @@ static MonoType * mono_type_create_fnptr_from_mono_method (VerifyContext *ctx, MonoMethod *method) { MonoType *res = g_new0 (MonoType, 1); - MEM_ALLOC (sizeof (MonoType)); + _MEM_ALLOC (sizeof (MonoType)); //FIXME use mono_method_get_signature_full res->data.method = mono_method_signature (method); @@ -1500,13 +1500,13 @@ ensure_stack_size (ILCodeDesc *stack, int required) g_assert (new_size >= required); tmp = g_new0 (ILStackDesc, new_size); - MEM_ALLOC (sizeof (ILStackDesc) * new_size); + _MEM_ALLOC (sizeof (ILStackDesc) * new_size); if (stack->stack) { if (stack->size) memcpy (tmp, stack->stack, stack->size * sizeof (ILStackDesc)); g_free (stack->stack); - MEM_FREE (sizeof (ILStackDesc) * stack->max_size); + _MEM_FREE (sizeof (ILStackDesc) * stack->max_size); } stack->stack = tmp; @@ -4851,19 +4851,19 @@ mono_method_verify (MonoMethod *method, int level) ctx.code = g_new (ILCodeDesc, ctx.header->code_size); ctx.code_size = ctx.header->code_size; - MEM_ALLOC (sizeof (ILCodeDesc) * ctx.header->code_size); + _MEM_ALLOC (sizeof (ILCodeDesc) * ctx.header->code_size); memset(ctx.code, 0, sizeof (ILCodeDesc) * ctx.header->code_size); ctx.num_locals = ctx.header->num_locals; ctx.locals = g_memdup (ctx.header->locals, sizeof (MonoType*) * ctx.header->num_locals); - MEM_ALLOC (sizeof (MonoType*) * ctx.header->num_locals); + _MEM_ALLOC (sizeof (MonoType*) * ctx.header->num_locals); if (ctx.num_locals > 0 && !ctx.header->init_locals) CODE_NOT_VERIFIABLE (&ctx, g_strdup_printf ("Method with locals variable but without init locals set")); ctx.params = g_new (MonoType*, ctx.max_args); - MEM_ALLOC (sizeof (MonoType*) * ctx.max_args); + _MEM_ALLOC (sizeof (MonoType*) * ctx.max_args); if (ctx.signature->hasthis) ctx.params [0] = method->klass->valuetype ? &method->klass->this_arg : &method->klass->byval_arg; From fd0659abd42f5bcda397409cc17c239702cd2c08 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:12:12 +0100 Subject: [PATCH 104/694] Fixed unsigned/signed mismatch warning. --- mono/mini/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/mini/main.c b/mono/mini/main.c index 84c6f39c060..784179c6441 100644 --- a/mono/mini/main.c +++ b/mono/mini/main.c @@ -19,7 +19,7 @@ mono_main_with_options (int argc, char *argv []) GPtrArray *array = g_ptr_array_new (); GString *buffer = g_string_new (""); const char *p; - int i; + unsigned i; gboolean in_quotes = FALSE; char quote_char = '\0'; From d8164bb3fc0a06ad898d425cf22ffa556cd8affe Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:15:01 +0100 Subject: [PATCH 105/694] Fixed unreferenced variables/label warnings in MSVC. --- mono/metadata/coree.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mono/metadata/coree.c b/mono/metadata/coree.c index 9e48a3fe077..5b7badcf66c 100644 --- a/mono/metadata/coree.c +++ b/mono/metadata/coree.c @@ -226,10 +226,12 @@ STDAPI _CorValidateImage(PVOID *ImageBase, LPCWSTR FileName) { IMAGE_DOS_HEADER* DosHeader; IMAGE_NT_HEADERS32* NtHeaders32; - IMAGE_NT_HEADERS64* NtHeaders64; IMAGE_DATA_DIRECTORY* CliHeaderDir; +#ifdef _WIN64 + IMAGE_NT_HEADERS64* NtHeaders64; MonoCLIHeader* CliHeader; DWORD SizeOfHeaders; +#endif DWORD* Address; DWORD OldProtect; @@ -410,7 +412,9 @@ HMODULE WINAPI MonoLoadImage(LPCWSTR FileName) HANDLE MapHandle; IMAGE_DOS_HEADER* DosHeader; IMAGE_NT_HEADERS32* NtHeaders32; +#ifdef _WIN64 IMAGE_NT_HEADERS64* NtHeaders64; +#endif HMODULE ModuleHandle; FileHandle = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); @@ -458,7 +462,9 @@ HMODULE WINAPI MonoLoadImage(LPCWSTR FileName) goto UnmapView; } +#ifdef _WIN64 ValidImage: +#endif UnmapViewOfFile(DosHeader); CloseHandle(MapHandle); From 08ac4efcf1efd1b8913b2a4838ce1e71d80e4690 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:18:14 +0100 Subject: [PATCH 106/694] Fixed MSVC warning about different types for formal and actual parameter. --- mono/metadata/threads.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mono/metadata/threads.c b/mono/metadata/threads.c index c85082d033e..11e6fd5be9d 100755 --- a/mono/metadata/threads.c +++ b/mono/metadata/threads.c @@ -1998,7 +1998,7 @@ static void signal_thread_state_change (MonoInternalThread *thread) } #ifdef HOST_WIN32 - QueueUserAPC ((PAPCFUNC)interruption_request_apc, thread->handle, NULL); + QueueUserAPC ((PAPCFUNC)interruption_request_apc, thread->handle, (ULONG_PTR)NULL); #else /* * This will cause waits to be broken. @@ -4180,7 +4180,7 @@ mono_thread_request_interruption (gboolean running_managed) or similar */ /* Our implementation of this function ignores the func argument */ #ifdef HOST_WIN32 - QueueUserAPC ((PAPCFUNC)dummy_apc, thread->handle, NULL); + QueueUserAPC ((PAPCFUNC)dummy_apc, thread->handle, (ULONG_PTR)NULL); #else wapi_self_interrupt (); #endif From c4dfe62e05c6929c30c9f3ed25955ed1575a6439 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:21:05 +0100 Subject: [PATCH 107/694] Fixed MSVC warning about unreferenced local variable. --- mono/metadata/threads.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mono/metadata/threads.c b/mono/metadata/threads.c index 11e6fd5be9d..a2fc6e4517f 100755 --- a/mono/metadata/threads.c +++ b/mono/metadata/threads.c @@ -4635,7 +4635,9 @@ suspend_thread_internal (MonoInternalThread *thread, gboolean interrupt) if (running_managed && !protected_wrapper) { transition_to_suspended (thread, info); } else { +#ifndef HOST_WIN32 gpointer interrupt_handle; +#endif if (InterlockedCompareExchange (&thread->interruption_requested, 1, 0) == 0) InterlockedIncrement (&thread_interruption_requested); From 4d4332ce91524f47e199e52528adc51c87aba1c7 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:25:13 +0100 Subject: [PATCH 108/694] Fixed unreferenced local variable warning in MSVC. --- mono/mini/mini-gc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mono/mini/mini-gc.c b/mono/mini/mini-gc.c index 5589d99eabb..4934f49beaa 100644 --- a/mono/mini/mini-gc.c +++ b/mono/mini/mini-gc.c @@ -598,7 +598,9 @@ thread_suspend_func (gpointer user_data, void *sigctx, MonoContext *ctx) if (tls->tid != GetCurrentThreadId ()) { /* Happens on osx because threads are not suspended using signals */ +#ifndef TARGET_WIN32 gboolean res; +#endif g_assert (tls->info); #ifdef TARGET_WIN32 From 8c940e64590d7c412e78dbf9cdc2471743819a4d Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:27:45 +0100 Subject: [PATCH 109/694] Fixed warning in MSVC: 'getpid' undefined; assuming extern returning int. --- mono/mini/debugger-agent.c | 1 + 1 file changed, 1 insertion(+) diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c index 4f7872d1a40..0466018419a 100644 --- a/mono/mini/debugger-agent.c +++ b/mono/mini/debugger-agent.c @@ -47,6 +47,7 @@ #ifdef HOST_WIN32 #ifdef _MSC_VER #include +#include #endif #include #ifdef __GNUC__ From f7cc6db9c3a4c12b0c45a3e5b8f6908200a981da Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:28:33 +0100 Subject: [PATCH 110/694] Fixed warning in MSVC: 'different types for formal and actual parameter'. --- mono/mini/debugger-agent.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c index 0466018419a..2ed2dc94cb2 100644 --- a/mono/mini/debugger-agent.c +++ b/mono/mini/debugger-agent.c @@ -2737,7 +2737,7 @@ notify_thread (gpointer key, gpointer value, gpointer user_data) /* This is _not_ equivalent to ves_icall_System_Threading_Thread_Abort () */ #ifdef HOST_WIN32 - QueueUserAPC (notify_thread_apc, thread->handle, NULL); + QueueUserAPC (notify_thread_apc, thread->handle, (ULONG_PTR)NULL); #else if (mono_thread_info_new_interrupt_enabled ()) { MonoThreadInfo *info; From 47324cca658627e8c51b13319483b8679bb0f9a1 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:29:55 +0100 Subject: [PATCH 111/694] Fixed warning in MSVC: 'unreferenced local variable'. --- mono/mini/debugger-agent.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c index 2ed2dc94cb2..d9032db69a6 100644 --- a/mono/mini/debugger-agent.c +++ b/mono/mini/debugger-agent.c @@ -2710,7 +2710,9 @@ notify_thread (gpointer key, gpointer value, gpointer user_data) MonoInternalThread *thread = key; DebuggerTlsData *tls = value; gsize tid = thread->tid; +#ifndef HOST_WIN32 int res; +#endif if (GetCurrentThreadId () == tid || tls->terminated) return; @@ -2959,7 +2961,9 @@ invalidate_frames (DebuggerTlsData *tls) static void suspend_current (void) { +#ifndef HOST_WIN32 int err; +#endif DebuggerTlsData *tls; g_assert (debugger_thread_id != GetCurrentThreadId ()); From cfea841bb401f5957e4d9b76cb64b3997a2cb1bd Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:31:28 +0100 Subject: [PATCH 112/694] Fixed warning in MSVC: 'unreferenced local variable'. --- mono/mini/mini-exceptions.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mono/mini/mini-exceptions.c b/mono/mini/mini-exceptions.c index 221082759f7..17762008fbe 100644 --- a/mono/mini/mini-exceptions.c +++ b/mono/mini/mini-exceptions.c @@ -2352,7 +2352,10 @@ mono_print_thread_dump_internal (void *sigctx, MonoContext *start_ctx) MonoContext ctx; #endif GString* text = g_string_new (0); - char *name, *wapi_desc; + char *name; +#ifndef HOST_WIN32 + char *wapi_desc; +#endif GError *error = NULL; if (thread->name) { From 0338bfae3f7decb6e9fcf7754ed87036aa855722 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:34:00 +0100 Subject: [PATCH 113/694] Removed an unused variable from the code, fixes a warning in MSVC. --- mono/mini/driver.c | 1 - 1 file changed, 1 deletion(-) diff --git a/mono/mini/driver.c b/mono/mini/driver.c index 5855b81ca97..daca0dcf38d 100644 --- a/mono/mini/driver.c +++ b/mono/mini/driver.c @@ -1308,7 +1308,6 @@ static const char info[] = #ifdef HOST_WIN32 BOOL APIENTRY DllMain (HMODULE module_handle, DWORD reason, LPVOID reserved) { - int dummy; if (!mono_gc_dllmain (module_handle, reason, reserved)) return FALSE; From 12926a22ac2e7f6f028fc748d5c4855749321dda Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:35:39 +0100 Subject: [PATCH 114/694] Fixed warnings in MSVC: 'unreferenced local variable'. --- mono/mini/aot-compiler.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mono/mini/aot-compiler.c b/mono/mini/aot-compiler.c index 59569b46563..660d9da1e04 100644 --- a/mono/mini/aot-compiler.c +++ b/mono/mini/aot-compiler.c @@ -7259,9 +7259,9 @@ emit_code (MonoAotCompile *acfg) fprintf (acfg->fp, " .no_dead_strip %s\n", symbol); for (i = 0; i < acfg->nmethods; ++i) { +#ifdef MONO_ARCH_AOT_SUPPORTED int call_size; -#ifdef MONO_ARCH_AOT_SUPPORTED if (acfg->cfgs [i]) arch_emit_direct_call (acfg, acfg->cfgs [i]->asm_symbol, FALSE, acfg->thumb_mixed && acfg->cfgs [i]->compile_llvm, NULL, &call_size); else @@ -7318,7 +7318,9 @@ emit_code (MonoAotCompile *acfg) method = cfg->orig_method; if (acfg->aot_opts.full_aot && cfg->orig_method->klass->valuetype) { +#ifdef MONO_ARCH_AOT_SUPPORTED int call_size; +#endif index = get_method_index (acfg, method); sprintf (symbol, "ut_%d", index); From 13e47bf9cba355eaaf46126da77e4e3b0e492391 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:37:46 +0100 Subject: [PATCH 115/694] Fixed warning in MSVC: 'void' function returning a value. --- mono/metadata/object.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/metadata/object.c b/mono/metadata/object.c index a9a86706f23..7434a69448b 100644 --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@ -3342,7 +3342,7 @@ mono_field_static_get_value_for_thread (MonoInternalThread *thread, MonoVTable * void mono_field_static_get_value (MonoVTable *vt, MonoClassField *field, void *value) { - return mono_field_static_get_value_for_thread (mono_thread_internal_current (), vt, field, value); + mono_field_static_get_value_for_thread (mono_thread_internal_current (), vt, field, value); } /** From 623e43dcd6f28da4e486ea50e4120925039bae34 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:39:40 +0100 Subject: [PATCH 116/694] Fixed warning in MSVC: 'different types for formal and actual parameter'. --- mono/metadata/icall.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index f861ff581f9..f1ed87a0a0d 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -6731,7 +6731,7 @@ ICALL_EXPORT void ves_icall_System_Environment_BroadcastSettingChange (void) { #ifdef HOST_WIN32 - SendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, NULL, L"Environment", SMTO_ABORTIFHUNG, 2000, 0); + SendMessageTimeout (HWND_BROADCAST, WM_SETTINGCHANGE, (WPARAM)NULL, (LPARAM)L"Environment", SMTO_ABORTIFHUNG, 2000, 0); #endif } From c353c84db325673f26a36780dfe4f0ee0c32d5c0 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 15:40:37 +0100 Subject: [PATCH 117/694] Fixed warning in MSVC: 'unreferenced local variable'. --- mono/metadata/icall.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index f1ed87a0a0d..b05892a7a2a 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -6468,12 +6468,11 @@ ves_icall_System_Environment_GetEnvironmentVariableNames (void) ICALL_EXPORT void ves_icall_System_Environment_InternalSetEnvironmentVariable (MonoString *name, MonoString *value) { - MonoError error; #ifdef HOST_WIN32 - gunichar2 *utf16_name, *utf16_value; #else gchar *utf8_name, *utf8_value; + MonoError error; #endif MONO_ARCH_SAVE_REGS; From 92f13d1988c9bb23e59794ed40d1eaa37ec62098 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 16:19:26 +0100 Subject: [PATCH 118/694] Regenerate keyboards.resx resource file. The existing one is reported as malformed XML by csc. --- .../resources/keyboards.resx | 1532 ++++++++++++++++- 1 file changed, 1530 insertions(+), 2 deletions(-) diff --git a/mcs/class/Managed.Windows.Forms/resources/keyboards.resx b/mcs/class/Managed.Windows.Forms/resources/keyboards.resx index f6f5fadb7df..4fac9f436ca 100644 --- a/mcs/class/Managed.Windows.Forms/resources/keyboards.resx +++ b/mcs/class/Managed.Windows.Forms/resources/keyboards.resx @@ -1,18 +1,96 @@  + + + + + + + + + + + + + + + + + + + - + + @@ -27,4 +105,1454 @@ -text/microsoft-resx1.3System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=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AAl2DQAACXcNAAAJeA0AAAl5DQAACXoNAAAJew0AAAl8DQAACX0NAAAJfg0AAAl/DQAACYANAAAJgQ0AAAmCDQAAD0MBAAACAAAAD2AAAAB+AAAAD0QBAAACAAAADzEAAAAhAAAAD0UBAAACAAAADzIAAABAAAAAD0YBAAACAAAADzMAAAAjAAAAD0cBAAACAAAADzQAAAAkAAAAD0gBAAACAAAADzUAAAAlAAAAD0kBAAACAAAADzYAAABeAAAAD0oBAAACAAAADzcAAAAmAAAAD0sBAAACAAAADzgAAAAqAAAAD0wBAAACAAAADzkAAAAoAAAAD00BAAACAAAADzAAAAApAAAAD04BAAACAAAADy0AAABfAAAAD08BAAACAAAADz0AAAArAAAAD1ABAAACAAAAD3EAAABRAAAAD1EBAAACAAAAD3cAAABXAAAAD1IBAAACAAAAD2UAAABFAAAAD1MBAAACAAAAD3IAAABSAAAAD1QBAAACAAAAD3QAAABUAAAAD1UBAAACAAAAD3kAAABZAAAAD1YBAAACAAAAD3UAAABVAAAAD1cBAAACAAAAD2kAAABJAAAAD1gBAAACAAAAD28AAABPAAAAD1kBAAACAAAAD3AAAABQAAAAD1oBAAACAAAAD1sAAAB7AAAAD1sBAAACAAAAD10AAAB9AAAAD1wBAAACAAAAD2EAAABBAAAAD10BAAACAAAAD3MAAABTAAAAD14BAAACAAAAD2QAAABEAAAAD18BAAACAAAAD2YAAABGAAAAD2ABAAACAAAAD2cAAABHAAAAD2EBAAACAAAAD2gAAABIAAAAD2IBAAACAAAAD2oAAABKAAAAD2MBAAACAAAAD2sAAABLAAAAD2QBAAACAAAAD2wAAABMAAAAD2UBAAACAAAADzsAAAA6AAAAD2YBAAACAAAADycAAAAiAAAAD2cBAAACAAAAD1wAAAB8AAAAD2gBAAACAAAAD3oAAABaAAAAD2kBAAACAAAAD3gAAABYAAAAD2oBAAACAAAAD2MAAABDAAAAD2sBAAACAAAAD3YAAABWAAAAD2wBAAACAAAAD2IAAABCAAAAD20BAAACAAAAD24AAABOAAAAD24BAAACAAAAD20AAABNAAAAD28BAAACAAAADywAAAA8AAAAD3ABAAACAAAADy4AAAA+AAAAD3EBAAACAAAADy8AAAA/AAAAD3IBAAAAAAAADw9zAQAAAAAAAA8PdAEAAAIAAAAPYAAAAH4AAAAPdQEAAAIAAAAPMQAAACEAAAAPdgEAAAIAAAAPMgAAAEAAAAAPdwEAAAIAAAAPMwAAACMAAAAPeAEAAAIAAAAPNAAAACQAAAAPeQEAAAIAAAAPNQAAACUAAAAPegEAAAIAAAAPNgAAAF4AAAAPewEAAAIAAAAPNwAAACYAAAAPfAEAAAIAAAAPOAAAACoAAAAPfQEAAAIAAAAPOQAAACgAAAAPfgEAAAIAAAAPMAAAACkAAAAPfwEAAAIAAAAPLQAAAF8AAAAPgAEAAAIAAAAPPQAAACsAAAAPgQEAAAIAAAAPcQAAAFEAAAAPggEAAAIAAAAPdwAAAFcAAAAPgwEAAAIAAAAPZQAAAEUAAAAPhAEAAAIAAAAPcgAAAFIAAAAPhQEAAAIAAAAPdAAAAFQAAAAPhgEAAAIAAAAPeQAAAFkAAAAPhwEAAAIAAAAPdQAAAFUAAAAPiAEAAAIAAAAPaQAAAEkAAAAPiQEAAAIAAAAPbwAAAE8AAAAPigEAAAIAAAAPcAAAAFAAAAAPiwEAAAIAAAAPWwAAAHsAAAAPjAEAAAIAAAAPXQAAAH0AAAAPjQEAAAIAAAAPYQAAAEEAAAAPjgEAAAIAAAAPcwAAAFMAAAAPjwEAAAIAAAAPZAAAAEQAAAAPkAEAAAIAAAAPZgAAAEYAAAAPkQEAAAIAAAAPZwAAAEcAAAAPkgEAAAIAAAAPaAAAAEgAAAAPkwEAAAIAAAAPagAAAEoAAAAPlAEAAAIAAAAPawAAAEsAAAAPlQEAAAIAAAAPbAAAAEwAAAAPlgEAAAIAAAAPOwAAADoAAAAPlwEAAAIAAAAPJwAAACIAAAAPmAEAAAIAAAAPXAAAAHwAAAAPmQEAAAIAAAAPegAAAFoAAAAPmgEAAAIAAAAPeAAAAFgAAAAPmwEAAAIAAAAPYwAAAEMAAAAPnAEAAAIAAAAPdgAAAFYAAAAPnQEAAAIAAAAPYgAAAEIAAAAPngEAAAIAAAAPbgAAAE4AAAAPnwEAAAIAAAAPbQAAAE0AAAAPoAEAAAIAAAAPLAAAADwAAAAPoQEAAAIAAAAPLgAAAD4AAAAPogEAAAIAAAAPLwAAAD8AAAAPowEAAAIAAAAPPAAAAD4AAAAPpAEAAAAAAAAPD6UBAAACAAAAD2AAAAB+AAAAD6YBAAACAAAADzEAAAAhAAAAD6cBAAACAAAADzIAAABAAAAAD6gBAAACAAAADzMAAAAjAAAAD6kBAAACAAAADzQAAAAkAAAAD6oBAAACAAAADzUAAAAlAAAAD6sBAAACAAAADzYAAABeAAAAD6wBAAACAAAADzcAAAAmAAAAD60BAAACAAAADzgAAAAqAAAAD64BAAACAAAADzkAAAAoAAAAD68BAAACAAAADzAAAAApAAAAD7ABAAACAAAAD1sAAAB7AAAAD7EBAAACAAAAD10AAAB9AAAAD7IBAAACAAAADycAAAAiAAAAD7MBAAACAAAADywAAAA8AAAAD7QBAAACAAAADy4AAAA+AAAAD7UBAAACAAAAD3AAAABQAAAAD7YBAAACAAAAD3kAAABZAAAAD7cBAAACAAAAD2YAAABGAAAAD7gBAAACAAAAD2cAAABHAAAAD7kBAAACAAAAD2MAAABDAAAAD7oBAAACAAAAD3IAAABSAAAAD7sBAAACAAAAD2wAAABMAAAAD7wBAAACAAAADy8AAAA/AAAAD70BAAACAAAADz0AAAArAAAAD74BAAACAAAAD2EAAABBAAAAD78BAAACAAAAD28AAABPAAAAD8ABAAACAAAAD2UAAABFAAAAD8EBAAACAAAAD3UAAABVAAAAD8IBAAACAAAAD2kAAABJAAAAD8MBAAACAAAAD2QAAABEAAAAD8QBAAACAAAAD2gAAABIAAAAD8UBAAACAAAAD3QAAABUAAAAD8YBAAACAAAAD24AAABOAAAAD8cBAAACAAAAD3MAAABTAAAAD8gBAAACAAAADy0AAABfAAAAD8kBAAACAAAAD1wAAAB8AAAAD8oBAAACAAAADzsAAAA6AAAAD8sBAAACAAAAD3EAAABRAAAAD8wBAAACAAAAD2oAAABKAAAAD80BAAACAAAAD2sAAABLAAAAD84BAAACAAAAD3gAAABYAAAAD88BAAACAAAAD2IAAABCAAAAD9ABAAACAAAAD20AAABNAAAAD9EBAAACAAAAD3cAAABXAAAAD9IBAAACAAAAD3YAAABWAAAAD9MBAAACAAAAD3oAAABaAAAAD9QBAAAAAAAADw/VAQAAAAAAAA8P1gEAAAIAAAAPYAAAAH4AAAAP1wEAAAIAAAAPMQAAACEAAAAP2AEAAAIAAAAPMgAAAEAAAAAP2QEAAAIAAAAPMwAAACMAAAAP2gEAAAIAAAAPNAAAACQAAAAP2wEAAAIAAAAPNQAAACUAAAAP3AEAAAIAAAAPNgAAAF4AAAAP3QEAAAIAAAAPNwAAACYAAAAP3gEAAAIAAAAPOAAAACoAAAAP3wEAAAIAAAAPOQAAACgAAAAP4AEAAAIAAAAPMAAAACkAAAAP4QEAAAIAAAAPLQAAAF8AAAAP4gEAAAIAAAAPPQAAACsAAAAP4wEAAAIAAAAPXAAAAHwAAAAP5AEAAAIAAAAPcQAAAFEAAAAP5QEAAAIAAAAPdwAAAFcAAAAP5gEAAAIAAAAPZQAAAEUAAAAP5wEAAAIAAAAPcgAAAFIAAAAP6AEAAAIAAAAPdAAAAFQAAAAP6QEAAAIAAAAPeQAAAFkAAAAP6gEAAAIAAAAPdQAAAFUAAAAP6wEAAAIAAAAPaQAAAEkAAAAP7AEAAAIAAAAPbwAAAE8AAAAP7QEAAAIAAAAPcAAAAFAAAAAP7gEAAAIAAAAPWwAAAHsAAAAP7wEAAAIAAAAPXQAAAH0AAAAP8AEAAAIAAAAPYQAAAEEAAAAP8QEAAAIAAAAPcwAAAFMAAAAP8gEAAAIAAAAPZAAAAEQAAAAP8wEAAAIAAAAPZgAAAEYAAAAP9AEAAAIAAAAPZwAAAEcAAAAP9QEAAAIAAAAPaAAAAEgAAAAP9gEAAAIAAAAPagAAAEoAAAAP9wEAAAIAAAAPawAAAEsAAAAP+AEAAAIAAAAPbAAAAEwAAAAP+QEAAAIAAAAPOwAAADoAAAAP+gEAAAIAAAAPJwAAACIAAAAP+wEAAAIAAAAPegAAAFoAAAAP/AEAAAIAAAAPeAAAAFgAAAAP/QEAAAIAAAAPYwAAAEMAAAAP/gEAAAIAAAAPdgAAAFYAAAAP/wEAAAIAAAAPYgAAAEIAAAAPAAIAAAIAAAAPbgAAAE4AAAAPAQIAAAIAAAAPbQAAAE0AAAAPAgIAAAIAAAAPLAAAADwAAAAPAwIAAAIAAAAPLgAAAD4AAAAPBAIAAAIAAAAPLwAAAD8AAAAPBQIAAAAAAAAPDwYCAAAAAAAADw8HAgAAAQAAAA9gAAAADwgCAAACAAAADzEAAAAhAAAADwkCAAACAAAADzIAAAAiAAAADwoCAAACAAAADzMAAACj////DwsCAAACAAAADzQAAAAkAAAADwwCAAACAAAADzUAAAAlAAAADw0CAAACAAAADzYAAABeAAAADw4CAAACAAAADzcAAAAmAAAADw8CAAACAAAADzgAAAAqAAAADxACAAACAAAADzkAAAAoAAAADxECAAACAAAADzAAAAApAAAADxICAAACAAAADy0AAABfAAAADxMCAAACAAAADz0AAAArAAAADxQCAAACAAAAD3EAAABRAAAADxUCAAACAAAAD3cAAABXAAAADxYCAAACAAAAD2UAAABFAAAADxcCAAACAAAAD3IAAABSAAAADxgCAAACAAAAD3QAAABUAAAADxkCAAACAAAAD3kAAABZAAAADxoCAAACAAAAD3UAAABVAAAADxsCAAACAAAAD2kAAABJAAAADxwCAAACAAAAD28AAABPAAAADx0CAAACAAAAD3AAAABQAAAADx4CAAACAAAAD1sAAAB7AAAADx8CAAACAAAAD10AAAB9AAAADyACAAACAAAAD2EAAABBAAAADyECAAACAAAAD3MAAABTAAAADyICAAACAAAAD2QAAABEAAAADyMCAAACAAAAD2YAAABGAAAADyQCAAACAAAAD2cAAABHAAAADyUCAAACAAAAD2gAAABIAAAADyYCAAACAAAAD2oAAABKAAAADycCAAACAAAAD2sAAABLAAAADygCAAACAAAAD2wAAABMAAAADykCAAACAAAADzsAAAA6AAAADyoCAAACAAAADycAAABAAAAADysCAAACAAAADyMAAAB+AAAADywCAAACAAAAD3oAAABaAAAADy0CAAACAAAAD3gAAABYAAAADy4CAAACAAAAD2MAAABDAAAADy8CAAACAAAAD3YAAABWAAAADzACAAACAAAAD2IAAABCAAAADzECAAACAAAAD24AAABOAAAADzICAAACAAAAD20AAABNAAAADzMCAAACAAAADywAAAA8AAAADzQCAAACAAAADy4AAAA+AAAADzUCAAACAAAADy8AAAA/AAAADzYCAAACAAAAD1wAAAB8AAAADzcCAAAAAAAADw84AgAAAgAAAA9eAAAAsP///w85AgAAAgAAAA8xAAAAIQAAAA86AgAAAgAAAA8yAAAAIgAAAA87AgAAAgAAAA8zAAAAp////w88AgAAAgAAAA80AAAAJAAAAA89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DzQDAAACAAAADzcAAAAvAAAADzUDAAACAAAADzgAAAAoAAAADzYDAAACAAAADzkAAAApAAAADzcDAAACAAAADzAAAAA9AAAADzgDAAACAAAADycAAAA/AAAADzkDAAACAAAAD14AAABgAAAADzoDAAACAAAAD3EAAABRAAAADzsDAAACAAAAD3cAAABXAAAADzwDAAACAAAAD2UAAABFAAAADz0DAAACAAAAD3IAAABSAAAADz4DAAACAAAAD3QAAABUAAAADz8DAAACAAAAD3oAAABaAAAAD0ADAAACAAAAD3UAAABVAAAAD0EDAAACAAAAD2kAAABJAAAAD0IDAAACAAAAD28AAABPAAAAD0MDAAACAAAAD3AAAABQAAAAD0QDAAACAAAAD+j////8////D0UDAAACAAAAD6j///8hAAAAD0YDAAACAAAAD2EAAABBAAAAD0cDAAACAAAAD3MAAABTAAAAD0gDAAACAAAAD2QAAABEAAAAD0kDAAACAAAAD2YAAABGAAAAD0oDAAACAAAAD2cAAABHAAAAD0sDAAACAAAAD2gAAABIAAAAD0wDAAACAAAAD2oAAABKAAAAD00DAAACAAAAD2sAAABLAAAAD04DAAACAAAAD2wAAABMAAAAD08DAAACAAAAD+n////2////D1ADAAACAAAAD+D////k////D1EDAAACAAAADyQAAACj////D1IDAAACAAAAD3kAAABZAAAAD1MDAAACAAAAD3gAAABYAAAAD1QDAAACAAAAD2MAAABDAAAAD1UDAAACAAAAD3YAAABWAAAAD1YDAAACAAAAD2IAAABCAAAAD1cDAAACAAAAD24AAABOAAAAD1gDAAACAAAAD20AAABNAAAAD1kDAAACAAAADywAAAA7AAAAD1oDAAACAAAADy4AAAA6AAAAD1sDAAACAAAADy0AAABfAAAAD1wDAAACAAAADzwAAAA+AAAAD10DAAAAAAAADw9eAwAAAgAAAA+n////vf///w9fAwAAAgAAAA8xAAAAIQAAAA9gAwAAAgAAAA8yAAAAIgAAAA9hAwAAAgAAAA8zAAAAIwAAAA9iAwAAAgAAAA80AAAApP///w9jAwAAAgAAAA81AAAAJQAAAA9kAwAAAgAAAA82AAAAJgAAAA9lAwAAAgAAAA83AAAALwAAAA9mAwAAAgAA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AAAADzcAAAAmAAAAD4wEAAACAAAADzgAAAAqAAAAD40EAAACAAAADzkAAAAoAAAAD44EAAACAAAADzAAAAApAAAAD48EAAACAAAADy0AAABfAAAAD5AEAAACAAAADz0AAAArAAAAD5EEAAACAAAAD3EAAABRAAAAD5IEAAACAAAAD3cAAABXAAAAD5MEAAACAAAAD2UAAABFAAAAD5QEAAACAAAAD3IAAABSAAAAD5UEAAACAAAAD3QAAABUAAAAD5YEAAACAAAAD3kAAABZAAAAD5cEAAACAAAAD3UAAABVAAAAD5gEAAACAAAAD2kAAABJAAAAD5kEAAACAAAAD28AAABPAAAAD5oEAAACAAAAD3AAAABQAAAAD5sEAAACAAAAD14AAABeAAAAD5wEAAACAAAAD7j///+o////D50EAAACAAAAD2EAAABBAAAAD54EAAACAAAAD3MAAABTAAAAD58EAAACAAAAD2QAAABEAAAAD6AEAAACAAAAD2YAAABGAAAAD6EEAAACAAAAD2cAAABHAAAAD6IEAAACAAAAD2gAAABIAAAAD6MEAAACAAAAD2oAAABKAAAAD6QEAAACAAAAD2sAAABLAAAAD6UEAAACAAAAD2wAAABMAAAAD6YEAAACAAAADzsAAAA6AAAAD6cEAAACAAAAD2AAAABgAAAAD6gEAAACAAAADzwAAAA+AAAAD6kEAAACAAAAD3oAAABaAAAAD6oEAAACAAAAD3gAAABYAAAAD6sEAAACAAAAD2MAAABDAAAAD6wEAAACAAAAD3YAAABWAAAAD60EAAACAAAAD2IAAABCAAAAD64EAAACAAAAD24AAABOAAAAD68EAAACAAAAD20AAABNAAAAD7AEAAACAAAADywAAAAnAAAAD7EEAAABAAAADy4AAAAPsgQAAAIAAAAP6f///8n///8PswQAAAIAAAAPq////7v///8PtAQAAAAAAAAPD7UEAAACAAAADy8AAABcAAAAD7YEAAAEAAAADzEAAAAhAAAAuf///6H///8PtwQAAAMAAAAPMgAAAEAAAACy////D7gEAAAEAAAADzMAAAAjAAAAs////6P///8PuQQAAAQAAAAPNAAAACQAAAC8////pP///w+6BAAAAwAAAA81AAAAJQAAAL3///8PuwQAAAMAAAAPNgAAAD8AAAC+////D7wEAAACAAAADzcAAAAmAAAAD70EAAACAAAADzgAAAAqAAAAD74EAAACAAAADzkAAAAoAAAAD78EAAACAAAADzAAAAApAAAAD8AEAAACAAAADy0AAABfAAAAD8EEAAACAAAADz0AAAArAAAAD8IEAAACAAAAD3EAAABRAAAAD8MEAAACAAAAD3cAAABXAAAAD8QEAAACAAAAD2UAAABFAAAAD8UEAAACAAAAD3IAAABSAAAAD8YEAAACAAAAD3QAAABUAAAAD8cEAAACAAAAD3kAAABZAAAAD8gEAAACAAAAD3UAAABVAAAAD8kEAAACAAAAD2kAAABJAAAAD8oEAAAEAAAAD28AAABPAAAA+P///9j///8PywQAAAQAAAAPcAAAAFAAAAD+////3v///w/MBAAAAwAAAA9eAAAAqP///6j///8PzQQAAAMAAAAP5////8f///9+AAAAD84EAAAEAAAAD2EAAABBAAAA5v///8b///8PzwQAAAQAAAAPcwAAAFMAAADf////p////w/QBAAABAAAAA9kAAAARAAAAPD////Q////D9EEAAACAAAAD2YAAABGAAAAD9IEAAACAAAAD2cAAABHAAAAD9MEAAACAAAAD2gAAABIAAAAD9QEAAACAAAAD2oAAABKAAAAD9UEAAACAAAAD2sAAABLAAAAD9YEAAACAAAAD2wAAABMAAAAD9cEAAADAAAADzsAAAA6AAAAtP///w/YBAAAAgAAAA/o////yP///w/ZBAAAAgAAAA/g////wP///w/aBAAAAgAAAA96AAAAWgAAAA/bBAAAAgAAAA94AAAAWAAAAA/cBAAABAAAAA9jAAAAQwAAAKL///+p////D90EAAACAAAAD3YAAABWAAAAD94EAAACAAAAD2IAAABCAAAAD98EAAACAAAAD24AAABOAAAAD+AEAAAEAAAAD20AAABNAAAAtf///7r///8P4QQAAAIAAAAPLAAAACcAAAAP4gQAAAQAAAAPLgAAACIAAAC3////9////w/jBAAAAgAAAA/p////yf///w/kBAAAAgAAAA/5////2f///w/lBAAAAAAAAA8P5gQAAAAAAAAPD+cEAAADAAAADyYAAAAxAAAAfAAAAA/oBAAAAwAAAA/p////MgAAAEAAAAAP6QQAAAMAAAAPIgAAADMAAAAjAAAAD+oEAAACAAAADycAAAA0AAAAD+sEAAACAAAADygAAAA1AAAAD+wEAAADAAAAD6f///82AAAAXgAAAA/tBAAAAgAAAA/o////NwAAAA/uBAAAAgAAAA8hAAAAOAAAAA/vBAAAAwAAAA/n////OQAAAHsAAAAP8AQAAAMAAAAP4P///zAAAAB9AAAAD/EEAAACAAAADykAAACw////D/IEAAACAAAADy0AAABfAAAAD/MEAAACAAAAD2EAAABBAAAAD/QEAAACAAAAD3oAAABaAAAAD/UEAAADAAAAD2UAAABFAAAApP///w/2BAAAAgAAAA9yAAAAUgAAAA/3BAAAAgAAAA90AAAAVAAAAA/4BAAAAgAAAA95AAAAWQAAAA/5BAAAAgAAAA91AAAAVQAAAA/6BAAAAgAAAA9pAAAASQAAAA/7BAAAAgAAAA9vAAAATwAAAA/8BAAAAgAAAA9wAAAAUAAAAA/9BAAAAwAAAA9eAAAAqP///1sAAAAP/gQAAAMAAAAPJAAAACoAAABdAAAAD/8EAAACAAAAD3EAAABRAAAADwAFAAADAAAAD3MAAABTAAAA3////w8BBQAAAgAAAA9kAAAARAAAAA8CBQAAAgAAAA9mAAAARgAAAA8DBQAAAgAAAA9nAAAARwAAAA8EBQAAAgAAAA9oAAAASAAAAA8FBQAAAgAAAA9qAAAASgAAAA8GBQAAAgAAAA9rAAAASwAAAA8HBQAAAgAAAA9sAAAATAAAAA8IBQAAAgAAAA9tAAAATQAAAA8JBQAAAwAAAA/5////JQAAALT///8PCgUAAAMAAAAPtf///6P///9gAAAADwsFAAACAAAAD3cAAABXAAAADwwFAAACAAAAD3gAAABYAAAADw0FAAACAAAAD2MAAABDAAAADw4FAAACAAAAD3YAAABWAAAADw8FAAACAAAAD2IAAABCAAAADxAFAAACAAAAD24AAABOAAAADxEFAAACAAAADywAAAA/AAAADxIFAAACAAAADzsAAAAuAAAADxMFAAACAAAADzoAAAAvAAAADxQFAAADAAAADz0AAAArAAAAfgAAAA8VBQAAAwAAAA88AAAAPgAAAFwAAAAPFgUAAAAAAAAPDxcFAAACAAAAD1wAAAB8AAAADxgFAAACAAAADzEAAAAhAAAADxkFAAACAAAADzIAAAAiAAAADxoFAAACAAAADzMAAAAjAAAADxsFAAACAAAADzQAAAAkAAAADxwFAAACAAAADzUAAAAlAAAADx0FAAACAAAADzYAAAAmAAAADx4FAAACAAAADzcAAAAvAAAADx8FAAACAAAADzgAAAAoAAAADyAFAAACAAAADzkAAAApAAAADyEFAAACAAAADzAAAAA9AAAADyIFAAACAAAADycAAAA/AAAADyMFAAACAAAAD6v///+7////DyQFAAACAAAAD3EAAABRAAAADyUFAAACAAAAD3cAAABXAAAADyYFAAACAAAAD2UAAABFAAAADycFAAACAAAAD3IAAABSAAAADygFAAACAAAAD3QAAABUAAAADykFAAACAAAAD3kAAABZAAAADyoFAAACAAAAD3UAAABVAAAADysFAAACAAAAD2kAAABJAAAADywFAAACAAAAD28AAABPAAAADy0FAAACAAAAD3AAAABQAAAADy4FAAACAAAADysAAAAqAAAADy8FAAACAAAAD7T///9gAAAADzAFAAACAAAAD2EAAABBAAAADzEFAAACAAAAD3MAAABTAAAADzIFAAACAAAAD2QAAABEAAAADzMFAAACAAAAD2YAAABGAAAADzQFAAACAAAAD2cAAABHAAAADzUFAAACAAAAD2gAAABIAAAADzYFAAACAAAAD2oAAABKAAAADzcFAAACAAAAD2sAAABLAAAADzgFAAACAAAAD2wAAABMAAAADzkFAAACAAAAD+f////H////DzoFAAACAAAAD7r///+q////DzsFAAACAAAAD34AAABeAAAADzwFAAACAAAAD3oAAABaAAAADz0FAAACAAAAD3gAAABYAAAADz4FAAACAAAAD2MAAABDAAAADz8FAAACAAAAD3YAAABWAAAAD0AFAAACAAAAD2IAAABCAAAAD0EFAAACAAAAD24AAABOAAAAD0IFAAACAAAAD20AAABNAAAAD0MFAAACAAAADywAAAA7AAAAD0QFAAACAAAADy4AAAA6AAAAD0UFAAACAAAADy0AAABfAAAAD0YFAAACAAAADzwAAAA+AAAAD0cFAAAAAAAADw9IBQAAAgAAAA8nAAAAIgAAAA9JBQAAAgAAAA8xAAAAIQAAAA9KBQAAAgAAAA8yAAAAQAAAAA9LBQAAAgAAAA8zAAAAIwAAAA9MBQAAAgAA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AAAADzQAAAAkAAAANAAAACIAAAAP4AUAAAIAAAAPNQAAACUAAAAP4QUAAAQAAAAPNgAAAF4AAAA2AAAAPQAAAA/iBQAABAAAAA83AAAAJgAAADcAAAA6AAAAD+MFAAAEAAAADzgAAAAqAAAAOAAAAC8AAAAP5AUAAAIAAAAPOQAAACgAAAAP5QUAAAIAAAAPMAAAACkAAAAP5gUAAAQAAAAPLQAAAF8AAAAtAAAASQAAAA/nBQAABAAAAA89AAAAKwAAAC4AAABWAAAAD+gFAAAEAAAAD3EAAABRAAAALAAAAPv///8P6QUAAAQAAAAPdwAAAFcAAADz////0////w/qBQAABAAAAA9lAAAARQAAAOX////F////D+sFAAAEAAAAD3IAAABSAAAA6P///8j///8P7AUAAAQAAAAPdAAAAFQAAAD4////2P///w/tBQAABAAAAA95AAAAWQAAAPn////Z////D+4FAAAEAAAAD3UAAABVAAAA6v///8r///8P7wUAAAQAAAAPaQAAAEkAAADx////0f///w/wBQAABAAAAA9vAAAATwAAAOT////E////D/EFAAAEAAAAD3AAAABQAAAA5////8f///8P8gUAAAQAAAAPWwAAAHsAAAD2////1v///w/zBQAAAwAAAA9dAAAAfQAAADsAAAAP9AUAAAQAAAAPYQAAAEEAAAD8////3P///w/1BQAABAAAAA9zAAAAUwAAAP/////f////D/YFAAAEAAAAD2QAAABEAAAA4P///8D///8P9wUAAAQAAAAPZgAAAEYAAADu////zv///w/4BQAABAAAAA9nAAAARwAAAOb////G////D/kFAAAEAAAAD2gAAABIAAAA4////8P///8P+gUAAAQAAAAPagAAAEoAAADy////0v///w/7BQAABAAAAA9rAAAASwAAAO3////N////D/wFAAAEAAAAD2wAAABMAAAA4v///8L///8P/QUAAAQAAAAPOwAAADoAAADs////zP///w/+BQAABAAAAA8nAAAAIgAAAPf////X////D/8FAAAEAAAAD1wAAAB8AAAAJwAAANv///8PAAYAAAQAAAAPegAAAFoAAAD+////3v///w8BBgAABAAAAA94AAAAWAAAAOn////J////DwIGAAAEAAAAD2MAAABDAAAA+v///9r///8PAwYAAAQAAAAPdgAAAFYAAAD9////3f///w8EBgAABAAAAA9iAAAAQgAAAPT////U////DwUGAAAEAAAAD24AAABOAAAA9f///9X///8PBgYAAAQAAAAPbQAAAE0AAADv////z////w8HBgAABAAAAA8sAAAAPAAAAPD////Q////DwgGAAAEAAAADy4AAAA+AAAA6////8v///8PCQYAAAQAAAAPLwAAAD8AAADh////wf///w8KBgAAAgAAAA88AAAAPgAAAA8LBgAAAAAAAA8PDAYAAAQAAAAPYAAAAH4AAAD3////1////w8NBgAAAgAAAA8xAAAAIQAAAA8OBgAAAgAAAA8yAAAAQAAAAA8PBgAAAgAAAA8zAAAAIwAAAA8QBgAAAgAAAA80AAAAJAAAAA8RBgAAAgAAAA81AAAAJQAAAA8SBgAAAgAAAA82AAAAXgAAAA8TBgAAAgAAAA83AAAAJgAAAA8UBgAAAgAAAA84AAAAKgAAAA8VBgAAAgAAAA85AAAAKAAAAA8WBgAAAgAAAA8wAAAAKQAAAA8XBgAAAgAAAA8tAAAAXwAAAA8YBgAAAgAAAA89AAAAKwAAAA8ZBgAABAAAAA9xAAAAUQAAAP/////f////DxoGAAAEAAAAD3cAAABXAAAA4v///8L///8PGwYAAAQAAAAPZQAAAEUAAADl////xf///w8cBgAABAAAAA9yAAAAUgAAAPD////Q////Dx0GAAAEAAAAD3QAAABUAAAA8v///9L///8PHgYAAAQAAAAPeQAAAFkAAAD6////2v///w8fBgAABAAAAA91AAAAVQAAAPP////T////DyAGAAAEAAAAD2kAAABJAAAA6P///8j///8PIQYAAAQAAAAPbwAAAE8AAADu////zv///w8iBgAABAAAAA9wAAAAUAAAAO/////P////DyMGAAAEAAAAD1sAAAB7AAAA+P///9j///8PJAYAAAQAAAAPXQAAAH0AAAD5////2f///w8lBgAABAAAAA9hAAAAQQAAAOD////A////DyYGAAAEAAAAD3MAAABTAAAA8f///9H///8PJwYAAAQAAAAPZAAAAEQAAADk////xP///w8oBgAABAAAAA9mAAAARgAAAPT////U////DykGAAAEAAAAD2cAAABHAAAA4////8P///8PKgYAAAQAAAAPaAAAAEgAAAD1////1f///w8rBgAABAAAAA9qAAAASgAAAOn////J////DywGAAAEAAAAD2sAAABLAAAA6v///8r///8PLQYAAAQAAAAPbAAAAEwAAADr////y////w8uBgAAAgAAAA87AAAAOgAAAA8vBgAAAgAAAA8nAAAAIgAAAA8wBgAABAAAAA9cAAAAfAAAAP7////e////DzEGAAAEAAAAD3oAAABaAAAA5////8f///8PMgYAAAQAAAAPeAAAAFgAAAD8////3P///w8zBgAABAAAAA9jAAAAQwAAAPb////W////DzQGAAAEAAAAD3YAAABWAAAA5v///8b///8PNQYAAAQAAAAPYgAAAEIAAADh////wf///w82BgAABAAAAA9uAAAATgAAAO3////N////DzcGAAAEAAAAD20AAABNAAAA7P///8z///8POAYAAAIAAAAPLAAAADwAAAAPOQYAAAIAAAAPLgAAAD4AAAAPOgYAAAIAAAAPLwAAAD8AAAAPOwYAAAIAAAAPPAAAAD4AAAAPPAYAAAAAAAAPDz0GAAAEAAAAD2AAAAB+AAAAo////7P///8PPgYAAAIAAAAPMQAAACEAAAAPPwYAAAIAAAAPMgAAAEAAAAAPQAYAAAIAAAAPMwAAACMAAAAPQQYAAAIAAAAPNAAAACQAAAAPQgYAAAIAAAAPNQAAACUAAAAPQwYAAAIAAAAPNgAAAF4AAAAPRAYAAAIAAAAPNwAAACYAAAAPRQYAAAIAAAAPOAAAACoAAAAPRgYAAAIAAAAPOQAAACgAAAAPRwYAAAIAAAAPMAAAACkAAAAPSAYAAAIAAAAPLQAAAF8AAAAPSQYAAAIAAAAPPQAAACsAAAAPSgYAAAQAAAAPcQAAAFEAAADK////6v///w9LBgAABAAAAA93AAAAVwAAAMP////j////D0wGAAAEAAAAD2UAAABFAAAA1f////X///8PTQYAAAQAAAAPcgAAAFIAAADL////6////w9OBgAABAAAAA90AAAAVAAAAMX////l////D08GAAAEAAAAD3kAAABZAAAAzv///+7///8PUAYAAAQAAAAPdQAAAFUAAADH////5////w9RBgAABAAAAA9pAAAASQAAANv////7////D1IGAAAEAAAAD28AAABPAAAArv///77///8PUwYAAAQAAAAPcAAAAFAAAADa////+v///w9UBgAABAAAAA9bAAAAewAAAMj////o////D1UGAAAEAAAAD10AAAB9AAAAJwAAACcAAAAPVgYAAAQAAAAPYQAAAEEAAADG////5v///w9XBgAABAAAAA9zAAAAUwAAANn////5////D1gGAAAEAAAAD2QAAABEAAAA1/////f///8PWQYAAAQAAAAPZgAAAEYAAADB////4f///w9aBgAABAAAAA9nAAAARwAAAND////w////D1sGAAAEAAAAD2gAAABIAAAA0v////L///8PXAYAAAQAAAAPagAAAEoAAADP////7////w9dBgAABAAAAA9rAAAASwAAAMz////s////D14GAAAEAAAAD2wAAABMAAAAxP///+T///8PXwYAAAQAAAAPOwAAADoAAADW////9v///w9gBgAABAAAAA8nAAAAIgAAANz////8////D2EGAAAEAAAAD1wAAAB8AAAALwAAAHwAAAAPYgYAAAQAAAAPegAAAFoAAADR////8f///w9jBgAABAAAAA94AAAAWAAAAN7////+////D2QGAAAEAAAAD2MAAABDAAAA0/////P///8PZQYAAAQAAAAPdgAAAFYAAADN////7f///w9mBgAABAAAAA9iAAAAQgAAAKb///+2////D2cGAAAEAAAAD24AAABOAAAA1P////T///8PaAYAAAQAAAAPbQAAAE0AAADY////+P///w9pBgAABAAAAA8sAAAAPAAAAML////i////D2oGAAAEAAAADy4AAAA+AAAAwP///+D///8PawYAAAQAAAAPLwAAAD8AAAAuAAAALAAAAA9sBgAABAAAAA88AAAAPgAAAHwAAACm////D20GAAAAAAAADw9uBgAAAgAAAA9gAAAAfgAAAA9vBgAAAgAAAA8xAAAAIQAAAA9wBgAAAgAAAA8yAAAAQAAAAA9xBgAAAgAAAA8zAAAAIwAAAA9yBgAAAgAAAA80AAAAJAAAAA9zBgAAAgAAAA81AAAAJQAAAA90BgAAAgAAAA82AAAAXgAAAA91BgAAAgAAAA83AAAAJgAAAA92BgAAAgAAAA84AAAAKgAAAA93BgAAAgAAAA85AAAAKAAAAA94BgAAAgAAAA8wAAAAKQAAAA95BgAAAgAAAA8tAAAAXwAAAA96BgAAAgAAAA89AAAAKwAAAA97BgAABAAAAA9xAAAAUQAAAMr////q////D3wGAAAEAAAAD3cAAABXAAAAw////+P///8PfQYAAAQAAAAPZQAAAEUAAADV////9f///w9+BgAABAAAAA9yAAAAUgAAAMv////r////D38GAAAEAAAAD3QAAABUAAAAxf///+X///8PgAYAAAQAAAAPeQAAAFkAAADO////7v///w+BBgAABAAAAA91AAAAVQAAAMf////n////D4IGAAAEAAAAD2kAAABJAAAA2/////v///8PgwYAAAQAAAAPbwAAAE8AAADd/////f///w+EBgAABAAAAA9wAAAAUAAAANr////6////D4UGAAAEAAAAD1sAAAB7AAAAyP///+j///8PhgYAAAQAAAAPXQAAAH0AAADf/////////w+HBgAABAAAAA9hAAAAQQAAAMb////m////D4gGAAAEAAAAD3MAAABTAAAA2f////n///8PiQYAAAQAAAAPZAAAAEQAAADX////9////w+KBgAABAAAAA9mAAAARgAAAMH////h////D4sGAAAEAAAAD2cAAABHAAAA0P////D///8PjAYAAAQAAAAPaAAAAEgAAADS////8v///w+NBgAABAAAAA9qAAAASgAAAM/////v////D44GAAAEAAAAD2sAAABLAAAAzP///+z///8PjwYAAAQAAAAPbAAAAEwAAADE////5P///w+QBgAABAAAAA87AAAAOgAAANb////2////D5EGAAAEAAAADycAAAAiAAAA3P////z///8PkgYAAAIAAAAPXAAAAHwAAAAPkwYAAAQAAAAPegAAAFoAAADR////8f///w+UBgAABAAAAA94AAAAWAAAAN7////+////D5UGAAAEAAAAD2MAAABDAAAA0/////P///8PlgYAAAQAAAAPdgAAAFYAAADN////7f///w+XBgAABAAAAA9iAAAAQgAAAMn////p////D5gGAAAEAAAAD24AAABOAAAA1P////T///8PmQYAAAQAAAAPbQAAAE0AAADY////+P///w+aBgAABAAAAA8sAAAAPAAAAML////i////D5sGAAAEAAAADy4AAAA+AAAAwP///+D///8PnAYAAAIAAAAPLwAAAD8AAAAPnQYAAAAAAAAPD54GAAAAAAAADw+fBgAAAgAAAA9gAAAAfgAAAA+gBgAAAgAAAA8xAAAAIQAAAA+hBgAAAgAAAA8yAAAAQAAAAA+iBgAAAgAAAA8zAAAAIwAAAA+jBgAAAgAAAA80AAAAJAAAAA+kBgAAAgAAAA81AAAAJQAAAA+lBgAAAgAAAA82AAAAXgAAAA+mBgAAAgAAAA83AAAAJgAAAA+nBgAAAgAAAA84AAAAKgAAAA+oBgAAAgAAAA85AAAAKAAAAA+pBgAAAgAAAA8wAAAAKQAAAA+qBgAAAgAAAA8tAAAAXwAAAA+rBgAAAgAAAA89AAAAKwAAAA+sBgAABAAAAA9xAAAAUQAAAMr////q////D60GAAAEAAAAD3cAAABXAAAAw////+P///8PrgYAAAQAAAAPZQAAAEUAAADV////9f///w+vBgAABAAAAA9yAAAAUgAAAMv////r////D7AGAAAEAAAAD3QAAABUAAAAxf///+X///8PsQYAAAQAAAAPeQAAAFkAAADO////7v///w+yBgAABAAAAA91AAAAVQAAAMf////n////D7MGAAAEAAAAD2kAAABJAAAA2/////v///8PtAYAAAQAAAAPbwAAAE8AAADd/////f///w+1BgAABAAAAA9wAAAAUAAAANr////6////D7YGAAAEAAAAD1sAAAB7AAAAyP///+j///8PtwYAAAQAAAAPXQAAAH0AAADf/////////w+4BgAABAAAAA9hAAAAQQAAAMb////m////D7kGAAAEAAAAD3MAAABTAAAA2f////n///8PugYAAAQAAAAPZAAAAEQAAADX////9////w+7BgAABAAAAA9mAAAARgAAAMH////h////D7wGAAAEAAAAD2cAAABHAAAA0P////D///8PvQYAAAQAAAAPaAAAAEgAAADS////8v///w++BgAABAAAAA9qAAAASgAAAM/////v////D78GAAAEAAAAD2sAAABLAAAAzP///+z///8PwAYAAAQAAAAPbAAAAEwAAADE////5P///w/BBgAABAAAAA87AAAAOgAAANb////2////D8IGAAAEAAAADycAAAAiAAAA3P////z///8PwwYAAAIAAAAPXAAAAHwAAAAPxAYAAAQAAAAPegAAAFoAAADR////8f///w/FBgAABAAAAA94AAAAWAAAAN7////+////D8YGAAAEAAAAD2MAAABDAAAA0/////P///8PxwYAAAQAAAAPdgAAAFYAAADN////7f///w/IBgAABAAAAA9iAAAAQgAAAMn////p////D8kGAAAEAAAAD24AAABOAAAA1P////T///8PygYAAAQAAAAPbQAAAE0AAADY////+P///w/LBgAABAAAAA8sAAAAPAAAAML////i////D8wGAAAEAAAADy4AAAA+AAAAwP///+D///8PzQYAAAIAAAAPLwAAAD8AAAAPzgYAAAIAAAAPPAAAAD4AAAAPzwYAAAAAAAAPD9AGAAACAAAADygAAAApAAAAD9EGAAACAAAADzEAAAAhAAAAD9IGAAACAAAADzIAAAAiAAAAD9MGAAACAAAADzMAAAAvAAAAD9QGAAACAAAADzQAAAAkAAAAD9UGAAACAAAADzUAAAA6AAAAD9YGAAACAAAADzYAAAAsAAAAD9cGAAACAAAADzcAAAAuAAAAD9gGAAACAAAADzgAAAA7AAAAD9kGAAACAAAADzkAAAA/AAAAD9oGAAACAAAADzAAAAAlAAAAD9sGAAACAAAADy0AAABfAAAAD9wGAAACAAAADz0AAAArAAAAD90GAAACAAAAD8r////q////D94GAAACAAAAD8P////j////D98GAAACAAAAD9X////1////D+AGAAACAAAAD8v////r////D+EGAAACAAAAD8X////l////D+IGAAACAAAAD87////u////D+MGAAACAAAAD8f////n////D+QGAAACAAAAD9v////7////D+UGAAACAAAAD93////9////D+YGAAACAAAAD9r////6////D+cGAAACAAAAD8j////o////D+gGAAACAAAAD9//////////D+kGAAACAAAAD8b////m////D+oGAAACAAAAD9n////5////D+sGAAACAAAAD9f////3////D+wGAAACAAAAD8H////h////D+0GAAACAAAAD9D////w////D+4GAAACAAAAD9L////y////D+8GAAACAAAAD8/////v////D/AGAAACAAAAD8z////s////D/EGAAACAAAAD8T////k////D/IGAAACAAAAD9b////2////D/MGAAACAAAAD9z////8////D/QGAAACAAAAD1wAAAB8AAAAD/UGAAACAAAAD9H////x////D/YGAAACAAAAD97////+////D/cGAAACAAAAD9P////z////D/gGAAACAAAAD83////t////D/kGAAACAAAAD8n////p////D/oGAAACAAAAD9T////0////D/sGAAACAAAAD9j////4////D/wGAAACAAAAD8L////i////D/0GAAACAAAAD8D////g////D/4GAAACAAAADy8AAAA/AAAAD/8GAAACAAAADzwAAAA+AAAADwAHAAAAAAAADw8BBwAAAgAAAA9gAAAAfgAAAA8CBwAAAgAAAA8xAAAAIQAAAA8DBwAAAgAAAA8yAAAAQAAAAA8EBwAAAgAAAA8zAAAAIwAAAA8FBwAAAgAAAA80AAAAJAAAAA8GBwAAAgAAAA81AAAAJQAAAA8HBwAAAgAAAA82AAAAXgAAAA8IBwAAAgAAAA83AAAAJgAAAA8JBwAAAgAAAA84AAAAKgAAAA8KBwAAAgAAAA85AAAAKAAAAA8LBwAAAgAAAA8wAAAAKQAAAA8MBwAAAgAAAA8tAAAAXwAAAA8NBwAAAgAAAA89AAAAKwAAAA8OBwAABAAAAA9xAAAAUQAAAOn////J////Dw8HAAAEAAAAD3cAAABXAAAA9v///9b///8PEAcAAAQAAAAPZQAAAEUAAADz////0////w8RBwAABAAAAA9yAAAAUgAAAOr////K////DxIHAAAEAAAAD3QAAABUAAAA5f///8X///8PEwcAAAQAAAAPeQAAAFkAAADt////zf///w8UBwAABAAAAA91AAAAVQAAAOP////D////DxUHAAAEAAAAD2kAAABJAAAA+P///9j///8PFgcAAAQAAAAPbwAAAE8AAAD5////2f///w8XBwAABAAAAA9wAAAAUAAAAOf////H////DxgHAAAEAAAAD1sAAAB7AAAA9f///9X///8PGQcAAAQAAAAPXQAAAH0AAAD6////2v///w8aBwAABAAAAA9hAAAAQQAAAPT////U////DxsHAAAEAAAAD3MAAABTAAAA+////9v///8PHAcAAAQAAAAPZAAAAEQAAADi////wv///w8dBwAABAAAAA9mAAAARgAAAOD////A////Dx4HAAAEAAAAD2cAAABHAAAA7////8////8PHwcAAAQAAAAPaAAAAEgAAADw////0P///w8gBwAABAAAAA9qAAAASgAAAO7////O////DyEHAAAEAAAAD2sAAABLAAAA6////8v///8PIgcAAAQAAAAPbAAAAEwAAADk////xP///w8jBwAABAAAAA87AAAAOgAAAOb////G////DyQHAAAEAAAADycAAAAiAAAA/f///93///8PJQcAAAIAAAAPXAAAAHwAAAAPJgcAAAQAAAAPegAAAFoAAAD/////3////w8nBwAABAAAAA94AAAAWAAAAPf////X////DygHAAAEAAAAD2MAAABDAAAA8f///9H///8PKQcAAAQAAAAPdgAAAFYAAADs////zP///w8qBwAABAAAAA9iAAAAQgAAAOj////I////DysHAAAEAAAAD24AAABOAAAA8v///9L///8PLAcAAAQAAAAPbQAAAE0AAAD8////3P///w8tBwAABAAAAA8sAAAAPAAAAOH////B////Dy4HAAAEAAAADy4AAAA+AAAA/v///97///8PLwcAAAIAAAAPLwAAAD8AAAAPMAcAAAIAAAAPPAAAAD4AAAAPMQcAAAAAAAAPDzIHAAACAAAAD2AAAAB+AAAADzMHAAACAAAADzEAAAAhAAAADzQHAAACAAAADzIAAABAAAAADzUHAAACAAAADzMAAAAjAAAADzYHAAACAAAADzQAAAAkAAAADzcHAAACAAAADzUAAAAlAAAADzgHAAACAAAADzYAAABeAAAADzkHAAACAAAADzcAAAAmAAAADzoHAAACAAAADzgAAAAqAAAADzsHAAACAAAADzkAAAAoAAAADzwHAAACAAAADzAAAAApAAAADz0HAAACAAAADy0AAABfAAAADz4HAAACAAAADz0AAAArAAAADz8HAAAEAAAAD3EAAABRAAAA0f////H///8PQAcAAAQAAAAPdwAAAFcAAADX////9////w9BBwAABAAAAA9lAAAARQAAAMX////l////D0IHAAAEAAAAD3IAAABSAAAA0v////L///8PQwcAAAQAAAAPdAAAAFQAAADU////9P///w9EBwAABAAAAA95AAAAWQAAANn////5////D0UHAAAEAAAAD3UAAABVAAAA1f////X///8PRgcAAAQAAAAPaQAAAEkAAADJ////6f///w9HBwAABAAAAA9vAAAATwAAAM/////v////D0gHAAAEAAAAD3AAAABQAAAA0P////D///8PSQcAAAQAAAAPWwAAAHsAAADb////+////w9KBwAABAAAAA9dAAAAfQAAAN3////9////D0sHAAAEAAAAD2EAAABBAAAAwf///+H///8PTAcAAAQAAAAPcwAAAFMAAADT////8////w9NBwAABAAAAA9kAAAARAAAAMT////k////D04HAAAEAAAAD2YAAABGAAAAxv///+b///8PTwcAAAQAAAAPZwAAAEcAAADH////5////w9QBwAABAAAAA9oAAAASAAAAMj////o////D1EHAAAEAAAAD2oAAABKAAAAyv///+r///8PUgcAAAQAAAAPawAAAEsAAADL////6////w9TBwAABAAAAA9sAAAATAAAAMz////s////D1QHAAACAAAADzsAAAA6AAAAD1UHAAACAAAADycAAAAiAAAAD1YHAAACAAAAD1wAAAB8AAAAD1cHAAAEAAAAD3oAAABaAAAA2v////r///8PWAcAAAQAAAAPeAAAAFgAAADY////+P///w9ZBwAABAAAAA9jAAAAQwAAAMP////j////D1oHAAAEAAAAD3YAAABWAAAA1v////b///8PWwcAAAQAAAAPYgAAAEIAAADC////4v///w9cBwAABAAAAA9uAAAATgAAAM7////u////D10HAAAEAAAAD20AAABNAAAAzf///+3///8PXgcAAAIAAAAPLAAAADwAAAAPXwcAAAIAAAAPLgAAAD4AAAAPYAcAAAIAAAAPLwAAAD8AAAAPYQcAAAIAAAAPPAAAAD4AAAAPYgcAAAAAAAAPD2MHAAAEAAAAD2AAAAB+AAAArf///73///8PZAcAAAQAAAAPMQAAACEAAAAxAAAAIQAAAA9lBwAABAAAAA8yAAAAQAAAADIAAAAiAAAAD2YHAAAEAAAADzMAAAAjAAAAMwAAACcAAAAPZwcAAAQAAAAPNAAAACQAAAA0AAAAKgAAAA9oBwAABAAAAA81AAAAJQAAADUAAAA6AAAAD2kHAAAEAAAADzYAAABeAAAANgAAACwAAAAPagcAAAQAAAAPNwAAACYAAAA3AAAALgAAAA9rBwAABAAAAA84AAAAKgAAADgAAAA7AAAAD2wHAAAEAAAADzkAAAAoAAAAOQAAACgAAAAPbQcAAAQAAAAPMAAAACkAAAAwAAAAKQAAAA9uBwAABAAAAA8tAAAAXwAAAC0AAABfAAAAD28HAAAEAAAADz0AAAArAAAAPQAAACsAAAAPcAcAAAQAAAAPcQAAAFEAAADK////6v///w9xBwAABAAAAA93AAAAVwAAAMP////j////D3IHAAAEAAAAD2UAAABFAAAA1f////X///8PcwcAAAQAAAAPcgAAAFIAAADL////6////w90BwAABAAAAA90AAAAVAAAAMX////l////D3UHAAAEAAAAD3kAAABZAAAAzv///+7///8PdgcAAAQAAAAPdQAAAFUAAADH////5////w93BwAABAAAAA9pAAAASQAAANv////7////D3gHAAAEAAAAD28AAABPAAAA3f////3///8PeQcAAAQAAAAPcAAAAFAAAADa////+v///w96BwAABAAAAA9bAAAAewAAAMj////o////D3sHAAAEAAAAD10AAAB9AAAAp////7f///8PfAcAAAQAAAAPYQAAAEEAAADG////5v///w99BwAABAAAAA9zAAAAUwAAAKb///+2////D34HAAAEAAAAD2QAAABEAAAA1/////f///8PfwcAAAQAAAAPZgAAAEYAAADB////4f///w+ABwAABAAAAA9nAAAARwAAAND////w////D4EHAAAEAAAAD2gAAABIAAAA0v////L///8PggcAAAQAAAAPagAAAEoAAADP////7////w+DBwAABAAAAA9rAAAASwAAAMz////s////D4QHAAAEAAAAD2wAAABMAAAAxP///+T///8PhQcAAAQAAAAPOwAAADoAAADW////9v///w+GBwAABAAAAA8nAAAAIgAAAKT///+0////D4cHAAAEAAAAD1wAAAB8AAAAXAAAAHwAAAAPiAcAAAQAAAAPegAAAFoAAADR////8f///w+JBwAABAAAAA94AAAAWAAAAN7////+////D4oHAAAEAAAAD2MAAABDAAAA0/////P///8PiwcAAAQAAAAPdgAAAFYAAADN////7f///w+MBwAABAAAAA9iAAAAQgAAAMn////p////D40HAAAEAAAAD24AAABOAAAA1P////T///8PjgcAAAQAAAAPbQAAAE0AAADY////+P///w+PBwAABAAAAA8sAAAAPAAAAML////i////D5AHAAAEAAAADy4AAAA+AAAAwP///+D///8PkQcAAAQAAAAPLwAAAD8AAAAvAAAAPwAAAA+SBwAAAgAAAA88AAAAPgAAAA+TBwAAAAAAAA8PlAcAAAIAAAAPrf///73///8PlQcAAAIAAAAPMQAAACEAAAAPlgcAAAIAAAAPMgAAACIAAAAPlwcAAAIAAAAPMwAAACcAAAAPmAcAAAIAAAAPNAAAADsAAAAPmQcAAAIAAAAPNQAAACUAAAAPmgcAAAIAAAAPNgAAADoAAAAPmwcAAAIAAAAPNwAAAD8AAAAPnAcAAAIAAAAPOAAAACoAAAAPnQcAAAIAAAAPOQAAACgAAAAPngcAAAIAAAAPMAAAACkAAAAPnwcAAAIAAAAPLQAAAF8AAAAPoAcAAAIAAAAPPQAAACsAAAAPoQcAAAIAAAAPyv///+r///8PogcAAAIAAAAPw////+P///8PowcAAAIAAAAP1f////X///8PpAcAAAIAAAAPy////+v///8PpQcAAAIAAAAPxf///+X///8PpgcAAAIAAAAPzv///+7///8PpwcAAAIAAAAPx////+f///8PqAcAAAIAAAAP2/////v///8PqQcAAAIAAAAP3f////3///8PqgcAAAIAAAAP2v////r///8PqwcAAAIAAAAPyP///+j///8PrAcAAAIAAAAPp////7f///8PrQcAAAIAAAAPxv///+b///8PrgcAAAIAAAAPpv///7b///8PrwcAAAIAAAAP1/////f///8PsAcAAAIAAAAPwf///+H///8PsQcAAAIAAAAP0P////D///8PsgcAAAIAAAAP0v////L///8PswcAAAIAAAAPz////+////8PtAcAAAIAAAAPzP///+z///8PtQcAAAIAAAAPxP///+T///8PtgcAAAIAAAAP1v////b///8PtwcAAAIAAAAPpP///7T///8PuAcAAAIAAAAPXAAAAC8AAAAPuQcAAAIAAAAP0f////H///8PugcAAAIAAAAP3v////7///8PuwcAAAIAAAAP0/////P///8PvAcAAAIAAAAPzf///+3///8PvQcAAAIAAAAPyf///+n///8PvgcAAAIAAAAP1P////T///8PvwcAAAIAAAAP2P////j///8PwAcAAAIAAAAPwv///+L///8PwQcAAAIAAAAPwP///+D///8PwgcAAAIAAAAPLgAAACwAAAAPwwcAAAIAAAAPPAAAAD4AAAAPxAcAAAAAAAAPD8UHAAACAAAAD6P///+z////D8YHAAACAAAADzEAAAAhAAAAD8cHAAACAAAADzIAAAAiAAAAD8gHAAACAAAADzMAAAAnAAAAD8kHAAACAAAADzQAAAA7AAAAD8oHAAACAAAADzUAAAAlAAAAD8sHAAACAAAADzYAAAA6AAAAD8wHAAACAAAADzcAAAA/AAAAD80HAAACAAAADzgAAAAqAAAAD84HAAACAAAADzkAAAAoAAAAD88HAAACAAAADzAAAAApAAAAD9AHAAACAAAADy0AAABfAAAAD9EHAAACAAAADz0AAAArAAAAD9IHAAACAAAAD8r////q////D9MHAAACAAAAD8P////j////D9QHAAACAAAAD9X////1////D9UHAAACAAAAD8v////r////D9YHAAACAAAAD8X////l////D9cHAAACAAAAD87////u////D9gHAAACAAAAD8f////n////D9kHAAACAAAAD9v////7////D9oHAAACAAAAD93////9////D9sHAAACAAAAD9r////6////D9wHAAACAAAAD8j////o////D90HAAACAAAAD9//////////D94HAAACAAAAD8b////m////D98HAAACAAAAD9n////5////D+AHAAACAAAAD9f////3////D+EHAAACAAAAD8H////h////D+IHAAACAAAAD9D////w////D+MHAAACAAAAD9L////y////D+QHAAACAAAAD8/////v////D+UHAAACAAAAD8z////s////D+YHAAACAAAAD8T////k////D+cHAAACAAAAD9b////2////D+gHAAACAAAAD9z////8////D+kHAAACAAAAD1wAAAAvAAAAD+oHAAACAAAAD9H////x////D+sHAAACAAAAD97////+////D+wHAAACAAAAD9P////z////D+0HAAACAAAAD83////t////D+4HAAACAAAAD8n////p////D+8HAAACAAAAD9T////0////D/AHAAACAAAAD9j////4////D/EHAAACAAAAD8L////i////D/IHAAACAAAAD8D////g////D/MHAAAC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CAAAAwAAAA8yAAAAIgAAALf///8PjAgAAAMAAAAPMwAAACsAAABeAAAAD40IAAADAAAADzQAAAAhAAAAov///w+OCAAABAAAAA81AAAAJQAAADAAAACw////D48IAAADAAAADzYAAAAvAAAAsv///w+QCAAAAwAAAA83AAAAPQAAAGAAAAAPkQgAAAMAAAAPOAAAACgAAAD/////D5IIAAADAAAADzkAAAApAAAAtP///w+TCAAAAwAAAA/2////1v///73///8PlAgAAAMAAAAP/P///9z///+o////D5UIAAADAAAAD/P////T////uP///w+WCAAAAwAAAA9xAAAAUQAAAFwAAAAPlwgAAAMAAAAPdwAAAFcAAAB8AAAAD5gIAAACAAAAD2UAAABFAAAAD5kIAAACAAAAD3IAAABSAAAAD5oIAAACAAAAD3QAAABUAAAAD5sIAAACAAAAD3oAAABaAAAAD5wIAAACAAAAD3UAAABVAAAAD50IAAADAAAAD2kAAABJAAAAzf///w+eCAAAAwAAAA9vAAAATwAAAPj///8PnwgAAAIAAAAPcAAAAFAAAAAPoAgAAAMAAAAP9f///9X////3////D6EIAAADAAAAD/r////a////1////w+iCAAAAgAAAA9hAAAAQQAAAA+jCAAAAwAAAA9zAAAAUwAAAPD///8PpAgAAAMAAAAPZAAAAEQAAADQ////D6UIAAADAAAAD2YAAABGAAAAWwAAAA+mCAAAAwAAAA9nAAAARwAAAF0AAAAPpwgAAAIAAAAPaAAAAEgAAAAPqAgAAAMAAAAPagAAAEoAAADt////D6kIAAADAAAAD2sAAABLAAAAs////w+qCAAAAwAAAA9sAAAATAAAAKP///8PqwgAAAMAAAAP6f///8n///8kAAAAD6wIAAADAAAAD+H////B////3////w+tCAAAAwAAAA/7////2////6T///8PrggAAAMAAAAPeQAAAFkAAAA+AAAAD68IAAADAAAAD3gAAABYAAAAIwAAAA+wCAAAAwAAAA9jAAAAQwAAACYAAAAPsQgAAAMAAAAPdgAAAFYAAABAAAAAD7IIAAADAAAAD2IAAABCAAAAewAAAA+zCAAAAwAAAA9uAAAATgAAAH0AAAAPtAgAAAIAAAAPbQAAAE0AAAAPtQgAAAMAAAAP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CQAAAgAAAA9uAAAATgAAAA8WCQAAAgAAAA9tAAAATQAAAA8XCQAAAgAAAA8sAAAAOwAAAA8YCQAAAgAAAA8uAAAAOgAAAA8ZCQAAAgAAAA8tAAAAXwAAAA8aCQAAAgAAAA88AAAAPgAAAA8bCQAAAAAAAA8PHAkAAAIAAAAPYAAAAH4AAAAPHQkAAAIAAAAPMQAAACEAAAAPHgkAAAIAAAAPMgAAACIAAAAPHwkAAAIAAAAPMwAAACMAAAAPIAkAAAIAAAAPNAAAACQAAAAPIQkAAAIAAAAPNQAAACUAAAAPIgkAAAIAAAAPNgAAACYAAAAPIwkAAAIAAAAPNwAAAC8AAAAPJAkAAAIAAAAPOAAAACgAAAAPJQkAAAIAAAAPOQAAACkAAAAPJgkAAAIAAAAPMAAAAD0AAAAPJwkAAAIAAAAPJwAAAD8AAAAPKAkAAAIAAAAPKwAAACoAAAAPKQkAAAIAAAAPqf///7n///8PKgkAAAIAAAAPqv///7r///8PKwkAAAIAAAAPxf///+X///8PLAkAAAIAAAAP0v////L///8PLQkAAAIAAAAP1P////T///8PLgkAAAIAAAAP2v////r///8PLwkAAAIAAAAP1f////X///8PMAkAAAIAAAAPyf///+n///8PMQkAAAIAAAAPz////+////8PMgkAAAIAAAAP0P////D///8PMwkAAAIAAAAP2/////v///8PNAkAAAIAAAAPWwAAAF0AAAAPNQkAAAIAAAAPwf///+H///8PNgkAAAIAAAAP0/////P///8PNwkAAAIAAAAPxP///+T///8POAkAAAIAAAAPxv///+b///8POQkAAAIAAAAPx////+f///8POgkAAAIAAAAPyP///+j///8POwkAAAIAAAAPqP///7j///8PPAkAAAIAAAAPy////+v///8PPQkAAAIAAAAPzP///+z///8PPgkAAAIAAAAP3v////7///8PPwkAAAIAAAAPq////7v///8PQAkAAAIAAAAPLQAAAF8AAAAPQQkAAAIAAAAPof///7H///8PQgkAAAIAAAAPr////7////8PQwkAAAIAAAAPw////+P///8PRAkAAAIAAAAP1/////f///8PRQkAAAIAAAAPwv///+L///8PRgkAAAIAAAAPzv///+7///8PRwkAAAIAAAAPzf///+3///8PSAkAAAIAAAAPLAAAADsAAAAPSQkAAAIAAAAPLgAAADoAAAAPSgkAAAIAAAAP1v////b///8PSwkAAAIAAAAPPAAAAD4AAAAPTAkAAAAAAAAPD00JAAACAAAAD2AAAAB+AAAAD04JAAACAAAADzEAAAAhAAAAD08JAAAEAAAADzIAAABAAAAAMgAAACIAAAAPUAkAAAIAAAAPMwAAACMAAAAPUQkAAAIAAAAPNAAAACQAAAAPUgkAAAIAAAAPNQAAACUAAAAPUwkAAAQAAAAPNgAAAF4AAAA2AAAAJgAAAA9UCQAABAAAAA83AAAAJgAAADcAAAAvAAAAD1UJAAAEAAAADzgAAAAqAAAAOAAAACgAAAAPVgkAAAQAAAAPOQAAACgAAAA5AAAAKQAAAA9XCQAABAAAAA8wAAAAKQAAADAAAAA9AAAAD1gJAAAEAAAADy0AAABfAAAAJwAAAD8AAAAPWQkAAAQAAAAPPQAAACsAAAArAAAAKgAAAA9aCQAABAAAAA9xAAAAUQAAAKn///+5////D1sJAAAEAAAAD3cAAABXAAAAqv///7r///8PXAkAAAQAAAAPZQAAAEUAAADF////5f///w9dCQAABAAAAA9yAAAAUgAAANL////y////D14JAAAEAAAAD3QAAABUAAAA1P////T///8PXwkAAAQAAAAPeQAAAFkAAADa////+v///w9gCQAABAAAAA91AAAAVQAAANX////1////D2EJAAAEAAAAD2kAAABJAAAAyf///+n///8PYgkAAAQAAAAPbwAAAE8AAADP////7////w9jCQAABAAAAA9wAAAAUAAAAND////w////D2QJAAAEAAAAD1sAAAB7AAAA2/////v///8PZQkAAAQAAAAPXQAAAH0AAABbAAAAXQAAAA9mCQAABAAAAA9hAAAAQQAAAMH////h////D2cJAAAEAAAAD3MAAABTAAAA0/////P///8PaAkAAAQAAAAPZAAAAEQAAADE////5P///w9pCQAABAAAAA9mAAAARgAAAMb////m////D2oJAAAEAAAAD2cAAABHAAAAx////+f///8PawkAAAQAAAAPaAAAAEgAAADI////6P///w9sCQAABAAAAA9qAAAASgAAAKj///+4////D20JAAAEAAAAD2sAAABLAAAAy////+v///8PbgkAAAQAAAAPbAAAAEwAAADM////7P///w9vCQAABAAAAA87AAAAOgAAAN7////+////D3AJAAAEAAAADycAAAAiAAAAq////7v///8PcQkAAAQAAAAPXAAAAHwAAAAtAAAAXwAAAA9yCQAABAAAAA96AAAAWgAAAKH///+x////D3MJAAAEAAAAD3gAAABYAAAAr////7////8PdAkAAAQAAAAPYwAAAEMAAADD////4////w91CQAABAAAAA92AAAAVgAAANf////3////D3YJAAAEAAAAD2IAAABCAAAAwv///+L///8PdwkAAAQAAAAPbgAAAE4AAADO////7v///w94CQAABAAAAA9tAAAATQAAAM3////t////D3kJAAAEAAAADywAAAA8AAAALAAAADsAAAAPegkAAAQAAAAPLgAAAD4AAAAuAAAAOgAAAA97CQAABAAAAA8vAAAAPwAAANb////2////D3wJAAACAAAADzwAAAA+AAAAD30JAAAAAAAADw9+CQAAAgAAAA+4////qP///w9/CQAAAgAAAA8xAAAAIQAAAA+ACQAAAgAAAA8yAAAAIgAAAA+BCQAAAgAAAA8zAAAAIwAAAA+CCQAAAgAAAA80AAAAJAAAAA+DCQAAAgAAAA81AAAAJQAAAA+ECQAAAgAAAA82AAAAJgAAAA+FCQAAAgAAAA83AAAALwAAAA+GCQAAAgAAAA84AAAAKAAAAA+HCQAAAgAAAA85AAAAKQAAAA+ICQAAAgAAAA8wAAAAPQAAAA+JCQAAAgAAAA8nAAAAPwAAAA+KCQAAAgAAAA8rAAAAKgAAAA+LCQAAAgAAAA9xAAAAUQAAAA+MCQAAAgAAAA93AAAAVwAAAA+NCQAAAgAAAA9lAAAARQAAAA+OCQAAAgAAAA9yAAAAUgAAAA+PCQAAAgAAAA90AAAAVAAAAA+QCQAAAgAAAA96AAAAWgAAAA+RCQAAAgAAAA91AAAAVQAAAA+SCQAAAgAAAA9pAAAASQAAAA+TCQAAAgAAAA9vAAAATwAAAA+UCQAAAgAAAA9wAAAAUAAAAA+VCQAAAgAAAA+5////qf///w+WCQAAAgAAAA/w////0P///w+XCQAAAgAAAA9hAAAAQQAAAA+YCQAAAgAAAA9zAAAAUwAAAA+ZCQAAAgAAAA9kAAAA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AAAAD2oAAABKAAAAD2IKAAACAAAAD2sAAABLAAAAD2MKAAACAAAAD2wAAABMAAAAD2QKAAACAAAAD/T///8iAAAAD2UKAAACAAAAD6f///8hAAAAD2YKAAACAAAAD/L///8pAAAAD2cKAAACAAAAD3oAAABaAAAAD2gKAAACAAAAD3gAAABYAAAAD2kKAAACAAAAD2MAAABDAAAAD2oKAAACAAAAD3YAAABWAAAAD2sKAAACAAAAD2IAAABCAAAAD2wKAAACAAAAD24AAABOAAAAD20KAAACAAAAD20AAABNAAAAD24KAAACAAAADywAAAA/AAAAD28KAAACAAAADy4AAAA6AAAAD3AKAAACAAAADy0AAABfAAAAD3EKAAACAAAADzwAAAA+AAAAD3IKAAAAAAAADw9zCgAAAgAAAA9gAAAAfgAAAA90CgAAAgAAAA8xAAAAIQAAAA91CgAAAgAAAA8yAAAAQAAAAA92CgAAAgAAAA8zAAAAIwAAAA93CgAAAgAAAA80AAAAJAAAAA94CgAAAgAAAA81AAAAJQAAAA95CgAAAgAAAA82AAAAXgAAAA96CgAAAgAAAA83AAAAJgAAAA97CgAAAgAAAA84AAAAKgAAAA98CgAAAgAAAA85AAAAKAAAAA99CgAAAgAAAA8wAAAAKQAAAA9+CgAAAgAAAA8tAAAAXwAAAA9/CgAAAgAAAA89AAAAKwAAAA+ACgAABAAAAA9xAAAAUQAAAOT////E////D4EKAAAEAAAAD3cAAABXAAAA7P///8z///8PggoAAAQAAAAPZQAAAEUAAADp////yf///w+DCgAABAAAAA9yAAAAUgAAAPj////Y////D4QKAAAEAAAAD3QAAABUAAAAu////6v///8PhQoAAAQAAAAPeQAAAFkAAAD9////3f///w+GCgAABAAAAA91AAAAVQAAAPn////Z////D4cKAAAEAAAAD2kAAABJAAAA7f///83///8PiAoAAAQAAAAPbwAAAE8AAADz////0////w+JCgAABAAAAA9wAAAAUAAAAPb////W////D4oKAAACAAAAD1sAAAB7AAAAD4sKAAACAAAAD10AAAB9AAAAD4wKAAAEAAAAD2EAAABBAAAA4f///8H///8PjQoAAAQAAAAPcwAAAFMAAAC5////qf///w+OCgAABAAAAA9kAAAARAAAAO/////P////D48KAAAEAAAAD2YAAABGAAAA6////8v///8PkAoAAAQAAAAPZwAAAEcAAADg////wP///w+RCgAABAAAAA9oAAAASAAAAPr////a////D5IKAAAEAAAAD2oAAABKAAAA/P///9z///8PkwoAAAQAAAAPawAAAEsAAAD0////1P///w+UCgAABAAAAA9sAAAATAAAALX///+l////D5UKAAACAAAADzsAAAA6AAAAD5YKAAACAAAADycAAAAiAAAAD5cKAAACAAAAD1wAAAB8AAAAD5gKAAAEAAAAD3oAAABaAAAAvv///67///8PmQoAAAMAAAAPeAAAAFgAAACk////D5oKAAAEAAAAD2MAAABDAAAA6P///8j///8PmwoAAAQAAAAPdgAAAFYAAADn////x////w+cCgAAAgAAAA9iAAAAQgAAAA+dCgAABAAAAA9uAAAATgAAAPL////S////D54KAAAEAAAAD20AAABNAAAA5f///8X///8PnwoAAAIAAAAPLAAAADwAAAAPoAoAAAIAAAAPLgAAAD4AAAAPoQoAAAIAAAAPLwAAAD8AAAAPogoAAAIAAAAPPAAAAD4AAAAPowoAAAAAAAAPD6QKAAABAAAADzsAAAAPpQoAAAIAAAAPKwAAADEAAAAPpgoAAAIAAAAP7P///zIAAAAPpwoAAAIAAAAPuf///zMAAAAPqAoAAAIAAAAP6P///zQAAAAPqQoAAAIAAAAP+P///zUAAAAPqgoAAAIAAAAPvv///zYAAAAPqwoAAAIAAAAP/f///zcAAAAPrAoAAAIAAAAP4f///zgAAAAPrQoAAAIAAAAP7f///zkAAAAPrgoAAAQAAAAP6f///zAAAAC9////KQAAAA+vCgAAAgAAAA89AAAAJQAAAA+wCgAAAAAAAA8PsQoAAAMAAAAPcQAAAFEAAABcAAAAD7IKAAADAAAAD3cAAABXAAAAfAAAAA+zCgAAAgAAAA9lAAAARQAAAA+0CgAAAgAAAA9yAAAAUgAAAA+1CgAAAgAAAA90AAAAVAAAAA+2CgAAAgAAAA95AAAAWQAAAA+3CgAAAgAAAA91AAAAVQAAAA+4CgAAAgAAAA9pAAAASQAAAA+5CgAAAgAAAA9vAAAATwAAAA+6CgAAAgAAAA9wAAAAUAAAAA+7CgAABAAAAA/6////LwAAAFsAAAB7AAAAD7wKAAAEAAAADykAAAAoAAAAXQAAAH0AAAAPvQoAAAIAAAAPYQAAAEEAAAAPvgoAAAMAAAAPcwAAAFMAAADw////D78KAAADAAAAD2QAAABEAAAA0P///w/ACgAAAwAAAA9mAAAARgAAAFsAAAAPwQoAAAMAAAAPZwAAAEcAAABdAAAAD8IKAAACAAAAD2gAAABIAAAAD8MKAAACAAAAD2oAAABKAAAAD8QKAAADAAAAD2sAAABLAAAAs////w/FCgAAAwAAAA9sAAAATAAAAKP///8PxgoAAAMAAAAP+f///yIAAAAkAAAAD8cKAAADAAAAD6f///8hAAAA3////w/ICgAAAgAAAA+o////JwAAAA/JCgAAAwAAAA96AAAAWgAAAD4AAAAPygoAAAMAAAAPeAAAAFgAAAAjAAAAD8sKAAADAAAAD2MAAABDAAAAJgAAAA/MCgAAAwAAAA92AAAAVgAAAEAAAAAPzQoAAAMAAAAPYgAAAEIAAAB7AAAAD84KAAADAAAAD24AAABOAAAAfQAAAA/PCgAAAgAAAA9tAAAATQAAAA/QCgAAAwAAAA8sAAAAPwAAADwAAAAP0QoAAAMAAAAPLgAAADoAAAA+AAAAD9IKAAADAAAADy0AAABfAAAAKgAAAA/TCgAABAAAAA88AAAAPgAAAFwAAAB8AAAAD9QKAAAAAAAADw/VCgAAAQAAAA87AAAAD9YKAAACAAAADysAAAAxAAAAD9cKAAACAAAAD+z///8yAAAAD9gKAAACAAAAD7n///8zAAAAD9kKAAACAAAAD+j///80AAAAD9oKAAACAAAAD/j///81AAAAD9sKAAACAAAAD77///82AAAAD9wKAAACAAAAD/3///83AAAAD90KAAACAAAAD+H///84AAAAD94KAAACAAAAD+3///85AAAAD98KAAACAAAAD+n///8wAAAAD+AKAAACAAAADz0AAAAlAAAAD+EKAAACAAAAD7T///+3////D+IKAAACAAAAD3EAAABRAAAAD+MKAAACAAAAD3cAAABXAAAAD+QKAAACAAAAD2UAAABFAAAAD+UKAAACAAAAD3IAAABSAAAAD+YKAAACAAAAD3QAAABUAAAAD+cKAAACAAAAD3oAAABaAAAAD+gKAAACAAAAD3UA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aQAAAA8WDAAAAgAAAA9lAAAARQAAAA8XDAAAAgAAAA9hAAAAQQAAAA8YDAAAAgAAAA/8////3P///w8ZDAAAAgAAAA90AAAAVAAAAA8aDAAAAgAAAA9rAAAASwAAAA8bDAAAAgAAAA9tAAAATQAAAA8cDAAAAgAAAA9sAAAATAAAAA8dDAAAAgAAAA95AAAAWQAAAA8eDAAAAgAAAA+6////qv///w8fDAAAAgAAAA94AAAAWAAAAA8gDAAAAgAAAA9qAAAASgAAAA8hDAAAAgAAAA/2////1v///w8iDAAAAgAAAA92AAAAVgAAAA8jDAAAAgAAAA9jAAAAQwAAAA8kDAAAAgAAAA/n////x////w8lDAAAAgAAAA96AAAAWgAAAA8mDAAAAgAAAA9zAAAAUwAAAA8nDAAAAgAAAA9iAAAAQgAAAA8oDAAAAgAAAA8uAAAAOgAAAA8pDAAAAgAAAA8sAAAAOwAAAA8qDAAAAgAAAA88AAAAPgAAAA8rDAAAAAAAAA8PLAwAAAMAAAAPYAAAAH4AAAA7AAAADy0MAAACAAAADzEAAAAhAAAADy4MAAACAAAADzIAAABAAAAADy8MAAACAAAADzMAAAAjAAAADzAMAAACAAAADzQAAAAkAAAADzEMAAACAAAADzUAAAAlAAAADzIMAAACAAAADzYAAABeAAAADzMMAAACAAAADzcAAAAmAAAADzQMAAACAAAADzgAAAAqAAAADzUMAAACAAAADzkAAAAoAAAADzYMAAACAAAADzAAAAApAAAADzcMAAACAAAADy0AAABfAAAADzgMAAACAAAADz0AAAArAAAADzkMAAADAAAAD3EAAABRAAAALwAAAA86DAAAAwAAAA93AAAAVwAAACcAAAAPOwwAAAMAAAAPZQAAAEUAAAD3////DzwMAAADAAAAD3IAAABSAAAA+P///w89DAAAAwAAAA90AAAAVAAAAOD///8PPgwAAAMAAAAPeQAAAFkAAADo////Dz8MAAADAAAAD3UAAABVAAAA5f///w9ADAAAAwAAAA9pAAAASQAAAO////8PQQwAAAMAAAAPbwAAAE8AAADt////D0IMAAADAAAAD3AAAABQAAAA9P///w9DDAAAAgAAAA9bAAAAewAAAA9EDAAAAgAAAA9dAAAAfQAAAA9FDAAAAwAAAA9hAAAAQQAAAPn///8PRgwAAAMAAAAPcwAAAFMAAADj////D0cMAAADAAAAD2QAAABEAAAA4v///w9IDAAAAwAAAA9mAAAARgAAAOv///8PSQwAAAMAAAAPZwAAAEcAAADy////D0oMAAADAAAAD2gAAABIAAAA6f///w9LDAAAAwAAAA9qAAAASgAAAOf///8PTAwAAAMAAAAPawAAAEsAAADs////D00MAAADAAAAD2wAAABMAAAA6v///w9ODAAAAwAAAA87AAAAOgAAAPP///8PTwwAAAMAAAAPJwAAACIAAAAsAAAAD1AMAAACAAAAD1wAAAB8AAAAD1EMAAADAAAAD3oAAABaAAAA5v///w9SDAAAAwAAAA94AAAAWAAAAPH///8PUwwAAAMAAAAPYwAAAEMAAADh////D1QMAAADAAAAD3YAAABWAAAA5P///w9VDAAAAwAAAA9iAAAAQgAAAPD///8PVgwAAAMAAAAPbgAAAE4AAADu////D1cMAAADAAAAD20AAABNAAAA9v///w9YDAAAAwAAAA8sAAAAPAAAAPr///8PWQwAAAMAAAAPLgAAAD4AAAD1////D1oMAAADAAAADy8AAAA/AAAALgAAAA9bDAAAAgAAAA88AAAAPgAAAA9cDAAAAAAAAA8PXQwAAAIAAAAPYAAAAH4AAAAPXgwAAAIAAAAPMQAAACEAAAAPXwwAAAIAAAAPMgAAAEAAAAAPYAwAAAIAAAAPMwAAACMAAAAPYQwAAAIAAAAPNAAAACQAAAAPYgwAAAIAAAAPNQAAACUAAAAPYwwAAAIAAAAPNgAAAF4AAAAPZAwAAAIAAAAPNwAAACYAAAAPZQwAAAIAAAAPOAAAACoAAAAPZgwAAAIAAAAPOQAAACgAAAAPZwwAAAIAAAAPMAAAACkAAAAPaAwAAAIAAAAPLQAAAF8AAAAPaQwAAAIAAAAPPQAAACsAAAAPagwAAAMAAAAPcQAAAFEAAAD3////D2sMAAADAAAAD3cAAABXAAAA5f///w9sDAAAAwAAAA9lAAAARQAAAOD///8PbQwAAAMAAAAPcgAAAFIAAAD4////D24MAAADAAAAD3QAAABUAAAA+v///w9vDAAAAwAAAA95AAAAWQAAAPL///8PcAwAAAMAAAAPdQAAAFUAAADl////D3EMAAADAAAAD2kAAABJAAAA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xf///w8ADQAABAAAAA9yAAAAUgAAAPH////R////DwENAAAEAAAAD3QAAABUAAAA9P///9T///8PAg0AAAQAAAAPeQAAAFkAAAD1////1f///w8DDQAABAAAAA91AAAAVQAAAOj////I////DwQNAAAEAAAAD2kAAABJAAAA6f///8n///8PBQ0AAAQAAAAPbwAAAE8AAADv////z////w8GDQAABAAAAA9wAAAAUAAAAPD////Q////DwcNAAACAAAAD1sAAAB7AAAADwgNAAACAAAAD10AAAB9AAAADwkNAAAEAAAAD2EAAABBAAAA4f///8H///8PCg0AAAIAAAAPcwAAAFMAAAAPCw0AAAQAAAAPZAAAAEQAAADk////xP///w8MDQAABAAAAA9mAAAARgAAAPb////W////Dw0NAAAEAAAAD2cAAABHAAAA4////8P///8PDg0AAAQAAAAPaAAAAEgAAADn////x////w8PDQAABAAAAA9qAAAASgAAAO7////O////DxANAAAEAAAAD2sAAABLAAAA6v///8r///8PEQ0AAAQAAAAPbAAAAEwAAADr////y////w8SDQAABAAAAA87AAAAOgAAALT///+o////DxMNAAACAAAADycAAAAiAAAADxQNAAACAAAAD1wAAAB8AAAADxUNAAAEAAAAD3oAAABaAAAA5v///8b///8PFg0AAAQAAAAPeAAAAFgAAAD3////1////w8XDQAABAAAAA9jAAAAQwAAAPj////Y////DxgNAAAEAAAAD3YAAABWAAAA+f///9n///8PGQ0AAAQAAAAPYgAAAEIAAADi////wv///w8aDQAABAAAAA9uAAAATgAAAO3////N////DxsNAAAEAAAAD20AAABNAAAA7P///8z///8PHA0AAAIAAAAPLAAAADwAAAAPHQ0AAAIAAAAPLgAAAD4AAAAPHg0AAAIAAAAPLwAAAD8AAAAPHw0AAAIAAAAPPAAAAD4AAAAPIA0AAAAAAAAPDyENAAAEAAAAD2AAAAB+AAAAXwAAACUAAAAPIg0AAAQAAAAPMQAAACEAAADl////KwAAAA8jDQAABAAAAA8yAAAAQAAAAC8AAADx////DyQNAAAEAAAADzMAAAAjAAAALQAAAPL///8PJQ0AAAQAAAAPNAAAACQAAADA////8////w8mDQAABAAAAA81AAAAJQAAALb////0////DycNAAAEAAAADzYAAABeAAAA2P///9n///8PKA0AAAQAAAAPNwAAACYAAADW////3////w8pDQAABAAAAA84AAAAKgAAAKT////1////DyoNAAAEAAAADzkAAAAoAAAAtf////b///8PKw0AAAQAAAAPMAAAACkAAACo////9////w8sDQAABAAAAA8tAAAAXwAAAKL////4////Dy0NAAAEAAAADz0AAAArAAAAqv////n///8PLg0AAAQAAAAPcQAAAFEAAADm////8P///w8vDQAABAAAAA93AAAAVwAAAOT///8iAAAADzANAAAEAAAAD2UAAABFAAAA0////67///8PMQ0AAAQAAAAPcgAAAFIAAAC+////sf///w8yDQAABAAAAA90AAAAVAAAAND///+4////DzMNAAAEAAAAD3kAAABZAAAA0f///+3///8PNA0AAAQAAAAPdQAAAFUAAADV////6v///w81DQAABAAAAA9pAAAASQAAAMP///+z////DzYNAAAEAAAAD28AAABPAAAAuf///8////8PNw0AAAQAAAAPcAAAAFAAAADC////rf///w84DQAABAAAAA9bAAAAewAAALr///+w////DzkNAAAEAAAAD10AAAB9AAAAxf///ywAAAAPOg0AAAQAAAAPYQAAAEEAAAC/////xP///w87DQAABAAAAA9zAAAAUwAAAMv///+m////DzwNAAAEAAAAD2QAAABEAAAAof///6////8PPQ0AAAQAAAAPZgAAAEYAAAC0////4v///w8+DQAABAAAAA9nAAAARwAAAOD///+s////Dz8NAAAEAAAAD2gAAABIAAAA6f///+f///8PQA0AAAQAAAAPagAAAEoAAADo////6////w9BDQAABAAAAA9rAAAASwAAANL////J////D0INAAAEAAAAD2wAAABMAAAAyv///8j///8PQw0AAAQAAAAPOwAAADoAAADH////q////w9EDQAABAAAAA8nAAAAIgAAAKf///8uAAAAD0UNAAAEAAAAD1wAAAB8AAAAo////6X///8PRg0AAAQAAAAPegAAAFoAAAC8////KAAAAA9HDQAABAAAAA94AAAAWAAAALv///8pAAAAD0gNAAAEAAAAD2MAAABDAAAA4f///6n///8PSQ0AAAQAAAAPdgAAAFYAAADN////zv///w9KDQAAAwAAAA9iAAAAQgAAANr///8PSw0AAAQAAAAPbgAAAE4AAADX////7P///w9MDQAABAAAAA9tAAAATQAAALf///8/AAAAD00NAAAEAAAADywAAAA8AAAAwf///7L///8PTg0AAAQAAAAPLgAAAD4AAADj////zP///w9PDQAABAAAAA8vAAAAPwAAAL3////G////D1ANAAAAAAAADw9RDQAAAAAAAA8PUg0AAAIAAAAPQAAAAKf///8PUw0AAAIAAAAPMQAAACEAAAAPVA0AAAIAAAAPMgAAACIAAAAPVQ0AAAIAAAAPMwAAACMAAAAPVg0AAAIAAAAPNAAAACQAAAAPVw0AAAIAAAAPNQAAACUAAAAPWA0AAAIAAAAPNgAAACYAAAAPWQ0AAAIAAAAPNwAAAF8AAAAPWg0AAAIAAAAPOAAAACgAAAAPWw0AAAIAAAAPOQAAACkAAAAPXA0AAAIAAAAPMAAAACcAAAAPXQ0AAAIAAAAPLwAAAD8AAAAPXg0AAAIAAAAPsP///34AAAAPXw0AAAIAAAAPcQAAAFEAAAAPYA0AAAIAAAAPdwAAAFcAAAAPYQ0AAAIAAAAPZQAAAEUAAAAPYg0AAAIAAAAPcgAAAFIAAAAPYw0AAAIAAAAPdAAAAFQAAAAPZA0AAAIAAAAPeQAAAFkAAAAPZQ0AAAIAAAAPdQAAAFUAAAAPZg0AAAIAAAAPaQAAAEkAAAAPZw0AAAIAAAAPbwAAAE8AAAAPaA0AAAIAAAAPcAAAAFAAAAAPaQ0AAAIAAAAPqP///34AAAAPag0AAAIAAAAPKgAAAHwAAAAPaw0AAAIAAAAPYQAAAEEAAAAPbA0AAAIAAAAPcwAAAFMAAAAPbQ0AAAIAAAAPZAAAAEQAAAAPbg0AAAIAAAAPZgAAAEYAAAAPbw0AAAIAAAAPZwAAAEcAAAAPcA0AAAIAAAAPaAAAAEgAAAAPcQ0AAAIAAAAPagAAAEoAAAAPcg0AAAIAAAAPawAAAEsAAAAPcw0AAAIAAAAPbAAAAEwAAAAPdA0AAAIAAAAPKwAAALH///8PdQ0AAAIAAAAPJwAAAGAAAAAPdg0AAAIAAAAPPAAAAD4AAAAPdw0AAAIAAAAPegAAAFoAAAAPeA0AAAIAAAAPeAAAAFgAAAAPeQ0AAAIAAAAPYwAAAEMAAAAPeg0AAAIAAAAPdgAAAFYAAAAPew0AAAIAAAAPYgAAAEIAAAAPfA0AAAIAAAAPbgAAAE4AAAAPfQ0AAAIAAAAPbQAAAE0AAAAPfg0AAAIAAAAPLAAAADsAAAAPfw0AAAIAAAAPLgAAADoAAAAPgA0AAAIAAAAPLQAAAD0AAAAPgQ0AAAIAAAAPWwAAAF0AAAAPgg0AAAAAAAAPCw==AAEAAAD/////AQAAAAAAAAAHAQAAAAEBAAAABQAAAAcHCQIAAAAJAwAAAAkEAAAACQUAAAAJBgAAAA8CAAAAMAAAAAcpAAIAAwAEAAUABgAHAAgACQAKAAsADAANABAAEQASABMAFAAVABYAFwAYABkAGgAbAB4AHwAgACEAIgAjACQAJQAmACcAKAArACwALQAuAC8AMAAxADIAMwA0ADUAVgAPAwAAADAAAAAHKQACAAMABAAFAAYABwAIAAkACgALABoAGwAoADMANAAZABUAIQAiAC4AEwAmADUADQAeABgAEgAWABcAIAAjABQAMQAfAAwAKwAnABAAJAAlAC0AMAAyABEALwAsAFYADwQAAAAyAAAABykAAgADAAQABQAGAAcACAAJAAoACwAMAA0AEAARABIAEwAUABUAFgAXABgAGQAaABsAHgAfACAAIQAiACMAJAAlACYAJwAoACsAXgAsAC0ALgAvADAAMQAyADMANAA1AFYANQAPBQAAADAAAAAHAgADAAQABQAGAAcACAAJAAoACwAMAA0AKQAQABEAEgATABQAFQAWABcAGAAZABoAGwAeAB8AIAAhACIAIwAkACUAJgAnACgAKwAsAC0ALgAvADAAMQAyADMANAA1AFYADwYAAAAwAAAABwIAAwAEAAUABgAHAAgACQAKAAsADAANABoAGwAnACgAKQAzADQANQArAB4AMAAuACAAEgAhACIAIwAXACQAJQAmADIAMQAYABkAEAATAB8AFAAWAC8AEQAtABUALABWAAs=AAEAAAD/////AQAAAAAAAAAHAQAAAAEBAAAACQAAAAcICQIAAAAJAwAAAAkEAAAACQUAAAAJBgAAAAkHAAAACQgAAAAJCQAAAAkKAAAADwIAAAAwAAAACMAAAAAxAAAAMgAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAAwAAAAvQAAALsAAABRAAAAVwAAAEUAAABSAAAAVAAAAFkAAABVAAAASQAAAE8AAABQAAAA2wAAAN0AAABBAAAAUwAAAEQAAABGAAAARwAAAEgAAABKAAAASwAAAEwAAAC6AAAA3gAAANwAAABaAAAAWAAAAEMAAABWAAAAQgAAAE4AAABNAAAAvAAAAL4AAAC/AAAA4gAAAA8DAAAAMAAAAAjAAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAMAAAAL0AAAC7AAAAUQAAAFcAAABFAAAAUgAAAFQAAABaAAAAVQAAAEkAAABPAAAAUAAAANsAAADdAAAAQQAAAFMAAABEAAAARgAAAEcAAABIAAAASgAAAEsAAABMAAAAugAAAN4AAADcAAAAWQAAAFgAAABDAAAAVgAAAEIAAABOAAAATQAAALwAAAC+AAAAvwAAAOIAAAAPBAAAADAAAAAIwAAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADAAAADbAAAA3QAAAN4AAAC8AAAAvgAAAFAAAABZAAAARgAAAEcAAABDAAAAUgAAAEwAAAC/AAAAuwAAAEEAAABPAAAARQAAAFUAAABJAAAARAAAAEgAAABUAAAATgAAAFMAAAC9AAAA3AAAALoAAABRAAAASgAAAEsAAABYAAAAQgAAAE0AAABXAAAAVgAAAFoAAADiAAAADwUAAAAwAAAACN4AAAAxAAAAMgAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAAwAAAA2wAAALsAAABBAAAAWgAAAEUAAABSAAAAVAAAAFkAAABVAAAASQAAAE8AAABQAAAA3QAAALoAAABRAAAAUwAAAEQAAABGAAAARwAAAEgAAABKAAAASwAAAEwAAABNAAAAwAAAANwAAABXAAAAWAAAAEMAAABWAAAAQgAAAE4AAAC8AAAAvgAAAL8AAADfAAAA4gAAAA8GAAAAMAAAAAjeAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAMAAAANsAAAC7AAAAQQAAAFoAAABFAAAAUgAAAFQAAABZAAAAVQAAAEkAAABPAAAAUAAAAN0AAAC6AAAAUQAAAFMAAABEAAAARgAAAEcAAABIAAAASgAAAEsAAABMAAAATQAAAMAAAADcAAAAVwAAAFgAAABDAAAAVgAAAEIAAABOAAAAvAAAAL4AAAC/AAAA3wAAAOIAAAAPBwAAADAAAAAI3gAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADAAAADbAAAAuwAAAEEAAABaAAAARQAAAFIAAABUAAAAWQAAAFUAAABJAAAATwAAAFAAAADdAAAAugAAAFEAAABTAAAARAAAAEYAAABHAAAASAAAAEoAAABLAAAATAAAAE0AAADAAAAA3AAAAFcAAABYAAAAQwAAAFYAAABCAAAATgAAALwAAAC+AAAAvwAAAN8AAADiAAAADwgAAAAxAAAACN4AAAAxAAAAMgAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAAwAAAAvQAAALsAAABRAAAAVwAAAEUAAABSAAAAVAAAAFkAAABVAAAASQAAAE8AAABQAAAAwAAAANsAAABBAAAAUwAAAEQAAABGAAAARwAAAEgAAABKAAAASwAAAEwAAADfAAAA4gAAAN0AAABaAAAAWAAAAEMAAABWAAAAQgAAAE4AAABNAAAAvAAAAL4AAAC6AAAAvwAAANwAAAAPCQAAADUAAAAI3gAAADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADAAAADbAAAAuwAAAEEAAABaAAAARQAAAFIAAABUAAAAWQAAAFUAAABJAAAATwAAAFAAAADdAAAAugAAAFEAAABTAAAARAAAAEYAAABHAAAASAAAAEoAAABLAAAATAAAAE0AAADAAAAA3AAAAFcAAABYAAAAQwAAAFYAAABCAAAATgAAALwAAAC+AAAAvwAAAN8AAADwAAAA4gAAAPIAAADzAAAA9AAAAPUAAAAPCgAAADAAAAAIMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAMAAAAL0AAAC7AAAA2wAAAN0AAAC6AAAA3gAAAMAAAAC8AAAAvgAAAL8AAADcAAAAQQAAAEIAAABDAAAARAAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAAFEAAABSAAAAUwAAAFQAAABVAAAAVgAAAFcAAABYAAAAWQAAAFoAAADiAAAACw==A4gAAAAs= \ No newline at end of file + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAEdjcmVhdGUta2V5Ym9hcmRzLCBWZXJzaW9uPTAuMC4wLjAsIEN1 + bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAcBAAAAAAEAAABAAAAABCNTeXN0ZW0uV2lu + ZG93cy5Gb3Jtcy5LZXlib2FyZExheW91dAIAAAAJAwAAAAkEAAAACQUAAAAJBgAAAAkHAAAACQgAAAAJ + CQAAAAkKAAAACQsAAAAJDAAAAAkNAAAACQ4AAAAJDwAAAAkQAAAACREAAAAJEgAAAAkTAAAACRQAAAAJ + FQAAAAkWAAAACRcAAAAJGAAAAAkZAAAACRoAAAAJGwAAAAkcAAAACR0AAAAJHgAAAAkfAAAACSAAAAAJ + IQAAAAkiAAAACSMAAAAJJAAAAAklAAAACSYAAAAJJwAAAAkoAAAACSkAAAAJKgAAAAkrAAAACSwAAAAJ + LQAAAAkuAAAACS8AAAAJMAAAAAkxAAAACTIAAAAJMwAAAAk0AAAACTUAAAAJNgAAAAk3AAAACTgAAAAJ + OQAAAAk6AAAACTsAAAAJPAAAAAk9AAAACT4AAAAJPwAAAAlAAAAACUEAAAAJQgAAAAUDAAAAI1N5c3Rl + bS5XaW5kb3dzLkZvcm1zLktleWJvYXJkTGF5b3V0BQAAAARMY2lkBE5hbWUJU2NhbkluZGV4CVZLZXlJ + bmRleARLZXlzAAEEBAMII1N5c3RlbS5XaW5kb3dzLkZvcm1zLlNjYW5UYWJsZUluZGV4AgAAACNTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5WS2V5VGFibGVJbmRleAIAAAARU3lzdGVtLlVJbnQzMltdW10CAAAACQQA + AAZDAAAAHVVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0Bbz///8jU3lzdGVtLldpbmRvd3MuRm9y + bXMuU2NhblRhYmxlSW5kZXgBAAAAB3ZhbHVlX18ACAIAAAAAAAAABbv///8jU3lzdGVtLldpbmRvd3Mu + Rm9ybXMuVktleVRhYmxlSW5kZXgBAAAAB3ZhbHVlX18ACAIAAAAAAAAACUYAAAABBAAAAAMAAAAJBAAA + BkcAAAAzVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pAbj/ + //+8////AAAAAAG3////u////wAAAAAJSgAAAAEFAAAAAwAAAAkEAAAGSwAAACZVbml0ZWQgU3RhdGVz + IGtleWJvYXJkIGxheW91dCAoZHZvcmFrKQG0////vP///wEAAAABs////7v///8CAAAACU4AAAABBgAA + AAMAAAAJBAAABk8AAAArVW5pdGVkIFN0YXRlcyBJbnRlcm5hdGlvbmFsIGtleWJvYXJkIGxheW91dAGw + ////vP///wAAAAABr////7v///8AAAAACVIAAAABBwAAAAMAAAAJCAAABlMAAAAXQnJpdGlzaCBrZXli + b2FyZCBsYXlvdXQBrP///7z///8AAAAAAav///+7////AAAAAAlWAAAAAQgAAAADAAAABwQAAAZXAAAA + Fkdlcm1hbiBrZXlib2FyZCBsYXlvdXQBqP///7z///8AAAAAAaf///+7////AQAAAAlaAAAAAQkAAAAD + AAAABwQAAAZbAAAAKEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMBpP///7z/ + //8AAAAAAaP///+7////AQAAAAleAAAAAQoAAAADAAAABwQAAAZfAAAAL0dlcm1hbiBrZXlib2FyZCBs + YXlvdXQgZm9yIGxvZ2l0ZWNoIGRlc2t0b3AgcHJvAaD///+8////AAAAAAGf////u////wEAAAAJYgAA + AAELAAAAAwAAAAcEAAAGYwAAACxHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlz + IDEwNQGc////vP///wAAAAABm////7v///8DAAAACWYAAAABDAAAAAMAAAAHCAAABmcAAAAcU3dpc3Mg + R2VybWFuIGtleWJvYXJkIGxheW91dAGY////vP///wAAAAABl////7v///8BAAAACWoAAAABDQAAAAMA + AAAMEAAABmsAAAAcU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dAGU////vP///wAAAAABk////7v/ + //8BAAAACW4AAAABDgAAAAMAAAAdBAAABm8AAAAXU3dlZGlzaCBrZXlib2FyZCBsYXlvdXQBkP///7z/ + //8AAAAAAY////+7////BQAAAAlyAAAAAQ8AAAADAAAAJQQAAAZzAAAAGEVzdG9uaWFuIGtleWJvYXJk + IGxheW91dAGM////vP///wAAAAABi////7v///8AAAAACXYAAAABEAAAAAMAAAAUBAAABncAAAAZTm9y + d2VnaWFuIGtleWJvYXJkIGxheW91dAGI////vP///wAAAAABh////7v///8AAAAACXoAAAABEQAAAAMA + AAAGBAAABnsAAAAWRGFuaXNoIGtleWJvYXJkIGxheW91dAGE////vP///wAAAAABg////7v///8AAAAA + CX4AAAABEgAAAAMAAAAMBAAABn8AAAAWRnJlbmNoIGtleWJvYXJkIGxheW91dAGA////vP///wAAAAAB + f////7v///8EAAAACYIAAAABEwAAAAMAAAAMDAAABoMAAAAfQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJk + IGxheW91dAF8////vP///wAAAAABe////7v///8AAAAACYYAAAABFAAAAAMAAAAMDAAABocAAAAnQ2Fu + YWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCAoQ0FfZnIpAXj///+8////AAAAAAF3////u////wAA + AAAJigAAAAEVAAAAAwAAAAwMAAAGiwAAABhDYW5hZGlhbiBrZXlib2FyZCBsYXlvdXQBdP///7z///8A + AAAAAXP///+7////AAAAAAmOAAAAARYAAAADAAAADAgAAAaPAAAAF0JlbGdpYW4ga2V5Ym9hcmQgbGF5 + b3V0AXD///+8////AAAAAAFv////u////wQAAAAJkgAAAAEXAAAAAwAAABYIAAAGkwAAABpQb3J0dWd1 + ZXNlIGtleWJvYXJkIGxheW91dAFs////vP///wAAAAABa////7v///8AAAAACZYAAAABGAAAAAMAAAAW + BAAABpcAAAAgQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQBaP///7z///8CAAAAAWf///+7 + ////BgAAAAmaAAAAARkAAAADAAAAFgQAAAabAAAAJ0JyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5 + b3V0IEFMVCBHUgFk////vP///wIAAAABY////7v///8GAAAACZ4AAAABGgAAAAMAAAALBAAABp8AAAAX + RmlubmlzaCBrZXlib2FyZCBsYXlvdXQBYP///7z///8AAAAAAV////+7////AAAAAAmiAAAAARsAAAAD + AAAAAgQAAAajAAAAHUJ1bGdhcmlhbiBiZHMga2V5Ym9hcmQgbGF5b3V0AVz///+8////AAAAAAFb//// + u////wAAAAAJpgAAAAEcAAAAAwAAAAIEAAAGpwAAACJCdWxnYXJpYW4gcGhvbmV0aWMga2V5Ym9hcmQg + bGF5b3V0AVj///+8////AAAAAAFX////u////wAAAAAJqgAAAAEdAAAAAwAAACMEAAAGqwAAABpCZWxh + cnVzaWFuIGtleWJvYXJkIGxheW91dAFU////vP///wAAAAABU////7v///8AAAAACa4AAAABHgAAAAMA + AAAZBAAABq8AAAAXUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQBUP///7z///8AAAAAAU////+7////AAAA + AAmyAAAAAR8AAAADAAAAGQQAAAazAAAALVJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtl + eSB2ZXJzaW9uKQFM////vP///wAAAAABS////7v///8AAAAACbYAAAABIAAAAAMAAAAZBAAABrcAAAAe + UnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SAUj///+8////AAAAAAFH////u////wAAAAAJugAA + AAEhAAAAAwAAABkEAAAGuwAAAB5SdXNzaWFuIGtleWJvYXJkIGxheW91dCBjcDEyNTEBRP///7z///8A + AAAAAUP///+7////AAAAAAm+AAAAASIAAAADAAAAGQQAAAa/AAAAIFJ1c3NpYW4gcGhvbmV0aWMga2V5 + Ym9hcmQgbGF5b3V0AUD///+8////AAAAAAE/////u////wAAAAAJwgAAAAEjAAAAAwAAACIEAAAGwwAA + ACBVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVQE8////vP///wAAAAABO////7v///8AAAAA + CcYAAAABJAAAAAMAAAAiBAAABscAAAAkVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCAoc3RhbmRhcmQp + ATj///+8////AAAAAAE3////u////wAAAAAJygAAAAElAAAAAwAAABkEAAAGywAAACJSdXNzaWFuIGtl + eWJvYXJkIGxheW91dCAoc3RhbmRhcmQpATT///+8////AAAAAAEz////u////wAAAAAJzgAAAAEmAAAA + AwAAAAoEAAAGzwAAABdTcGFuaXNoIGtleWJvYXJkIGxheW91dAEw////vP///wAAAAABL////7v///8A + AAAACdIAAAABJwAAAAMAAAAQBAAABtMAAAAXSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQBLP///7z///8A + AAAAASv///+7////AAAAAAnWAAAAASgAAAADAAAADwQAAAbXAAAAGUljZWxhbmRpYyBrZXlib2FyZCBs + YXlvdXQBKP///7z///8AAAAAASf///+7////AAAAAAnaAAAAASkAAAADAAAADgQAAAbbAAAAGUh1bmdh + cmlhbiBrZXlib2FyZCBsYXlvdXQBJP///7z///8AAAAAASP///+7////AQAAAAneAAAAASoAAAADAAAA + FQQAAAbfAAAAJVBvbGlzaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQBIP///7z///8AAAAA + AR////+7////AAAAAAniAAAAASsAAAADAAAAJAQAAAbjAAAAGVNsb3ZlbmlhbiBrZXlib2FyZCBsYXlv + dXQBHP///7z///8AAAAAARv///+7////AQAAAAnmAAAAASwAAAADAAAAGgwAAAbnAAAAGlNlcmJpYW4g + a2V5Ym9hcmQgbGF5b3V0IHNyARj///+8////AAAAAAEX////u////wAAAAAJ6gAAAAEtAAAAAwAAABoM + AAAG6wAAAB1TZXJiaWFuIGtleWJvYXJkIGxheW91dCB1cyxzcgEU////vP///wAAAAABE////7v///8A + AAAACe4AAAABLgAAAAMAAAAaBAAABu8AAAAYQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0ARD///+8//// + AAAAAAEP////u////wEAAAAJ8gAAAAEvAAAAAwAAABoEAAAG8wAAACNDcm9hdGlhbiBrZXlib2FyZCBs + YXlvdXQgKHNwZWNpZmljKQEM////vP///wAAAAABC////7v///8AAAAACfYAAAABMAAAAAMAAAARBAAA + BvcAAAAcSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dAEI////vP///wMAAAABB////7v///8HAAAA + CfoAAAABMQAAAAMAAAARBAAABvsAAAAfSmFwYW5lc2UgcGM5OHgxIGtleWJvYXJkIGxheW91dAEE//// + vP///wAAAAABA////7v///8AAAAACf4AAAABMgAAAAMAAAAbBAAABv8AAAAWU2xvdmFrIGtleWJvYXJk + IGxheW91dAEA////vP///wAAAAAB//7//7v///8AAAAACQIBAAABMwAAAAMAAAAbBAAABgMBAAAyU2xv + dmFrIGFuZCBDemVjaCBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMB/P7//7z///8AAAAA + Afv+//+7////AAAAAAkGAQAAATQAAAADAAAABQQAAAYHAQAAFUN6ZWNoIGtleWJvYXJkIGxheW91dAH4 + /v//vP///wAAAAAB9/7//7v///8AAAAACQoBAAABNQAAAAMAAAAFBAAABgsBAAAYQ3plY2gga2V5Ym9h + cmQgbGF5b3V0IGN6AfT+//+8////AAAAAAHz/v//u////wEAAAAJDgEAAAE2AAAAAwAAAAUEAAAGDwEA + AB9DemVjaCBrZXlib2FyZCBsYXlvdXQgY3pfcXdlcnR5AfD+//+8////AAAAAAHv/v//u////wAAAAAJ + EgEAAAE3AAAAAwAAAAoEAAAGEwEAAB5MYXRpbiBBbWVyaWNhbiBrZXlib2FyZCBsYXlvdXQB7P7//7z/ + //8AAAAAAev+//+7////AAAAAAkWAQAAATgAAAADAAAAJwQAAAYXAQAAI0xpdGh1YW5pYW4gKEJhbHRp + Yykga2V5Ym9hcmQgbGF5b3V0Aej+//+8////AAAAAAHn/v//u////wAAAAAJGgEAAAE5AAAAAwAAAB8E + AAAGGwEAABdUdXJraXNoIGtleWJvYXJkIGxheW91dAHk/v//vP///wAAAAAB4/7//7v///8AAAAACR4B + AAABOgAAAAMAAAAfBAAABh8BAAAaVHVya2lzaCBrZXlib2FyZCBsYXlvdXQgdHIB4P7//7z///8AAAAA + Ad/+//+7////AAAAAAkiAQAAATsAAAADAAAAHwQAAAYjAQAAG1R1cmtpc2gga2V5Ym9hcmQgbGF5b3V0 + IHRyZgHc/v//vP///wAAAAAB2/7//7v///8AAAAACSYBAAABPAAAAAMAAAANBAAABicBAAAZSXNyYWVs + aWFuIGtleWJvYXJkIGxheW91dAHY/v//vP///wAAAAAB1/7//7v///8AAAAACSoBAAABPQAAAAMAAAAN + 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 + D3IBAAAAAAAADw9zAQAAAAAAAA8PdAEAAAIAAAAPYAAAAH4AAAAPdQEAAAIAAAAPMQAAACEAAAAPdgEA + AAIAAAAPMgAAAEAAAAAPdwEAAAIAAAAPMwAAACMAAAAPeAEAAAIAAAAPNAAAACQAAAAPeQEAAAIAAAAP + NQAAACUAAAAPegEAAAIAAAAPNgAAAF4AAAAPewEAAAIAAAAPNwAAACYAAAAPfAEAAAIAAAAPOAAAACoA + AAAPfQEAAAIAAAAPOQAAACgAAAAPfgEAAAIAAAAPMAAAACkAAAAPfwEAAAIAAAAPLQAAAF8AAAAPgAEA + AAIAAAAPPQAAACsAAAAPgQEAAAIAAAAPcQAAAFEAAAAPggEAAAIAAAAPdwAAAFcAAAAPgwEAAAIAAAAP + ZQAAAEUAAAAPhAEAAAIAAAAPcgAAAFIAAAAPhQEAAAIAAAAPdAAAAFQAAAAPhgEAAAIAAAAPeQAAAFkA + AAAPhwEAAAIAAAAPdQAAAFUAAAAPiAEAAAIAAAAPaQAAAEkAAAAPiQEAAAIAAAAPbwAAAE8AAAAPigEA + AAIAAAAPcAAAAFAAAAAPiwEAAAIAAAAPWwAAAHsAAAAPjAEAAAIAAAAPXQAAAH0AAAAPjQEAAAIAAAAP + YQAAAEEAAAAPjgEAAAIAAAAPcwAAAFMAAAAPjwEAAAIAAAAPZAAAAEQAAAAPkAEAAAIAAAAPZgAAAEYA + AAAPkQEAAAIAAAAPZwAAAEcAAAAPkgEAAAIAAAAPaAAAAEgAAAAPkwEAAAIAAAAPagAAAEoAAAAPlAEA + AAIAAAAPawAAAEsAAAAPlQEAAAIAAAAPbAAAAEwAAAAPlgEAAAIAAAAPOwAAADoAAAAPlwEAAAIAAAAP + JwAAACIAAAAPmAEAAAIAAAAPXAAAAHwAAAAPmQEAAAIAAAAPegAAAFoAAAAPmgEAAAIAAAAPeAAAAFgA + AAAPmwEAAAIAAAAPYwAAAEMAAAAPnAEAAAIAAAAPdgAAAFYAAAAPnQEAAAIAAAAPYgAAAEIAAAAPngEA + AAIAAAAPbgAAAE4AAAAPnwEAAAIAAAAPbQAAAE0AAAAPoAEAAAIAAAAPLAAAADwAAAAPoQEAAAIAAAAP + LgAAAD4AAAAPogEAAAIAAAAPLwAAAD8AAAAPowEAAAIAAAAPPAAAAD4AAAAPpAEAAAAAAAAPD6UBAAAC + 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 + AAAADzQAAAAkAAAADwwCAAACAAAADzUAAAAlAAAADw0CAAACAAAADzYAAABeAAAADw4CAAACAAAADzcA + AAAmAAAADw8CAAACAAAADzgAAAAqAAAADxACAAACAAAADzkAAAAoAAAADxECAAACAAAADzAAAAApAAAA + DxICAAACAAAADy0AAABfAAAADxMCAAACAAAADz0AAAArAAAADxQCAAACAAAAD3EAAABRAAAADxUCAAAC + AAAAD3cAAABXAAAADxYCAAACAAAAD2UAAABFAAAADxcCAAACAAAAD3IAAABSAAAADxgCAAACAAAAD3QA + AABUAAAADxkCAAACAAAAD3kAAABZAAAADxoCAAACAAAAD3UAAABVAAAADxsCAAACAAAAD2kAAABJAAAA + DxwCAAACAAAAD28AAABPAAAADx0CAAACAAAAD3AAAABQAAAADx4CAAACAAAAD1sAAAB7AAAADx8CAAAC + AAAAD10AAAB9AAAADyACAAACAAAAD2EAAABBAAAADyECAAACAAAAD3MAAABTAAAADyICAAACAAAAD2QA + AABEAAAADyMCAAACAAAAD2YAAABGAAAADyQCAAACAAAAD2cAAABHAAAADyUCAAACAAAAD2gAAABIAAAA + DyYCAAACAAAAD2oAAABKAAAADycCAAACAAAAD2sAAABLAAAADygCAAACAAAAD2wAAABMAAAADykCAAAC + AAAADzsAAAA6AAAADyoCAAACAAAADycAAABAAAAADysCAAACAAAADyMAAAB+AAAADywCAAACAAAAD3oA + AABaAAAADy0CAAACAAAAD3gAAABYAAAADy4CAAACAAAAD2MAAABDAAAADy8CAAACAAAAD3YAAABWAAAA + DzACAAACAAAAD2IAAABCAAAADzECAAACAAAAD24AAABOAAAADzICAAACAAAAD20AAABNAAAADzMCAAAC + AAAADywAAAA8AAAADzQCAAACAAAADy4AAAA+AAAADzUCAAACAAAADy8AAAA/AAAADzYCAAACAAAAD1wA + AAB8AAAADzcCAAAAAAAADw84AgAAAgAAAA9eAAAAsP///w85AgAAAgAAAA8xAAAAIQAAAA86AgAAAgAA + AA8yAAAAIgAAAA87AgAAAgAAAA8zAAAAp////w88AgAAAgAAAA80AAAAJAAAAA89AgAAAgAAAA81AAAA + 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 + AAAvAAAADzUDAAACAAAADzgAAAAoAAAADzYDAAACAAAADzkAAAApAAAADzcDAAACAAAADzAAAAA9AAAA + DzgDAAACAAAADycAAAA/AAAADzkDAAACAAAAD14AAABgAAAADzoDAAACAAAAD3EAAABRAAAADzsDAAAC + AAAAD3cAAABXAAAADzwDAAACAAAAD2UAAABFAAAADz0DAAACAAAAD3IAAABSAAAADz4DAAACAAAAD3QA + AABUAAAADz8DAAACAAAAD3oAAABaAAAAD0ADAAACAAAAD3UAAABVAAAAD0EDAAACAAAAD2kAAABJAAAA + D0IDAAACAAAAD28AAABPAAAAD0MDAAACAAAAD3AAAABQAAAAD0QDAAACAAAAD+j////8////D0UDAAAC + AAAAD6j///8hAAAAD0YDAAACAAAAD2EAAABBAAAAD0cDAAACAAAAD3MAAABTAAAAD0gDAAACAAAAD2QA + AABEAAAAD0kDAAACAAAAD2YAAABGAAAAD0oDAAACAAAAD2cAAABHAAAAD0sDAAACAAAAD2gAAABIAAAA + D0wDAAACAAAAD2oAAABKAAAAD00DAAACAAAAD2sAAABLAAAAD04DAAACAAAAD2wAAABMAAAAD08DAAAC + AAAAD+n////2////D1ADAAACAAAAD+D////k////D1EDAAACAAAADyQAAACj////D1IDAAACAAAAD3kA + AABZAAAAD1MDAAACAAAAD3gAAABYAAAAD1QDAAACAAAAD2MAAABDAAAAD1UDAAACAAAAD3YAAABWAAAA + D1YDAAACAAAAD2IAAABCAAAAD1cDAAACAAAAD24AAABOAAAAD1gDAAACAAAAD20AAABNAAAAD1kDAAAC + AAAADywAAAA7AAAAD1oDAAACAAAADy4AAAA6AAAAD1sDAAACAAAADy0AAABfAAAAD1wDAAACAAAADzwA + AAA+AAAAD10DAAAAAAAADw9eAwAAAgAAAA+n////vf///w9fAwAAAgAAAA8xAAAAIQAAAA9gAwAAAgAA + AA8yAAAAIgAAAA9hAwAAAgAAAA8zAAAAIwAAAA9iAwAAAgAAAA80AAAApP///w9jAwAAAgAAAA81AAAA + JQAAAA9kAwAAAgAAAA82AAAAJgAAAA9lAwAAAgAAAA83AAAALwAAAA9mAwAAAgAAAA84AAAAKAAAAA9n + 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 + D4wEAAACAAAADzgAAAAqAAAAD40EAAACAAAADzkAAAAoAAAAD44EAAACAAAADzAAAAApAAAAD48EAAAC + AAAADy0AAABfAAAAD5AEAAACAAAADz0AAAArAAAAD5EEAAACAAAAD3EAAABRAAAAD5IEAAACAAAAD3cA + AABXAAAAD5MEAAACAAAAD2UAAABFAAAAD5QEAAACAAAAD3IAAABSAAAAD5UEAAACAAAAD3QAAABUAAAA + D5YEAAACAAAAD3kAAABZAAAAD5cEAAACAAAAD3UAAABVAAAAD5gEAAACAAAAD2kAAABJAAAAD5kEAAAC + AAAAD28AAABPAAAAD5oEAAACAAAAD3AAAABQAAAAD5sEAAACAAAAD14AAABeAAAAD5wEAAACAAAAD7j/ + //+o////D50EAAACAAAAD2EAAABBAAAAD54EAAACAAAAD3MAAABTAAAAD58EAAACAAAAD2QAAABEAAAA + D6AEAAACAAAAD2YAAABGAAAAD6EEAAACAAAAD2cAAABHAAAAD6IEAAACAAAAD2gAAABIAAAAD6MEAAAC + AAAAD2oAAABKAAAAD6QEAAACAAAAD2sAAABLAAAAD6UEAAACAAAAD2wAAABMAAAAD6YEAAACAAAADzsA + AAA6AAAAD6cEAAACAAAAD2AAAABgAAAAD6gEAAACAAAADzwAAAA+AAAAD6kEAAACAAAAD3oAAABaAAAA + D6oEAAACAAAAD3gAAABYAAAAD6sEAAACAAAAD2MAAABDAAAAD6wEAAACAAAAD3YAAABWAAAAD60EAAAC + AAAAD2IAAABCAAAAD64EAAACAAAAD24AAABOAAAAD68EAAACAAAAD20AAABNAAAAD7AEAAACAAAADywA + AAAnAAAAD7EEAAABAAAADy4AAAAPsgQAAAIAAAAP6f///8n///8PswQAAAIAAAAPq////7v///8PtAQA + AAAAAAAPD7UEAAACAAAADy8AAABcAAAAD7YEAAAEAAAADzEAAAAhAAAAuf///6H///8PtwQAAAMAAAAP + MgAAAEAAAACy////D7gEAAAEAAAADzMAAAAjAAAAs////6P///8PuQQAAAQAAAAPNAAAACQAAAC8//// + pP///w+6BAAAAwAAAA81AAAAJQAAAL3///8PuwQAAAMAAAAPNgAAAD8AAAC+////D7wEAAACAAAADzcA + AAAmAAAAD70EAAACAAAADzgAAAAqAAAAD74EAAACAAAADzkAAAAoAAAAD78EAAACAAAADzAAAAApAAAA + D8AEAAACAAAADy0AAABfAAAAD8EEAAACAAAADz0AAAArAAAAD8IEAAACAAAAD3EAAABRAAAAD8MEAAAC + AAAAD3cAAABXAAAAD8QEAAACAAAAD2UAAABFAAAAD8UEAAACAAAAD3IAAABSAAAAD8YEAAACAAAAD3QA + AABUAAAAD8cEAAACAAAAD3kAAABZAAAAD8gEAAACAAAAD3UAAABVAAAAD8kEAAACAAAAD2kAAABJAAAA + D8oEAAAEAAAAD28AAABPAAAA+P///9j///8PywQAAAQAAAAPcAAAAFAAAAD+////3v///w/MBAAAAwAA + AA9eAAAAqP///6j///8PzQQAAAMAAAAP5////8f///9+AAAAD84EAAAEAAAAD2EAAABBAAAA5v///8b/ + //8PzwQAAAQAAAAPcwAAAFMAAADf////p////w/QBAAABAAAAA9kAAAARAAAAPD////Q////D9EEAAAC + AAAAD2YAAABGAAAAD9IEAAACAAAAD2cAAABHAAAAD9MEAAACAAAAD2gAAABIAAAAD9QEAAACAAAAD2oA + AABKAAAAD9UEAAACAAAAD2sAAABLAAAAD9YEAAACAAAAD2wAAABMAAAAD9cEAAADAAAADzsAAAA6AAAA + tP///w/YBAAAAgAAAA/o////yP///w/ZBAAAAgAAAA/g////wP///w/aBAAAAgAAAA96AAAAWgAAAA/b + BAAAAgAAAA94AAAAWAAAAA/cBAAABAAAAA9jAAAAQwAAAKL///+p////D90EAAACAAAAD3YAAABWAAAA + D94EAAACAAAAD2IAAABCAAAAD98EAAACAAAAD24AAABOAAAAD+AEAAAEAAAAD20AAABNAAAAtf///7r/ + //8P4QQAAAIAAAAPLAAAACcAAAAP4gQAAAQAAAAPLgAAACIAAAC3////9////w/jBAAAAgAAAA/p//// + yf///w/kBAAAAgAAAA/5////2f///w/lBAAAAAAAAA8P5gQAAAAAAAAPD+cEAAADAAAADyYAAAAxAAAA + fAAAAA/oBAAAAwAAAA/p////MgAAAEAAAAAP6QQAAAMAAAAPIgAAADMAAAAjAAAAD+oEAAACAAAADycA + AAA0AAAAD+sEAAACAAAADygAAAA1AAAAD+wEAAADAAAAD6f///82AAAAXgAAAA/tBAAAAgAAAA/o//// + NwAAAA/uBAAAAgAAAA8hAAAAOAAAAA/vBAAAAwAAAA/n////OQAAAHsAAAAP8AQAAAMAAAAP4P///zAA + AAB9AAAAD/EEAAACAAAADykAAACw////D/IEAAACAAAADy0AAABfAAAAD/MEAAACAAAAD2EAAABBAAAA + D/QEAAACAAAAD3oAAABaAAAAD/UEAAADAAAAD2UAAABFAAAApP///w/2BAAAAgAAAA9yAAAAUgAAAA/3 + BAAAAgAAAA90AAAAVAAAAA/4BAAAAgAAAA95AAAAWQAAAA/5BAAAAgAAAA91AAAAVQAAAA/6BAAAAgAA + AA9pAAAASQAAAA/7BAAAAgAAAA9vAAAATwAAAA/8BAAAAgAAAA9wAAAAUAAAAA/9BAAAAwAAAA9eAAAA + qP///1sAAAAP/gQAAAMAAAAPJAAAACoAAABdAAAAD/8EAAACAAAAD3EAAABRAAAADwAFAAADAAAAD3MA + AABTAAAA3////w8BBQAAAgAAAA9kAAAARAAAAA8CBQAAAgAAAA9mAAAARgAAAA8DBQAAAgAAAA9nAAAA + RwAAAA8EBQAAAgAAAA9oAAAASAAAAA8FBQAAAgAAAA9qAAAASgAAAA8GBQAAAgAAAA9rAAAASwAAAA8H + BQAAAgAAAA9sAAAATAAAAA8IBQAAAgAAAA9tAAAATQAAAA8JBQAAAwAAAA/5////JQAAALT///8PCgUA + AAMAAAAPtf///6P///9gAAAADwsFAAACAAAAD3cAAABXAAAADwwFAAACAAAAD3gAAABYAAAADw0FAAAC + AAAAD2MAAABDAAAADw4FAAACAAAAD3YAAABWAAAADw8FAAACAAAAD2IAAABCAAAADxAFAAACAAAAD24A + AABOAAAADxEFAAACAAAADywAAAA/AAAADxIFAAACAAAADzsAAAAuAAAADxMFAAACAAAADzoAAAAvAAAA + DxQFAAADAAAADz0AAAArAAAAfgAAAA8VBQAAAwAAAA88AAAAPgAAAFwAAAAPFgUAAAAAAAAPDxcFAAAC + AAAAD1wAAAB8AAAADxgFAAACAAAADzEAAAAhAAAADxkFAAACAAAADzIAAAAiAAAADxoFAAACAAAADzMA + AAAjAAAADxsFAAACAAAADzQAAAAkAAAADxwFAAACAAAADzUAAAAlAAAADx0FAAACAAAADzYAAAAmAAAA + Dx4FAAACAAAADzcAAAAvAAAADx8FAAACAAAADzgAAAAoAAAADyAFAAACAAAADzkAAAApAAAADyEFAAAC + AAAADzAAAAA9AAAADyIFAAACAAAADycAAAA/AAAADyMFAAACAAAAD6v///+7////DyQFAAACAAAAD3EA + AABRAAAADyUFAAACAAAAD3cAAABXAAAADyYFAAACAAAAD2UAAABFAAAADycFAAACAAAAD3IAAABSAAAA + DygFAAACAAAAD3QAAABUAAAADykFAAACAAAAD3kAAABZAAAADyoFAAACAAAAD3UAAABVAAAADysFAAAC + AAAAD2kAAABJAAAADywFAAACAAAAD28AAABPAAAADy0FAAACAAAAD3AAAABQAAAADy4FAAACAAAADysA + AAAqAAAADy8FAAACAAAAD7T///9gAAAADzAFAAACAAAAD2EAAABBAAAADzEFAAACAAAAD3MAAABTAAAA + DzIFAAACAAAAD2QAAABEAAAADzMFAAACAAAAD2YAAABGAAAADzQFAAACAAAAD2cAAABHAAAADzUFAAAC + AAAAD2gAAABIAAAADzYFAAACAAAAD2oAAABKAAAADzcFAAACAAAAD2sAAABLAAAADzgFAAACAAAAD2wA + AABMAAAADzkFAAACAAAAD+f////H////DzoFAAACAAAAD7r///+q////DzsFAAACAAAAD34AAABeAAAA + DzwFAAACAAAAD3oAAABaAAAADz0FAAACAAAAD3gAAABYAAAADz4FAAACAAAAD2MAAABDAAAADz8FAAAC + AAAAD3YAAABWAAAAD0AFAAACAAAAD2IAAABCAAAAD0EFAAACAAAAD24AAABOAAAAD0IFAAACAAAAD20A + AABNAAAAD0MFAAACAAAADywAAAA7AAAAD0QFAAACAAAADy4AAAA6AAAAD0UFAAACAAAADy0AAABfAAAA + D0YFAAACAAAADzwAAAA+AAAAD0cFAAAAAAAADw9IBQAAAgAAAA8nAAAAIgAAAA9JBQAAAgAAAA8xAAAA + IQAAAA9KBQAAAgAAAA8yAAAAQAAAAA9LBQAAAgAAAA8zAAAAIwAAAA9MBQAAAgAAAA80AAAAJAAAAA9N + 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 + NAAAACIAAAAP4AUAAAIAAAAPNQAAACUAAAAP4QUAAAQAAAAPNgAAAF4AAAA2AAAAPQAAAA/iBQAABAAA + AA83AAAAJgAAADcAAAA6AAAAD+MFAAAEAAAADzgAAAAqAAAAOAAAAC8AAAAP5AUAAAIAAAAPOQAAACgA + AAAP5QUAAAIAAAAPMAAAACkAAAAP5gUAAAQAAAAPLQAAAF8AAAAtAAAASQAAAA/nBQAABAAAAA89AAAA + KwAAAC4AAABWAAAAD+gFAAAEAAAAD3EAAABRAAAALAAAAPv///8P6QUAAAQAAAAPdwAAAFcAAADz//// + 0////w/qBQAABAAAAA9lAAAARQAAAOX////F////D+sFAAAEAAAAD3IAAABSAAAA6P///8j///8P7AUA + AAQAAAAPdAAAAFQAAAD4////2P///w/tBQAABAAAAA95AAAAWQAAAPn////Z////D+4FAAAEAAAAD3UA + AABVAAAA6v///8r///8P7wUAAAQAAAAPaQAAAEkAAADx////0f///w/wBQAABAAAAA9vAAAATwAAAOT/ + ///E////D/EFAAAEAAAAD3AAAABQAAAA5////8f///8P8gUAAAQAAAAPWwAAAHsAAAD2////1v///w/z + BQAAAwAAAA9dAAAAfQAAADsAAAAP9AUAAAQAAAAPYQAAAEEAAAD8////3P///w/1BQAABAAAAA9zAAAA + UwAAAP/////f////D/YFAAAEAAAAD2QAAABEAAAA4P///8D///8P9wUAAAQAAAAPZgAAAEYAAADu//// + zv///w/4BQAABAAAAA9nAAAARwAAAOb////G////D/kFAAAEAAAAD2gAAABIAAAA4////8P///8P+gUA + AAQAAAAPagAAAEoAAADy////0v///w/7BQAABAAAAA9rAAAASwAAAO3////N////D/wFAAAEAAAAD2wA + AABMAAAA4v///8L///8P/QUAAAQAAAAPOwAAADoAAADs////zP///w/+BQAABAAAAA8nAAAAIgAAAPf/ + ///X////D/8FAAAEAAAAD1wAAAB8AAAAJwAAANv///8PAAYAAAQAAAAPegAAAFoAAAD+////3v///w8B + BgAABAAAAA94AAAAWAAAAOn////J////DwIGAAAEAAAAD2MAAABDAAAA+v///9r///8PAwYAAAQAAAAP + dgAAAFYAAAD9////3f///w8EBgAABAAAAA9iAAAAQgAAAPT////U////DwUGAAAEAAAAD24AAABOAAAA + 9f///9X///8PBgYAAAQAAAAPbQAAAE0AAADv////z////w8HBgAABAAAAA8sAAAAPAAAAPD////Q//// + DwgGAAAEAAAADy4AAAA+AAAA6////8v///8PCQYAAAQAAAAPLwAAAD8AAADh////wf///w8KBgAAAgAA + AA88AAAAPgAAAA8LBgAAAAAAAA8PDAYAAAQAAAAPYAAAAH4AAAD3////1////w8NBgAAAgAAAA8xAAAA + IQAAAA8OBgAAAgAAAA8yAAAAQAAAAA8PBgAAAgAAAA8zAAAAIwAAAA8QBgAAAgAAAA80AAAAJAAAAA8R + BgAAAgAAAA81AAAAJQAAAA8SBgAAAgAAAA82AAAAXgAAAA8TBgAAAgAAAA83AAAAJgAAAA8UBgAAAgAA + AA84AAAAKgAAAA8VBgAAAgAAAA85AAAAKAAAAA8WBgAAAgAAAA8wAAAAKQAAAA8XBgAAAgAAAA8tAAAA + XwAAAA8YBgAAAgAAAA89AAAAKwAAAA8ZBgAABAAAAA9xAAAAUQAAAP/////f////DxoGAAAEAAAAD3cA + AABXAAAA4v///8L///8PGwYAAAQAAAAPZQAAAEUAAADl////xf///w8cBgAABAAAAA9yAAAAUgAAAPD/ + ///Q////Dx0GAAAEAAAAD3QAAABUAAAA8v///9L///8PHgYAAAQAAAAPeQAAAFkAAAD6////2v///w8f + BgAABAAAAA91AAAAVQAAAPP////T////DyAGAAAEAAAAD2kAAABJAAAA6P///8j///8PIQYAAAQAAAAP + bwAAAE8AAADu////zv///w8iBgAABAAAAA9wAAAAUAAAAO/////P////DyMGAAAEAAAAD1sAAAB7AAAA + +P///9j///8PJAYAAAQAAAAPXQAAAH0AAAD5////2f///w8lBgAABAAAAA9hAAAAQQAAAOD////A//// + DyYGAAAEAAAAD3MAAABTAAAA8f///9H///8PJwYAAAQAAAAPZAAAAEQAAADk////xP///w8oBgAABAAA + AA9mAAAARgAAAPT////U////DykGAAAEAAAAD2cAAABHAAAA4////8P///8PKgYAAAQAAAAPaAAAAEgA + AAD1////1f///w8rBgAABAAAAA9qAAAASgAAAOn////J////DywGAAAEAAAAD2sAAABLAAAA6v///8r/ + //8PLQYAAAQAAAAPbAAAAEwAAADr////y////w8uBgAAAgAAAA87AAAAOgAAAA8vBgAAAgAAAA8nAAAA + IgAAAA8wBgAABAAAAA9cAAAAfAAAAP7////e////DzEGAAAEAAAAD3oAAABaAAAA5////8f///8PMgYA + AAQAAAAPeAAAAFgAAAD8////3P///w8zBgAABAAAAA9jAAAAQwAAAPb////W////DzQGAAAEAAAAD3YA + AABWAAAA5v///8b///8PNQYAAAQAAAAPYgAAAEIAAADh////wf///w82BgAABAAAAA9uAAAATgAAAO3/ + ///N////DzcGAAAEAAAAD20AAABNAAAA7P///8z///8POAYAAAIAAAAPLAAAADwAAAAPOQYAAAIAAAAP + LgAAAD4AAAAPOgYAAAIAAAAPLwAAAD8AAAAPOwYAAAIAAAAPPAAAAD4AAAAPPAYAAAAAAAAPDz0GAAAE + AAAAD2AAAAB+AAAAo////7P///8PPgYAAAIAAAAPMQAAACEAAAAPPwYAAAIAAAAPMgAAAEAAAAAPQAYA + AAIAAAAPMwAAACMAAAAPQQYAAAIAAAAPNAAAACQAAAAPQgYAAAIAAAAPNQAAACUAAAAPQwYAAAIAAAAP + NgAAAF4AAAAPRAYAAAIAAAAPNwAAACYAAAAPRQYAAAIAAAAPOAAAACoAAAAPRgYAAAIAAAAPOQAAACgA + AAAPRwYAAAIAAAAPMAAAACkAAAAPSAYAAAIAAAAPLQAAAF8AAAAPSQYAAAIAAAAPPQAAACsAAAAPSgYA + AAQAAAAPcQAAAFEAAADK////6v///w9LBgAABAAAAA93AAAAVwAAAMP////j////D0wGAAAEAAAAD2UA + AABFAAAA1f////X///8PTQYAAAQAAAAPcgAAAFIAAADL////6////w9OBgAABAAAAA90AAAAVAAAAMX/ + ///l////D08GAAAEAAAAD3kAAABZAAAAzv///+7///8PUAYAAAQAAAAPdQAAAFUAAADH////5////w9R + BgAABAAAAA9pAAAASQAAANv////7////D1IGAAAEAAAAD28AAABPAAAArv///77///8PUwYAAAQAAAAP + cAAAAFAAAADa////+v///w9UBgAABAAAAA9bAAAAewAAAMj////o////D1UGAAAEAAAAD10AAAB9AAAA + JwAAACcAAAAPVgYAAAQAAAAPYQAAAEEAAADG////5v///w9XBgAABAAAAA9zAAAAUwAAANn////5//// + D1gGAAAEAAAAD2QAAABEAAAA1/////f///8PWQYAAAQAAAAPZgAAAEYAAADB////4f///w9aBgAABAAA + AA9nAAAARwAAAND////w////D1sGAAAEAAAAD2gAAABIAAAA0v////L///8PXAYAAAQAAAAPagAAAEoA + AADP////7////w9dBgAABAAAAA9rAAAASwAAAMz////s////D14GAAAEAAAAD2wAAABMAAAAxP///+T/ + //8PXwYAAAQAAAAPOwAAADoAAADW////9v///w9gBgAABAAAAA8nAAAAIgAAANz////8////D2EGAAAE + AAAAD1wAAAB8AAAALwAAAHwAAAAPYgYAAAQAAAAPegAAAFoAAADR////8f///w9jBgAABAAAAA94AAAA + WAAAAN7////+////D2QGAAAEAAAAD2MAAABDAAAA0/////P///8PZQYAAAQAAAAPdgAAAFYAAADN//// + 7f///w9mBgAABAAAAA9iAAAAQgAAAKb///+2////D2cGAAAEAAAAD24AAABOAAAA1P////T///8PaAYA + AAQAAAAPbQAAAE0AAADY////+P///w9pBgAABAAAAA8sAAAAPAAAAML////i////D2oGAAAEAAAADy4A + AAA+AAAAwP///+D///8PawYAAAQAAAAPLwAAAD8AAAAuAAAALAAAAA9sBgAABAAAAA88AAAAPgAAAHwA + AACm////D20GAAAAAAAADw9uBgAAAgAAAA9gAAAAfgAAAA9vBgAAAgAAAA8xAAAAIQAAAA9wBgAAAgAA + AA8yAAAAQAAAAA9xBgAAAgAAAA8zAAAAIwAAAA9yBgAAAgAAAA80AAAAJAAAAA9zBgAAAgAAAA81AAAA + JQAAAA90BgAAAgAAAA82AAAAXgAAAA91BgAAAgAAAA83AAAAJgAAAA92BgAAAgAAAA84AAAAKgAAAA93 + BgAAAgAAAA85AAAAKAAAAA94BgAAAgAAAA8wAAAAKQAAAA95BgAAAgAAAA8tAAAAXwAAAA96BgAAAgAA + AA89AAAAKwAAAA97BgAABAAAAA9xAAAAUQAAAMr////q////D3wGAAAEAAAAD3cAAABXAAAAw////+P/ + //8PfQYAAAQAAAAPZQAAAEUAAADV////9f///w9+BgAABAAAAA9yAAAAUgAAAMv////r////D38GAAAE + AAAAD3QAAABUAAAAxf///+X///8PgAYAAAQAAAAPeQAAAFkAAADO////7v///w+BBgAABAAAAA91AAAA + VQAAAMf////n////D4IGAAAEAAAAD2kAAABJAAAA2/////v///8PgwYAAAQAAAAPbwAAAE8AAADd//// + /f///w+EBgAABAAAAA9wAAAAUAAAANr////6////D4UGAAAEAAAAD1sAAAB7AAAAyP///+j///8PhgYA + AAQAAAAPXQAAAH0AAADf/////////w+HBgAABAAAAA9hAAAAQQAAAMb////m////D4gGAAAEAAAAD3MA + AABTAAAA2f////n///8PiQYAAAQAAAAPZAAAAEQAAADX////9////w+KBgAABAAAAA9mAAAARgAAAMH/ + ///h////D4sGAAAEAAAAD2cAAABHAAAA0P////D///8PjAYAAAQAAAAPaAAAAEgAAADS////8v///w+N + BgAABAAAAA9qAAAASgAAAM/////v////D44GAAAEAAAAD2sAAABLAAAAzP///+z///8PjwYAAAQAAAAP + bAAAAEwAAADE////5P///w+QBgAABAAAAA87AAAAOgAAANb////2////D5EGAAAEAAAADycAAAAiAAAA + 3P////z///8PkgYAAAIAAAAPXAAAAHwAAAAPkwYAAAQAAAAPegAAAFoAAADR////8f///w+UBgAABAAA + AA94AAAAWAAAAN7////+////D5UGAAAEAAAAD2MAAABDAAAA0/////P///8PlgYAAAQAAAAPdgAAAFYA + AADN////7f///w+XBgAABAAAAA9iAAAAQgAAAMn////p////D5gGAAAEAAAAD24AAABOAAAA1P////T/ + //8PmQYAAAQAAAAPbQAAAE0AAADY////+P///w+aBgAABAAAAA8sAAAAPAAAAML////i////D5sGAAAE + AAAADy4AAAA+AAAAwP///+D///8PnAYAAAIAAAAPLwAAAD8AAAAPnQYAAAAAAAAPD54GAAAAAAAADw+f + BgAAAgAAAA9gAAAAfgAAAA+gBgAAAgAAAA8xAAAAIQAAAA+hBgAAAgAAAA8yAAAAQAAAAA+iBgAAAgAA + AA8zAAAAIwAAAA+jBgAAAgAAAA80AAAAJAAAAA+kBgAAAgAAAA81AAAAJQAAAA+lBgAAAgAAAA82AAAA + XgAAAA+mBgAAAgAAAA83AAAAJgAAAA+nBgAAAgAAAA84AAAAKgAAAA+oBgAAAgAAAA85AAAAKAAAAA+p + BgAAAgAAAA8wAAAAKQAAAA+qBgAAAgAAAA8tAAAAXwAAAA+rBgAAAgAAAA89AAAAKwAAAA+sBgAABAAA + AA9xAAAAUQAAAMr////q////D60GAAAEAAAAD3cAAABXAAAAw////+P///8PrgYAAAQAAAAPZQAAAEUA + AADV////9f///w+vBgAABAAAAA9yAAAAUgAAAMv////r////D7AGAAAEAAAAD3QAAABUAAAAxf///+X/ + //8PsQYAAAQAAAAPeQAAAFkAAADO////7v///w+yBgAABAAAAA91AAAAVQAAAMf////n////D7MGAAAE + AAAAD2kAAABJAAAA2/////v///8PtAYAAAQAAAAPbwAAAE8AAADd/////f///w+1BgAABAAAAA9wAAAA + UAAAANr////6////D7YGAAAEAAAAD1sAAAB7AAAAyP///+j///8PtwYAAAQAAAAPXQAAAH0AAADf//// + /////w+4BgAABAAAAA9hAAAAQQAAAMb////m////D7kGAAAEAAAAD3MAAABTAAAA2f////n///8PugYA + AAQAAAAPZAAAAEQAAADX////9////w+7BgAABAAAAA9mAAAARgAAAMH////h////D7wGAAAEAAAAD2cA + AABHAAAA0P////D///8PvQYAAAQAAAAPaAAAAEgAAADS////8v///w++BgAABAAAAA9qAAAASgAAAM// + ///v////D78GAAAEAAAAD2sAAABLAAAAzP///+z///8PwAYAAAQAAAAPbAAAAEwAAADE////5P///w/B + BgAABAAAAA87AAAAOgAAANb////2////D8IGAAAEAAAADycAAAAiAAAA3P////z///8PwwYAAAIAAAAP + XAAAAHwAAAAPxAYAAAQAAAAPegAAAFoAAADR////8f///w/FBgAABAAAAA94AAAAWAAAAN7////+//// + D8YGAAAEAAAAD2MAAABDAAAA0/////P///8PxwYAAAQAAAAPdgAAAFYAAADN////7f///w/IBgAABAAA + AA9iAAAAQgAAAMn////p////D8kGAAAEAAAAD24AAABOAAAA1P////T///8PygYAAAQAAAAPbQAAAE0A + AADY////+P///w/LBgAABAAAAA8sAAAAPAAAAML////i////D8wGAAAEAAAADy4AAAA+AAAAwP///+D/ + //8PzQYAAAIAAAAPLwAAAD8AAAAPzgYAAAIAAAAPPAAAAD4AAAAPzwYAAAAAAAAPD9AGAAACAAAADygA + AAApAAAAD9EGAAACAAAADzEAAAAhAAAAD9IGAAACAAAADzIAAAAiAAAAD9MGAAACAAAADzMAAAAvAAAA + D9QGAAACAAAADzQAAAAkAAAAD9UGAAACAAAADzUAAAA6AAAAD9YGAAACAAAADzYAAAAsAAAAD9cGAAAC + AAAADzcAAAAuAAAAD9gGAAACAAAADzgAAAA7AAAAD9kGAAACAAAADzkAAAA/AAAAD9oGAAACAAAADzAA + AAAlAAAAD9sGAAACAAAADy0AAABfAAAAD9wGAAACAAAADz0AAAArAAAAD90GAAACAAAAD8r////q//// + D94GAAACAAAAD8P////j////D98GAAACAAAAD9X////1////D+AGAAACAAAAD8v////r////D+EGAAAC + AAAAD8X////l////D+IGAAACAAAAD87////u////D+MGAAACAAAAD8f////n////D+QGAAACAAAAD9v/ + ///7////D+UGAAACAAAAD93////9////D+YGAAACAAAAD9r////6////D+cGAAACAAAAD8j////o//// + D+gGAAACAAAAD9//////////D+kGAAACAAAAD8b////m////D+oGAAACAAAAD9n////5////D+sGAAAC + AAAAD9f////3////D+wGAAACAAAAD8H////h////D+0GAAACAAAAD9D////w////D+4GAAACAAAAD9L/ + ///y////D+8GAAACAAAAD8/////v////D/AGAAACAAAAD8z////s////D/EGAAACAAAAD8T////k//// + D/IGAAACAAAAD9b////2////D/MGAAACAAAAD9z////8////D/QGAAACAAAAD1wAAAB8AAAAD/UGAAAC + AAAAD9H////x////D/YGAAACAAAAD97////+////D/cGAAACAAAAD9P////z////D/gGAAACAAAAD83/ + ///t////D/kGAAACAAAAD8n////p////D/oGAAACAAAAD9T////0////D/sGAAACAAAAD9j////4//// + D/wGAAACAAAAD8L////i////D/0GAAACAAAAD8D////g////D/4GAAACAAAADy8AAAA/AAAAD/8GAAAC + AAAADzwAAAA+AAAADwAHAAAAAAAADw8BBwAAAgAAAA9gAAAAfgAAAA8CBwAAAgAAAA8xAAAAIQAAAA8D + BwAAAgAAAA8yAAAAQAAAAA8EBwAAAgAAAA8zAAAAIwAAAA8FBwAAAgAAAA80AAAAJAAAAA8GBwAAAgAA + AA81AAAAJQAAAA8HBwAAAgAAAA82AAAAXgAAAA8IBwAAAgAAAA83AAAAJgAAAA8JBwAAAgAAAA84AAAA + KgAAAA8KBwAAAgAAAA85AAAAKAAAAA8LBwAAAgAAAA8wAAAAKQAAAA8MBwAAAgAAAA8tAAAAXwAAAA8N + BwAAAgAAAA89AAAAKwAAAA8OBwAABAAAAA9xAAAAUQAAAOn////J////Dw8HAAAEAAAAD3cAAABXAAAA + 9v///9b///8PEAcAAAQAAAAPZQAAAEUAAADz////0////w8RBwAABAAAAA9yAAAAUgAAAOr////K//// + DxIHAAAEAAAAD3QAAABUAAAA5f///8X///8PEwcAAAQAAAAPeQAAAFkAAADt////zf///w8UBwAABAAA + AA91AAAAVQAAAOP////D////DxUHAAAEAAAAD2kAAABJAAAA+P///9j///8PFgcAAAQAAAAPbwAAAE8A + AAD5////2f///w8XBwAABAAAAA9wAAAAUAAAAOf////H////DxgHAAAEAAAAD1sAAAB7AAAA9f///9X/ + //8PGQcAAAQAAAAPXQAAAH0AAAD6////2v///w8aBwAABAAAAA9hAAAAQQAAAPT////U////DxsHAAAE + AAAAD3MAAABTAAAA+////9v///8PHAcAAAQAAAAPZAAAAEQAAADi////wv///w8dBwAABAAAAA9mAAAA + RgAAAOD////A////Dx4HAAAEAAAAD2cAAABHAAAA7////8////8PHwcAAAQAAAAPaAAAAEgAAADw//// + 0P///w8gBwAABAAAAA9qAAAASgAAAO7////O////DyEHAAAEAAAAD2sAAABLAAAA6////8v///8PIgcA + AAQAAAAPbAAAAEwAAADk////xP///w8jBwAABAAAAA87AAAAOgAAAOb////G////DyQHAAAEAAAADycA + AAAiAAAA/f///93///8PJQcAAAIAAAAPXAAAAHwAAAAPJgcAAAQAAAAPegAAAFoAAAD/////3////w8n + BwAABAAAAA94AAAAWAAAAPf////X////DygHAAAEAAAAD2MAAABDAAAA8f///9H///8PKQcAAAQAAAAP + dgAAAFYAAADs////zP///w8qBwAABAAAAA9iAAAAQgAAAOj////I////DysHAAAEAAAAD24AAABOAAAA + 8v///9L///8PLAcAAAQAAAAPbQAAAE0AAAD8////3P///w8tBwAABAAAAA8sAAAAPAAAAOH////B//// + Dy4HAAAEAAAADy4AAAA+AAAA/v///97///8PLwcAAAIAAAAPLwAAAD8AAAAPMAcAAAIAAAAPPAAAAD4A + AAAPMQcAAAAAAAAPDzIHAAACAAAAD2AAAAB+AAAADzMHAAACAAAADzEAAAAhAAAADzQHAAACAAAADzIA + AABAAAAADzUHAAACAAAADzMAAAAjAAAADzYHAAACAAAADzQAAAAkAAAADzcHAAACAAAADzUAAAAlAAAA + DzgHAAACAAAADzYAAABeAAAADzkHAAACAAAADzcAAAAmAAAADzoHAAACAAAADzgAAAAqAAAADzsHAAAC + AAAADzkAAAAoAAAADzwHAAACAAAADzAAAAApAAAADz0HAAACAAAADy0AAABfAAAADz4HAAACAAAADz0A + AAArAAAADz8HAAAEAAAAD3EAAABRAAAA0f////H///8PQAcAAAQAAAAPdwAAAFcAAADX////9////w9B + BwAABAAAAA9lAAAARQAAAMX////l////D0IHAAAEAAAAD3IAAABSAAAA0v////L///8PQwcAAAQAAAAP + dAAAAFQAAADU////9P///w9EBwAABAAAAA95AAAAWQAAANn////5////D0UHAAAEAAAAD3UAAABVAAAA + 1f////X///8PRgcAAAQAAAAPaQAAAEkAAADJ////6f///w9HBwAABAAAAA9vAAAATwAAAM/////v//// + D0gHAAAEAAAAD3AAAABQAAAA0P////D///8PSQcAAAQAAAAPWwAAAHsAAADb////+////w9KBwAABAAA + AA9dAAAAfQAAAN3////9////D0sHAAAEAAAAD2EAAABBAAAAwf///+H///8PTAcAAAQAAAAPcwAAAFMA + AADT////8////w9NBwAABAAAAA9kAAAARAAAAMT////k////D04HAAAEAAAAD2YAAABGAAAAxv///+b/ + //8PTwcAAAQAAAAPZwAAAEcAAADH////5////w9QBwAABAAAAA9oAAAASAAAAMj////o////D1EHAAAE + AAAAD2oAAABKAAAAyv///+r///8PUgcAAAQAAAAPawAAAEsAAADL////6////w9TBwAABAAAAA9sAAAA + TAAAAMz////s////D1QHAAACAAAADzsAAAA6AAAAD1UHAAACAAAADycAAAAiAAAAD1YHAAACAAAAD1wA + AAB8AAAAD1cHAAAEAAAAD3oAAABaAAAA2v////r///8PWAcAAAQAAAAPeAAAAFgAAADY////+P///w9Z + BwAABAAAAA9jAAAAQwAAAMP////j////D1oHAAAEAAAAD3YAAABWAAAA1v////b///8PWwcAAAQAAAAP + YgAAAEIAAADC////4v///w9cBwAABAAAAA9uAAAATgAAAM7////u////D10HAAAEAAAAD20AAABNAAAA + zf///+3///8PXgcAAAIAAAAPLAAAADwAAAAPXwcAAAIAAAAPLgAAAD4AAAAPYAcAAAIAAAAPLwAAAD8A + AAAPYQcAAAIAAAAPPAAAAD4AAAAPYgcAAAAAAAAPD2MHAAAEAAAAD2AAAAB+AAAArf///73///8PZAcA + AAQAAAAPMQAAACEAAAAxAAAAIQAAAA9lBwAABAAAAA8yAAAAQAAAADIAAAAiAAAAD2YHAAAEAAAADzMA + AAAjAAAAMwAAACcAAAAPZwcAAAQAAAAPNAAAACQAAAA0AAAAKgAAAA9oBwAABAAAAA81AAAAJQAAADUA + AAA6AAAAD2kHAAAEAAAADzYAAABeAAAANgAAACwAAAAPagcAAAQAAAAPNwAAACYAAAA3AAAALgAAAA9r + BwAABAAAAA84AAAAKgAAADgAAAA7AAAAD2wHAAAEAAAADzkAAAAoAAAAOQAAACgAAAAPbQcAAAQAAAAP + MAAAACkAAAAwAAAAKQAAAA9uBwAABAAAAA8tAAAAXwAAAC0AAABfAAAAD28HAAAEAAAADz0AAAArAAAA + PQAAACsAAAAPcAcAAAQAAAAPcQAAAFEAAADK////6v///w9xBwAABAAAAA93AAAAVwAAAMP////j//// + D3IHAAAEAAAAD2UAAABFAAAA1f////X///8PcwcAAAQAAAAPcgAAAFIAAADL////6////w90BwAABAAA + AA90AAAAVAAAAMX////l////D3UHAAAEAAAAD3kAAABZAAAAzv///+7///8PdgcAAAQAAAAPdQAAAFUA + AADH////5////w93BwAABAAAAA9pAAAASQAAANv////7////D3gHAAAEAAAAD28AAABPAAAA3f////3/ + //8PeQcAAAQAAAAPcAAAAFAAAADa////+v///w96BwAABAAAAA9bAAAAewAAAMj////o////D3sHAAAE + AAAAD10AAAB9AAAAp////7f///8PfAcAAAQAAAAPYQAAAEEAAADG////5v///w99BwAABAAAAA9zAAAA + UwAAAKb///+2////D34HAAAEAAAAD2QAAABEAAAA1/////f///8PfwcAAAQAAAAPZgAAAEYAAADB//// + 4f///w+ABwAABAAAAA9nAAAARwAAAND////w////D4EHAAAEAAAAD2gAAABIAAAA0v////L///8PggcA + AAQAAAAPagAAAEoAAADP////7////w+DBwAABAAAAA9rAAAASwAAAMz////s////D4QHAAAEAAAAD2wA + AABMAAAAxP///+T///8PhQcAAAQAAAAPOwAAADoAAADW////9v///w+GBwAABAAAAA8nAAAAIgAAAKT/ + //+0////D4cHAAAEAAAAD1wAAAB8AAAAXAAAAHwAAAAPiAcAAAQAAAAPegAAAFoAAADR////8f///w+J + BwAABAAAAA94AAAAWAAAAN7////+////D4oHAAAEAAAAD2MAAABDAAAA0/////P///8PiwcAAAQAAAAP + dgAAAFYAAADN////7f///w+MBwAABAAAAA9iAAAAQgAAAMn////p////D40HAAAEAAAAD24AAABOAAAA + 1P////T///8PjgcAAAQAAAAPbQAAAE0AAADY////+P///w+PBwAABAAAAA8sAAAAPAAAAML////i//// + D5AHAAAEAAAADy4AAAA+AAAAwP///+D///8PkQcAAAQAAAAPLwAAAD8AAAAvAAAAPwAAAA+SBwAAAgAA + AA88AAAAPgAAAA+TBwAAAAAAAA8PlAcAAAIAAAAPrf///73///8PlQcAAAIAAAAPMQAAACEAAAAPlgcA + AAIAAAAPMgAAACIAAAAPlwcAAAIAAAAPMwAAACcAAAAPmAcAAAIAAAAPNAAAADsAAAAPmQcAAAIAAAAP + NQAAACUAAAAPmgcAAAIAAAAPNgAAADoAAAAPmwcAAAIAAAAPNwAAAD8AAAAPnAcAAAIAAAAPOAAAACoA + AAAPnQcAAAIAAAAPOQAAACgAAAAPngcAAAIAAAAPMAAAACkAAAAPnwcAAAIAAAAPLQAAAF8AAAAPoAcA + AAIAAAAPPQAAACsAAAAPoQcAAAIAAAAPyv///+r///8PogcAAAIAAAAPw////+P///8PowcAAAIAAAAP + 1f////X///8PpAcAAAIAAAAPy////+v///8PpQcAAAIAAAAPxf///+X///8PpgcAAAIAAAAPzv///+7/ + //8PpwcAAAIAAAAPx////+f///8PqAcAAAIAAAAP2/////v///8PqQcAAAIAAAAP3f////3///8PqgcA + AAIAAAAP2v////r///8PqwcAAAIAAAAPyP///+j///8PrAcAAAIAAAAPp////7f///8PrQcAAAIAAAAP + xv///+b///8PrgcAAAIAAAAPpv///7b///8PrwcAAAIAAAAP1/////f///8PsAcAAAIAAAAPwf///+H/ + //8PsQcAAAIAAAAP0P////D///8PsgcAAAIAAAAP0v////L///8PswcAAAIAAAAPz////+////8PtAcA + AAIAAAAPzP///+z///8PtQcAAAIAAAAPxP///+T///8PtgcAAAIAAAAP1v////b///8PtwcAAAIAAAAP + pP///7T///8PuAcAAAIAAAAPXAAAAC8AAAAPuQcAAAIAAAAP0f////H///8PugcAAAIAAAAP3v////7/ + //8PuwcAAAIAAAAP0/////P///8PvAcAAAIAAAAPzf///+3///8PvQcAAAIAAAAPyf///+n///8PvgcA + AAIAAAAP1P////T///8PvwcAAAIAAAAP2P////j///8PwAcAAAIAAAAPwv///+L///8PwQcAAAIAAAAP + wP///+D///8PwgcAAAIAAAAPLgAAACwAAAAPwwcAAAIAAAAPPAAAAD4AAAAPxAcAAAAAAAAPD8UHAAAC + AAAAD6P///+z////D8YHAAACAAAADzEAAAAhAAAAD8cHAAACAAAADzIAAAAiAAAAD8gHAAACAAAADzMA + AAAnAAAAD8kHAAACAAAADzQAAAA7AAAAD8oHAAACAAAADzUAAAAlAAAAD8sHAAACAAAADzYAAAA6AAAA + D8wHAAACAAAADzcAAAA/AAAAD80HAAACAAAADzgAAAAqAAAAD84HAAACAAAADzkAAAAoAAAAD88HAAAC + AAAADzAAAAApAAAAD9AHAAACAAAADy0AAABfAAAAD9EHAAACAAAADz0AAAArAAAAD9IHAAACAAAAD8r/ + ///q////D9MHAAACAAAAD8P////j////D9QHAAACAAAAD9X////1////D9UHAAACAAAAD8v////r//// + D9YHAAACAAAAD8X////l////D9cHAAACAAAAD87////u////D9gHAAACAAAAD8f////n////D9kHAAAC + AAAAD9v////7////D9oHAAACAAAAD93////9////D9sHAAACAAAAD9r////6////D9wHAAACAAAAD8j/ + ///o////D90HAAACAAAAD9//////////D94HAAACAAAAD8b////m////D98HAAACAAAAD9n////5//// + D+AHAAACAAAAD9f////3////D+EHAAACAAAAD8H////h////D+IHAAACAAAAD9D////w////D+MHAAAC + AAAAD9L////y////D+QHAAACAAAAD8/////v////D+UHAAACAAAAD8z////s////D+YHAAACAAAAD8T/ + ///k////D+cHAAACAAAAD9b////2////D+gHAAACAAAAD9z////8////D+kHAAACAAAAD1wAAAAvAAAA + D+oHAAACAAAAD9H////x////D+sHAAACAAAAD97////+////D+wHAAACAAAAD9P////z////D+0HAAAC + AAAAD83////t////D+4HAAACAAAAD8n////p////D+8HAAACAAAAD9T////0////D/AHAAACAAAAD9j/ + ///4////D/EHAAACAAAAD8L////i////D/IHAAACAAAAD8D////g////D/MHAAACAAAADy4AAAAsAAAA + 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 + IgAAALf///8PjAgAAAMAAAAPMwAAACsAAABeAAAAD40IAAADAAAADzQAAAAhAAAAov///w+OCAAABAAA + AA81AAAAJQAAADAAAACw////D48IAAADAAAADzYAAAAvAAAAsv///w+QCAAAAwAAAA83AAAAPQAAAGAA + AAAPkQgAAAMAAAAPOAAAACgAAAD/////D5IIAAADAAAADzkAAAApAAAAtP///w+TCAAAAwAAAA/2//// + 1v///73///8PlAgAAAMAAAAP/P///9z///+o////D5UIAAADAAAAD/P////T////uP///w+WCAAAAwAA + AA9xAAAAUQAAAFwAAAAPlwgAAAMAAAAPdwAAAFcAAAB8AAAAD5gIAAACAAAAD2UAAABFAAAAD5kIAAAC + AAAAD3IAAABSAAAAD5oIAAACAAAAD3QAAABUAAAAD5sIAAACAAAAD3oAAABaAAAAD5wIAAACAAAAD3UA + AABVAAAAD50IAAADAAAAD2kAAABJAAAAzf///w+eCAAAAwAAAA9vAAAATwAAAPj///8PnwgAAAIAAAAP + cAAAAFAAAAAPoAgAAAMAAAAP9f///9X////3////D6EIAAADAAAAD/r////a////1////w+iCAAAAgAA + AA9hAAAAQQAAAA+jCAAAAwAAAA9zAAAAUwAAAPD///8PpAgAAAMAAAAPZAAAAEQAAADQ////D6UIAAAD + AAAAD2YAAABGAAAAWwAAAA+mCAAAAwAAAA9nAAAARwAAAF0AAAAPpwgAAAIAAAAPaAAAAEgAAAAPqAgA + AAMAAAAPagAAAEoAAADt////D6kIAAADAAAAD2sAAABLAAAAs////w+qCAAAAwAAAA9sAAAATAAAAKP/ + //8PqwgAAAMAAAAP6f///8n///8kAAAAD6wIAAADAAAAD+H////B////3////w+tCAAAAwAAAA/7//// + 2////6T///8PrggAAAMAAAAPeQAAAFkAAAA+AAAAD68IAAADAAAAD3gAAABYAAAAIwAAAA+wCAAAAwAA + AA9jAAAAQwAAACYAAAAPsQgAAAMAAAAPdgAAAFYAAABAAAAAD7IIAAADAAAAD2IAAABCAAAAewAAAA+z + CAAAAwAAAA9uAAAATgAAAH0AAAAPtAgAAAIAAAAPbQAAAE0AAAAPtQgAAAMAAAAPLAAAAD8AAAA7AAAA + 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 + TgAAAA8WCQAAAgAAAA9tAAAATQAAAA8XCQAAAgAAAA8sAAAAOwAAAA8YCQAAAgAAAA8uAAAAOgAAAA8Z + CQAAAgAAAA8tAAAAXwAAAA8aCQAAAgAAAA88AAAAPgAAAA8bCQAAAAAAAA8PHAkAAAIAAAAPYAAAAH4A + AAAPHQkAAAIAAAAPMQAAACEAAAAPHgkAAAIAAAAPMgAAACIAAAAPHwkAAAIAAAAPMwAAACMAAAAPIAkA + AAIAAAAPNAAAACQAAAAPIQkAAAIAAAAPNQAAACUAAAAPIgkAAAIAAAAPNgAAACYAAAAPIwkAAAIAAAAP + NwAAAC8AAAAPJAkAAAIAAAAPOAAAACgAAAAPJQkAAAIAAAAPOQAAACkAAAAPJgkAAAIAAAAPMAAAAD0A + AAAPJwkAAAIAAAAPJwAAAD8AAAAPKAkAAAIAAAAPKwAAACoAAAAPKQkAAAIAAAAPqf///7n///8PKgkA + AAIAAAAPqv///7r///8PKwkAAAIAAAAPxf///+X///8PLAkAAAIAAAAP0v////L///8PLQkAAAIAAAAP + 1P////T///8PLgkAAAIAAAAP2v////r///8PLwkAAAIAAAAP1f////X///8PMAkAAAIAAAAPyf///+n/ + //8PMQkAAAIAAAAPz////+////8PMgkAAAIAAAAP0P////D///8PMwkAAAIAAAAP2/////v///8PNAkA + AAIAAAAPWwAAAF0AAAAPNQkAAAIAAAAPwf///+H///8PNgkAAAIAAAAP0/////P///8PNwkAAAIAAAAP + xP///+T///8POAkAAAIAAAAPxv///+b///8POQkAAAIAAAAPx////+f///8POgkAAAIAAAAPyP///+j/ + //8POwkAAAIAAAAPqP///7j///8PPAkAAAIAAAAPy////+v///8PPQkAAAIAAAAPzP///+z///8PPgkA + AAIAAAAP3v////7///8PPwkAAAIAAAAPq////7v///8PQAkAAAIAAAAPLQAAAF8AAAAPQQkAAAIAAAAP + of///7H///8PQgkAAAIAAAAPr////7////8PQwkAAAIAAAAPw////+P///8PRAkAAAIAAAAP1/////f/ + //8PRQkAAAIAAAAPwv///+L///8PRgkAAAIAAAAPzv///+7///8PRwkAAAIAAAAPzf///+3///8PSAkA + AAIAAAAPLAAAADsAAAAPSQkAAAIAAAAPLgAAADoAAAAPSgkAAAIAAAAP1v////b///8PSwkAAAIAAAAP + PAAAAD4AAAAPTAkAAAAAAAAPD00JAAACAAAAD2AAAAB+AAAAD04JAAACAAAADzEAAAAhAAAAD08JAAAE + AAAADzIAAABAAAAAMgAAACIAAAAPUAkAAAIAAAAPMwAAACMAAAAPUQkAAAIAAAAPNAAAACQAAAAPUgkA + AAIAAAAPNQAAACUAAAAPUwkAAAQAAAAPNgAAAF4AAAA2AAAAJgAAAA9UCQAABAAAAA83AAAAJgAAADcA + AAAvAAAAD1UJAAAEAAAADzgAAAAqAAAAOAAAACgAAAAPVgkAAAQAAAAPOQAAACgAAAA5AAAAKQAAAA9X + CQAABAAAAA8wAAAAKQAAADAAAAA9AAAAD1gJAAAEAAAADy0AAABfAAAAJwAAAD8AAAAPWQkAAAQAAAAP + PQAAACsAAAArAAAAKgAAAA9aCQAABAAAAA9xAAAAUQAAAKn///+5////D1sJAAAEAAAAD3cAAABXAAAA + qv///7r///8PXAkAAAQAAAAPZQAAAEUAAADF////5f///w9dCQAABAAAAA9yAAAAUgAAANL////y//// + D14JAAAEAAAAD3QAAABUAAAA1P////T///8PXwkAAAQAAAAPeQAAAFkAAADa////+v///w9gCQAABAAA + AA91AAAAVQAAANX////1////D2EJAAAEAAAAD2kAAABJAAAAyf///+n///8PYgkAAAQAAAAPbwAAAE8A + AADP////7////w9jCQAABAAAAA9wAAAAUAAAAND////w////D2QJAAAEAAAAD1sAAAB7AAAA2/////v/ + //8PZQkAAAQAAAAPXQAAAH0AAABbAAAAXQAAAA9mCQAABAAAAA9hAAAAQQAAAMH////h////D2cJAAAE + AAAAD3MAAABTAAAA0/////P///8PaAkAAAQAAAAPZAAAAEQAAADE////5P///w9pCQAABAAAAA9mAAAA + RgAAAMb////m////D2oJAAAEAAAAD2cAAABHAAAAx////+f///8PawkAAAQAAAAPaAAAAEgAAADI//// + 6P///w9sCQAABAAAAA9qAAAASgAAAKj///+4////D20JAAAEAAAAD2sAAABLAAAAy////+v///8PbgkA + AAQAAAAPbAAAAEwAAADM////7P///w9vCQAABAAAAA87AAAAOgAAAN7////+////D3AJAAAEAAAADycA + AAAiAAAAq////7v///8PcQkAAAQAAAAPXAAAAHwAAAAtAAAAXwAAAA9yCQAABAAAAA96AAAAWgAAAKH/ + //+x////D3MJAAAEAAAAD3gAAABYAAAAr////7////8PdAkAAAQAAAAPYwAAAEMAAADD////4////w91 + CQAABAAAAA92AAAAVgAAANf////3////D3YJAAAEAAAAD2IAAABCAAAAwv///+L///8PdwkAAAQAAAAP + bgAAAE4AAADO////7v///w94CQAABAAAAA9tAAAATQAAAM3////t////D3kJAAAEAAAADywAAAA8AAAA + LAAAADsAAAAPegkAAAQAAAAPLgAAAD4AAAAuAAAAOgAAAA97CQAABAAAAA8vAAAAPwAAANb////2//// + D3wJAAACAAAADzwAAAA+AAAAD30JAAAAAAAADw9+CQAAAgAAAA+4////qP///w9/CQAAAgAAAA8xAAAA + IQAAAA+ACQAAAgAAAA8yAAAAIgAAAA+BCQAAAgAAAA8zAAAAIwAAAA+CCQAAAgAAAA80AAAAJAAAAA+D + CQAAAgAAAA81AAAAJQAAAA+ECQAAAgAAAA82AAAAJgAAAA+FCQAAAgAAAA83AAAALwAAAA+GCQAAAgAA + AA84AAAAKAAAAA+HCQAAAgAAAA85AAAAKQAAAA+ICQAAAgAAAA8wAAAAPQAAAA+JCQAAAgAAAA8nAAAA + PwAAAA+KCQAAAgAAAA8rAAAAKgAAAA+LCQAAAgAAAA9xAAAAUQAAAA+MCQAAAgAAAA93AAAAVwAAAA+N + CQAAAgAAAA9lAAAARQAAAA+OCQAAAgAAAA9yAAAAUgAAAA+PCQAAAgAAAA90AAAAVAAAAA+QCQAAAgAA + AA96AAAAWgAAAA+RCQAAAgAAAA91AAAAVQAAAA+SCQAAAgAAAA9pAAAASQAAAA+TCQAAAgAAAA9vAAAA + TwAAAA+UCQAAAgAAAA9wAAAAUAAAAA+VCQAAAgAAAA+5////qf///w+WCQAAAgAAAA/w////0P///w+X + CQAAAgAAAA9hAAAAQQAAAA+YCQAAAgAAAA9zAAAAUwAAAA+ZCQAAAgAAAA9kAAAARAAAAA+aCQAAAgAA + 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 + AAAP/QkAAAIAAAAPZwAAAEcAAAAP/gkAAAIAAAAPaAAAAEgAAAAP/wkAAAIAAAAPagAAAEoAAAAPAAoA + AAIAAAAPawAAAEsAAAAPAQoAAAIAAAAPbAAAAEwAAAAPAgoAAAIAAAAPOwAAACsAAAAPAwoAAAIAAAAP + OgAAACoAAAAPBAoAAAIAAAAPXQAAAH0AAAAPBQoAAAIAAAAPegAAAFoAAAAPBgoAAAIAAAAPeAAAAFgA + AAAPBwoAAAIAAAAPYwAAAEMAAAAPCAoAAAIAAAAPdgAAAFYAAAAPCQoAAAIAAAAPYgAAAEIAAAAPCgoA + AAIAAAAPbgAAAE4AAAAPCwoAAAIAAAAPbQAAAE0AAAAPDAoAAAIAAAAPLAAAADwAAAAPDQoAAAIAAAAP + LgAAAD4AAAAPDgoAAAIAAAAPLwAAAD8AAAAPDwoAAAIAAAAPXAAAAF8AAAAPEAoAAAAAAAAPDxEKAAAC + AAAADzEAAAAhAAAADxIKAAACAAAADzIAAAAiAAAADxMKAAACAAAADzMAAAAjAAAADxQKAAACAAAADzQA + AAAkAAAADxUKAAACAAAADzUAAAAlAAAADxYKAAACAAAADzYAAAAmAAAADxcKAAACAAAADzcAAAAnAAAA + DxgKAAACAAAADzgAAAAoAAAADxkKAAACAAAADzkAAAApAAAADxoKAAABAAAADzAAAAAPGwoAAAIAAAAP + LQAAAD0AAAAPHAoAAAIAAAAPXgAAAGAAAAAPHQoAAAIAAAAPXAAAAHwAAAAPHgoAAAIAAAAPcQAAAFEA + AAAPHwoAAAIAAAAPdwAAAFcAAAAPIAoAAAIAAAAPZQAAAEUAAAAPIQoAAAIAAAAPcgAAAFIAAAAPIgoA + AAIAAAAPdAAAAFQAAAAPIwoAAAIAAAAPeQAAAFkAAAAPJAoAAAIAAAAPdQAAAFUAAAAPJQoAAAIAAAAP + aQAAAEkAAAAPJgoAAAIAAAAPbwAAAE8AAAAPJwoAAAIAAAAPcAAAAFAAAAAPKAoAAAIAAAAPQAAAAH4A + AAAPKQoAAAIAAAAPWwAAAHsAAAAPKgoAAAIAAAAPYQAAAEEAAAAPKwoAAAIAAAAPcwAAAFMAAAAPLAoA + AAIAAAAPZAAAAEQAAAAPLQoAAAIAAAAPZgAAAEYAAAAPLgoAAAIAAAAPZwAAAEcAAAAPLwoAAAIAAAAP + aAAAAEgAAAAPMAoAAAIAAAAPagAAAEoAAAAPMQoAAAIAAAAPawAAAEsAAAAPMgoAAAIAAAAPbAAAAEwA + AAAPMwoAAAIAAAAPOwAAACsAAAAPNAoAAAIAAAAPOgAAACoAAAAPNQoAAAIAAAAPXQAAAH0AAAAPNgoA + AAIAAAAPegAAAFoAAAAPNwoAAAIAAAAPeAAAAFgAAAAPOAoAAAIAAAAPYwAAAEMAAAAPOQoAAAIAAAAP + dgAAAFYAAAAPOgoAAAIAAAAPYgAAAEIAAAAPOwoAAAIAAAAPbgAAAE4AAAAPPAoAAAIAAAAPbQAAAE0A + AAAPPQoAAAIAAAAPLAAAADwAAAAPPgoAAAIAAAAPLgAAAD4AAAAPPwoAAAIAAAAPLwAAAD8AAAAPQAoA + AAIAAAAPXAAAAF8AAAAPQQoAAAAAAAAPD0IKAAACAAAADzsAAAAwAAAAD0MKAAACAAAADysAAAAxAAAA + D0QKAAACAAAAD7X///8yAAAAD0UKAAACAAAAD7n///8zAAAAD0YKAAACAAAAD+j///80AAAAD0cKAAAC + AAAAD7v///81AAAAD0gKAAACAAAAD77///82AAAAD0kKAAACAAAAD/3///83AAAAD0oKAAACAAAAD+H/ + //84AAAAD0sKAAACAAAAD+3///85AAAAD0wKAAACAAAAD+n///8wAAAAD00KAAACAAAADz0AAAAlAAAA + D04KAAACAAAADycAAAB2AAAAD08KAAACAAAAD3EAAABRAAAAD1AKAAACAAAAD3cAAABXAAAAD1EKAAAC + AAAAD2UAAABFAAAAD1IKAAACAAAAD3IAAABSAAAAD1MKAAACAAAAD3QAAABUAAAAD1QKAAACAAAAD3kA + AABZAAAAD1UKAAACAAAAD3UAAABVAAAAD1YKAAACAAAAD2kAAABJAAAAD1cKAAACAAAAD28AAABPAAAA + D1gKAAACAAAAD3AAAABQAAAAD1kKAAACAAAAD/r///8vAAAAD1oKAAACAAAAD+T///8oAAAAD1sKAAAC + AAAAD2EAAABBAAAAD1wKAAACAAAAD3MAAABTAAAAD10KAAACAAAAD2QAAABEAAAAD14KAAACAAAAD2YA + AABGAAAAD18KAAACAAAAD2cAAABHAAAAD2AKAAACAAAAD2gAAABIAAAAD2EKAAACAAAAD2oAAABKAAAA + D2IKAAACAAAAD2sAAABLAAAAD2MKAAACAAAAD2wAAABMAAAAD2QKAAACAAAAD/T///8iAAAAD2UKAAAC + AAAAD6f///8hAAAAD2YKAAACAAAAD/L///8pAAAAD2cKAAACAAAAD3oAAABaAAAAD2gKAAACAAAAD3gA + AABYAAAAD2kKAAACAAAAD2MAAABDAAAAD2oKAAACAAAAD3YAAABWAAAAD2sKAAACAAAAD2IAAABCAAAA + D2wKAAACAAAAD24AAABOAAAAD20KAAACAAAAD20AAABNAAAAD24KAAACAAAADywAAAA/AAAAD28KAAAC + AAAADy4AAAA6AAAAD3AKAAACAAAADy0AAABfAAAAD3EKAAACAAAADzwAAAA+AAAAD3IKAAAAAAAADw9z + CgAAAgAAAA9gAAAAfgAAAA90CgAAAgAAAA8xAAAAIQAAAA91CgAAAgAAAA8yAAAAQAAAAA92CgAAAgAA + AA8zAAAAIwAAAA93CgAAAgAAAA80AAAAJAAAAA94CgAAAgAAAA81AAAAJQAAAA95CgAAAgAAAA82AAAA + XgAAAA96CgAAAgAAAA83AAAAJgAAAA97CgAAAgAAAA84AAAAKgAAAA98CgAAAgAAAA85AAAAKAAAAA99 + CgAAAgAAAA8wAAAAKQAAAA9+CgAAAgAAAA8tAAAAXwAAAA9/CgAAAgAAAA89AAAAKwAAAA+ACgAABAAA + AA9xAAAAUQAAAOT////E////D4EKAAAEAAAAD3cAAABXAAAA7P///8z///8PggoAAAQAAAAPZQAAAEUA + AADp////yf///w+DCgAABAAAAA9yAAAAUgAAAPj////Y////D4QKAAAEAAAAD3QAAABUAAAAu////6v/ + //8PhQoAAAQAAAAPeQAAAFkAAAD9////3f///w+GCgAABAAAAA91AAAAVQAAAPn////Z////D4cKAAAE + AAAAD2kAAABJAAAA7f///83///8PiAoAAAQAAAAPbwAAAE8AAADz////0////w+JCgAABAAAAA9wAAAA + UAAAAPb////W////D4oKAAACAAAAD1sAAAB7AAAAD4sKAAACAAAAD10AAAB9AAAAD4wKAAAEAAAAD2EA + AABBAAAA4f///8H///8PjQoAAAQAAAAPcwAAAFMAAAC5////qf///w+OCgAABAAAAA9kAAAARAAAAO// + ///P////D48KAAAEAAAAD2YAAABGAAAA6////8v///8PkAoAAAQAAAAPZwAAAEcAAADg////wP///w+R + CgAABAAAAA9oAAAASAAAAPr////a////D5IKAAAEAAAAD2oAAABKAAAA/P///9z///8PkwoAAAQAAAAP + awAAAEsAAAD0////1P///w+UCgAABAAAAA9sAAAATAAAALX///+l////D5UKAAACAAAADzsAAAA6AAAA + D5YKAAACAAAADycAAAAiAAAAD5cKAAACAAAAD1wAAAB8AAAAD5gKAAAEAAAAD3oAAABaAAAAvv///67/ + //8PmQoAAAMAAAAPeAAAAFgAAACk////D5oKAAAEAAAAD2MAAABDAAAA6P///8j///8PmwoAAAQAAAAP + dgAAAFYAAADn////x////w+cCgAAAgAAAA9iAAAAQgAAAA+dCgAABAAAAA9uAAAATgAAAPL////S//// + D54KAAAEAAAAD20AAABNAAAA5f///8X///8PnwoAAAIAAAAPLAAAADwAAAAPoAoAAAIAAAAPLgAAAD4A + AAAPoQoAAAIAAAAPLwAAAD8AAAAPogoAAAIAAAAPPAAAAD4AAAAPowoAAAAAAAAPD6QKAAABAAAADzsA + AAAPpQoAAAIAAAAPKwAAADEAAAAPpgoAAAIAAAAP7P///zIAAAAPpwoAAAIAAAAPuf///zMAAAAPqAoA + AAIAAAAP6P///zQAAAAPqQoAAAIAAAAP+P///zUAAAAPqgoAAAIAAAAPvv///zYAAAAPqwoAAAIAAAAP + /f///zcAAAAPrAoAAAIAAAAP4f///zgAAAAPrQoAAAIAAAAP7f///zkAAAAPrgoAAAQAAAAP6f///zAA + AAC9////KQAAAA+vCgAAAgAAAA89AAAAJQAAAA+wCgAAAAAAAA8PsQoAAAMAAAAPcQAAAFEAAABcAAAA + D7IKAAADAAAAD3cAAABXAAAAfAAAAA+zCgAAAgAAAA9lAAAARQAAAA+0CgAAAgAAAA9yAAAAUgAAAA+1 + CgAAAgAAAA90AAAAVAAAAA+2CgAAAgAAAA95AAAAWQAAAA+3CgAAAgAAAA91AAAAVQAAAA+4CgAAAgAA + AA9pAAAASQAAAA+5CgAAAgAAAA9vAAAATwAAAA+6CgAAAgAAAA9wAAAAUAAAAA+7CgAABAAAAA/6//// + LwAAAFsAAAB7AAAAD7wKAAAEAAAADykAAAAoAAAAXQAAAH0AAAAPvQoAAAIAAAAPYQAAAEEAAAAPvgoA + AAMAAAAPcwAAAFMAAADw////D78KAAADAAAAD2QAAABEAAAA0P///w/ACgAAAwAAAA9mAAAARgAAAFsA + AAAPwQoAAAMAAAAPZwAAAEcAAABdAAAAD8IKAAACAAAAD2gAAABIAAAAD8MKAAACAAAAD2oAAABKAAAA + D8QKAAADAAAAD2sAAABLAAAAs////w/FCgAAAwAAAA9sAAAATAAAAKP///8PxgoAAAMAAAAP+f///yIA + AAAkAAAAD8cKAAADAAAAD6f///8hAAAA3////w/ICgAAAgAAAA+o////JwAAAA/JCgAAAwAAAA96AAAA + WgAAAD4AAAAPygoAAAMAAAAPeAAAAFgAAAAjAAAAD8sKAAADAAAAD2MAAABDAAAAJgAAAA/MCgAAAwAA + AA92AAAAVgAAAEAAAAAPzQoAAAMAAAAPYgAAAEIAAAB7AAAAD84KAAADAAAAD24AAABOAAAAfQAAAA/P + CgAAAgAAAA9tAAAATQAAAA/QCgAAAwAAAA8sAAAAPwAAADwAAAAP0QoAAAMAAAAPLgAAADoAAAA+AAAA + D9IKAAADAAAADy0AAABfAAAAKgAAAA/TCgAABAAAAA88AAAAPgAAAFwAAAB8AAAAD9QKAAAAAAAADw/V + CgAAAQAAAA87AAAAD9YKAAACAAAADysAAAAxAAAAD9cKAAACAAAAD+z///8yAAAAD9gKAAACAAAAD7n/ + //8zAAAAD9kKAAACAAAAD+j///80AAAAD9oKAAACAAAAD/j///81AAAAD9sKAAACAAAAD77///82AAAA + D9wKAAACAAAAD/3///83AAAAD90KAAACAAAAD+H///84AAAAD94KAAACAAAAD+3///85AAAAD98KAAAC + AAAAD+n///8wAAAAD+AKAAACAAAADz0AAAAlAAAAD+EKAAACAAAAD7T///+3////D+IKAAACAAAAD3EA + AABRAAAAD+MKAAACAAAAD3cAAABXAAAAD+QKAAACAAAAD2UAAABFAAAAD+UKAAACAAAAD3IAAABSAAAA + D+YKAAACAAAAD3QAAABUAAAAD+cKAAACAAAAD3oAAABaAAAAD+gKAAACAAAAD3UAAABVAAAAD+kKAAAC + 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 + AA9yAAAAUgAAAPH////R////DwENAAAEAAAAD3QAAABUAAAA9P///9T///8PAg0AAAQAAAAPeQAAAFkA + AAD1////1f///w8DDQAABAAAAA91AAAAVQAAAOj////I////DwQNAAAEAAAAD2kAAABJAAAA6f///8n/ + //8PBQ0AAAQAAAAPbwAAAE8AAADv////z////w8GDQAABAAAAA9wAAAAUAAAAPD////Q////DwcNAAAC + AAAAD1sAAAB7AAAADwgNAAACAAAAD10AAAB9AAAADwkNAAAEAAAAD2EAAABBAAAA4f///8H///8PCg0A + AAIAAAAPcwAAAFMAAAAPCw0AAAQAAAAPZAAAAEQAAADk////xP///w8MDQAABAAAAA9mAAAARgAAAPb/ + ///W////Dw0NAAAEAAAAD2cAAABHAAAA4////8P///8PDg0AAAQAAAAPaAAAAEgAAADn////x////w8P + DQAABAAAAA9qAAAASgAAAO7////O////DxANAAAEAAAAD2sAAABLAAAA6v///8r///8PEQ0AAAQAAAAP + bAAAAEwAAADr////y////w8SDQAABAAAAA87AAAAOgAAALT///+o////DxMNAAACAAAADycAAAAiAAAA + DxQNAAACAAAAD1wAAAB8AAAADxUNAAAEAAAAD3oAAABaAAAA5v///8b///8PFg0AAAQAAAAPeAAAAFgA + AAD3////1////w8XDQAABAAAAA9jAAAAQwAAAPj////Y////DxgNAAAEAAAAD3YAAABWAAAA+f///9n/ + //8PGQ0AAAQAAAAPYgAAAEIAAADi////wv///w8aDQAABAAAAA9uAAAATgAAAO3////N////DxsNAAAE + AAAAD20AAABNAAAA7P///8z///8PHA0AAAIAAAAPLAAAADwAAAAPHQ0AAAIAAAAPLgAAAD4AAAAPHg0A + AAIAAAAPLwAAAD8AAAAPHw0AAAIAAAAPPAAAAD4AAAAPIA0AAAAAAAAPDyENAAAEAAAAD2AAAAB+AAAA + XwAAACUAAAAPIg0AAAQAAAAPMQAAACEAAADl////KwAAAA8jDQAABAAAAA8yAAAAQAAAAC8AAADx//// + DyQNAAAEAAAADzMAAAAjAAAALQAAAPL///8PJQ0AAAQAAAAPNAAAACQAAADA////8////w8mDQAABAAA + AA81AAAAJQAAALb////0////DycNAAAEAAAADzYAAABeAAAA2P///9n///8PKA0AAAQAAAAPNwAAACYA + AADW////3////w8pDQAABAAAAA84AAAAKgAAAKT////1////DyoNAAAEAAAADzkAAAAoAAAAtf////b/ + //8PKw0AAAQAAAAPMAAAACkAAACo////9////w8sDQAABAAAAA8tAAAAXwAAAKL////4////Dy0NAAAE + AAAADz0AAAArAAAAqv////n///8PLg0AAAQAAAAPcQAAAFEAAADm////8P///w8vDQAABAAAAA93AAAA + VwAAAOT///8iAAAADzANAAAEAAAAD2UAAABFAAAA0////67///8PMQ0AAAQAAAAPcgAAAFIAAAC+//// + sf///w8yDQAABAAAAA90AAAAVAAAAND///+4////DzMNAAAEAAAAD3kAAABZAAAA0f///+3///8PNA0A + AAQAAAAPdQAAAFUAAADV////6v///w81DQAABAAAAA9pAAAASQAAAMP///+z////DzYNAAAEAAAAD28A + AABPAAAAuf///8////8PNw0AAAQAAAAPcAAAAFAAAADC////rf///w84DQAABAAAAA9bAAAAewAAALr/ + //+w////DzkNAAAEAAAAD10AAAB9AAAAxf///ywAAAAPOg0AAAQAAAAPYQAAAEEAAAC/////xP///w87 + DQAABAAAAA9zAAAAUwAAAMv///+m////DzwNAAAEAAAAD2QAAABEAAAAof///6////8PPQ0AAAQAAAAP + ZgAAAEYAAAC0////4v///w8+DQAABAAAAA9nAAAARwAAAOD///+s////Dz8NAAAEAAAAD2gAAABIAAAA + 6f///+f///8PQA0AAAQAAAAPagAAAEoAAADo////6////w9BDQAABAAAAA9rAAAASwAAANL////J//// + D0INAAAEAAAAD2wAAABMAAAAyv///8j///8PQw0AAAQAAAAPOwAAADoAAADH////q////w9EDQAABAAA + AA8nAAAAIgAAAKf///8uAAAAD0UNAAAEAAAAD1wAAAB8AAAAo////6X///8PRg0AAAQAAAAPegAAAFoA + AAC8////KAAAAA9HDQAABAAAAA94AAAAWAAAALv///8pAAAAD0gNAAAEAAAAD2MAAABDAAAA4f///6n/ + //8PSQ0AAAQAAAAPdgAAAFYAAADN////zv///w9KDQAAAwAAAA9iAAAAQgAAANr///8PSw0AAAQAAAAP + bgAAAE4AAADX////7P///w9MDQAABAAAAA9tAAAATQAAALf///8/AAAAD00NAAAEAAAADywAAAA8AAAA + wf///7L///8PTg0AAAQAAAAPLgAAAD4AAADj////zP///w9PDQAABAAAAA8vAAAAPwAAAL3////G//// + D1ANAAAAAAAADw9RDQAAAAAAAA8PUg0AAAIAAAAPQAAAAKf///8PUw0AAAIAAAAPMQAAACEAAAAPVA0A + AAIAAAAPMgAAACIAAAAPVQ0AAAIAAAAPMwAAACMAAAAPVg0AAAIAAAAPNAAAACQAAAAPVw0AAAIAAAAP + NQAAACUAAAAPWA0AAAIAAAAPNgAAACYAAAAPWQ0AAAIAAAAPNwAAAF8AAAAPWg0AAAIAAAAPOAAAACgA + AAAPWw0AAAIAAAAPOQAAACkAAAAPXA0AAAIAAAAPMAAAACcAAAAPXQ0AAAIAAAAPLwAAAD8AAAAPXg0A + AAIAAAAPsP///34AAAAPXw0AAAIAAAAPcQAAAFEAAAAPYA0AAAIAAAAPdwAAAFcAAAAPYQ0AAAIAAAAP + ZQAAAEUAAAAPYg0AAAIAAAAPcgAAAFIAAAAPYw0AAAIAAAAPdAAAAFQAAAAPZA0AAAIAAAAPeQAAAFkA + AAAPZQ0AAAIAAAAPdQAAAFUAAAAPZg0AAAIAAAAPaQAAAEkAAAAPZw0AAAIAAAAPbwAAAE8AAAAPaA0A + AAIAAAAPcAAAAFAAAAAPaQ0AAAIAAAAPqP///34AAAAPag0AAAIAAAAPKgAAAHwAAAAPaw0AAAIAAAAP + YQAAAEEAAAAPbA0AAAIAAAAPcwAAAFMAAAAPbQ0AAAIAAAAPZAAAAEQAAAAPbg0AAAIAAAAPZgAAAEYA + AAAPbw0AAAIAAAAPZwAAAEcAAAAPcA0AAAIAAAAPaAAAAEgAAAAPcQ0AAAIAAAAPagAAAEoAAAAPcg0A + AAIAAAAPawAAAEsAAAAPcw0AAAIAAAAPbAAAAEwAAAAPdA0AAAIAAAAPKwAAALH///8PdQ0AAAIAAAAP + JwAAAGAAAAAPdg0AAAIAAAAPPAAAAD4AAAAPdw0AAAIAAAAPegAAAFoAAAAPeA0AAAIAAAAPeAAAAFgA + AAAPeQ0AAAIAAAAPYwAAAEMAAAAPeg0AAAIAAAAPdgAAAFYAAAAPew0AAAIAAAAPYgAAAEIAAAAPfA0A + AAIAAAAPbgAAAE4AAAAPfQ0AAAIAAAAPbQAAAE0AAAAPfg0AAAIAAAAPLAAAADsAAAAPfw0AAAIAAAAP + LgAAADoAAAAPgA0AAAIAAAAPLQAAAD0AAAAPgQ0AAAIAAAAPWwAAAF0AAAAPgg0AAAAAAAAPCw== + + + + + AAEAAAD/////AQAAAAAAAAAHAQAAAAEBAAAABQAAAAcHCQIAAAAJAwAAAAkEAAAACQUAAAAJBgAAAA8C + AAAAMAAAAAcpAAIAAwAEAAUABgAHAAgACQAKAAsADAANABAAEQASABMAFAAVABYAFwAYABkAGgAbAB4A + HwAgACEAIgAjACQAJQAmACcAKAArACwALQAuAC8AMAAxADIAMwA0ADUAVgAPAwAAADAAAAAHKQACAAMA + BAAFAAYABwAIAAkACgALABoAGwAoADMANAAZABUAIQAiAC4AEwAmADUADQAeABgAEgAWABcAIAAjABQA + MQAfAAwAKwAnABAAJAAlAC0AMAAyABEALwAsAFYADwQAAAAyAAAABykAAgADAAQABQAGAAcACAAJAAoA + CwAMAA0AEAARABIAEwAUABUAFgAXABgAGQAaABsAHgAfACAAIQAiACMAJAAlACYAJwAoACsAXgAsAC0A + LgAvADAAMQAyADMANAA1AFYANQAPBQAAADAAAAAHAgADAAQABQAGAAcACAAJAAoACwAMAA0AKQAQABEA + EgATABQAFQAWABcAGAAZABoAGwAeAB8AIAAhACIAIwAkACUAJgAnACgAKwAsAC0ALgAvADAAMQAyADMA + NAA1AFYADwYAAAAwAAAABwIAAwAEAAUABgAHAAgACQAKAAsADAANABoAGwAnACgAKQAzADQANQArAB4A + MAAuACAAEgAhACIAIwAXACQAJQAmADIAMQAYABkAEAATAB8AFAAWAC8AEQAtABUALABWAAs= + + + + + AAEAAAD/////AQAAAAAAAAAHAQAAAAEBAAAACQAAAAcICQIAAAAJAwAAAAkEAAAACQUAAAAJBgAAAAkH + AAAACQgAAAAJCQAAAAkKAAAADwIAAAAwAAAACMAAAAAxAAAAMgAAADMAAAA0AAAANQAAADYAAAA3AAAA + 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 + Cw== + + + \ No newline at end of file From 2aa7af58636bc7c5499d4c150c64f51bf73b30c3 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Thu, 5 Jun 2014 19:05:39 +0200 Subject: [PATCH 119/694] [runtime] Fix a jit assertion on a class which contains an empty struct as a static field. Fixes #20349. --- mono/metadata/class.c | 7 +++++++ mono/mini/objects.cs | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/mono/metadata/class.c b/mono/metadata/class.c index 36a86794e77..2a0b76e97dd 100644 --- a/mono/metadata/class.c +++ b/mono/metadata/class.c @@ -1749,6 +1749,7 @@ mono_class_layout_fields (MonoClass *class) guint32 layout = class->flags & TYPE_ATTRIBUTE_LAYOUT_MASK; guint32 pass, passes, real_size; gboolean gc_aware_layout = FALSE; + gboolean has_static_fields = FALSE; MonoClassField *field; /* @@ -1989,6 +1990,8 @@ mono_class_layout_fields (MonoClass *class) break; } + has_static_fields = TRUE; + size = mono_type_size (field->type, &align); field->offset = class->sizes.class_size; /*align is always non-zero here*/ @@ -1996,6 +1999,10 @@ mono_class_layout_fields (MonoClass *class) field->offset &= ~(align - 1); class->sizes.class_size = field->offset + size; } + + if (has_static_fields && class->sizes.class_size == 0) + /* Simplify code which depends on class_size != 0 if the class has static fields */ + class->sizes.class_size = 8; } static MonoMethod* diff --git a/mono/mini/objects.cs b/mono/mini/objects.cs index 40c79e6280f..0e8ea1a4d7b 100644 --- a/mono/mini/objects.cs +++ b/mono/mini/objects.cs @@ -1625,6 +1625,20 @@ public static int test_0_14217 () { [MethodImplAttribute (MethodImplOptions.NoInlining)] static void t_14217_inner (BugStruct bug) { } + + [StructLayout(LayoutKind.Sequential)] + public struct EmptyStruct { + } + + class EmptyClass { + public static EmptyStruct s; + } + + // #20349 + static int test_0_empty_struct_as_static () { + var s = EmptyClass.s; + return 0; + } } #if MOBILE From 97fb37a95be1342f8603e122b0903bd410700f53 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Thu, 5 Jun 2014 19:35:32 +0200 Subject: [PATCH 120/694] [mcs] Return type inference of async anonymous methods --- mcs/errors/{cs0127-2.cs => cs8030-3.cs} | 2 +- mcs/mcs/async.cs | 6 +++--- mcs/mcs/statement.cs | 6 ++---- mcs/tests/test-async-64.cs | 18 ++++++++++++++++++ mcs/tests/ver-il-net_4_5.xml | 24 ++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 8 deletions(-) rename mcs/errors/{cs0127-2.cs => cs8030-3.cs} (56%) create mode 100644 mcs/tests/test-async-64.cs diff --git a/mcs/errors/cs0127-2.cs b/mcs/errors/cs8030-3.cs similarity index 56% rename from mcs/errors/cs0127-2.cs rename to mcs/errors/cs8030-3.cs index 1b36551e109..1ff2894089f 100644 --- a/mcs/errors/cs0127-2.cs +++ b/mcs/errors/cs8030-3.cs @@ -1,4 +1,4 @@ -// CS0127: `C.GetValue()': A return keyword must not be followed by any expression when method returns void +// CS8030: Anonymous function or lambda expression converted to a void returning delegate cannot return a value // Line: 11 using System; diff --git a/mcs/mcs/async.cs b/mcs/mcs/async.cs index 0c18052f91b..ea0d9c4a241 100644 --- a/mcs/mcs/async.cs +++ b/mcs/mcs/async.cs @@ -460,9 +460,9 @@ public TypeInferenceContext ReturnTypeInference { protected override BlockContext CreateBlockContext (BlockContext bc) { var ctx = base.CreateBlockContext (bc); - var lambda = bc.CurrentAnonymousMethod as LambdaMethod; - if (lambda != null) - return_inference = lambda.ReturnTypeInference; + var am = bc.CurrentAnonymousMethod as AnonymousMethodBody; + if (am != null) + return_inference = am.ReturnTypeInference; ctx.Set (ResolveContext.Options.TryScope); diff --git a/mcs/mcs/statement.cs b/mcs/mcs/statement.cs index 9336ba73584..09d7414e43a 100644 --- a/mcs/mcs/statement.cs +++ b/mcs/mcs/statement.cs @@ -1206,10 +1206,8 @@ protected override bool DoResolve (BlockContext ec) } if (async_type.Kind == MemberKind.Void) { - ec.Report.Error (127, loc, - "`{0}': A return keyword must not be followed by any expression when method returns void", - ec.GetSignatureForError ()); - + ec.Report.Error (8030, loc, + "Anonymous function or lambda expression converted to a void returning delegate cannot return a value"); return false; } diff --git a/mcs/tests/test-async-64.cs b/mcs/tests/test-async-64.cs new file mode 100644 index 00000000000..e16e1270292 --- /dev/null +++ b/mcs/tests/test-async-64.cs @@ -0,0 +1,18 @@ +using System; +using System.Threading.Tasks; + +class X +{ + public static void Main () + { + Invoke (async delegate { + await Task.Yield (); + return 1; + }); + } + + static T Invoke (Func> m) + { + return default (T); + } +} \ No newline at end of file diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index e2b1902f24b..a372ef6ab23 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -62770,6 +62770,30 @@ + + + + 37 + + + 18 + + + 33 + + + 7 + + + + + 167 + + + 13 + + + From 876126e680b762022c3a0bd098aeb0d7ab155a08 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Thu, 5 Jun 2014 18:29:54 +0200 Subject: [PATCH 121/694] [mcs] Check for await expression inside new delegate statement --- mcs/mcs/delegate.cs | 3 +- mcs/tests/test-async-13.cs | 12 + mcs/tests/ver-il-net_4_5.xml | 558 +++++++++++++++++------------------ 3 files changed, 283 insertions(+), 290 deletions(-) diff --git a/mcs/mcs/delegate.cs b/mcs/mcs/delegate.cs index a5adf348a41..7632a6128fd 100644 --- a/mcs/mcs/delegate.cs +++ b/mcs/mcs/delegate.cs @@ -446,7 +446,8 @@ public abstract class DelegateCreation : Expression, OverloadResolver.IErrorHand public override bool ContainsEmitWithAwait () { - return false; + var instance = method_group.InstanceExpression; + return instance != null && instance.ContainsEmitWithAwait (); } public static Arguments CreateDelegateMethodArguments (ResolveContext rc, AParametersCollection pd, TypeSpec[] types, Location loc) diff --git a/mcs/tests/test-async-13.cs b/mcs/tests/test-async-13.cs index 9f8cccac070..3363d7f4b11 100644 --- a/mcs/tests/test-async-13.cs +++ b/mcs/tests/test-async-13.cs @@ -585,6 +585,18 @@ async Task NewTest_2 () var s = new S (await Task.Factory.StartNew (() => 77), await Task.Factory.StartNew (() => "b")); return s.Value == 77; } + + async Task NewDelegate_1 () + { + var f = new Func (await NewDelegate_1_0 ()); + return f (); + } + + static async Task> NewDelegate_1_0 () + { + await Task.Factory.StartNew (() => { }); + return () => 0; + } async Task NewInitTest_1 () { diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index 60dda9db30a..e2b1902f24b 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -59358,46 +59358,6 @@ 348 - - - 1026 - - - - - 739 - - - - - 240 - - - - - 355 - - - - - 246 - - - - - 427 - - - - - 264 - - - - - 266 - - 9 @@ -59720,243 +59680,11 @@ 13 - - - 10 - - - 10 - - - 10 - - - 10 - - - 10 - - - 10 - - - - - 13 - - - 13 - - - 10 - - - 10 - - - - - 9 - - - - - 9 - - - 9 - - - - - 9 - - - - - 9 - - - 9 - - - - - 25 - - - - - 9 - - 33 - - - 299 - - - - - 222 - - - 9 - - - - - 295 - - - 9 - - - - - 645 - - - 10 - - - 9 - - - 9 - - - - - 455 - - - 13 - - - 13 - - - 9 - - - - - 233 - - - 9 - - - - - 339 - - - - - 372 - - - 9 - - - - - 348 - - - 9 - - - 9 - - - - - 25 - - - 7 - - - - - 24 - - - 24 - - - 24 - - - 7 - - - - - 25 - - - 7 - - - - - 23 - - - 9 - - - 7 - - - - - 25 - - - 7 - - - - - 25 - - - 7 - - - - - 25 - - - 7 - - - - - 25 - - - 7 - - - - - 14 - - - 7 - - 5 @@ -60211,90 +59939,342 @@ 13 - + + + 33 + + + 33 + + + + + 212 + 13 - + + + 226 + 13 + + 2 + + + 9 + - + + + 1026 + 13 + + 10 + + + 10 + + + 10 + + + 10 + + + 10 + + + 10 + - + + + 739 + 13 + + 13 + + + 13 + + + 10 + + + 10 + - + + + 240 + 13 + + 9 + - + + + 355 + 13 + + 9 + + + 9 + - + + + 246 + 13 + + 9 + - + + + 427 + 13 + + 9 + + + 9 + - + + + 264 + 13 + + 25 + - + + + 266 + 13 + + 9 + - + + + 299 + 13 - + + + 222 + + + 13 + + + 9 + + + + + 295 + + + 13 + + + 9 + + + + + 645 + 13 + + 10 + + + 9 + + + 9 + - + + + 455 + 13 + + 13 + + + 13 + + + 9 + - + + + 233 + 13 + + 9 + - + + + 339 + 13 - + + + 372 + 13 + + 9 + - + + + 348 + 13 + + 9 + + + 9 + + + + + 25 + + + 7 + + + + + 24 + + + 24 + + + 24 + + + 7 + + + + + 25 + + + 7 + + + + + 23 + + + 9 + + + 7 + + + + + 25 + + + 7 + + + + + 25 + + + 7 + + + + + 25 + + + 7 + + + + + 25 + + + 7 + + + + + 14 + + + 7 + From ea326aa9242258c24b221c2ddf509567e493ffc2 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Thu, 5 Jun 2014 19:45:07 +0100 Subject: [PATCH 122/694] Fixed monodis MSVC build. We need to include "mono/utils/mono-compiler.h" to get the proper isinf/isnan declaration. --- mono/dis/util.c | 1 + 1 file changed, 1 insertion(+) diff --git a/mono/dis/util.c b/mono/dis/util.c index 116824da9ec..70f3f6e4ced 100755 --- a/mono/dis/util.c +++ b/mono/dis/util.c @@ -12,6 +12,7 @@ #include #include #include "util.h" +#include "mono/utils/mono-compiler.h" #ifdef HAVE_IEEEFP_H #include From 4385e25d7a9694bc140ec2ab88d4953942fd8057 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Thu, 5 Jun 2014 20:47:56 +0200 Subject: [PATCH 123/694] [runtime] Fix support for custom marshallers defined in other assemblies. Fixes #20020. --- mono/metadata/marshal.c | 5 ++++- mono/metadata/metadata-internals.h | 2 +- mono/metadata/metadata.c | 11 ++++++++--- mono/metadata/metadata.h | 1 + 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c index 8a8b6b8b512..19aaa1a6b09 100644 --- a/mono/metadata/marshal.c +++ b/mono/metadata/marshal.c @@ -5920,7 +5920,10 @@ emit_marshal_custom (EmitMarshalContext *m, int argnum, MonoType *t, g_assert (marshal_native_to_managed); } - mtype = mono_reflection_type_from_name (spec->data.custom_data.custom_name, m->image); + if (spec->data.custom_data.image) + mtype = mono_reflection_type_from_name (spec->data.custom_data.custom_name, spec->data.custom_data.image); + else + mtype = mono_reflection_type_from_name (spec->data.custom_data.custom_name, m->image); g_assert (mtype != NULL); mklass = mono_class_from_mono_type (mtype); g_assert (mklass != NULL); diff --git a/mono/metadata/metadata-internals.h b/mono/metadata/metadata-internals.h index 618fd5b59d5..68b4d71dd3d 100644 --- a/mono/metadata/metadata-internals.h +++ b/mono/metadata/metadata-internals.h @@ -719,7 +719,7 @@ gboolean mono_metadata_type_equal_full (MonoType *t1, MonoType *t2, gboolean signature_only) MONO_INTERNAL; MonoMarshalSpec * -mono_metadata_parse_marshal_spec_full (MonoImage *image, const char *ptr) MONO_INTERNAL; +mono_metadata_parse_marshal_spec_full (MonoImage *image, MonoImage *parent_image, const char *ptr) MONO_INTERNAL; guint mono_metadata_generic_inst_hash (gconstpointer data) MONO_INTERNAL; gboolean mono_metadata_generic_inst_equal (gconstpointer ka, gconstpointer kb) MONO_INTERNAL; diff --git a/mono/metadata/metadata.c b/mono/metadata/metadata.c index 356dc2c2437..c2c69706081 100644 --- a/mono/metadata/metadata.c +++ b/mono/metadata/metadata.c @@ -5012,7 +5012,7 @@ mono_metadata_field_info_full (MonoImage *meta, guint32 index, guint32 *offset, const char *p; if ((p = mono_metadata_get_marshal_info (meta, index, TRUE))) { - *marshal_spec = mono_metadata_parse_marshal_spec_full (alloc_from_image ? meta : NULL, p); + *marshal_spec = mono_metadata_parse_marshal_spec_full (alloc_from_image ? meta : NULL, meta, p); } } @@ -5344,11 +5344,15 @@ mono_image_strndup (MonoImage *image, const char *data, guint len) MonoMarshalSpec * mono_metadata_parse_marshal_spec (MonoImage *image, const char *ptr) { - return mono_metadata_parse_marshal_spec_full (NULL, ptr); + return mono_metadata_parse_marshal_spec_full (NULL, image, ptr); } +/* + * If IMAGE is non-null, memory will be allocated from its mempool, otherwise it will be allocated using malloc. + * PARENT_IMAGE is the image containing the marshal spec. + */ MonoMarshalSpec * -mono_metadata_parse_marshal_spec_full (MonoImage *image, const char *ptr) +mono_metadata_parse_marshal_spec_full (MonoImage *image, MonoImage *parent_image, const char *ptr) { MonoMarshalSpec *res; int len; @@ -5413,6 +5417,7 @@ mono_metadata_parse_marshal_spec_full (MonoImage *image, const char *ptr) /* read cookie string */ len = mono_metadata_decode_value (ptr, &ptr); res->data.custom_data.cookie = mono_image_strndup (image, ptr, len); + res->data.custom_data.image = parent_image; } if (res->native == MONO_NATIVE_SAFEARRAY) { diff --git a/mono/metadata/metadata.h b/mono/metadata/metadata.h index 4b880c7bab4..0a61a2dc10a 100644 --- a/mono/metadata/metadata.h +++ b/mono/metadata/metadata.h @@ -190,6 +190,7 @@ typedef struct { struct { char *custom_name; char *cookie; + MonoImage *image; } custom_data; struct { MonoMarshalVariant elem_type; From 5428bdfb71817eff5d82e4fe57ccf554fc851764 Mon Sep 17 00:00:00 2001 From: Martin Baulig Date: Wed, 4 Jun 2014 21:03:22 +0200 Subject: [PATCH 124/694] [Http]: Fix the loop in WebConnection.ReadHeaders(). We need to reset `gotStatus' each time we enter the outer loop or we would attempt to interpret the status line as a header. --- mcs/class/System/System.Net/WebConnection.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mcs/class/System/System.Net/WebConnection.cs b/mcs/class/System/System.Net/WebConnection.cs index 54af1f44994..6ee88959a37 100644 --- a/mcs/class/System/System.Net/WebConnection.cs +++ b/mcs/class/System/System.Net/WebConnection.cs @@ -356,8 +356,6 @@ WebHeaderCollection ReadHeaders (Stream stream, out byte [] retBuffer, out int s byte [] buffer = new byte [1024]; MemoryStream ms = new MemoryStream (); - bool gotStatus = false; - WebHeaderCollection headers = null; while (true) { int n = stream.Read (buffer, 0, 1024); @@ -369,7 +367,8 @@ WebHeaderCollection ReadHeaders (Stream stream, out byte [] retBuffer, out int s ms.Write (buffer, 0, n); int start = 0; string str = null; - headers = new WebHeaderCollection (); + bool gotStatus = false; + WebHeaderCollection headers = new WebHeaderCollection (); while (ReadLine (ms.GetBuffer (), ref start, (int) ms.Length, ref str)) { if (str == null) { int contentLen = 0; From e6ce33bc7d7e8b0a0e6cb44b024b70920ecd55c5 Mon Sep 17 00:00:00 2001 From: Martin Baulig Date: Wed, 4 Jun 2014 23:31:08 +0200 Subject: [PATCH 125/694] [Http]: Read version from "HTTP CONNECT" response. When using "HTTP CONNECT" to create a tunnel to a proxy server, check the proxy server's response for the HTTP Version and close the connection if it's HTTP/1.0. --- mcs/class/System/System.Net/WebConnection.cs | 17 ++++++++++++++--- .../System/System.Net/WebConnectionData.cs | 1 + 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/mcs/class/System/System.Net/WebConnection.cs b/mcs/class/System/System.Net/WebConnection.cs index 6ee88959a37..0f35c49b3e4 100644 --- a/mcs/class/System/System.Net/WebConnection.cs +++ b/mcs/class/System/System.Net/WebConnection.cs @@ -398,13 +398,22 @@ WebHeaderCollection ReadHeaders (Stream stream, out byte [] retBuffer, out int s continue; } - int spaceidx = str.IndexOf (' '); - if (spaceidx == -1) { + string[] parts = str.Split (' '); + if (parts.Length < 2) { HandleError (WebExceptionStatus.ServerProtocolViolation, null, "ReadHeaders2"); return null; } - status = (int) UInt32.Parse (str.Substring (spaceidx + 1, 3)); + if (String.Compare (parts [0], "HTTP/1.1", true) == 0) + Data.ProxyVersion = HttpVersion.Version11; + else if (String.Compare (parts [0], "HTTP/1.0", true) == 0) + Data.ProxyVersion = HttpVersion.Version10; + else { + HandleError (WebExceptionStatus.ServerProtocolViolation, null, "ReadHeaders2"); + return null; + } + + status = (int)UInt32.Parse (parts [1]); gotStatus = true; } } @@ -840,6 +849,8 @@ internal void NextRead () string header = (sPoint.UsesProxy) ? "Proxy-Connection" : "Connection"; string cncHeader = (Data.Headers != null) ? Data.Headers [header] : null; bool keepAlive = (Data.Version == HttpVersion.Version11 && this.keepAlive); + if (Data.ProxyVersion != null && Data.ProxyVersion != HttpVersion.Version11) + keepAlive = false; if (cncHeader != null) { cncHeader = cncHeader.ToLower (); keepAlive = (this.keepAlive && cncHeader.IndexOf ("keep-alive", StringComparison.Ordinal) != -1); diff --git a/mcs/class/System/System.Net/WebConnectionData.cs b/mcs/class/System/System.Net/WebConnectionData.cs index 216b57f16c7..77d19540be1 100644 --- a/mcs/class/System/System.Net/WebConnectionData.cs +++ b/mcs/class/System/System.Net/WebConnectionData.cs @@ -39,6 +39,7 @@ class WebConnectionData public string StatusDescription; public WebHeaderCollection Headers; public Version Version; + public Version ProxyVersion; public Stream stream; public string[] Challenge; ReadState _readState; From 0b5802888390331a4eba1031856c7ee3280f2875 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Fri, 6 Jun 2014 03:00:22 +0200 Subject: [PATCH 126/694] [runtime] Avoid joining attached threads. Fixes #19343. --- mono/metadata/boehm-gc.c | 3 ++- mono/metadata/sgen-gc.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/mono/metadata/boehm-gc.c b/mono/metadata/boehm-gc.c index a27a004f7c6..f3c7685037b 100644 --- a/mono/metadata/boehm-gc.c +++ b/mono/metadata/boehm-gc.c @@ -378,7 +378,8 @@ boehm_thread_unregister (MonoThreadInfo *p) tid = mono_thread_info_get_tid (p); - mono_threads_add_joinable_thread ((gpointer)tid); + if (p->runtime_thread) + mono_threads_add_joinable_thread ((gpointer)tid); } gboolean diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index cb02da7a807..6494ca23edd 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -3863,7 +3863,8 @@ sgen_thread_unregister (SgenThreadInfo *p) binary_protocol_thread_unregister ((gpointer)tid); SGEN_LOG (3, "unregister thread %p (%p)", p, (gpointer)tid); - mono_threads_add_joinable_thread ((gpointer)tid); + if (p->info.runtime_thread) + mono_threads_add_joinable_thread ((gpointer)tid); if (gc_callbacks.thread_detach_func) { gc_callbacks.thread_detach_func (p->runtime_data); From 6135b2695e29e0bf5109666cecea3ddd3e693657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 6 Jun 2014 14:40:24 +0200 Subject: [PATCH 127/694] Fix formatting specifiers for some size_t arguments. --- mono/metadata/sgen-gc.c | 2 +- mono/metadata/sgen-nursery-allocator.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index 6494ca23edd..52ceeaf9391 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -1823,7 +1823,7 @@ dump_object (MonoObject *obj, gboolean dump_location) g_assert (j < sizeof (class_name)); class_name [j] = 0; - fprintf (heap_dump_file, "name_space, class_name, safe_object_get_size (obj)); if (dump_location) { diff --git a/mono/metadata/sgen-nursery-allocator.c b/mono/metadata/sgen-nursery-allocator.c index af33a097686..8e3dc1820ee 100644 --- a/mono/metadata/sgen-nursery-allocator.c +++ b/mono/metadata/sgen-nursery-allocator.c @@ -829,7 +829,7 @@ sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_ if (!unmask (mutator_allocator.alloc_head)) { SGEN_LOG (1, "Nursery fully pinned (%zd)", num_entries); for (i = 0; i < num_entries; ++i) { - SGEN_LOG (3, "Bastard pinning obj %p (%s), size: %d", start [i], sgen_safe_name (start [i]), sgen_safe_object_get_size (start [i])); + SGEN_LOG (3, "Bastard pinning obj %p (%s), size: %zd", start [i], sgen_safe_name (start [i]), sgen_safe_object_get_size (start [i])); } } return fragment_total; From 1aecffad3fd2834bbea26bd80c1bbbc0a8d8ef81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 6 Jun 2014 14:40:56 +0200 Subject: [PATCH 128/694] Add suggested parentheses to RHS of ^ operator. --- mono/metadata/sgen-tarjan-bridge.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/metadata/sgen-tarjan-bridge.c b/mono/metadata/sgen-tarjan-bridge.c index afa4f42a957..312e73a5449 100644 --- a/mono/metadata/sgen-tarjan-bridge.c +++ b/mono/metadata/sgen-tarjan-bridge.c @@ -502,7 +502,7 @@ static HashEntry merge_cache [COLOR_CACHE_SIZE][ELEMENTS_PER_BUCKET]; static int mix_hash (size_t hash) { - return (int)(((hash * 215497) >> 16) ^ (hash * 1823231) + hash); + return (int)(((hash * 215497) >> 16) ^ ((hash * 1823231) + hash)); } static void From 35a03dcec2bb9997742c7cdc381e1b645bbc580c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 6 Jun 2014 14:41:18 +0200 Subject: [PATCH 129/694] Fix a bunch of warnings caused by unused functions. --- mono/metadata/sgen-debug.c | 2 ++ mono/metadata/sgen-new-bridge.c | 12 ++++++------ mono/metadata/sgen-tarjan-bridge.c | 29 ++++------------------------- 3 files changed, 12 insertions(+), 31 deletions(-) diff --git a/mono/metadata/sgen-debug.c b/mono/metadata/sgen-debug.c index 54245bb51cd..616ca6befc3 100644 --- a/mono/metadata/sgen-debug.c +++ b/mono/metadata/sgen-debug.c @@ -927,6 +927,7 @@ compare_xrefs (const void *a_ptr, const void *b_ptr) return 0; } +/* static void dump_processor_state (SgenBridgeProcessor *p) { @@ -951,6 +952,7 @@ dump_processor_state (SgenBridgeProcessor *p) printf ("-------\n"); } +*/ gboolean sgen_compare_bridge_processor_results (SgenBridgeProcessor *a, SgenBridgeProcessor *b) diff --git a/mono/metadata/sgen-new-bridge.c b/mono/metadata/sgen-new-bridge.c index 2f3449751ee..ad486c0c47f 100644 --- a/mono/metadata/sgen-new-bridge.c +++ b/mono/metadata/sgen-new-bridge.c @@ -262,11 +262,13 @@ dyn_array_int_size (DynIntArray *da) return da->array.size; } +#ifdef NEW_XREFS static void dyn_array_int_empty (DynIntArray *da) { dyn_array_empty (&da->array); } +#endif static void dyn_array_int_add (DynIntArray *da, int x) @@ -281,17 +283,13 @@ dyn_array_int_get (DynIntArray *da, int x) return ((int*)da->array.data)[x]; } +#ifdef NEW_XREFS static void dyn_array_int_set (DynIntArray *da, int idx, int val) { ((int*)da->array.data)[idx] = val; } - -static void -dyn_array_int_ensure_capacity (DynIntArray *da, int capacity) -{ - dyn_array_ensure_capacity (&da->array, capacity, sizeof (int)); -} +#endif static void dyn_array_int_ensure_independent (DynIntArray *da) @@ -428,6 +426,7 @@ dyn_array_scc_get_ptr (DynSCCArray *da, int x) static DynIntArray merge_array; +#ifdef NEW_XREFS static gboolean dyn_array_int_contains (DynIntArray *da, int x) { @@ -437,6 +436,7 @@ dyn_array_int_contains (DynIntArray *da, int x) return TRUE; return FALSE; } +#endif static void enable_accounting (void) diff --git a/mono/metadata/sgen-tarjan-bridge.c b/mono/metadata/sgen-tarjan-bridge.c index 312e73a5449..59013f70124 100644 --- a/mono/metadata/sgen-tarjan-bridge.c +++ b/mono/metadata/sgen-tarjan-bridge.c @@ -67,14 +67,6 @@ typedef struct { /* private */ -static void -dyn_array_init (DynArray *da) -{ - da->size = 0; - da->capacity = 0; - da->data = NULL; -} - static void dyn_array_uninit (DynArray *da, int elem_size) { @@ -121,12 +113,6 @@ dyn_array_add (DynArray *da, int elem_size) /* ptr */ -static void -dyn_array_ptr_init (DynPtrArray *da) -{ - dyn_array_init (&da->array); -} - static void dyn_array_ptr_uninit (DynPtrArray *da) { @@ -461,6 +447,7 @@ bridge_object_forward (MonoObject *obj) return fwd ? fwd : obj; } +#ifdef DUMP_GRAPH static const char* safe_name_bridge (MonoObject *obj) { @@ -476,7 +463,7 @@ find_or_create_data (MonoObject *obj) entry = create_data (obj); return entry; } - +#endif //---------- typedef struct { @@ -908,6 +895,7 @@ cleanup (void) num_colors_with_bridges = 0; } +#ifdef DUMP_GRAPH static void dump_color_table (const char *why, gboolean do_index) { @@ -938,6 +926,7 @@ dump_color_table (const char *why, gboolean do_index) } } +#endif static gint64 step_timer (gint64 *timer) @@ -1036,16 +1025,6 @@ reset_xrefs (ColorData *color) } } -static mono_bool -is_bridge_object_alive (MonoObject *obj, void *data) -{ - SgenHashTable *table = data; - unsigned char *value = sgen_hash_table_lookup (table, obj); - if (!value) - return TRUE; - return *value; -} - static void processing_build_callback_data (int generation) { From bfaa08475e65c78aaa1e272d9b43891a8bb71c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 6 Jun 2014 14:51:44 +0200 Subject: [PATCH 130/694] Silence a bunch of unused result warnings in proflog.c. --- mono/profiler/proflog.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/mono/profiler/proflog.c b/mono/profiler/proflog.c index 438c0ec3803..b9cc28f8e1f 100644 --- a/mono/profiler/proflog.c +++ b/mono/profiler/proflog.c @@ -354,7 +354,12 @@ struct _LogBuffer { unsigned char buf [1]; }; -#define ENTER_LOG(lb,str) if ((lb)->locked) {write(2, str, strlen(str)); write(2, "\n", 1);return;} else {(lb)->locked++;} +static inline void +ign_res (int G_GNUC_UNUSED unused, ...) +{ +} + +#define ENTER_LOG(lb,str) if ((lb)->locked) {ign_res (write(2, str, strlen(str))); ign_res (write(2, "\n", 1));return;} else {(lb)->locked++;} #define EXIT_LOG(lb) (lb)->locked--; typedef struct _StatBuffer StatBuffer; @@ -1233,7 +1238,7 @@ mono_sample_hit (MonoProfiler *profiler, unsigned char *ip, void *context) char buf [256]; snprintf (buf, sizeof (buf), "hit at %p in thread %p after %llu ms\n", ip, (void*)thread_id (), (unsigned long long int)elapsed/100); len = strlen (buf); - write (2, buf, len); + ign_res (write (2, buf, len)); } sbuf = profiler->stat_buffers; if (!sbuf) @@ -1254,13 +1259,13 @@ mono_sample_hit (MonoProfiler *profiler, unsigned char *ip, void *context) foundsb = InterlockedCompareExchangePointer ((volatile void**)&profiler->stat_buffers, sbuf, oldsb); } while (foundsb != oldsb); if (do_debug) - write (2, "overflow\n", 9); + ign_res (write (2, "overflow\n", 9)); /* notify the helper thread */ if (sbuf->next->next) { char c = 0; - write (profiler->pipes [1], &c, 1); + ign_res (write (profiler->pipes [1], &c, 1)); if (do_debug) - write (2, "notify\n", 7); + ign_res (write (2, "notify\n", 7)); } } do { @@ -2089,7 +2094,7 @@ log_shutdown (MonoProfiler *prof) if (prof->command_port) { char c = 1; void *res; - write (prof->pipes [1], &c, 1); + ign_res (write (prof->pipes [1], &c, 1)); pthread_join (prof->helper_thread, &res); } #endif From 0b168543d7a969f8ee1bc2cc5b2a89916e2cc103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 6 Jun 2014 14:52:09 +0200 Subject: [PATCH 131/694] Fix volatile pointer casts in proflog.c. --- mono/profiler/proflog.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mono/profiler/proflog.c b/mono/profiler/proflog.c index b9cc28f8e1f..9064535fbd1 100644 --- a/mono/profiler/proflog.c +++ b/mono/profiler/proflog.c @@ -1256,7 +1256,7 @@ mono_sample_hit (MonoProfiler *profiler, unsigned char *ip, void *context) do { oldsb = profiler->stat_buffers; sbuf->next = oldsb; - foundsb = InterlockedCompareExchangePointer ((volatile void**)&profiler->stat_buffers, sbuf, oldsb); + foundsb = InterlockedCompareExchangePointer ((void * volatile*)&profiler->stat_buffers, sbuf, oldsb); } while (foundsb != oldsb); if (do_debug) ign_res (write (2, "overflow\n", 9)); @@ -1271,7 +1271,7 @@ mono_sample_hit (MonoProfiler *profiler, unsigned char *ip, void *context) do { old_data = sbuf->data; new_data = old_data + 4 + bt_data.count * 3; - data = InterlockedCompareExchangePointer ((volatile void**)&sbuf->data, new_data, old_data); + data = InterlockedCompareExchangePointer ((void * volatile*)&sbuf->data, new_data, old_data); } while (data != old_data); if (old_data >= sbuf->data_end) return; /* lost event */ From dd82497ce2dcea9e781778f52a7e6e8f402a5ef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 6 Jun 2014 14:52:28 +0200 Subject: [PATCH 132/694] Silence some warnings in decode.c. --- mono/profiler/decode.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mono/profiler/decode.c b/mono/profiler/decode.c index eea1dbf5db5..b6e4f7b9dcb 100644 --- a/mono/profiler/decode.c +++ b/mono/profiler/decode.c @@ -2149,13 +2149,13 @@ decode_buffer (ProfContext *ctx) case TYPE_HEAP: { int subtype = *p & 0xf0; if (subtype == TYPE_HEAP_OBJECT) { - HeapObjectDesc *ho; + HeapObjectDesc *ho = NULL; int i; intptr_t objdiff = decode_sleb128 (p + 1, &p); intptr_t ptrdiff = decode_sleb128 (p, &p); uint64_t size = decode_uleb128 (p, &p); uintptr_t num = decode_uleb128 (p, &p); - uintptr_t ref_offset; + uintptr_t ref_offset = 0; uintptr_t last_obj_offset = 0; ClassDesc *cd = lookup_class (ptr_base + ptrdiff); if (size) { @@ -2185,7 +2185,7 @@ decode_buffer (ProfContext *ctx) fprintf (outfile, "traced object %p, size %llu (%s), refs: %d\n", (void*)OBJ_ADDR (objdiff), size, cd->name, num); } else if (subtype == TYPE_HEAP_ROOT) { uintptr_t num = decode_uleb128 (p + 1, &p); - uintptr_t gc_num = decode_uleb128 (p, &p); + /*uintptr_t gc_num =*/ decode_uleb128 (p, &p); int i; for (i = 0; i < num; ++i) { intptr_t objdiff = decode_sleb128 (p, &p); @@ -2389,7 +2389,7 @@ decode_buffer (ProfContext *ctx) /* un unmanaged binary loaded in memory */ uint64_t tdiff = decode_uleb128 (p + 1, &p); uintptr_t addr = decode_sleb128 (p, &p); - uint64_t offset = decode_uleb128 (p, &p); + /*uint64_t offset =*/ decode_uleb128 (p, &p); uintptr_t size = decode_uleb128 (p, &p); char *name; LOG_TIME (time_base, tdiff); From 3b3f4bd673db40e0fdd7c3e3a76ccb32ba4ae07b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 6 Jun 2014 15:17:19 +0200 Subject: [PATCH 133/694] Fix a ton of printf formatting warnings in decode.c. --- mono/profiler/decode.c | 107 ++++++++++++++++++++++++++--------------- 1 file changed, 68 insertions(+), 39 deletions(-) diff --git a/mono/profiler/decode.c b/mono/profiler/decode.c index b6e4f7b9dcb..36f35d9ae99 100644 --- a/mono/profiler/decode.c +++ b/mono/profiler/decode.c @@ -457,9 +457,12 @@ dump_counters (void) } } else if (counters_sort_mode == COUNTERS_SORT_TIME) { for (ctimestamp = counters_timestamps; ctimestamp; ctimestamp = ctimestamp->next) { - fprintf (outfile, "\t%lld:%02lld:%02lld:%02lld.%03lld:\n", ctimestamp->value / 1000 / 60 / 60 / 24 % 1000, - ctimestamp->value / 1000 / 60 / 60 % 24, ctimestamp->value / 1000 / 60 % 60, - ctimestamp->value / 1000 % 60, ctimestamp->value % 1000); + fprintf (outfile, "\t%llu:%02llu:%02llu:%02llu.%03llu:\n", + (unsigned long long) (ctimestamp->value / 1000 / 60 / 60 / 24 % 1000), + (unsigned long long) (ctimestamp->value / 1000 / 60 / 60 % 24), + (unsigned long long) (ctimestamp->value / 1000 / 60 % 60), + (unsigned long long) (ctimestamp->value / 1000 % 60), + (unsigned long long) (ctimestamp->value % 1000)); for (csection = ctimestamp->sections; csection; csection = csection->next) { fprintf (outfile, "\t\t%s:\n", section_name (csection->value)); @@ -485,9 +488,12 @@ dump_counters (void) counter->name, type_name (counter->type), unit_name (counter->unit), variance_name (counter->variance)); for (cvalue = counter->values; cvalue; cvalue = cvalue->next) { - snprintf (strtimestamp, sizeof (strtimestamp), "%lld:%02lld:%02lld:%02lld.%03lld", cvalue->timestamp / 1000 / 60 / 60 / 24 % 1000, - cvalue->timestamp / 1000 / 60 / 60 % 24, cvalue->timestamp / 1000 / 60 % 60, - cvalue->timestamp / 1000 % 60, cvalue->timestamp % 1000); + snprintf (strtimestamp, sizeof (strtimestamp), "%llu:%02llu:%02llu:%02llu.%03llu", + (unsigned long long) (cvalue->timestamp / 1000 / 60 / 60 / 24 % 1000), + (unsigned long long) (cvalue->timestamp / 1000 / 60 / 60 % 24), + (unsigned long long) (cvalue->timestamp / 1000 / 60 % 60), + (unsigned long long) (cvalue->timestamp / 1000 % 60), + (unsigned long long) (cvalue->timestamp % 1000)); dump_counters_value (counter, "\t\t\t%s", strtimestamp, cvalue->buffer); } @@ -852,9 +858,9 @@ static void print_usym (UnmanagedSymbol* um) { if (um->parent) - fprintf (outfile, "\t%6d %6.2f %-36s in %s\n", um->sample_hits, um->sample_hits*100.0/num_stat_samples, um->name, um->parent->name); + fprintf (outfile, "\t%6zd %6.2f %-36s in %s\n", um->sample_hits, um->sample_hits*100.0/num_stat_samples, um->name, um->parent->name); else - fprintf (outfile, "\t%6d %6.2f %s\n", um->sample_hits, um->sample_hits*100.0/num_stat_samples, um->name); + fprintf (outfile, "\t%6zd %6.2f %s\n", um->sample_hits, um->sample_hits*100.0/num_stat_samples, um->name); } static int @@ -1333,7 +1339,7 @@ heap_shot_mark_objects (HeapShot *hs) fprintf (outfile, "object %p (%s) unmarked\n", (void*)hs->objects_hash [i], hs->objects_hash [i]->hklass->klass->name); } } - fprintf (outfile, "Total unmarked: %d/%d\n", num_unmarked, hs->objects_count); + fprintf (outfile, "Total unmarked: %zd/%zd\n", num_unmarked, hs->objects_count); free (marks); } @@ -1840,7 +1846,7 @@ tracked_creation (uintptr_t obj, ClassDesc *cd, uint64_t size, BackTrace *bt, ui for (i = 0; i < num_tracked_objects; ++i) { if (tracked_objects [i] != obj) continue; - fprintf (outfile, "Object %p created (%s, %llu bytes) at %.3f secs.\n", (void*)obj, cd->name, size, (timestamp - startup_time)/1000000000.0); + fprintf (outfile, "Object %p created (%s, %llu bytes) at %.3f secs.\n", (void*)obj, cd->name, (unsigned long long) size, (timestamp - startup_time)/1000000000.0); if (bt && bt->count) { int k; for (k = 0; k < bt->count; ++k) @@ -1929,7 +1935,7 @@ decode_buffer (ProfContext *ctx) thread_id = read_int64 (p + 32); method_base = read_int64 (p + 40); if (debug) - fprintf (outfile, "buf: thread:%x, len: %d, time: %llu, file offset: %llu\n", thread_id, len, time_base, file_offset); + fprintf (outfile, "buf: thread:%zx, len: %d, time: %llu, file offset: %llu\n", thread_id, len, (unsigned long long) time_base, (unsigned long long) file_offset); thread = load_thread (ctx, thread_id); if (!load_data (ctx, len)) return 0; @@ -1956,7 +1962,7 @@ decode_buffer (ProfContext *ctx) if (subtype == TYPE_GC_RESIZE) { uint64_t new_size = decode_uleb128 (p, &p); if (debug) - fprintf (outfile, "gc heap resized to %llu\n", new_size); + fprintf (outfile, "gc heap resized to %llu\n", (unsigned long long) new_size); gc_resizes++; if (new_size > max_heap_size) max_heap_size = new_size; @@ -1964,7 +1970,7 @@ decode_buffer (ProfContext *ctx) uint64_t ev = decode_uleb128 (p, &p); int gen = decode_uleb128 (p, &p); if (debug) - fprintf (outfile, "gc event for gen%d: %s at %llu (thread: 0x%x)\n", gen, gc_event_name (ev), time_base, thread->thread_id); + fprintf (outfile, "gc event for gen%d: %s at %llu (thread: 0x%zx)\n", gen, gc_event_name (ev), (unsigned long long) time_base, thread->thread_id); if (gen > 2) { fprintf (outfile, "incorrect gc gen: %d\n", gen); break; @@ -2033,7 +2039,7 @@ decode_buffer (ProfContext *ctx) return 0; } if (debug) - fprintf (outfile, "loaded class %p (%s in %p) at %llu\n", (void*)(ptr_base + ptrdiff), p, (void*)(ptr_base + imptrdiff), time_base); + fprintf (outfile, "loaded class %p (%s in %p) at %llu\n", (void*)(ptr_base + ptrdiff), p, (void*)(ptr_base + imptrdiff), (unsigned long long) time_base); if (!error) add_class (ptr_base + ptrdiff, (char*)p); while (*p) p++; @@ -2045,7 +2051,7 @@ decode_buffer (ProfContext *ctx) return 0; } if (debug) - fprintf (outfile, "loaded image %p (%s) at %llu\n", (void*)(ptr_base + ptrdiff), p, time_base); + fprintf (outfile, "loaded image %p (%s) at %llu\n", (void*)(ptr_base + ptrdiff), p, (unsigned long long) time_base); if (!error) add_image (ptr_base + ptrdiff, (char*)p); while (*p) p++; @@ -2080,7 +2086,7 @@ decode_buffer (ProfContext *ctx) LOG_TIME (time_base, tdiff); time_base += tdiff; if (debug) - fprintf (outfile, "alloced object %p, size %llu (%s) at %llu\n", (void*)OBJ_ADDR (objdiff), len, lookup_class (ptr_base + ptrdiff)->name, time_base); + fprintf (outfile, "alloced object %p, size %llu (%s) at %llu\n", (void*)OBJ_ADDR (objdiff), (unsigned long long) len, lookup_class (ptr_base + ptrdiff)->name, (unsigned long long) time_base); if (has_bt) { num_bt = 8; frames = decode_bt (sframes, &num_bt, p, &p, ptr_base); @@ -2182,7 +2188,7 @@ decode_buffer (ProfContext *ctx) track_obj_reference (OBJ_ADDR (obj1diff), OBJ_ADDR (objdiff), cd); } if (debug && size) - fprintf (outfile, "traced object %p, size %llu (%s), refs: %d\n", (void*)OBJ_ADDR (objdiff), size, cd->name, num); + fprintf (outfile, "traced object %p, size %llu (%s), refs: %zd\n", (void*)OBJ_ADDR (objdiff), (unsigned long long) size, cd->name, num); } else if (subtype == TYPE_HEAP_ROOT) { uintptr_t num = decode_uleb128 (p + 1, &p); /*uintptr_t gc_num =*/ decode_uleb128 (p, &p); @@ -2487,7 +2493,7 @@ decode_buffer (ProfContext *ctx) break; } default: - fprintf (outfile, "unhandled profiler event: 0x%x at file offset: %llu + %d (len: %d\n)\n", *p, file_offset, p - ctx->buf, len); + fprintf (outfile, "unhandled profiler event: 0x%x at file offset: %llu + %ld (len: %d\n)\n", *p, (unsigned long long) file_offset, p - ctx->buf, len); exit (1); } } @@ -2591,7 +2597,7 @@ dump_traces (TraceDesc *traces, const char *desc) bt = traces->traces [j].bt; if (!bt->count) continue; - fprintf (outfile, "\t%llu %s from:\n", traces->traces [j].count, desc); + fprintf (outfile, "\t%llu %s from:\n", (unsigned long long) traces->traces [j].count, desc); for (k = 0; k < bt->count; ++k) fprintf (outfile, "\t\t%s\n", bt->methods [k]->name); } @@ -2612,12 +2618,12 @@ dump_exceptions (void) { int i; fprintf (outfile, "\nException summary\n"); - fprintf (outfile, "\tThrows: %llu\n", throw_count); + fprintf (outfile, "\tThrows: %llu\n", (unsigned long long) throw_count); dump_traces (&exc_traces, "throws"); for (i = 0; i <= MONO_EXCEPTION_CLAUSE_FAULT; ++i) { if (!clause_summary [i]) continue; - fprintf (outfile, "\tExecuted %s clauses: %llu\n", clause_name (i), clause_summary [i]); + fprintf (outfile, "\tExecuted %s clauses: %llu\n", clause_name (i), (unsigned long long) clause_summary [i]); } } @@ -2657,9 +2663,9 @@ dump_monitors (void) mdesc->wait_time/1000000000.0, mdesc->max_wait_time/1000000000.0, mdesc->wait_time/1000000000.0/mdesc->contentions); dump_traces (&mdesc->traces, "contentions"); } - fprintf (outfile, "\tLock contentions: %llu\n", monitor_contention); - fprintf (outfile, "\tLock acquired: %llu\n", monitor_acquired); - fprintf (outfile, "\tLock failures: %llu\n", monitor_failed); + fprintf (outfile, "\tLock contentions: %llu\n", (unsigned long long) monitor_contention); + fprintf (outfile, "\tLock acquired: %llu\n", (unsigned long long) monitor_acquired); + fprintf (outfile, "\tLock failures: %llu\n", (unsigned long long) monitor_failed); } static void @@ -2668,20 +2674,25 @@ dump_gcs (void) int i; fprintf (outfile, "\nGC summary\n"); fprintf (outfile, "\tGC resizes: %d\n", gc_resizes); - fprintf (outfile, "\tMax heap size: %llu\n", max_heap_size); - fprintf (outfile, "\tObject moves: %llu\n", gc_object_moves); + fprintf (outfile, "\tMax heap size: %llu\n", (unsigned long long) max_heap_size); + fprintf (outfile, "\tObject moves: %llu\n", (unsigned long long) gc_object_moves); for (i = 0; i < 3; ++i) { if (!gc_info [i].count) continue; fprintf (outfile, "\tGen%d collections: %d, max time: %lluus, total time: %lluus, average: %lluus\n", - i, gc_info [i].count, gc_info [i].max_time / 1000, gc_info [i].total_time / 1000, - gc_info [i].total_time / gc_info [i].count / 1000); + i, gc_info [i].count, + (unsigned long long) (gc_info [i].max_time / 1000), + (unsigned long long) (gc_info [i].total_time / 1000), + (unsigned long long) (gc_info [i].total_time / gc_info [i].count / 1000)); } for (i = 0; i < 3; ++i) { if (!handle_info [i].max_live) continue; fprintf (outfile, "\tGC handles %s: created: %llu, destroyed: %llu, max: %llu\n", - get_handle_name (i), handle_info [i].created, handle_info [i].destroyed, handle_info [i].max_live); + get_handle_name (i), + (unsigned long long) (handle_info [i].created), + (unsigned long long) (handle_info [i].destroyed), + (unsigned long long) (handle_info [i].max_live)); dump_traces (&handle_info [i].traces, "created"); } } @@ -2735,11 +2746,15 @@ dump_allocations (void) fprintf (outfile, "\nAllocation summary\n"); fprintf (outfile, "%10s %10s %8s Type name\n", "Bytes", "Count", "Average"); } - fprintf (outfile, "%10llu %10d %8llu %s\n", cd->alloc_size, cd->allocs, cd->alloc_size / cd->allocs, cd->name); + fprintf (outfile, "%10llu %10zd %8llu %s\n", + (unsigned long long) (cd->alloc_size), + cd->allocs, + (unsigned long long) (cd->alloc_size / cd->allocs), + cd->name); dump_traces (&cd->traces, "bytes"); } if (allocs) - fprintf (outfile, "Total memory allocated: %llu bytes in %d objects\n", size, allocs); + fprintf (outfile, "Total memory allocated: %llu bytes in %zd objects\n", (unsigned long long) size, allocs); } enum { @@ -2825,11 +2840,15 @@ dump_methods (void) fprintf (outfile, "\nMethod call summary\n"); fprintf (outfile, "%8s %8s %10s Method name\n", "Total(ms)", "Self(ms)", "Calls"); } - fprintf (outfile, "%8llu %8llu %10llu %s\n", msecs, smsecs, cd->calls, cd->name); + fprintf (outfile, "%8llu %8llu %10llu %s\n", + (unsigned long long) (msecs), + (unsigned long long) (smsecs), + (unsigned long long) (cd->calls), + cd->name); dump_traces (&cd->traces, "calls"); } if (calls) - fprintf (outfile, "Total calls: %llu\n", calls); + fprintf (outfile, "Total calls: %llu\n", (unsigned long long) calls); } static int @@ -2874,7 +2893,9 @@ dump_rev_claases (HeapClassRevRef *revs, int count) return; for (j = 0; j < count; ++j) { HeapClassDesc *cd = revs [j].klass; - fprintf (outfile, "\t\t%llu references from: %s\n", revs [j].count, cd->klass->name); + fprintf (outfile, "\t\t%llu references from: %s\n", + (unsigned long long) (revs [j].count), + cd->klass->name); } } @@ -2898,8 +2919,12 @@ heap_shot_summary (HeapShot *hs, int hs_num, HeapShot *last_hs) } hs->sorted = sorted; qsort (sorted, ccount, sizeof (void*), compare_heap_class); - fprintf (outfile, "\n\tHeap shot %d at %.3f secs: size: %llu, object count: %llu, class count: %d, roots: %d\n", - hs_num, (hs->timestamp - startup_time)/1000000000.0, size, count, ccount, hs->num_roots); + fprintf (outfile, "\n\tHeap shot %d at %.3f secs: size: %llu, object count: %llu, class count: %d, roots: %zd\n", + hs_num, + (hs->timestamp - startup_time)/1000000000.0, + (unsigned long long) (size), + (unsigned long long) (count), + ccount, hs->num_roots); if (!verbose && ccount > 30) ccount = 30; fprintf (outfile, "\t%10s %10s %8s Class name\n", "Bytes", "Count", "Average"); @@ -2910,11 +2935,15 @@ heap_shot_summary (HeapShot *hs, int hs_num, HeapShot *last_hs) cd = sorted [i]; if (last_hs) ocd = heap_class_lookup (last_hs, cd->klass); - fprintf (outfile, "\t%10llu %10llu %8llu %s", cd->total_size, cd->count, cd->total_size / cd->count, cd->klass->name); + fprintf (outfile, "\t%10llu %10llu %8llu %s", + (unsigned long long) (cd->total_size), + (unsigned long long) (cd->count), + (unsigned long long) (cd->total_size / cd->count), + cd->klass->name); if (ocd) { int64_t bdiff = cd->total_size - ocd->total_size; int64_t cdiff = cd->count - ocd->count; - fprintf (outfile, " (bytes: %+lld, count: %+lld)\n", bdiff, cdiff); + fprintf (outfile, " (bytes: %+lld, count: %+lld)\n", (long long) bdiff, (long long) cdiff); } else { fprintf (outfile, "\n"); } @@ -2929,7 +2958,7 @@ heap_shot_summary (HeapShot *hs, int hs_num, HeapShot *last_hs) assert (cd->rev_count == k); qsort (rev_sorted, cd->rev_count, sizeof (HeapClassRevRef), compare_rev_class); if (cd->root_references) - fprintf (outfile, "\t\t%d root references (%d pinning)\n", cd->root_references, cd->pinned_references); + fprintf (outfile, "\t\t%zd root references (%zd pinning)\n", cd->root_references, cd->pinned_references); dump_rev_claases (rev_sorted, cd->rev_count); free (rev_sorted); } From 56819afa82883b28872c7aa9459accede1e50a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 6 Jun 2014 15:19:20 +0200 Subject: [PATCH 134/694] Use G_GNUC_UNUSED instead of commenting out variable declarations. The previous approach resulted in mixed decls/stmts warnings. --- mono/profiler/decode.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mono/profiler/decode.c b/mono/profiler/decode.c index 36f35d9ae99..2a52c19f4d0 100644 --- a/mono/profiler/decode.c +++ b/mono/profiler/decode.c @@ -20,6 +20,7 @@ #if defined (HAVE_SYS_ZLIB) #include #endif +#include #include #include #include @@ -2191,7 +2192,7 @@ decode_buffer (ProfContext *ctx) fprintf (outfile, "traced object %p, size %llu (%s), refs: %zd\n", (void*)OBJ_ADDR (objdiff), (unsigned long long) size, cd->name, num); } else if (subtype == TYPE_HEAP_ROOT) { uintptr_t num = decode_uleb128 (p + 1, &p); - /*uintptr_t gc_num =*/ decode_uleb128 (p, &p); + uintptr_t gc_num G_GNUC_UNUSED = decode_uleb128 (p, &p); int i; for (i = 0; i < num; ++i) { intptr_t objdiff = decode_sleb128 (p, &p); @@ -2395,7 +2396,7 @@ decode_buffer (ProfContext *ctx) /* un unmanaged binary loaded in memory */ uint64_t tdiff = decode_uleb128 (p + 1, &p); uintptr_t addr = decode_sleb128 (p, &p); - /*uint64_t offset =*/ decode_uleb128 (p, &p); + uint64_t offset G_GNUC_UNUSED = decode_uleb128 (p, &p); uintptr_t size = decode_uleb128 (p, &p); char *name; LOG_TIME (time_base, tdiff); From 11e01299d958fa8f9ffc5253f27e2ff631b29c04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 6 Jun 2014 15:20:52 +0200 Subject: [PATCH 135/694] Fix printf formatting warnings in mono-counters.c. --- mono/utils/mono-counters.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mono/utils/mono-counters.c b/mono/utils/mono-counters.c index 2f642bb3ec1..8ab20140cda 100644 --- a/mono/utils/mono-counters.c +++ b/mono/utils/mono-counters.c @@ -250,10 +250,10 @@ dump_counter (MonoCounter *counter, FILE *outfile) { if ((counter->type & MONO_COUNTER_UNIT_MASK) == MONO_COUNTER_TIME) fprintf (outfile, ENTRY_FMT "%.2f ms\n", counter->name, (double)(*(gint64*)buffer) / 10000.0); else - fprintf (outfile, ENTRY_FMT "%lld\n", counter->name, *(gint64*)buffer); + fprintf (outfile, ENTRY_FMT "%lld\n", counter->name, *(long long *)buffer); break; case MONO_COUNTER_ULONG: - fprintf (outfile, ENTRY_FMT "%llu\n", counter->name, *(guint64*)buffer); + fprintf (outfile, ENTRY_FMT "%llu\n", counter->name, *(unsigned long long *)buffer); break; case MONO_COUNTER_WORD: fprintf (outfile, ENTRY_FMT "%zd\n", counter->name, *(gssize*)buffer); From a587e4641a69581471e2f61cf2df60a1c9ff8617 Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Fri, 6 Jun 2014 16:00:03 -0400 Subject: [PATCH 136/694] [counters] Add counters documentation to man page --- man/mprof-report.1 | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/man/mprof-report.1 b/man/mprof-report.1 index de40af60d8e..4b1b7816817 100644 --- a/man/mprof-report.1 +++ b/man/mprof-report.1 @@ -211,6 +211,15 @@ The following commands are available: .IP \[bu] 2 \f[I]heapshot\f[]: perform a heapshot as soon as possible .RE +.IP \[bu] 2 +\f[I]counters\f[]: sample counters values every 1 second. This allow +a really lightweight way to have insight in some of the runtime key +metrics. Counters displayed in non verbose mode are : Methods from AOT, +Methods JITted using mono JIT, Methods JITted using LLVM, Total time +spent JITting (sec), User Time, System Time, Total Time, Working Set, +Private Bytes, Virtual Bytes, Page Faults and CPU Load Average (1min, +5min and 15min). +.RE .SS Analyzing the profile data .PP Currently there is a command line program (\f[I]mprof-report\f[]) @@ -284,6 +293,16 @@ where \f[I]MODE\f[] can be: .IP \[bu] 2 \f[I]bytes\f[]: the total number of bytes used by objects of the given type +.PP +To change the sort order of counters, use the option: +.PP +\f[B]--counters-sort=MODE\f[] +.PP +where \f[I]MODE\f[] can be: +.IP \[bu] 2 +\f[I]time\f[]: sort values by time then category +.IP \[bu] 2 +\f[I]category\f[]: sort values by category then time .SS Selecting what data to report .PP The profiler by default collects data about many runtime subsystems @@ -319,6 +338,8 @@ version \f[I]thread\f[]: thread information .IP \[bu] 2 \f[I]heapshot\f[]: live heap usage at heap shots +.IP \[bu] 2 +\f[I]counters\f[]: counters samples .PP It is possible to limit some of the data displayed to a timeframe of the program execution with the option: From 8fc059bea3b3c91a73cbce708d175a06770c51a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 6 Jun 2014 22:57:55 +0200 Subject: [PATCH 137/694] Remove a #warning in security.c which gets triggered on OS X. --- mono/io-layer/security.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/mono/io-layer/security.c b/mono/io-layer/security.c index 1d702d3188f..d1bf3d0362c 100644 --- a/mono/io-layer/security.c +++ b/mono/io-layer/security.c @@ -19,19 +19,6 @@ #include #include - -/* Disclaimers */ - -#if defined(__GNUC__) -#ifndef HAVE_GETRESUID - #warning getresuid not supported. WindowsImpersonationContext wont work -#endif -#ifndef HAVE_SETRESUID - #warning setresuid not supported. WindowsImpersonationContext wont work -#endif -#endif - - gboolean ImpersonateLoggedOnUser (gpointer handle) { From 1fdc8789a7f4bfc6fa7f67c126569765194a3b6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 6 Jun 2014 22:58:20 +0200 Subject: [PATCH 138/694] Fix a warning in atomic.c. --- mono/utils/atomic.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mono/utils/atomic.c b/mono/utils/atomic.c index 7cd884e61d9..f0d817d9144 100755 --- a/mono/utils/atomic.c +++ b/mono/utils/atomic.c @@ -17,14 +17,14 @@ #include -static pthread_mutex_t spin = PTHREAD_MUTEX_INITIALIZER; - #define NEED_64BIT_CMPXCHG_FALLBACK #endif #ifdef WAPI_NO_ATOMIC_ASM +static pthread_mutex_t spin = PTHREAD_MUTEX_INITIALIZER; + static mono_once_t spin_once=MONO_ONCE_INIT; static void spin_init(void) From 8e35b7d01e14371851a806dad6196b36d9163c91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 6 Jun 2014 23:02:33 +0200 Subject: [PATCH 139/694] Disable `perf` support in the profiler when running on Android (for now). We need to assess the situation before we enable this everywhere. Apparently some older devices have trouble with `perf`. --- mono/profiler/proflog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/profiler/proflog.c b/mono/profiler/proflog.c index 9064535fbd1..193be897f76 100644 --- a/mono/profiler/proflog.c +++ b/mono/profiler/proflog.c @@ -67,7 +67,7 @@ #endif /* the architecture needs a memory fence */ -#if defined(__linux__) && (defined(__i386__) || defined(__x86_64__) || defined(__arm__)) +#if defined(__linux__) && (defined(__i386__) || defined(__x86_64__) || defined(__arm__)) && !defined(PLATFORM_ANDROID) #include #include #include "perf_event.h" From bb3ccfb141860a5e05acbe9892984a3427c91958 Mon Sep 17 00:00:00 2001 From: Brezae Vlad Date: Thu, 5 Jun 2014 01:46:54 +0300 Subject: [PATCH 140/694] [x86] Arguments to calls are passed via moves, instead of pushes. I release these changes under the MIT license. --- mono/mini/exceptions-x86.c | 2 + mono/mini/method-to-ir.c | 1 + mono/mini/mini-gc.c | 8 ++ mono/mini/mini-x86.c | 214 ++++++++++++++++++++++++++----------- mono/mini/mini-x86.h | 3 + 5 files changed, 168 insertions(+), 60 deletions(-) diff --git a/mono/mini/exceptions-x86.c b/mono/mini/exceptions-x86.c index aa10aaad593..86a28e08ab4 100644 --- a/mono/mini/exceptions-x86.c +++ b/mono/mini/exceptions-x86.c @@ -849,6 +849,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, *lmf = (gpointer)(((gsize)(*lmf)->previous_lmf) & ~3); } +#ifndef MONO_X86_NO_PUSHES /* Pop arguments off the stack */ if (ji->has_arch_eh_info) { int stack_size; @@ -868,6 +869,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, #endif } } +#endif return TRUE; } else if (*lmf) { diff --git a/mono/mini/method-to-ir.c b/mono/mini/method-to-ir.c index 4a9c33d2953..78c25126a41 100644 --- a/mono/mini/method-to-ir.c +++ b/mono/mini/method-to-ir.c @@ -7787,6 +7787,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b EMIT_NEW_ARGLOAD (cfg, call->args [i], i); mono_arch_emit_call (cfg, call); + cfg->param_area = MAX(cfg->param_area, call->stack_usage); MONO_ADD_INS (bblock, (MonoInst*)call); } else { for (i = 0; i < num_args; ++i) diff --git a/mono/mini/mini-gc.c b/mono/mini/mini-gc.c index a2e1f2f6029..41ca382a0bc 100644 --- a/mono/mini/mini-gc.c +++ b/mono/mini/mini-gc.c @@ -1869,7 +1869,11 @@ sp_offset_to_fp_offset (MonoCompile *cfg, int sp_offset) #elif defined(TARGET_X86) /* The offset is computed from the sp at the start of the call sequence */ g_assert (cfg->frame_reg == X86_EBP); +#ifdef MONO_X86_NO_PUSHES + return (- cfg->arch.sp_fp_offset + sp_offset); +#else return (- cfg->arch.sp_fp_offset - sp_offset); +#endif #else NOT_IMPLEMENTED; return -1; @@ -2056,7 +2060,11 @@ compute_frame_size (MonoCompile *cfg) #ifdef TARGET_AMD64 min_offset = MIN (min_offset, -cfg->arch.sp_fp_offset); #elif defined(TARGET_X86) +#ifdef MONO_X86_NO_PUSHES + min_offset = MIN (min_offset, -cfg->arch.sp_fp_offset); +#else min_offset = MIN (min_offset, - (cfg->arch.sp_fp_offset + cfg->arch.param_area_size)); +#endif #elif defined(TARGET_ARM) // FIXME: #elif defined(TARGET_s390X) diff --git a/mono/mini/mini-x86.c b/mono/mini/mini-x86.c index 02a6d1daa78..db3c4599d43 100644 --- a/mono/mini/mini-x86.c +++ b/mono/mini/mini-x86.c @@ -1209,6 +1209,10 @@ mono_arch_create_vars (MonoCompile *cfg) cfg->vret_addr = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_ARG); } +#ifdef MONO_X86_NO_PUSHES + cfg->arch.no_pushes = TRUE; +#endif + if (cfg->method->save_lmf) { cfg->create_lmf_var = TRUE; cfg->lmf_ir = TRUE; @@ -1267,9 +1271,17 @@ emit_sig_cookie (MonoCompile *cfg, MonoCallInst *call, CallInfo *cinfo) if (cfg->compile_aot) { sig_reg = mono_alloc_ireg (cfg); MONO_EMIT_NEW_SIGNATURECONST (cfg, sig_reg, tmp_sig); - MONO_EMIT_NEW_UNALU (cfg, OP_X86_PUSH, -1, sig_reg); + if (cfg->arch.no_pushes) { + MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, X86_ESP, cinfo->sig_cookie.offset, sig_reg); + } else { + MONO_EMIT_NEW_UNALU (cfg, OP_X86_PUSH, -1, sig_reg); + } } else { - MONO_EMIT_NEW_BIALU_IMM (cfg, OP_X86_PUSH_IMM, -1, -1, tmp_sig); + if (cfg->arch.no_pushes) { + MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STORE_MEMBASE_IMM, X86_ESP, cinfo->sig_cookie.offset, tmp_sig); + } else { + MONO_EMIT_NEW_BIALU_IMM (cfg, OP_X86_PUSH_IMM, -1, -1, tmp_sig); + } } } @@ -1394,6 +1406,9 @@ emit_gc_param_slot_def (MonoCompile *cfg, int sp_offset, MonoType *t) if (cfg->compute_gc_maps) { MonoInst *def; + /* Needs checking if the feature will be enabled again */ + g_assert (!cfg->arch.no_pushes); + /* On x86, the offsets are from the sp value before the start of the call sequence */ if (t == NULL) t = &mono_defaults.int_class->byval_arg; @@ -1420,7 +1435,7 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) if (!sig->pinvoke && (sig->call_convention == MONO_CALL_VARARG)) sentinelpos = sig->sentinelpos + (sig->hasthis ? 1 : 0); - if (cinfo->need_stack_align) { + if (cinfo->need_stack_align && !cfg->arch.no_pushes) { MONO_INST_NEW (cfg, arg, OP_SUB_IMM); arg->dreg = X86_ESP; arg->sreg1 = X86_ESP; @@ -1451,7 +1466,7 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) /* Handle the case where there are no implicit arguments */ if (!sig->pinvoke && (sig->call_convention == MONO_CALL_VARARG) && (n == sentinelpos)) { emit_sig_cookie (cfg, call, cinfo); - sp_offset += 4; + sp_offset = (cfg->arch.no_pushes) ? cinfo->sig_cookie.offset : (sp_offset + 4); emit_gc_param_slot_def (cfg, sp_offset, NULL); } @@ -1462,13 +1477,23 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) int argsize; if (cinfo->vtype_retaddr && cinfo->vret_arg_index == 1 && i == 0) { - /* Push the vret arg before the first argument */ MonoInst *vtarg; - MONO_INST_NEW (cfg, vtarg, OP_X86_PUSH); - vtarg->type = STACK_MP; - vtarg->sreg1 = call->vret_var->dreg; - MONO_ADD_INS (cfg->cbb, vtarg); - sp_offset += 4; + /* Push the vret arg before the first argument */ + if (cfg->arch.no_pushes) { + MONO_INST_NEW (cfg, vtarg, OP_STORE_MEMBASE_REG); + vtarg->type = STACK_MP; + vtarg->inst_destbasereg = X86_ESP; + vtarg->sreg1 = call->vret_var->dreg; + vtarg->inst_offset = cinfo->ret.offset; + MONO_ADD_INS (cfg->cbb, vtarg); + sp_offset = cinfo->ret.offset; + } else { + MONO_INST_NEW (cfg, vtarg, OP_X86_PUSH); + vtarg->type = STACK_MP; + vtarg->sreg1 = call->vret_var->dreg; + MONO_ADD_INS (cfg->cbb, vtarg); + sp_offset += 4; + } emit_gc_param_slot_def (cfg, sp_offset, NULL); } @@ -1521,48 +1546,70 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) MONO_ADD_INS (cfg->cbb, arg); if (ainfo->storage != ArgValuetypeInReg) { - sp_offset += size; + sp_offset = (cfg->arch.no_pushes) ? ainfo->offset : (sp_offset + size); emit_gc_param_slot_def (cfg, sp_offset, orig_type); } } } else { - argsize = 4; - switch (ainfo->storage) { case ArgOnStack: - arg->opcode = OP_X86_PUSH; if (!t->byref) { if (t->type == MONO_TYPE_R4) { - MONO_EMIT_NEW_BIALU_IMM (cfg, OP_SUB_IMM, X86_ESP, X86_ESP, 4); - arg->opcode = OP_STORER4_MEMBASE_REG; - arg->inst_destbasereg = X86_ESP; - arg->inst_offset = 0; + if (cfg->arch.no_pushes) { + MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORER4_MEMBASE_REG, X86_ESP, ainfo->offset, in->dreg); + } else { + MONO_EMIT_NEW_BIALU_IMM (cfg, OP_SUB_IMM, X86_ESP, X86_ESP, 4); + MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORER4_MEMBASE_REG, X86_ESP, 0, in->dreg); + } argsize = 4; } else if (t->type == MONO_TYPE_R8) { - MONO_EMIT_NEW_BIALU_IMM (cfg, OP_SUB_IMM, X86_ESP, X86_ESP, 8); - arg->opcode = OP_STORER8_MEMBASE_REG; - arg->inst_destbasereg = X86_ESP; - arg->inst_offset = 0; + if (cfg->arch.no_pushes) { + MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORER8_MEMBASE_REG, X86_ESP, ainfo->offset, in->dreg); + } else { + MONO_EMIT_NEW_BIALU_IMM (cfg, OP_SUB_IMM, X86_ESP, X86_ESP, 8); + MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORER8_MEMBASE_REG, X86_ESP, 0, in->dreg); + } argsize = 8; } else if (t->type == MONO_TYPE_I8 || t->type == MONO_TYPE_U8) { - arg->sreg1 ++; - MONO_EMIT_NEW_UNALU (cfg, OP_X86_PUSH, -1, in->dreg + 2); - sp_offset += 4; + if (cfg->arch.no_pushes) { + MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, X86_ESP, ainfo->offset + 4, in->dreg + 2); + MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, X86_ESP, ainfo->offset, in->dreg + 1); + } else { + MONO_EMIT_NEW_UNALU (cfg, OP_X86_PUSH, -1, in->dreg + 2); + MONO_EMIT_NEW_UNALU (cfg, OP_X86_PUSH, -1, in->dreg + 1); + sp_offset += 4; + } + argsize = 4; + } else { + if (cfg->arch.no_pushes) { + MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, X86_ESP, ainfo->offset, in->dreg); + } else { + arg->opcode = OP_X86_PUSH; + MONO_ADD_INS (cfg->cbb, arg); + } + argsize = 4; + } + } else { + if (cfg->arch.no_pushes) { + MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, X86_ESP, ainfo->offset, in->dreg); + } else { + arg->opcode = OP_X86_PUSH; + MONO_ADD_INS (cfg->cbb, arg); } + argsize = 4; } break; case ArgInIReg: arg->opcode = OP_MOVE; arg->dreg = ainfo->reg; + MONO_ADD_INS (cfg->cbb, arg); argsize = 0; break; default: g_assert_not_reached (); } - - MONO_ADD_INS (cfg->cbb, arg); - sp_offset += argsize; + sp_offset = (cfg->arch.no_pushes) ? ainfo->offset : (sp_offset + argsize); if (cfg->compute_gc_maps) { if (argsize == 4) { @@ -1579,8 +1626,12 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) } } else { /* i8/r8 */ - for (j = 0; j < argsize; j += 4) - emit_gc_param_slot_def (cfg, sp_offset - j, NULL); + for (j = 0; j < argsize; j += 4) { + if (cfg->arch.no_pushes) + emit_gc_param_slot_def (cfg, sp_offset + j, NULL); + else + emit_gc_param_slot_def (cfg, sp_offset - j, NULL); + } } } } @@ -1588,7 +1639,7 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) if (!sig->pinvoke && (sig->call_convention == MONO_CALL_VARARG) && (i == sentinelpos)) { /* Emit the signature cookie just before the implicit arguments */ emit_sig_cookie (cfg, call, cinfo); - sp_offset += 4; + sp_offset = (cfg->arch.no_pushes) ? cinfo->sig_cookie.offset : (sp_offset + 4); emit_gc_param_slot_def (cfg, sp_offset, NULL); } } @@ -1609,12 +1660,17 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) mono_call_inst_add_outarg_reg (cfg, call, vtarg->dreg, cinfo->ret.reg, FALSE); } else if (cinfo->vtype_retaddr && cinfo->vret_arg_index == 0) { - MonoInst *vtarg; - MONO_INST_NEW (cfg, vtarg, OP_X86_PUSH); - vtarg->type = STACK_MP; - vtarg->sreg1 = call->vret_var->dreg; - MONO_ADD_INS (cfg->cbb, vtarg); - sp_offset += 4; + if (cfg->arch.no_pushes) { + MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, X86_ESP, cinfo->ret.offset, call->vret_var->dreg); + sp_offset = cinfo->ret.offset; + } else { + MonoInst *vtarg; + MONO_INST_NEW (cfg, vtarg, OP_X86_PUSH); + vtarg->type = STACK_MP; + vtarg->sreg1 = call->vret_var->dreg; + MONO_ADD_INS (cfg->cbb, vtarg); + sp_offset += 4; + } emit_gc_param_slot_def (cfg, sp_offset, NULL); } @@ -1625,7 +1681,8 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) call->stack_usage = cinfo->stack_usage; call->stack_align_amount = cinfo->stack_align_amount; - cfg->arch.param_area_size = MAX (cfg->arch.param_area_size, sp_offset); + if (!cfg->arch.no_pushes) + cfg->arch.param_area_size = MAX (cfg->arch.param_area_size, sp_offset); } void @@ -1657,24 +1714,42 @@ mono_arch_emit_outarg_vt (MonoCompile *cfg, MonoInst *ins, MonoInst *src) else { if (cfg->gsharedvt && mini_is_gsharedvt_klass (cfg, ins->klass)) { /* Pass by addr */ - MONO_INST_NEW (cfg, arg, OP_X86_PUSH); - arg->sreg1 = src->dreg; - MONO_ADD_INS (cfg->cbb, arg); + if (cfg->arch.no_pushes) { + MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, X86_ESP, ainfo->offset, src->dreg); + } else { + MONO_INST_NEW (cfg, arg, OP_X86_PUSH); + arg->sreg1 = src->dreg; + MONO_ADD_INS (cfg->cbb, arg); + } } else if (size <= 4) { - MONO_INST_NEW (cfg, arg, OP_X86_PUSH_MEMBASE); - arg->sreg1 = src->dreg; - - MONO_ADD_INS (cfg->cbb, arg); - } else if (size <= 20) { - MONO_EMIT_NEW_BIALU_IMM (cfg, OP_SUB_IMM, X86_ESP, X86_ESP, ALIGN_TO (size, 4)); - mini_emit_memcpy (cfg, X86_ESP, 0, src->dreg, 0, size, 4); + if (cfg->arch.no_pushes) { + int dreg = mono_alloc_ireg (cfg); + MONO_EMIT_NEW_LOAD_MEMBASE (cfg, dreg, src->dreg, 0); + MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, X86_ESP, ainfo->offset, dreg); + } else { + MONO_INST_NEW (cfg, arg, OP_X86_PUSH_MEMBASE); + arg->sreg1 = src->dreg; + MONO_ADD_INS (cfg->cbb, arg); + } + } else if (size <= 20) { + if (cfg->arch.no_pushes) { + mini_emit_memcpy (cfg, X86_ESP, ainfo->offset, src->dreg, 0, size, 4); + } else { + MONO_EMIT_NEW_BIALU_IMM (cfg, OP_SUB_IMM, X86_ESP, X86_ESP, ALIGN_TO (size, 4)); + mini_emit_memcpy (cfg, X86_ESP, 0, src->dreg, 0, size, 4); + } } else { - MONO_INST_NEW (cfg, arg, OP_X86_PUSH_OBJ); - arg->inst_basereg = src->dreg; - arg->inst_offset = 0; - arg->inst_imm = size; + if (cfg->arch.no_pushes) { + // FIXME: Code growth + mini_emit_memcpy (cfg, X86_ESP, ainfo->offset, src->dreg, 0, size, 4); + } else { + MONO_INST_NEW (cfg, arg, OP_X86_PUSH_OBJ); + arg->inst_basereg = src->dreg; + arg->inst_offset = 0; + arg->inst_imm = size; - MONO_ADD_INS (cfg->cbb, arg); + MONO_ADD_INS (cfg->cbb, arg); + } } } } @@ -2173,7 +2248,7 @@ emit_float_to_int (MonoCompile *cfg, guchar *code, int dreg, int size, gboolean } static unsigned char* -mono_emit_stack_alloc (guchar *code, MonoInst* tree) +mono_emit_stack_alloc (MonoCompile *cfg, guchar *code, MonoInst* tree) { int sreg = tree->sreg1; int need_touch = FALSE; @@ -2218,6 +2293,8 @@ mono_emit_stack_alloc (guchar *code, MonoInst* tree) x86_mov_reg_imm (code, X86_ECX, (0x1000 >> 2)); x86_alu_reg_reg (code, X86_XOR, X86_EAX, X86_EAX); x86_lea_membase (code, X86_EDI, X86_ESP, 12); + if (cfg->param_area && cfg->arch.no_pushes) + x86_alu_reg_imm (code, X86_ADD, X86_EDI, cfg->param_area); x86_cld (code); x86_prefix (code, X86_REP_PREFIX); x86_stosl (code); @@ -3252,7 +3329,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) code = emit_call (cfg, code, MONO_PATCH_INFO_ABS, call->fptr); ins->flags |= MONO_INST_GC_CALLSITE; ins->backend.pc_offset = code - cfg->native_code; - if (call->stack_usage && !CALLCONV_IS_STDCALL (call->signature)) { + if (call->stack_usage && !CALLCONV_IS_STDCALL (call->signature) && !cfg->arch.no_pushes) { /* a pop is one byte, while an add reg, imm is 3. So if there are 4 or 8 * bytes to pop, we want to use pops. GCC does this (note it won't happen * for P4 or i686 because gcc will avoid using pop push at all. But we aren't @@ -3286,7 +3363,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) x86_call_reg (code, ins->sreg1); ins->flags |= MONO_INST_GC_CALLSITE; ins->backend.pc_offset = code - cfg->native_code; - if (call->stack_usage && !CALLCONV_IS_STDCALL (call->signature)) { + if (call->stack_usage && !CALLCONV_IS_STDCALL (call->signature) && !cfg->arch.no_pushes) { if (call->stack_usage == 4) x86_pop_reg (code, X86_ECX); else @@ -3305,7 +3382,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) x86_call_membase (code, ins->sreg1, ins->inst_offset); ins->flags |= MONO_INST_GC_CALLSITE; ins->backend.pc_offset = code - cfg->native_code; - if (call->stack_usage && !CALLCONV_IS_STDCALL (call->signature)) { + if (call->stack_usage && !CALLCONV_IS_STDCALL (call->signature) && !cfg->arch.no_pushes) { if (call->stack_usage == 4) x86_pop_reg (code, X86_ECX); else @@ -3314,15 +3391,19 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) code = emit_move_return_value (cfg, ins, code); break; case OP_X86_PUSH: + g_assert (!cfg->arch.no_pushes); x86_push_reg (code, ins->sreg1); break; case OP_X86_PUSH_IMM: + g_assert (!cfg->arch.no_pushes); x86_push_imm (code, ins->inst_imm); break; case OP_X86_PUSH_MEMBASE: + g_assert (!cfg->arch.no_pushes); x86_push_membase (code, ins->inst_basereg, ins->inst_offset); break; case OP_X86_PUSH_OBJ: + g_assert (!cfg->arch.no_pushes); x86_alu_reg_imm (code, X86_SUB, X86_ESP, ins->inst_imm); x86_push_reg (code, X86_EDI); x86_push_reg (code, X86_ESI); @@ -3353,8 +3434,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) /* keep alignment */ x86_alu_reg_imm (code, X86_ADD, ins->sreg1, MONO_ARCH_LOCALLOC_ALIGNMENT - 1); x86_alu_reg_imm (code, X86_AND, ins->sreg1, ~(MONO_ARCH_LOCALLOC_ALIGNMENT - 1)); - code = mono_emit_stack_alloc (code, ins); + code = mono_emit_stack_alloc (cfg, code, ins); x86_mov_reg_reg (code, ins->dreg, X86_ESP, 4); + if (cfg->param_area && cfg->arch.no_pushes) + x86_alu_reg_imm (code, X86_ADD, ins->dreg, cfg->param_area); break; case OP_LOCALLOC_IMM: { guint32 size = ins->inst_imm; @@ -3365,12 +3448,14 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) x86_mov_reg_imm (code, ins->dreg, size); ins->sreg1 = ins->dreg; - code = mono_emit_stack_alloc (code, ins); + code = mono_emit_stack_alloc (cfg, code, ins); x86_mov_reg_reg (code, ins->dreg, X86_ESP, 4); } else { x86_alu_reg_imm (code, X86_SUB, X86_ESP, size); x86_mov_reg_reg (code, ins->dreg, X86_ESP, 4); } + if (cfg->param_area && cfg->arch.no_pushes) + x86_alu_reg_imm (code, X86_ADD, ins->dreg, cfg->param_area); break; } case OP_THROW: { @@ -3401,6 +3486,11 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_START_HANDLER: { MonoInst *spvar = mono_find_spvar_for_region (cfg, bb->region); x86_mov_membase_reg (code, spvar->inst_basereg, spvar->inst_offset, X86_ESP, 4); + if ((MONO_BBLOCK_IS_IN_REGION (bb, MONO_REGION_FINALLY) || + MONO_BBLOCK_IS_IN_REGION (bb, MONO_REGION_FAULT)) && + cfg->param_area && cfg->arch.no_pushes) { + x86_alu_reg_imm (code, X86_SUB, X86_ESP, ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT)); + } break; } case OP_ENDFINALLY: { @@ -5246,6 +5336,10 @@ mono_arch_emit_prolog (MonoCompile *cfg) cfg->frame_reg = X86_ESP; } + if (cfg->arch.no_pushes) { + cfg->stack_offset += cfg->param_area; + } + alloc_size = cfg->stack_offset; pos = 0; @@ -5561,7 +5655,7 @@ mono_arch_emit_epilog (MonoCompile *cfg) MonoJitArgumentInfo *arg_info = alloca (sizeof (MonoJitArgumentInfo) * (sig->param_count + 1)); stack_to_pop = mono_arch_get_argument_info (NULL, sig, sig->param_count, arg_info); - } else if (cinfo->vtype_retaddr) + } else if (cinfo->vtype_retaddr && !cfg->arch.no_pushes) stack_to_pop = 4; else stack_to_pop = 0; diff --git a/mono/mini/mini-x86.h b/mono/mini/mini-x86.h index 995686bf94b..50cd4ac0510 100644 --- a/mono/mini/mini-x86.h +++ b/mono/mini/mini-x86.h @@ -74,6 +74,8 @@ struct sigcontext { #endif /* HAVE_WORKING_SIGALTSTACK */ #endif /* !HOST_WIN32 */ +#define MONO_X86_NO_PUSHES + #define MONO_ARCH_SUPPORT_TASKLETS 1 #ifndef DISABLE_SIMD @@ -167,6 +169,7 @@ struct MonoLMF { typedef struct { gboolean need_stack_frame_inited; gboolean need_stack_frame; + gboolean no_pushes; int sp_fp_offset, param_area_size; } MonoCompileArch; From 4149ba44cf800efa08c60518e1e7e4e70da264ac Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Sat, 7 Jun 2014 01:22:01 +0200 Subject: [PATCH 141/694] [arm] Fix OP_ATOMIC_CAS_I4. --- mono/mini/mini-arm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/mini/mini-arm.c b/mono/mini/mini-arm.c index e6ebc8dea7e..6895e1fb3a1 100644 --- a/mono/mini/mini-arm.c +++ b/mono/mini/mini-arm.c @@ -4206,7 +4206,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ARM_CMP_REG_IMM (code, tmpreg, 0, 0); buf [2] = code; ARM_B_COND (code, ARMCOND_NE, 0); - arm_patch (buf [2], buf [1]); + arm_patch (buf [2], buf [0]); arm_patch (buf [1], code); break; case OP_ATOMIC_ADD_NEW_I4: From eeef746ffcb539c2b85b49143fa8d62b5ffe39c8 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Sat, 7 Jun 2014 15:21:02 +0200 Subject: [PATCH 142/694] Revert "Fix a warning in atomic.c." MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 1fdc8789a7f4bfc6fa7f67c126569765194a3b6c. This breaks the ios build: ../../../../../mono/mono/utils/atomic.c: In function ‘InterlockedCompareExchange64’: ../../../../../mono/mono/utils/atomic.c:572: error: ‘spin’ undeclared (first use in this function) ../../../../../mono/mono/utils/atomic.c:572: error: (Each undeclared identifier is reported only once ../../../../../mono/mono/utils/atomic.c:572: error: for each function it appears in.) --- mono/utils/atomic.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mono/utils/atomic.c b/mono/utils/atomic.c index f0d817d9144..7cd884e61d9 100755 --- a/mono/utils/atomic.c +++ b/mono/utils/atomic.c @@ -17,14 +17,14 @@ #include +static pthread_mutex_t spin = PTHREAD_MUTEX_INITIALIZER; + #define NEED_64BIT_CMPXCHG_FALLBACK #endif #ifdef WAPI_NO_ATOMIC_ASM -static pthread_mutex_t spin = PTHREAD_MUTEX_INITIALIZER; - static mono_once_t spin_once=MONO_ONCE_INIT; static void spin_init(void) From 97e016c9664b08c2aafbe20f797a1f4a97df3218 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 16:13:22 +0200 Subject: [PATCH 143/694] Mark the `spin` variable in atomic.c as G_GNUC_UNUSED. It would require an `#ifdef` forest to get the conditions under which it is used right. --- mono/utils/atomic.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mono/utils/atomic.c b/mono/utils/atomic.c index 7cd884e61d9..3fdd34d5bf4 100755 --- a/mono/utils/atomic.c +++ b/mono/utils/atomic.c @@ -13,11 +13,11 @@ #include -#if defined (WAPI_NO_ATOMIC_ASM) || defined (BROKEN_64BIT_ATOMICS_INTRINSIC) +#if defined (WAPI_NO_ATOMIC_ASM) || (defined (BROKEN_64BIT_ATOMICS_INTRINSIC) && !defined (TARGET_OSX)) #include -static pthread_mutex_t spin = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t spin G_GNUC_UNUSED = PTHREAD_MUTEX_INITIALIZER; #define NEED_64BIT_CMPXCHG_FALLBACK From c94206ef72018738b99184d92a9020db7e7b30e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 16:18:35 +0200 Subject: [PATCH 144/694] Bring the implementation of the 64-bit CAS fallback in line with the 32-bit one. --- mono/utils/atomic.c | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/mono/utils/atomic.c b/mono/utils/atomic.c index 3fdd34d5bf4..6dbc8f54b72 100755 --- a/mono/utils/atomic.c +++ b/mono/utils/atomic.c @@ -19,19 +19,19 @@ static pthread_mutex_t spin G_GNUC_UNUSED = PTHREAD_MUTEX_INITIALIZER; -#define NEED_64BIT_CMPXCHG_FALLBACK - -#endif - -#ifdef WAPI_NO_ATOMIC_ASM - -static mono_once_t spin_once=MONO_ONCE_INIT; +static mono_once_t spin_once G_GNUC_UNUSED = MONO_ONCE_INIT; static void spin_init(void) { g_warning("Using non-atomic functions! Expect race conditions when using process-shared handles!"); } +#define NEED_64BIT_CMPXCHG_FALLBACK + +#endif + +#ifdef WAPI_NO_ATOMIC_ASM + gint32 InterlockedCompareExchange(volatile gint32 *dest, gint32 exch, gint32 comp) { @@ -568,15 +568,26 @@ gint64 InterlockedCompareExchange64(volatile gint64 *dest, gint64 exch, gint64 comp) { gint64 old; + int ret; + + mono_once(&spin_once, spin_init); + + pthread_cleanup_push ((void(*)(void *))pthread_mutex_unlock, + (void *)&spin); + ret = pthread_mutex_lock(&spin); + g_assert (ret == 0); + + old= *dest; + if(old==comp) { + *dest=exch; + } + + ret = pthread_mutex_unlock(&spin); + g_assert (ret == 0); + + pthread_cleanup_pop (0); - pthread_mutex_lock (&spin); - - old = *dest; - if(old == comp) - *dest = exch; - - pthread_mutex_unlock (&spin); - return old; + return(old); } #endif From 2cecaa471356b8ac1727c808ef453243b549cbd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 16:38:47 +0200 Subject: [PATCH 145/694] Fix the build. We've been missing this include for ages... --- mono/utils/atomic.c | 1 + 1 file changed, 1 insertion(+) diff --git a/mono/utils/atomic.c b/mono/utils/atomic.c index 6dbc8f54b72..fc0324dbee6 100755 --- a/mono/utils/atomic.c +++ b/mono/utils/atomic.c @@ -12,6 +12,7 @@ #include #include +#include #if defined (WAPI_NO_ATOMIC_ASM) || (defined (BROKEN_64BIT_ATOMICS_INTRINSIC) && !defined (TARGET_OSX)) From 09f85a32d944d3ebfd07f5d18cfa4aeb3d3d5a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 16:52:50 +0200 Subject: [PATCH 146/694] Revert unintentional change. --- mono/utils/atomic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/utils/atomic.c b/mono/utils/atomic.c index fc0324dbee6..362bb8d3a08 100755 --- a/mono/utils/atomic.c +++ b/mono/utils/atomic.c @@ -14,7 +14,7 @@ #include #include -#if defined (WAPI_NO_ATOMIC_ASM) || (defined (BROKEN_64BIT_ATOMICS_INTRINSIC) && !defined (TARGET_OSX)) +#if defined (WAPI_NO_ATOMIC_ASM) || defined (BROKEN_64BIT_ATOMICS_INTRINSIC) #include From 69ed93a8fac6c21f5addb44a55d23082a16b9acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 17:56:06 +0200 Subject: [PATCH 147/694] Compile libgc with -Wno-deprecated-declarations as it uses some obsolete POSIX APIs. --- configure.ac | 3 +++ 1 file changed, 3 insertions(+) diff --git a/configure.ac b/configure.ac index 696bf15ead0..ffd98962529 100644 --- a/configure.ac +++ b/configure.ac @@ -59,6 +59,9 @@ CFLAGS_FOR_LIBGC=$CFLAGS CPPFLAGS_FOR_EGLIB=$CPPFLAGS CFLAGS_FOR_EGLIB=$CFLAGS +# libgc uses some deprecated APIs +CFLAGS_FOR_LIBGC="$CFLAGS -Wno-deprecated-declarations" + # # These are the flags that need to be stored in the mono.pc file for # compiling code that will embed Mono From bf703c4a8f95db4859452474499038c7539ea3c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 17:56:50 +0200 Subject: [PATCH 148/694] Disable -Wreturn-local-addr in libgc/mark_rts.c!GC_approx_sp with GCC 4.8.0+. --- libgc/mark_rts.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libgc/mark_rts.c b/libgc/mark_rts.c index 4074879a71a..58d7db153ca 100644 --- a/libgc/mark_rts.c +++ b/libgc/mark_rts.c @@ -375,8 +375,15 @@ ptr_t GC_approx_sp() /* doing something wrong. */ # ifdef _MSC_VER # pragma warning(disable:4172) +# endif +# if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 408) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wreturn-local-addr" # endif return((ptr_t)(&dummy)); +# if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 408) + pragma GCC diagnostic pop +# endif # ifdef _MSC_VER # pragma warning(default:4172) # endif From d6aee5a283074d1bfa6c82e0b650fe75c6f2e51e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 17:57:46 +0200 Subject: [PATCH 149/694] Disable -Warray-bounds in eglib/src/sort.frag.h!insert_list in GCC 4.6.0+. --- eglib/src/sort.frag.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/eglib/src/sort.frag.h b/eglib/src/sort.frag.h index 2cf5a9ba1f3..8a98c66f644 100644 --- a/eglib/src/sort.frag.h +++ b/eglib/src/sort.frag.h @@ -124,6 +124,14 @@ sweep_up (struct sort_info *si, list_node *list, int upto) static inline void insert_list (struct sort_info *si, list_node* list, int rank) { +#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406) + /* + * GCC incorrectly thinks we're writing below si->ranks array bounds. + */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Warray-bounds" +#endif + int i; if (rank > si->n_ranks) { @@ -149,6 +157,10 @@ insert_list (struct sort_info *si, list_node* list, int rank) si->n_ranks = i + 1; si->min_rank = i; si->ranks [i] = list; + +#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406) +#pragma GCC diagnostic pop +#endif } #undef stringify2 From 1ef4b4801407f4915f17907d05b2c6c96b79a526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 17:58:32 +0200 Subject: [PATCH 150/694] Mark an unused variable as such in eglib/test/file.c. --- eglib/test/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eglib/test/file.c b/eglib/test/file.c index 411c9452966..19276c990c6 100644 --- a/eglib/test/file.c +++ b/eglib/test/file.c @@ -115,7 +115,7 @@ test_file () #ifndef G_OS_WIN32 /* FIXME */ gchar *sympath; - gint ignored; + gint ignored G_GNUC_UNUSED; #endif res = g_file_test (NULL, 0); From 27c58875c2c93fd1cd7ad3cd40e613b0b9e40687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 17:58:48 +0200 Subject: [PATCH 151/694] Add missing prototypes in ikvm-native. --- ikvm-native/jni.c | 8 +++++++- ikvm-native/os.c | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/ikvm-native/jni.c b/ikvm-native/jni.c index dec858e131f..e638db1d76f 100644 --- a/ikvm-native/jni.c +++ b/ikvm-native/jni.c @@ -486,11 +486,15 @@ static void* JNIEnv_vtable[] = 0 // jlong JNICALL GetDirectBufferCapacity(jobject buf); }; -JNIEXPORT void** JNICALL ikvm_GetJNIEnvVTable() +void** ikvm_GetJNIEnvVTable(void); + +JNIEXPORT void** JNICALL ikvm_GetJNIEnvVTable(void) { return JNIEnv_vtable; } +void* JNICALL ikvm_MarshalDelegate(void* p); + JNIEXPORT void* JNICALL ikvm_MarshalDelegate(void* p) { return p; @@ -498,6 +502,8 @@ JNIEXPORT void* JNICALL ikvm_MarshalDelegate(void* p) typedef jint (JNICALL *PJNI_ONLOAD)(JavaVM* vm, void* reserved); +jint JNICALL ikvm_CallOnLoad(PJNI_ONLOAD method, JavaVM* vm, void* reserved); + JNIEXPORT jint JNICALL ikvm_CallOnLoad(PJNI_ONLOAD method, JavaVM* vm, void* reserved) { return method(vm, reserved); diff --git a/ikvm-native/os.c b/ikvm-native/os.c index 9f2115f712b..43531ae0ea5 100644 --- a/ikvm-native/os.c +++ b/ikvm-native/os.c @@ -61,16 +61,22 @@ #include #include "jni.h" + void* JNICALL ikvm_LoadLibrary(char* psz); + JNIEXPORT void* JNICALL ikvm_LoadLibrary(char* psz) { return g_module_open(psz, 0); } + void JNICALL ikvm_FreeLibrary(GModule* handle); + JNIEXPORT void JNICALL ikvm_FreeLibrary(GModule* handle) { g_module_close(handle); } + void* JNICALL ikvm_GetProcAddress(GModule* handle, char* name, jint argc); + JNIEXPORT void* JNICALL ikvm_GetProcAddress(GModule* handle, char* name, jint argc) { void *symbol; @@ -83,16 +89,22 @@ return NULL; } + void* JNICALL ikvm_mmap(int fd, jboolean writeable, jboolean copy_on_write, jlong position, jint size); + JNIEXPORT void* JNICALL ikvm_mmap(int fd, jboolean writeable, jboolean copy_on_write, jlong position, jint size) { return mmap(0, size, writeable ? PROT_WRITE | PROT_READ : PROT_READ, copy_on_write ? MAP_PRIVATE : MAP_SHARED, fd, position); } + int JNICALL ikvm_munmap(void* address, jint size); + JNIEXPORT int JNICALL ikvm_munmap(void* address, jint size) { return munmap(address, size); } + int JNICALL ikvm_msync(void* address, jint size); + JNIEXPORT int JNICALL ikvm_msync(void* address, jint size) { #if defined(__native_client__) && defined(USE_NEWLIB) From 54de0818bf3614f5f15f30492d56812cb0a0230b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 17:59:18 +0200 Subject: [PATCH 152/694] Silence unused mkstemp result warnings in jay. --- mcs/jay/main.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/mcs/jay/main.c b/mcs/jay/main.c index b47867d3e33..2cac736b1bf 100644 --- a/mcs/jay/main.c +++ b/mcs/jay/main.c @@ -303,9 +303,17 @@ create_file_names() prolog_file_name[len + 5] = 'p'; local_file_name[len + 5] = 'l'; - mkstemp(action_file_name); - mkstemp(prolog_file_name); - mkstemp(local_file_name); +#ifdef __GNUC__ +#define GNUC_UNUSED __attribute__((__unused__)) +#else +#define GNUC_UNUSED +#endif + + int mkstemp_res GNUC_UNUSED; + + mkstemp_res = mkstemp(action_file_name); + mkstemp_res = mkstemp(prolog_file_name); + mkstemp_res = mkstemp(local_file_name); len = strlen(file_prefix); From 86602698daeeca5f46fe5fdcbbe29b8834bc4f20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 17:59:49 +0200 Subject: [PATCH 153/694] Add g_assert_not_reached () to mono_gc_pthread_exit (). On Android, pthread_exit () is not decorated as noreturn. --- mono/metadata/boehm-gc.c | 1 + mono/metadata/sgen-gc.c | 1 + 2 files changed, 2 insertions(+) diff --git a/mono/metadata/boehm-gc.c b/mono/metadata/boehm-gc.c index f3c7685037b..ef498c60760 100644 --- a/mono/metadata/boehm-gc.c +++ b/mono/metadata/boehm-gc.c @@ -1245,6 +1245,7 @@ void mono_gc_pthread_exit (void *retval) { pthread_exit (retval); + g_assert_not_reached (); } #endif diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index 52ceeaf9391..7ab1cb6c25b 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -3936,6 +3936,7 @@ mono_gc_pthread_exit (void *retval) { mono_thread_info_detach (); pthread_exit (retval); + g_assert_not_reached (); } #endif /* USE_PTHREAD_INTERCEPT */ From a96bd2f959e007d390d787d088391a0c767ad0a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 18:00:41 +0200 Subject: [PATCH 154/694] Wrap deadce_has_run variable in DISABLE_SSA ifdef. --- mono/mini/mini.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mono/mini/mini.c b/mono/mini/mini.c index 035f975c9f8..679fdcda71a 100644 --- a/mono/mini/mini.c +++ b/mono/mini/mini.c @@ -4901,7 +4901,9 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, JitFl guint8 *ip; MonoCompile *cfg; int dfn, i, code_size_ratio; +#ifndef DISABLE_SSA gboolean deadce_has_run = FALSE; +#endif gboolean try_generic_shared, try_llvm = FALSE; MonoMethod *method_to_compile, *method_to_register; gboolean method_is_gshared = FALSE; From 6db015b5e3828efca11f314398185af82d819707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 18:01:10 +0200 Subject: [PATCH 155/694] Move shared_area_disabled () behind ifdef. --- mono/utils/mono-mmap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mono/utils/mono-mmap.c b/mono/utils/mono-mmap.c index 402b82e2f95..5546c6b7cca 100644 --- a/mono/utils/mono-mmap.c +++ b/mono/utils/mono-mmap.c @@ -483,6 +483,8 @@ mono_mprotect (void *addr, size_t length, int flags) } #endif // HAVE_MMAP +#if defined(HAVE_SHM_OPEN) && !defined (DISABLE_SHARED_PERFCOUNTERS) + static int use_shared_area; static gboolean @@ -497,8 +499,6 @@ shared_area_disabled (void) return use_shared_area == -1; } -#if defined(HAVE_SHM_OPEN) && !defined (DISABLE_SHARED_PERFCOUNTERS) - static int mono_shared_area_instances_slow (void **array, int count, gboolean cleanup) { From 58ebad8f7214eac5e1095b3ba5c94bd211ff0c0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 18:02:14 +0200 Subject: [PATCH 156/694] Add missing prototypes to Mono.Posix C sources. --- support/macros.c | 9 +++++++++ support/sys-time.c | 4 ++++ support/syslog.c | 3 +++ 3 files changed, 16 insertions(+) diff --git a/support/macros.c b/support/macros.c index d2cf5e7bcdb..8d455889d7c 100644 --- a/support/macros.c +++ b/support/macros.c @@ -100,6 +100,15 @@ char *helper_Mono_Posix_readdir(void *dir) { } #if HAVE_GETPWNAM_R +int helper_Mono_Posix_getpwnamuid (int mode, char *in_name, int in_uid, + char **account, + char **password, + int *uid, + int *gid, + char **name, + char **home, + char **shell); + int helper_Mono_Posix_getpwnamuid (int mode, char *in_name, int in_uid, char **account, char **password, diff --git a/support/sys-time.c b/support/sys-time.c index 1759ec0fcb8..1309f2a9753 100644 --- a/support/sys-time.c +++ b/support/sys-time.c @@ -70,6 +70,10 @@ Mono_Posix_Syscall_settimeofday ( } /* Remove this at some point in the future */ +gint32 +Mono_Posix_Syscall_utimes_bad (const char *filename, + struct Mono_Posix_Timeval *tv); + gint32 Mono_Posix_Syscall_utimes_bad (const char *filename, struct Mono_Posix_Timeval *tv) diff --git a/support/syslog.c b/support/syslog.c index 6fed2ad2059..2d8d7cbe800 100644 --- a/support/syslog.c +++ b/support/syslog.c @@ -47,6 +47,9 @@ Mono_Posix_Syscall_syslog (int priority, const char* message) #endif /* vararg version of syslog(3). */ +gint32 +Mono_Posix_Syscall_syslog2 (int priority, const char *format, ...); + gint32 Mono_Posix_Syscall_syslog2 (int priority, const char *format, ...) { From 93e7f8691cf4e290124c7f05fe5cc207f784b46b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 18:02:29 +0200 Subject: [PATCH 157/694] Fix z_alloc () signature. Yes, really. zlib really uses a 32-bit int here... --- support/zlib-helper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/zlib-helper.c b/support/zlib-helper.c index 47adde38dbf..d0911fc0764 100644 --- a/support/zlib-helper.c +++ b/support/zlib-helper.c @@ -45,7 +45,7 @@ gint WriteZStream (ZStream *stream, guchar *buffer, gint length); static gint flush_internal (ZStream *stream, gboolean is_final); static void * -z_alloc (void *opaque, gsize nitems, gsize item_size) +z_alloc (void *opaque, unsigned int nitems, unsigned int item_size) { return g_malloc0 (nitems * item_size); } From f35c6a0b07959ff4ca854db5a68d7ddbd7658ce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 18:03:19 +0200 Subject: [PATCH 158/694] Comment an unused function in minizip. --- support/minizip/zip.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/support/minizip/zip.c b/support/minizip/zip.c index 5acf49f5861..ef81ecc032c 100644 --- a/support/minizip/zip.c +++ b/support/minizip/zip.c @@ -187,12 +187,13 @@ local void init_linkedlist(linkedlist_data *ll) ll->first_block = ll->last_block = NULL; } +/* local void free_linkedlist(linkedlist_data *ll) { free_datablock(ll->first_block); ll->first_block = ll->last_block = NULL; } - +*/ local int add_data_in_datablock(linkedlist_data *ll, const void *buf, uLong len) { From b45527f44b8b38dff4ed3941411a24f5fe1a9287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 18:03:31 +0200 Subject: [PATCH 159/694] Add missing prototypes to supportw.c. --- support/supportw.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/support/supportw.c b/support/supportw.c index 49ed549c5d2..51b49697152 100644 --- a/support/supportw.c +++ b/support/supportw.c @@ -158,6 +158,9 @@ FindWindowExW (gpointer hwndParent, gpointer hwndChildAfter, const char *classw, return func (hwndParent, hwndChildAfter, classw, window); } +int +SetWindowPos (gpointer hwnd, gpointer hwndInsertAfter, int x, int y, int cx, int cy, unsigned int flags); + int SetWindowPos (gpointer hwnd, gpointer hwndInsertAfter, int x, int y, int cx, int cy, unsigned int flags) { @@ -165,6 +168,9 @@ SetWindowPos (gpointer hwnd, gpointer hwndInsertAfter, int x, int y, int cx, int return 1; } +int +SendMessageA (gpointer hwnd, unsigned int msg, gpointer wparam, gpointer lparam); + int SendMessageA (gpointer hwnd, unsigned int msg, gpointer wparam, gpointer lparam) { @@ -172,6 +178,9 @@ SendMessageA (gpointer hwnd, unsigned int msg, gpointer wparam, gpointer lparam) return 0; } +int +GetWindowLongA (gpointer hwnd, int a); + int GetWindowLongA (gpointer hwnd, int a) { From f6b7bf735a912859c0f8a29f510ab54237b5ca66 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Sat, 7 Jun 2014 18:35:41 +0100 Subject: [PATCH 160/694] Fixed the build on MSVC. Local variables need to be declared at the start of the block. --- mcs/jay/main.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/mcs/jay/main.c b/mcs/jay/main.c index 2cac736b1bf..fcac218b1df 100644 --- a/mcs/jay/main.c +++ b/mcs/jay/main.c @@ -256,11 +256,17 @@ unsigned n; return (p); } +#ifdef __GNUC__ +#define GNUC_UNUSED __attribute__((__unused__)) +#else +#define GNUC_UNUSED +#endif create_file_names() { int i, len; char *tmpdir; + int mkstemp_res GNUC_UNUSED; #if defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__) tmpdir = "."; @@ -303,14 +309,6 @@ create_file_names() prolog_file_name[len + 5] = 'p'; local_file_name[len + 5] = 'l'; -#ifdef __GNUC__ -#define GNUC_UNUSED __attribute__((__unused__)) -#else -#define GNUC_UNUSED -#endif - - int mkstemp_res GNUC_UNUSED; - mkstemp_res = mkstemp(action_file_name); mkstemp_res = mkstemp(prolog_file_name); mkstemp_res = mkstemp(local_file_name); From 06a33428d247929cca975f71bc64a9e25b1c1d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 22:19:39 +0200 Subject: [PATCH 161/694] Fix typo in bf703c4a8f95db4859452474499038c7539ea3c7. --- libgc/mark_rts.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libgc/mark_rts.c b/libgc/mark_rts.c index 58d7db153ca..b3e996a29c2 100644 --- a/libgc/mark_rts.c +++ b/libgc/mark_rts.c @@ -382,7 +382,7 @@ ptr_t GC_approx_sp() # endif return((ptr_t)(&dummy)); # if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 408) - pragma GCC diagnostic pop +# pragma GCC diagnostic pop # endif # ifdef _MSC_VER # pragma warning(default:4172) From da1d328913dfea6eff2c46c2114b05cb8ff4daa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 7 Jun 2014 22:26:58 +0200 Subject: [PATCH 162/694] Silence another array subscript warning in eglib/src/sort.frag.h. --- eglib/src/sort.frag.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/eglib/src/sort.frag.h b/eglib/src/sort.frag.h index 8a98c66f644..6dc1950ae4e 100644 --- a/eglib/src/sort.frag.h +++ b/eglib/src/sort.frag.h @@ -88,12 +88,24 @@ merge_lists (list_node *first, list_node *second, GCompareFunc func) static inline list_node * sweep_up (struct sort_info *si, list_node *list, int upto) { +#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406) + /* + * GCC incorrectly thinks we're writing below si->ranks array bounds. + */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Warray-bounds" +#endif + int i; for (i = si->min_rank; i < upto; ++i) { list = merge_lists (si->ranks [i], list, si->func); si->ranks [i] = NULL; } return list; + +#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406) +#pragma GCC diagnostic pop +#endif } /* From a99ebf9843f0cf92b3a9a856738378dcace20566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 8 Jun 2014 01:55:54 +0200 Subject: [PATCH 163/694] Fix a ton of warnings when building the log profiler with newer zlib versions. --- mono/profiler/proflog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/profiler/proflog.c b/mono/profiler/proflog.c index 193be897f76..f053e81097c 100644 --- a/mono/profiler/proflog.c +++ b/mono/profiler/proflog.c @@ -384,7 +384,7 @@ struct _MonoProfiler { StatBuffer *stat_buffers; FILE* file; #if defined (HAVE_SYS_ZLIB) - gzFile *gzfile; + gzFile gzfile; #endif uint64_t startup_time; int pipe_output; From e6aa46a391300812b5a959fe1d1b2f2bbd9b5c27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 8 Jun 2014 04:09:05 +0200 Subject: [PATCH 164/694] Apply the change in a99ebf9843f0cf92b3a9a856738378dcace20566 to mprof-report too. --- mono/profiler/decode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/profiler/decode.c b/mono/profiler/decode.c index 2a52c19f4d0..dff9d66a143 100644 --- a/mono/profiler/decode.c +++ b/mono/profiler/decode.c @@ -1433,7 +1433,7 @@ typedef struct _ThreadContext ThreadContext; typedef struct { FILE *file; #if defined (HAVE_SYS_ZLIB) - gzFile *gzfile; + gzFile gzfile; #endif unsigned char *buf; int size; From 8530d2b60ef7f794c7e63b0647ec1b545acfc4d9 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Sun, 8 Jun 2014 14:28:38 +0200 Subject: [PATCH 165/694] [x86] Disable the no-pushes code for now, it breaks many tests. --- mono/mini/mini-x86.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/mini/mini-x86.h b/mono/mini/mini-x86.h index 50cd4ac0510..7ddc2f69cd7 100644 --- a/mono/mini/mini-x86.h +++ b/mono/mini/mini-x86.h @@ -74,7 +74,7 @@ struct sigcontext { #endif /* HAVE_WORKING_SIGALTSTACK */ #endif /* !HOST_WIN32 */ -#define MONO_X86_NO_PUSHES +// #define MONO_X86_NO_PUSHES 1 #define MONO_ARCH_SUPPORT_TASKLETS 1 From 039f01d6b0f80dcb5b90381bee67041d46a21c21 Mon Sep 17 00:00:00 2001 From: Brian Durham Date: Sun, 8 Jun 2014 10:14:50 -0500 Subject: [PATCH 166/694] Update Graphics.cs - change "Check you DISPLAY" Update Graphics.cs - change "Check you DISPLAY environment variable" to "Check your DISPLAY environment variable" --- mcs/class/System.Drawing/System.Drawing/Graphics.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/System.Drawing/System.Drawing/Graphics.cs b/mcs/class/System.Drawing/System.Drawing/Graphics.cs index 827bdee0881..6e18fe690df 100644 --- a/mcs/class/System.Drawing/System.Drawing/Graphics.cs +++ b/mcs/class/System.Drawing/System.Drawing/Graphics.cs @@ -1744,7 +1744,7 @@ public static Graphics FromHwnd (IntPtr hwnd) if (GDIPlus.Display == IntPtr.Zero) { GDIPlus.Display = GDIPlus.XOpenDisplay (IntPtr.Zero); if (GDIPlus.Display == IntPtr.Zero) - throw new NotSupportedException ("Could not open display (X-Server required. Check you DISPLAY environment variable)"); + throw new NotSupportedException ("Could not open display (X-Server required. Check your DISPLAY environment variable)"); } if (hwnd == IntPtr.Zero) { hwnd = GDIPlus.XRootWindow (GDIPlus.Display, GDIPlus.XDefaultScreen (GDIPlus.Display)); From ca7f073b7e1a30728c41cffb3cd7991b466cb24c Mon Sep 17 00:00:00 2001 From: Brian Durham Date: Sun, 8 Jun 2014 10:18:02 -0500 Subject: [PATCH 167/694] Update X11Display.cs - change "Check you DISPLAY" Change "Check you DISPLAY environment variable" to "Check your DISPLAY environment variable" --- .../System.Windows.Forms.X11Internal/X11Display.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms.X11Internal/X11Display.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms.X11Internal/X11Display.cs index 43b39dcd4fc..a15b747d188 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms.X11Internal/X11Display.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms.X11Internal/X11Display.cs @@ -104,7 +104,7 @@ public X11Display (IntPtr display) { if (display == IntPtr.Zero) { throw new ArgumentNullException("Display", - "Could not open display (X-Server required. Check you DISPLAY environment variable)"); + "Could not open display (X-Server required. Check your DISPLAY environment variable)"); } this.display = display; From 98d56eb3038557261a6b8a5f66dc703a9a050609 Mon Sep 17 00:00:00 2001 From: Brian Durham Date: Sun, 8 Jun 2014 10:22:06 -0500 Subject: [PATCH 168/694] Update XplatUIX11.cs - change "Check you DISPLAY" Update XplatUIX11.cs - change "Check you DISPLAY" to "Check your DISPLAY" --- .../Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs index e05a093aac5..1f3af258464 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs @@ -552,7 +552,7 @@ internal void SetDisplay(IntPtr display_handle) ErrorHandler = new XErrorHandler(HandleError); XSetErrorHandler(ErrorHandler); } else { - throw new ArgumentNullException("Display", "Could not open display (X-Server required. Check you DISPLAY environment variable)"); + throw new ArgumentNullException("Display", "Could not open display (X-Server required. Check your DISPLAY environment variable)"); } } #endregion // Internal Methods From f5858f05f1aeecf58559e6095bbaba42b7313571 Mon Sep 17 00:00:00 2001 From: Brian Durham Date: Sun, 8 Jun 2014 10:24:35 -0500 Subject: [PATCH 169/694] Update XplatUIX11GTK.cs - change "Check you DISPLAY" Update XplatUIX11GTK.cs - change "Check you DISPLAY" text to "Check your DISPLAY" --- .../Managed.Windows.Forms/System.Windows.Forms/XplatUIX11GTK.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11GTK.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11GTK.cs index 77e89c4975a..b8820a9bed0 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11GTK.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11GTK.cs @@ -708,7 +708,7 @@ internal void SetDisplay (IntPtr display_handle) ErrorHandler = new XErrorHandler (HandleError); XSetErrorHandler (ErrorHandler); } else { - throw new ArgumentNullException ("Display", "Could not open display (X-Server required. Check you DISPLAY environment variable)"); + throw new ArgumentNullException ("Display", "Could not open display (X-Server required. Check your DISPLAY environment variable)"); } } #endregion // Internal Methods From e7bc1740772720fd9ea05066613e97026ceb8285 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Sun, 8 Jun 2014 23:18:53 +0200 Subject: [PATCH 170/694] [jit] Align the stack when using the pushless code on x86. --- mono/mini/mini-x86.c | 1 + 1 file changed, 1 insertion(+) diff --git a/mono/mini/mini-x86.c b/mono/mini/mini-x86.c index db3c4599d43..18b3001e663 100644 --- a/mono/mini/mini-x86.c +++ b/mono/mini/mini-x86.c @@ -5338,6 +5338,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) if (cfg->arch.no_pushes) { cfg->stack_offset += cfg->param_area; + cfg->stack_offset = ALIGN_TO (cfg->stack_offset, MONO_ARCH_FRAME_ALIGNMENT); } alloc_size = cfg->stack_offset; From b8580c63d31bed779b975d007ce7c0fe7f332b6a Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Mon, 9 Jun 2014 12:42:00 +0900 Subject: [PATCH 171/694] [sys.xaml] remove extraneous NET_2_1 and use __MOBILE__ to make it build for XA/XiOS. --- mcs/class/System.Xaml/Makefile | 2 +- .../System.Windows.Markup/AmbientAttribute.cs | 2 -- .../System.Xaml/System.Windows.Markup/ArrayExtension.cs | 4 ---- .../ConstructorArgumentAttribute.cs | 2 -- .../System.Windows.Markup/ContentPropertyAttribute.cs | 2 -- .../System.Windows.Markup/ContentWrapperAttribute.cs | 7 ------- .../System.Windows.Markup/DateTimeValueSerializer.cs | 2 -- .../System.Windows.Markup/DependsOnAttribute.cs | 9 --------- .../DictionaryKeyPropertyAttribute.cs | 2 -- .../System.Windows.Markup/IComponentConnector.cs | 2 -- .../System.Xaml/System.Windows.Markup/INameScope.cs | 2 -- .../System.Windows.Markup/IProvideValueTarget.cs | 2 -- .../System.Xaml/System.Windows.Markup/IUriContext.cs | 2 -- .../System.Windows.Markup/IValueSerializerContext.cs | 2 -- .../System.Windows.Markup/IXamlTypeResolver.cs | 2 -- .../System.Xaml/System.Windows.Markup/MarkupExtension.cs | 2 -- .../System.Windows.Markup/NameScopePropertyAttribute.cs | 2 -- .../System.Xaml/System.Windows.Markup/NullExtension.cs | 2 -- .../System.Windows.Markup/RootNamespaceAttribute.cs | 2 -- .../RuntimeNamePropertyAttribute.cs | 2 -- .../System.Xaml/System.Windows.Markup/StaticExtension.cs | 2 -- .../TrimSurroundingWhitespaceAttribute.cs | 2 -- .../System.Xaml/System.Windows.Markup/TypeExtension.cs | 4 ---- .../System.Windows.Markup/UidPropertyAttribute.cs | 2 -- .../System.Xaml/System.Windows.Markup/ValueSerializer.cs | 6 ------ .../System.Windows.Markup/ValueSerializerAttribute.cs | 2 -- .../WhitespaceSignificantCollectionAttribute.cs | 2 -- .../System.Windows.Markup/XmlLangPropertyAttribute.cs | 2 -- .../XmlnsCompatibleWithAttribute.cs | 2 -- .../System.Windows.Markup/XmlnsDefinitionAttribute.cs | 2 -- .../System.Windows.Markup/XmlnsPrefixAttribute.cs | 2 -- .../System.Xaml/XamlDuplicateMemberException.cs | 6 ------ mcs/class/System.Xaml/System.Xaml/XamlException.cs | 6 ------ .../System.Xaml/System.Xaml/XamlInternalException.cs | 4 ---- mcs/class/System.Xaml/System.Xaml/XamlMember.cs | 2 -- .../System.Xaml/System.Xaml/XamlObjectReaderException.cs | 4 ---- .../System.Xaml/System.Xaml/XamlObjectWriterException.cs | 4 ---- .../System.Xaml/System.Xaml/XamlObjectWriterSettings.cs | 6 +++--- mcs/class/System.Xaml/System.Xaml/XamlParseException.cs | 4 ---- mcs/class/System.Xaml/System.Xaml/XamlSchemaContext.cs | 8 +------- mcs/class/System.Xaml/System.Xaml/XamlSchemaException.cs | 4 ---- mcs/class/System.Xaml/System.Xaml/XamlServices.cs | 2 -- .../System.Xaml/System.Xaml/XamlXmlWriterException.cs | 4 ---- 43 files changed, 5 insertions(+), 131 deletions(-) diff --git a/mcs/class/System.Xaml/Makefile b/mcs/class/System.Xaml/Makefile index 04ad2dda799..17d16132910 100644 --- a/mcs/class/System.Xaml/Makefile +++ b/mcs/class/System.Xaml/Makefile @@ -18,7 +18,7 @@ TEST_EXTRA_DISTFILES = \ Test/XmlFiles/*.xml \ Test/XmlFiles/*.xaml -VALID_PROFILE := $(filter 4, $(FRAMEWORK_VERSION_MAJOR)) +VALID_PROFILE := $(filter 4 monodroid monotouch, $(FRAMEWORK_VERSION_MAJOR)) ifndef VALID_PROFILE LIBRARY_NAME = dummy-System.Xaml.dll NO_INSTALL = yes diff --git a/mcs/class/System.Xaml/System.Windows.Markup/AmbientAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/AmbientAttribute.cs index ff55aefc7cf..003f0c789e3 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/AmbientAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/AmbientAttribute.cs @@ -31,9 +31,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property, Inherited = true)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class AmbientAttribute : Attribute { } diff --git a/mcs/class/System.Xaml/System.Windows.Markup/ArrayExtension.cs b/mcs/class/System.Xaml/System.Windows.Markup/ArrayExtension.cs index 7a99b796010..e3da18695d9 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/ArrayExtension.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/ArrayExtension.cs @@ -32,9 +32,7 @@ namespace System.Windows.Markup { [MarkupExtensionReturnType (typeof (Array))] [ContentProperty ("Items")] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyPresentationFramework_3_5)] -#endif public class ArrayExtension : MarkupExtension { public ArrayExtension () @@ -62,9 +60,7 @@ public ArrayExtension (Type arrayType) public Type Type { get; set; } IList items; -#if !NET_2_1 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)] -#endif public IList Items { get { return items; } } diff --git a/mcs/class/System.Xaml/System.Windows.Markup/ConstructorArgumentAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/ConstructorArgumentAttribute.cs index 69a8b3f0ba6..7708fe7c078 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/ConstructorArgumentAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/ConstructorArgumentAttribute.cs @@ -25,9 +25,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Property, AllowMultiple = false, Inherited = false)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class ConstructorArgumentAttribute : Attribute { public ConstructorArgumentAttribute (string argumentName) diff --git a/mcs/class/System.Xaml/System.Windows.Markup/ContentPropertyAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/ContentPropertyAttribute.cs index f772a2bd82e..5b3c078b70d 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/ContentPropertyAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/ContentPropertyAttribute.cs @@ -29,9 +29,7 @@ namespace System.Windows.Markup // member regardless of this attribute. [AttributeUsage (AttributeTargets.Class, AllowMultiple = false, Inherited = true)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class ContentPropertyAttribute : Attribute { public ContentPropertyAttribute () diff --git a/mcs/class/System.Xaml/System.Windows.Markup/ContentWrapperAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/ContentWrapperAttribute.cs index 12e10c5e151..0ee8ea4b2ab 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/ContentWrapperAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/ContentWrapperAttribute.cs @@ -25,9 +25,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Class, AllowMultiple = true, Inherited = true)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class ContentWrapperAttribute : Attribute { public ContentWrapperAttribute (Type contentWrapper) @@ -36,11 +34,6 @@ public ContentWrapperAttribute (Type contentWrapper) } public Type ContentWrapper { get; private set; } -#if !NET_2_1 - public override Object TypeId { - get { return this; } - } -#endif public override bool Equals (object other) { diff --git a/mcs/class/System.Xaml/System.Windows.Markup/DateTimeValueSerializer.cs b/mcs/class/System.Xaml/System.Windows.Markup/DateTimeValueSerializer.cs index 5556e7f43c1..720a3517dcc 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/DateTimeValueSerializer.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/DateTimeValueSerializer.cs @@ -28,9 +28,7 @@ namespace System.Windows.Markup { -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public class DateTimeValueSerializer : ValueSerializer { const DateTimeStyles styles = DateTimeStyles.RoundtripKind | DateTimeStyles.NoCurrentDateDefault | DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite; diff --git a/mcs/class/System.Xaml/System.Windows.Markup/DependsOnAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/DependsOnAttribute.cs index f49ce4fb5be..d087be19a05 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/DependsOnAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/DependsOnAttribute.cs @@ -25,9 +25,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class DependsOnAttribute : Attribute { public DependsOnAttribute (string name) @@ -36,12 +34,5 @@ public DependsOnAttribute (string name) } public string Name { get; private set; } - -#if !NET_2_1 - // really? I doubt it should be overriden. - public override Object TypeId { - get { return this; } - } -#endif } } diff --git a/mcs/class/System.Xaml/System.Windows.Markup/DictionaryKeyPropertyAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/DictionaryKeyPropertyAttribute.cs index df7f4482bdc..1664fe23a8d 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/DictionaryKeyPropertyAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/DictionaryKeyPropertyAttribute.cs @@ -25,9 +25,7 @@ namespace System.Windows.Markup { [AttributeUsageAttribute(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class DictionaryKeyPropertyAttribute : Attribute { public DictionaryKeyPropertyAttribute (string name) diff --git a/mcs/class/System.Xaml/System.Windows.Markup/IComponentConnector.cs b/mcs/class/System.Xaml/System.Windows.Markup/IComponentConnector.cs index 8b143b92791..5e6081628fd 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/IComponentConnector.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/IComponentConnector.cs @@ -28,9 +28,7 @@ namespace System.Windows.Markup { -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public interface IComponentConnector { void Connect (int connectionId, object target); diff --git a/mcs/class/System.Xaml/System.Windows.Markup/INameScope.cs b/mcs/class/System.Xaml/System.Windows.Markup/INameScope.cs index 5c142ec0afa..3035a7cbc17 100644 --- a/mcs/class/System.Xaml/System.Windows.Markup/INameScope.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/INameScope.cs @@ -25,9 +25,7 @@ namespace System.Windows.Markup { -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public interface INameScope { object FindName (string name); diff --git a/mcs/class/System.Xaml/System.Windows.Markup/IProvideValueTarget.cs b/mcs/class/System.Xaml/System.Windows.Markup/IProvideValueTarget.cs index 65c124bfc36..6a44ce005d1 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/IProvideValueTarget.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/IProvideValueTarget.cs @@ -28,9 +28,7 @@ namespace System.Windows.Markup { -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyPresentationFramework_3_5)] -#endif public interface IProvideValueTarget { object TargetObject { get; } diff --git a/mcs/class/System.Xaml/System.Windows.Markup/IUriContext.cs b/mcs/class/System.Xaml/System.Windows.Markup/IUriContext.cs index 7ace4b70cd7..252ab6964cd 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/IUriContext.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/IUriContext.cs @@ -28,9 +28,7 @@ namespace System.Windows.Markup { -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyPresentationCore_3_5)] -#endif public interface IUriContext { Uri BaseUri { get; set; } diff --git a/mcs/class/System.Xaml/System.Windows.Markup/IValueSerializerContext.cs b/mcs/class/System.Xaml/System.Windows.Markup/IValueSerializerContext.cs index 011c32e983a..bfc1e0a3720 100644 --- a/mcs/class/System.Xaml/System.Windows.Markup/IValueSerializerContext.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/IValueSerializerContext.cs @@ -29,9 +29,7 @@ namespace System.Windows.Markup { -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public interface IValueSerializerContext : ITypeDescriptorContext, IServiceProvider { ValueSerializer GetValueSerializerFor (PropertyDescriptor descriptor); diff --git a/mcs/class/System.Xaml/System.Windows.Markup/IXamlTypeResolver.cs b/mcs/class/System.Xaml/System.Windows.Markup/IXamlTypeResolver.cs index c78be097471..563387c8421 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/IXamlTypeResolver.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/IXamlTypeResolver.cs @@ -28,9 +28,7 @@ namespace System.Windows.Markup { -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public interface IXamlTypeResolver { Type Resolve (string qualifiedTypeName); diff --git a/mcs/class/System.Xaml/System.Windows.Markup/MarkupExtension.cs b/mcs/class/System.Xaml/System.Windows.Markup/MarkupExtension.cs index 9277a3ca7ac..f79cefd6e02 100644 --- a/mcs/class/System.Xaml/System.Windows.Markup/MarkupExtension.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/MarkupExtension.cs @@ -29,9 +29,7 @@ namespace System.Windows.Markup { -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public abstract class MarkupExtension { public abstract object ProvideValue (IServiceProvider serviceProvider); diff --git a/mcs/class/System.Xaml/System.Windows.Markup/NameScopePropertyAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/NameScopePropertyAttribute.cs index 3ecd55b2001..8e33e017cfc 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/NameScopePropertyAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/NameScopePropertyAttribute.cs @@ -25,9 +25,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Class, AllowMultiple = false, Inherited = true)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class NameScopePropertyAttribute : Attribute { public NameScopePropertyAttribute (string name) diff --git a/mcs/class/System.Xaml/System.Windows.Markup/NullExtension.cs b/mcs/class/System.Xaml/System.Windows.Markup/NullExtension.cs index 9aef4b4d78f..19cd2cbf598 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/NullExtension.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/NullExtension.cs @@ -29,9 +29,7 @@ namespace System.Windows.Markup { [MarkupExtensionReturnType (typeof (Object))] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyPresentationFramework_3_5)] -#endif public class NullExtension : MarkupExtension { public override Object ProvideValue (IServiceProvider serviceProvider) diff --git a/mcs/class/System.Xaml/System.Windows.Markup/RootNamespaceAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/RootNamespaceAttribute.cs index 392968b4328..040f1945a7a 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/RootNamespaceAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/RootNamespaceAttribute.cs @@ -25,9 +25,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Assembly)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class RootNamespaceAttribute : Attribute { public RootNamespaceAttribute (string nameSpace) diff --git a/mcs/class/System.Xaml/System.Windows.Markup/RuntimeNamePropertyAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/RuntimeNamePropertyAttribute.cs index ccd2cbc95bf..44c3706b502 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/RuntimeNamePropertyAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/RuntimeNamePropertyAttribute.cs @@ -25,9 +25,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Class)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class RuntimeNamePropertyAttribute : Attribute { public RuntimeNamePropertyAttribute (string name) diff --git a/mcs/class/System.Xaml/System.Windows.Markup/StaticExtension.cs b/mcs/class/System.Xaml/System.Windows.Markup/StaticExtension.cs index 465ba56521d..24df4f5a169 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/StaticExtension.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/StaticExtension.cs @@ -30,9 +30,7 @@ namespace System.Windows.Markup { [MarkupExtensionReturnType (typeof (object))] [TypeConverter (typeof (StaticExtensionConverter))] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyPresentationFramework_3_5)] -#endif public class StaticExtension : MarkupExtension { public StaticExtension () diff --git a/mcs/class/System.Xaml/System.Windows.Markup/TrimSurroundingWhitespaceAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/TrimSurroundingWhitespaceAttribute.cs index bf4309d6e33..371e3e06f8e 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/TrimSurroundingWhitespaceAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/TrimSurroundingWhitespaceAttribute.cs @@ -31,9 +31,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Class, AllowMultiple = false, Inherited = true)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class TrimSurroundingWhitespaceAttribute : Attribute { } diff --git a/mcs/class/System.Xaml/System.Windows.Markup/TypeExtension.cs b/mcs/class/System.Xaml/System.Windows.Markup/TypeExtension.cs index 00af705581e..42da7a13783 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/TypeExtension.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/TypeExtension.cs @@ -30,9 +30,7 @@ namespace System.Windows.Markup { [MarkupExtensionReturnType (typeof (Type))] [TypeConverter (typeof (TypeExtensionConverter))] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyPresentationFramework_3_5)] -#endif public class TypeExtension : MarkupExtension { public TypeExtension () @@ -56,9 +54,7 @@ public TypeExtension (Type type) [ConstructorArgument ("type")] [DefaultValue (null)] public Type Type { get; set; } -#if !NET_2_1 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] -#endif public string TypeName { get; set; } public override object ProvideValue (IServiceProvider serviceProvider) diff --git a/mcs/class/System.Xaml/System.Windows.Markup/UidPropertyAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/UidPropertyAttribute.cs index bd66ca26145..1898e16a207 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/UidPropertyAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/UidPropertyAttribute.cs @@ -31,9 +31,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Class, AllowMultiple = false)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class UidPropertyAttribute : Attribute { public UidPropertyAttribute (string name) diff --git a/mcs/class/System.Xaml/System.Windows.Markup/ValueSerializer.cs b/mcs/class/System.Xaml/System.Windows.Markup/ValueSerializer.cs index bee7ad65908..45adefabec7 100644 --- a/mcs/class/System.Xaml/System.Windows.Markup/ValueSerializer.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/ValueSerializer.cs @@ -32,24 +32,19 @@ namespace System.Windows.Markup { -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public abstract class ValueSerializer { -#if !NET_2_1 public static ValueSerializer GetSerializerFor (PropertyDescriptor descriptor) { return GetSerializerFor (descriptor, null); } -#endif public static ValueSerializer GetSerializerFor (Type type) { return GetSerializerFor (type, null); } -#if !NET_2_1 // untested public static ValueSerializer GetSerializerFor (PropertyDescriptor descriptor, IValueSerializerContext context) { @@ -63,7 +58,6 @@ public static ValueSerializer GetSerializerFor (PropertyDescriptor descriptor, I return new TypeConverterValueSerializer (tc); return null; } -#endif public static ValueSerializer GetSerializerFor (Type type, IValueSerializerContext context) { diff --git a/mcs/class/System.Xaml/System.Windows.Markup/ValueSerializerAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/ValueSerializerAttribute.cs index fdb4e951e2f..37dec5262a9 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/ValueSerializerAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/ValueSerializerAttribute.cs @@ -31,9 +31,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Interface, AllowMultiple = false, Inherited = true)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class ValueSerializerAttribute : Attribute { public ValueSerializerAttribute (string valueSerializerTypeName) diff --git a/mcs/class/System.Xaml/System.Windows.Markup/WhitespaceSignificantCollectionAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/WhitespaceSignificantCollectionAttribute.cs index 893d79c1aa3..36cdf56aa28 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/WhitespaceSignificantCollectionAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/WhitespaceSignificantCollectionAttribute.cs @@ -31,9 +31,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Class, AllowMultiple = false, Inherited = true)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class WhitespaceSignificantCollectionAttribute : Attribute { } diff --git a/mcs/class/System.Xaml/System.Windows.Markup/XmlLangPropertyAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/XmlLangPropertyAttribute.cs index 18978a84645..4789120383b 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/XmlLangPropertyAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/XmlLangPropertyAttribute.cs @@ -31,9 +31,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Class, AllowMultiple = false)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class XmlLangPropertyAttribute : Attribute { public XmlLangPropertyAttribute (string name) diff --git a/mcs/class/System.Xaml/System.Windows.Markup/XmlnsCompatibleWithAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/XmlnsCompatibleWithAttribute.cs index e77ae359726..0e16db2f15d 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/XmlnsCompatibleWithAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/XmlnsCompatibleWithAttribute.cs @@ -31,9 +31,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Assembly, AllowMultiple = true)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class XmlnsCompatibleWithAttribute : Attribute { public XmlnsCompatibleWithAttribute (string oldNamespace, string newNamespace) diff --git a/mcs/class/System.Xaml/System.Windows.Markup/XmlnsDefinitionAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/XmlnsDefinitionAttribute.cs index 078623fb082..81be2dae73d 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/XmlnsDefinitionAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/XmlnsDefinitionAttribute.cs @@ -31,9 +31,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Assembly, AllowMultiple = true)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class XmlnsDefinitionAttribute : Attribute { public XmlnsDefinitionAttribute (string xmlNamespace, string clrNamespace) diff --git a/mcs/class/System.Xaml/System.Windows.Markup/XmlnsPrefixAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/XmlnsPrefixAttribute.cs index 4bdf0d97aff..c907c8eb427 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/XmlnsPrefixAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/XmlnsPrefixAttribute.cs @@ -31,9 +31,7 @@ namespace System.Windows.Markup { [AttributeUsage (AttributeTargets.Assembly, AllowMultiple = true)] -#if !NET_2_1 [System.Runtime.CompilerServices.TypeForwardedFrom (Consts.AssemblyWindowsBase)] -#endif public sealed class XmlnsPrefixAttribute : Attribute { public XmlnsPrefixAttribute (string xmlNamespace, string prefix) diff --git a/mcs/class/System.Xaml/System.Xaml/XamlDuplicateMemberException.cs b/mcs/class/System.Xaml/System.Xaml/XamlDuplicateMemberException.cs index e65e23faf1f..10e18587261 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlDuplicateMemberException.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlDuplicateMemberException.cs @@ -27,9 +27,7 @@ namespace System.Xaml { -#if !NET_2_1 [Serializable] -#endif public class XamlDuplicateMemberException : XamlException { public XamlDuplicateMemberException () @@ -54,25 +52,21 @@ public XamlDuplicateMemberException (string message, Exception innerException) { } -#if !NET_2_1 protected XamlDuplicateMemberException (SerializationInfo info, StreamingContext context) : base (info, context) { DuplicateMember = (XamlMember) info.GetValue ("member", typeof (XamlMember)); ParentType = (XamlType) info.GetValue ("type", typeof (XamlType)); } -#endif public XamlMember DuplicateMember { get; set; } public XamlType ParentType { get; set; } -#if !NET_2_1 public override void GetObjectData (SerializationInfo info, StreamingContext context) { base.GetObjectData (info, context); info.AddValue ("member", DuplicateMember); info.AddValue ("type", ParentType); } -#endif } } diff --git a/mcs/class/System.Xaml/System.Xaml/XamlException.cs b/mcs/class/System.Xaml/System.Xaml/XamlException.cs index ecccbb4ced5..669b2245ece 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlException.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlException.cs @@ -27,9 +27,7 @@ namespace System.Xaml { -#if !NET_2_1 [Serializable] -#endif public class XamlException : Exception { public XamlException () @@ -63,14 +61,12 @@ public XamlException (string message, Exception innerException, int lineNumber, LinePosition = linePosition; } -#if !NET_2_1 protected XamlException (SerializationInfo info, StreamingContext context) : base (info, context) { LineNumber = info.GetInt32 ("lineNumber"); LinePosition = info.GetInt32 ("linePosition"); } -#endif public int LineNumber { get; protected internal set; } public int LinePosition { get; protected internal set; } @@ -78,12 +74,10 @@ public override string Message { get { return FormatLine (base.Message, LineNumber, LinePosition); } } -#if !NET_2_1 public override void GetObjectData (SerializationInfo info, StreamingContext context) { info.AddValue ("lineNumber", LineNumber); info.AddValue ("linePosition", LinePosition); } -#endif } } diff --git a/mcs/class/System.Xaml/System.Xaml/XamlInternalException.cs b/mcs/class/System.Xaml/System.Xaml/XamlInternalException.cs index a24cffe420a..d98aa4c4df2 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlInternalException.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlInternalException.cs @@ -27,9 +27,7 @@ namespace System.Xaml { -#if !NET_2_1 [Serializable] -#endif public class XamlInternalException : XamlException { public XamlInternalException () @@ -47,11 +45,9 @@ public XamlInternalException (string message, Exception innerException) { } -#if !NET_2_1 protected XamlInternalException (SerializationInfo info, StreamingContext context) : base (info, context) { } -#endif } } diff --git a/mcs/class/System.Xaml/System.Xaml/XamlMember.cs b/mcs/class/System.Xaml/System.Xaml/XamlMember.cs index 7b85eb322d5..ad03cbf6283 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlMember.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlMember.cs @@ -166,7 +166,6 @@ public string PreferredXamlNamespace { get { return directive_ns ?? (DeclaringType == null ? null : DeclaringType.PreferredXamlNamespace); } } -#if !NET_2_1 public DesignerSerializationVisibility SerializationVisibility { get { var c= GetCustomAttributeProvider (); @@ -174,7 +173,6 @@ public DesignerSerializationVisibility SerializationVisibility { return a != null ? a.Visibility : DesignerSerializationVisibility.Visible; } } -#endif public bool IsAttachable { get { return is_attachable; } diff --git a/mcs/class/System.Xaml/System.Xaml/XamlObjectReaderException.cs b/mcs/class/System.Xaml/System.Xaml/XamlObjectReaderException.cs index 89c64fe1adc..0bad880d68d 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlObjectReaderException.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlObjectReaderException.cs @@ -27,9 +27,7 @@ namespace System.Xaml { -#if !NET_2_1 [Serializable] -#endif public class XamlObjectReaderException : XamlException { public XamlObjectReaderException () @@ -47,11 +45,9 @@ public XamlObjectReaderException (string message, Exception innerException) { } -#if !NET_2_1 protected XamlObjectReaderException (SerializationInfo info, StreamingContext context) : base (info, context) { } -#endif } } diff --git a/mcs/class/System.Xaml/System.Xaml/XamlObjectWriterException.cs b/mcs/class/System.Xaml/System.Xaml/XamlObjectWriterException.cs index b5ce0b3b803..17708cc0344 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlObjectWriterException.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlObjectWriterException.cs @@ -27,9 +27,7 @@ namespace System.Xaml { -#if !NET_2_1 [Serializable] -#endif public class XamlObjectWriterException : XamlException { public XamlObjectWriterException () @@ -47,11 +45,9 @@ public XamlObjectWriterException (string message, Exception innerException) { } -#if !NET_2_1 protected XamlObjectWriterException (SerializationInfo info, StreamingContext context) : base (info, context) { } -#endif } } diff --git a/mcs/class/System.Xaml/System.Xaml/XamlObjectWriterSettings.cs b/mcs/class/System.Xaml/System.Xaml/XamlObjectWriterSettings.cs index 4ecbe75e6f7..a46dded4edf 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlObjectWriterSettings.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlObjectWriterSettings.cs @@ -25,7 +25,7 @@ using System.ComponentModel; using System.Reflection; using System.Windows.Markup; -#if !NET_2_1 +#if !__MOBILE__ using System.Xaml.Permissions; #endif using System.Xaml.Schema; @@ -42,7 +42,7 @@ public XamlObjectWriterSettings (XamlObjectWriterSettings settings) : base (settings) { var s = settings; -#if !NET_2_1 +#if !__MOBILE__ AccessLevel = s.AccessLevel; #endif AfterBeginInitHandler = s.AfterBeginInitHandler; @@ -65,7 +65,7 @@ public XamlObjectWriterSettings (XamlObjectWriterSettings settings) public EventHandler BeforePropertiesHandler { get; set; } public EventHandler XamlSetValueHandler { get; set; } -#if !NET_2_1 +#if !__MOBILE__ [MonoTODO ("Ignored")] public XamlAccessLevel AccessLevel { get; set; } #endif diff --git a/mcs/class/System.Xaml/System.Xaml/XamlParseException.cs b/mcs/class/System.Xaml/System.Xaml/XamlParseException.cs index 1ae1667b53a..4bb8340a48a 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlParseException.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlParseException.cs @@ -27,9 +27,7 @@ namespace System.Xaml { -#if !NET_2_1 [Serializable] -#endif public class XamlParseException : XamlException { public XamlParseException () @@ -47,11 +45,9 @@ public XamlParseException (string message, Exception innerException) { } -#if !NET_2_1 protected XamlParseException (SerializationInfo info, StreamingContext context) : base (info, context) { } -#endif } } diff --git a/mcs/class/System.Xaml/System.Xaml/XamlSchemaContext.cs b/mcs/class/System.Xaml/System.Xaml/XamlSchemaContext.cs index de31e46de24..64cf91ea71c 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlSchemaContext.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlSchemaContext.cs @@ -57,10 +57,8 @@ public XamlSchemaContext (IEnumerable referenceAssemblies, XamlSchemaC { if (referenceAssemblies != null) reference_assemblies = new List (referenceAssemblies); -#if !NET_2_1 else AppDomain.CurrentDomain.AssemblyLoad += OnAssemblyLoaded; -#endif if (settings == null) return; @@ -69,13 +67,11 @@ public XamlSchemaContext (IEnumerable referenceAssemblies, XamlSchemaC SupportMarkupExtensionsWithDuplicateArity = settings.SupportMarkupExtensionsWithDuplicateArity; } -#if !NET_2_1 ~XamlSchemaContext () { if (reference_assemblies == null) AppDomain.CurrentDomain.AssemblyLoad -= OnAssemblyLoaded; } -#endif IList reference_assemblies; @@ -255,7 +251,6 @@ public virtual bool TryGetCompatibleXamlNamespace (string xamlNamespace, out str return compat_nss.TryGetValue (xamlNamespace, out compatibleNamespace); } -#if !NET_2_1 void OnAssemblyLoaded (object o, AssemblyLoadEventArgs e) { if (reference_assemblies != null) @@ -270,8 +265,7 @@ void OnAssemblyLoaded (object o, AssemblyLoadEventArgs e) if (all_xaml_types != null) FillAllXamlTypes (e.LoadedAssembly); } -#endif - + // cache updater methods void FillXamlNamespaces (Assembly ass) { diff --git a/mcs/class/System.Xaml/System.Xaml/XamlSchemaException.cs b/mcs/class/System.Xaml/System.Xaml/XamlSchemaException.cs index 9681927b39b..78de4f8e482 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlSchemaException.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlSchemaException.cs @@ -27,9 +27,7 @@ namespace System.Xaml { -#if !NET_2_1 [Serializable] -#endif public class XamlSchemaException : XamlException { public XamlSchemaException () @@ -47,11 +45,9 @@ public XamlSchemaException (string message, Exception innerException) { } -#if !NET_2_1 protected XamlSchemaException (SerializationInfo info, StreamingContext context) : base (info, context) { } -#endif } } diff --git a/mcs/class/System.Xaml/System.Xaml/XamlServices.cs b/mcs/class/System.Xaml/System.Xaml/XamlServices.cs index cf686d8506f..c8026d195a4 100755 --- a/mcs/class/System.Xaml/System.Xaml/XamlServices.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlServices.cs @@ -71,13 +71,11 @@ public static string Save (object instance) return sw.ToString (); } -#if !NET_2_1 public static void Save (string fileName, object instance) { using (var xw = XmlWriter.Create (fileName, new XmlWriterSettings () { OmitXmlDeclaration = true, Indent = true })) Save (xw, instance); } -#endif public static void Save (Stream stream, object instance) { diff --git a/mcs/class/System.Xaml/System.Xaml/XamlXmlWriterException.cs b/mcs/class/System.Xaml/System.Xaml/XamlXmlWriterException.cs index d784b9df2d0..ffa402cc7df 100644 --- a/mcs/class/System.Xaml/System.Xaml/XamlXmlWriterException.cs +++ b/mcs/class/System.Xaml/System.Xaml/XamlXmlWriterException.cs @@ -27,9 +27,7 @@ namespace System.Xaml { -#if !NET_2_1 [Serializable] -#endif public class XamlXmlWriterException : XamlException { public XamlXmlWriterException () @@ -47,11 +45,9 @@ public XamlXmlWriterException (string message, Exception innerException) { } -#if !NET_2_1 protected XamlXmlWriterException (SerializationInfo info, StreamingContext context) : base (info, context) { } -#endif } } From 5093efd55883e8a8a093fdb43d938d7b9dde7a4e Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Mon, 9 Jun 2014 16:35:39 +0200 Subject: [PATCH 172/694] [x86] Reenable the no pushes code. --- mono/mini/mini-x86.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/mini/mini-x86.h b/mono/mini/mini-x86.h index 7ddc2f69cd7..4e2f94bd80a 100644 --- a/mono/mini/mini-x86.h +++ b/mono/mini/mini-x86.h @@ -74,7 +74,7 @@ struct sigcontext { #endif /* HAVE_WORKING_SIGALTSTACK */ #endif /* !HOST_WIN32 */ -// #define MONO_X86_NO_PUSHES 1 +#define MONO_X86_NO_PUSHES 1 #define MONO_ARCH_SUPPORT_TASKLETS 1 From 6fffdcacef47afa64e9bd273e52fe5f2baebdb17 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Mon, 9 Jun 2014 17:11:51 +0200 Subject: [PATCH 173/694] [x86] Fix the build. --- mono/mini/cpu-x86.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/mini/cpu-x86.md b/mono/mini/cpu-x86.md index b239ed0e765..cc14b0dc152 100644 --- a/mono/mini/cpu-x86.md +++ b/mono/mini/cpu-x86.md @@ -149,7 +149,7 @@ call_membase: dest:a src1:b len:16 nacl:18 clob:c iconst: dest:i len:5 r4const: dest:f len:15 r8const: dest:f len:16 -store_membase_imm: dest:b len:10 +store_membase_imm: dest:b len:11 store_membase_reg: dest:b src1:i len:7 storei1_membase_imm: dest:b len:10 storei1_membase_reg: dest:b src1:y len:7 From ed2daa2a843ef7d832610638ff727b4f0daf60d7 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Mon, 9 Jun 2014 17:37:20 +0200 Subject: [PATCH 174/694] Revert "[x86] Reenable the no pushes code." This reverts commit 5093efd55883e8a8a093fdb43d938d7b9dde7a4e. Revert this as it still breaks the build. --- mono/mini/mini-x86.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/mini/mini-x86.h b/mono/mini/mini-x86.h index 4e2f94bd80a..7ddc2f69cd7 100644 --- a/mono/mini/mini-x86.h +++ b/mono/mini/mini-x86.h @@ -74,7 +74,7 @@ struct sigcontext { #endif /* HAVE_WORKING_SIGALTSTACK */ #endif /* !HOST_WIN32 */ -#define MONO_X86_NO_PUSHES 1 +// #define MONO_X86_NO_PUSHES 1 #define MONO_ARCH_SUPPORT_TASKLETS 1 From 79d2d4c11d3f260f743f76d70415abdf03fca989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Tue, 10 Jun 2014 01:44:18 +0200 Subject: [PATCH 175/694] Revert "Disable `perf` support in the profiler when running on Android (for now)." This reverts commit 8e35b7d01e14371851a806dad6196b36d9163c91. The fallback implementation (as used on other platforms) appears to hang the runtime. Having a maybe-working `perf`-backed sample profiler is better than a not-working sample profiler. --- mono/profiler/proflog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/profiler/proflog.c b/mono/profiler/proflog.c index f053e81097c..99f9f4d051f 100644 --- a/mono/profiler/proflog.c +++ b/mono/profiler/proflog.c @@ -67,7 +67,7 @@ #endif /* the architecture needs a memory fence */ -#if defined(__linux__) && (defined(__i386__) || defined(__x86_64__) || defined(__arm__)) && !defined(PLATFORM_ANDROID) +#if defined(__linux__) && (defined(__i386__) || defined(__x86_64__) || defined(__arm__)) #include #include #include "perf_event.h" From 96e1ee05780a8f6cee3cc0b27a455b092b536244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Tue, 10 Jun 2014 01:45:25 +0200 Subject: [PATCH 176/694] Remove the architecture conditions for using `perf` in the log profiler. We now use generic atomics which work on all platforms, so there's no reason to keep this constraint here. This allows the `perf`-backed profiler to be used on mips, ppc, s390x, etc. --- mono/profiler/proflog.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mono/profiler/proflog.c b/mono/profiler/proflog.c index 99f9f4d051f..2f3ef61ca5f 100644 --- a/mono/profiler/proflog.c +++ b/mono/profiler/proflog.c @@ -66,8 +66,7 @@ #include #endif -/* the architecture needs a memory fence */ -#if defined(__linux__) && (defined(__i386__) || defined(__x86_64__) || defined(__arm__)) +#if defined(__linux__) #include #include #include "perf_event.h" From ec0304a5990cbd36b1eb9e997b3e125cf92d96b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Tue, 10 Jun 2014 03:15:16 +0200 Subject: [PATCH 177/694] Remove unnecessary MPH_INTERNAL applied to a function definition. This should be applied to prototypes, and it already is for this function (in mph.h). --- support/x-struct-str.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/x-struct-str.c b/support/x-struct-str.c index b71a9cca1f0..5124af71fc9 100644 --- a/support/x-struct-str.c +++ b/support/x-struct-str.c @@ -20,7 +20,7 @@ : lstr_at(p, n) \ ) -char* MPH_INTERNAL +char* _mph_copy_structure_strings ( void *to, const mph_string_offset_t *to_offsets, const void *from, const mph_string_offset_t *from_offsets, From ad354665a83f644a65365f5bc1fbee4f1dc38b42 Mon Sep 17 00:00:00 2001 From: Lucas Date: Mon, 9 Jun 2014 21:20:35 -0400 Subject: [PATCH 178/694] Identities not being set in ClaimsPrincipal Ctor Class' identities member is not set in constructor ClaimsPrincipal (IEnumerable identities) --- mcs/class/corlib/System.Security.Claims/ClaimsPrincipal.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/corlib/System.Security.Claims/ClaimsPrincipal.cs b/mcs/class/corlib/System.Security.Claims/ClaimsPrincipal.cs index 9eea7eec8dc..cf1fe29e9d1 100644 --- a/mcs/class/corlib/System.Security.Claims/ClaimsPrincipal.cs +++ b/mcs/class/corlib/System.Security.Claims/ClaimsPrincipal.cs @@ -59,7 +59,7 @@ public ClaimsPrincipal (IEnumerable identities) if (identities == null) throw new ArgumentNullException ("identities"); - identities = new List (identities); + this.identities = new List (identities); } public ClaimsPrincipal (IIdentity identity) From be483f24daa3ee3076ab198cc1bc22b1cdef3b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Tue, 10 Jun 2014 09:34:01 +0200 Subject: [PATCH 179/694] Add build system plumbing for building with -Werror. --- Makefile.am | 2 ++ configure.ac | 6 ++++++ eglib/Makefile.am | 2 ++ eglib/configure.ac | 6 ++++++ eglib/src/Makefile.am | 2 ++ libgc/Makefile.am | 2 +- libgc/configure.ac | 6 ++++++ 7 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 3542279772d..7d2251fd640 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,7 @@ ACLOCAL_AMFLAGS = -I m4 +AM_CFLAGS = $(WERROR_CFLAGS) + MONOTOUCH_SUBDIRS = $(libgc_dir) eglib/src mono if CROSS_COMPILING diff --git a/configure.ac b/configure.ac index ffd98962529..6d06c9227ec 100644 --- a/configure.ac +++ b/configure.ac @@ -676,6 +676,12 @@ AC_ARG_WITH(crosspkgdir, [ --with-crosspkgdir=/path/to/pkg-config/dir Chan fi ) +AC_ARG_ENABLE(werror, [ --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no) +if test x$werror_flag = xyes; then + WERROR_CFLAGS="-Werror" +fi +AC_SUBST([WERROR_CFLAGS]) + ac_configure_args="$ac_configure_args \"CPPFLAGS_FOR_EGLIB=$EGLIB_CPPFLAGS\" \"CFLAGS_FOR_EGLIB=$CFLAGS_FOR_EGLIB\"" AC_CONFIG_SUBDIRS(eglib) diff --git a/eglib/Makefile.am b/eglib/Makefile.am index b7e5cd63894..84cc8353c99 100644 --- a/eglib/Makefile.am +++ b/eglib/Makefile.am @@ -1,5 +1,7 @@ ACLOCAL_AMFLAGS = -I m4 +AM_CFLAGS = $(WERROR_CFLAGS) + if HOST_WIN32 SUBDIRS = m4 src else diff --git a/eglib/configure.ac b/eglib/configure.ac index fab57247699..80600f8565f 100644 --- a/eglib/configure.ac +++ b/eglib/configure.ac @@ -235,6 +235,12 @@ AC_ARG_WITH(crosspkgdir, [ --with-crosspkgdir=/path/to/pkg-config/dir Chan fi ) +AC_ARG_ENABLE(werror, [ --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no) +if test x$werror_flag = xyes; then + WERROR_CFLAGS="-Werror" +fi +AC_SUBST([WERROR_CFLAGS]) + AC_SUBST(GPOINTER_TO_INT) AC_SUBST(GPOINTER_TO_UINT) AC_SUBST(GINT_TO_POINTER) diff --git a/eglib/src/Makefile.am b/eglib/src/Makefile.am index 0d0e90354ee..a0baeea025f 100644 --- a/eglib/src/Makefile.am +++ b/eglib/src/Makefile.am @@ -1,5 +1,7 @@ noinst_LTLIBRARIES = libeglib.la libeglib-static.la +AM_CFLAGS = $(WERROR_CFLAGS) + win_files = \ eglib-config.hw \ gdate-win32.c gdir-win32.c gfile-win32.c gmisc-win32.c \ diff --git a/libgc/Makefile.am b/libgc/Makefile.am index 49dbe4be81c..a53aafcbf3e 100644 --- a/libgc/Makefile.am +++ b/libgc/Makefile.am @@ -68,7 +68,7 @@ libmonogc_static_la_LDFLAGS = -static EXTRA_DIST += alpha_mach_dep.S mips_sgi_mach_dep.s sparc_mach_dep.S -AM_CFLAGS = @GC_CFLAGS@ +AM_CFLAGS = $(WERROR_CFLAGS) @GC_CFLAGS@ if CPLUSPLUS extra_checks = test_cpp diff --git a/libgc/configure.ac b/libgc/configure.ac index 837e2cb9f15..7dc04985a90 100644 --- a/libgc/configure.ac +++ b/libgc/configure.ac @@ -531,6 +531,12 @@ fi AC_ARG_ENABLE(quiet-build, [ --enable-quiet-build Enable quiet libgc build (on by default)], enable_quiet_build=$enableval, enable_quiet_build=yes) AM_CONDITIONAL(USE_LIBDIR, test -z "$with_cross_host") +AC_ARG_ENABLE(werror, [ --enable-werror Pass -Werror to the C compiler], werror_flag=$enableval, werror_flag=no) +if test x$werror_flag = xyes; then + WERROR_CFLAGS="-Werror" +fi +AC_SUBST([WERROR_CFLAGS]) + if test "${multilib}" = "yes"; then multilib_arg="--enable-multilib" else From 975bf0a37966e55e5544660f3f5089a8a90f4567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Tue, 10 Jun 2014 09:40:22 +0200 Subject: [PATCH 180/694] Attempt to sanitize the `vasprintf` situation in eglib. The problem is that on some platforms we call the function without having provided a prototype for it. This breaks when building with `-Werror`. Now we declare it in the private `vasprintf.h` header when the platform doesn't have a declaration in `stdio.h`. This should also let us remove the hack in `glib.h` for MSVC. This may or may not break the build on some platforms; I've tried on those that I have access to with success. Let me know if this breaks anything. --- eglib/src/gerror.c | 2 ++ eglib/src/glib.h | 6 ------ eglib/src/goutput.c | 2 ++ eglib/src/gstr.c | 2 ++ eglib/src/vasprintf.h | 11 +++++++++++ 5 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 eglib/src/vasprintf.h diff --git a/eglib/src/gerror.c b/eglib/src/gerror.c index 790c388c7ad..2ec089c9956 100644 --- a/eglib/src/gerror.c +++ b/eglib/src/gerror.c @@ -30,6 +30,8 @@ #include #include +#include "vasprintf.h" + GError * g_error_new (gpointer domain, gint code, const char *format, ...) { diff --git a/eglib/src/glib.h b/eglib/src/glib.h index cf54676312d..30c2d7adb8f 100644 --- a/eglib/src/glib.h +++ b/eglib/src/glib.h @@ -49,12 +49,6 @@ G_BEGIN_DECLS -#ifdef G_OS_WIN32 -/* MSC and Cross-compilatin will use this */ -int vasprintf (char **strp, const char *fmt, va_list ap); -#endif - - /* * Basic data types */ diff --git a/eglib/src/goutput.c b/eglib/src/goutput.c index aff9f460c57..73ef1f383de 100644 --- a/eglib/src/goutput.c +++ b/eglib/src/goutput.c @@ -31,6 +31,8 @@ #include #include +#include "vasprintf.h" + /* The current fatal levels, error is always fatal */ static GLogLevelFlags fatal = G_LOG_LEVEL_ERROR; diff --git a/eglib/src/gstr.c b/eglib/src/gstr.c index 335ccff9365..3e976c5a2ed 100644 --- a/eglib/src/gstr.c +++ b/eglib/src/gstr.c @@ -32,6 +32,8 @@ #include #include +#include "vasprintf.h" + /* This is not a macro, because I dont want to put _GNU_SOURCE in the glib.h header */ gchar * g_strndup (const gchar *str, gsize n) diff --git a/eglib/src/vasprintf.h b/eglib/src/vasprintf.h new file mode 100644 index 00000000000..3d294541a5b --- /dev/null +++ b/eglib/src/vasprintf.h @@ -0,0 +1,11 @@ +#ifndef __VASPRINTF_H +#define __VASPRINTF_H + +#include +#include + +#ifndef HAVE_VASPRINTF +int vasprintf(char **ret, const char *fmt, va_list ap); +#endif + +#endif /* __VASPRINTF_H */ From 93e5f42f801ec904d88a1151f126c84f581631ba Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Tue, 10 Jun 2014 21:49:05 +0900 Subject: [PATCH 181/694] [sys.xaml] fix TypeId and get broken WindowsBase tests pass. --- .../System.Windows.Markup/ContentWrapperAttribute.cs | 6 ++++++ .../System.Windows.Markup/DependsOnAttribute.cs | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/mcs/class/System.Xaml/System.Windows.Markup/ContentWrapperAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/ContentWrapperAttribute.cs index 0ee8ea4b2ab..d64a2a9645b 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/ContentWrapperAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/ContentWrapperAttribute.cs @@ -35,6 +35,12 @@ public ContentWrapperAttribute (Type contentWrapper) public Type ContentWrapper { get; private set; } +#if !__MOBILE__ + public override Object TypeId { + get { return this; } + } +#endif + public override bool Equals (object other) { var cwa = other as ContentWrapperAttribute; diff --git a/mcs/class/System.Xaml/System.Windows.Markup/DependsOnAttribute.cs b/mcs/class/System.Xaml/System.Windows.Markup/DependsOnAttribute.cs index d087be19a05..361df14ed60 100755 --- a/mcs/class/System.Xaml/System.Windows.Markup/DependsOnAttribute.cs +++ b/mcs/class/System.Xaml/System.Windows.Markup/DependsOnAttribute.cs @@ -34,5 +34,12 @@ public DependsOnAttribute (string name) } public string Name { get; private set; } + +#if !__MOBILE__ + // really? I doubt it should be overriden. + public override Object TypeId { + get { return this; } + } +#endif } } From dcc7a89be1bee430f05fe0c06bc448d2c7aaaf51 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Tue, 10 Jun 2014 16:55:24 +0100 Subject: [PATCH 182/694] Changed mono_win_chained_exception_needs_run to be a JIT TLS variable. This fixes a potential race condition that might happen if two threads try to handle an exception at the same time. --- mono/mini/exceptions-amd64.c | 6 +++--- mono/mini/exceptions-x86.c | 6 +++--- mono/mini/mini-windows.c | 5 ++--- mono/mini/mini.h | 5 +++++ 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/mono/mini/exceptions-amd64.c b/mono/mini/exceptions-amd64.c index bd9847c4172..a27176d295a 100644 --- a/mono/mini/exceptions-amd64.c +++ b/mono/mini/exceptions-amd64.c @@ -48,7 +48,6 @@ static MonoW32ExceptionHandler segv_handler; LPTOP_LEVEL_EXCEPTION_FILTER mono_old_win_toplevel_exception_filter; void *mono_win_vectored_exception_handle; -extern gboolean mono_win_chained_exception_needs_run; #define W32_SEH_HANDLE_EX(_ex) \ if (_ex##_handler) _ex##_handler(0, ep, sctx) @@ -76,8 +75,9 @@ static LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep) CONTEXT* ctx; MonoContext* sctx; LONG res; + MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id); - mono_win_chained_exception_needs_run = FALSE; + jit_tls->mono_win_chained_exception_needs_run = FALSE; res = EXCEPTION_CONTINUE_EXECUTION; er = ep->ExceptionRecord; @@ -118,7 +118,7 @@ static LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep) break; } - if (mono_win_chained_exception_needs_run) { + if (jit_tls->mono_win_chained_exception_needs_run) { /* Don't copy context back if we chained exception * as the handler may have modfied the EXCEPTION_POINTERS * directly. We don't pass sigcontext to chained handlers. diff --git a/mono/mini/exceptions-x86.c b/mono/mini/exceptions-x86.c index 86a28e08ab4..0505633d1bc 100644 --- a/mono/mini/exceptions-x86.c +++ b/mono/mini/exceptions-x86.c @@ -47,7 +47,6 @@ static MonoW32ExceptionHandler segv_handler; LPTOP_LEVEL_EXCEPTION_FILTER mono_old_win_toplevel_exception_filter; gpointer mono_win_vectored_exception_handle; -extern gboolean mono_win_chained_exception_needs_run; extern int (*gUnhandledExceptionHandler)(EXCEPTION_POINTERS*); #ifndef PROCESS_CALLBACK_FILTER_ENABLED @@ -196,8 +195,9 @@ LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep) CONTEXT* ctx; struct sigcontext* sctx; LONG res; + MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id); - mono_win_chained_exception_needs_run = FALSE; + jit_tls->mono_win_chained_exception_needs_run = FALSE; res = EXCEPTION_CONTINUE_EXECUTION; er = ep->ExceptionRecord; @@ -237,7 +237,7 @@ LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep) break; } - if (mono_win_chained_exception_needs_run) { + if (jit_tls->mono_win_chained_exception_needs_run) { /* Don't copy context back if we chained exception * as the handler may have modfied the EXCEPTION_POINTERS * directly. We don't pass sigcontext to chained handlers. diff --git a/mono/mini/mini-windows.c b/mono/mini/mini-windows.c index bb71ec48192..c43b1d0102f 100644 --- a/mono/mini/mini-windows.c +++ b/mono/mini/mini-windows.c @@ -50,8 +50,6 @@ #include "jit-icalls.h" -gboolean mono_win_chained_exception_needs_run; - void mono_runtime_install_handlers (void) { @@ -83,7 +81,8 @@ mono_runtime_cleanup_handlers (void) gboolean SIG_HANDLER_SIGNATURE (mono_chain_signal) { - mono_win_chained_exception_needs_run = TRUE; + MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id); + jit_tls->mono_win_chained_exception_needs_run = TRUE; return TRUE; } diff --git a/mono/mini/mini.h b/mono/mini/mini.h index ff3d5537ad2..76cbdf32022 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -1060,6 +1060,11 @@ typedef struct { */ MonoContext orig_ex_ctx; gboolean orig_ex_ctx_set; + + /* + * Stores if we need to run a chained exception in Windows. + */ + gboolean mono_win_chained_exception_needs_run; } MonoJitTlsData; /* From d8e44abb07c4e622edf933ebecb2c7ea793722a4 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Tue, 10 Jun 2014 17:03:30 +0100 Subject: [PATCH 183/694] Fix mono exception handler crashing on windows. Here's the scenario that causes the crash: Exception is fired, which invokes mono's vectored exception handler. It is not an exception mono recognizes, so falls through to the default: case in the exception handler. The problem is the return value has been initialized to EXCEPTION_CONTINUE_EXECUTION. This causes SEH not to process any other handlers, and just attempt to continue execution at the point the exception was thrown. The problem is much of windows internals will catch various exceptions internally and handle them. So instead of the exception being handled, we would just crash in the bowels of windows. The solution is to set mono_win_chained_exception_needs_run to TRUE in the default case - this is what the various exception handlers do if the exception is not in JIT'd code. This causes the handler to return EXCEPTION_CONTINUE_SEARCH, which causes SEH to search for the next handler, and no crash is produced. Both x86 and x64 had this bug, so I fixed it in both places. Fix contributed by Steve Anichini. --- mono/mini/exceptions-amd64.c | 1 + mono/mini/exceptions-x86.c | 1 + 2 files changed, 2 insertions(+) diff --git a/mono/mini/exceptions-amd64.c b/mono/mini/exceptions-amd64.c index a27176d295a..b3dca7ecaa9 100644 --- a/mono/mini/exceptions-amd64.c +++ b/mono/mini/exceptions-amd64.c @@ -115,6 +115,7 @@ static LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep) W32_SEH_HANDLE_EX(fpe); break; default: + jit_tls->mono_win_chained_exception_needs_run = TRUE; break; } diff --git a/mono/mini/exceptions-x86.c b/mono/mini/exceptions-x86.c index 0505633d1bc..a52e5cec446 100644 --- a/mono/mini/exceptions-x86.c +++ b/mono/mini/exceptions-x86.c @@ -234,6 +234,7 @@ LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep) W32_SEH_HANDLE_EX(fpe); break; default: + jit_tls->mono_win_chained_exception_needs_run = TRUE; break; } From 6759817ac2e685efb728883a5ff96e8535ced60c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 10 Jun 2014 12:54:48 -0400 Subject: [PATCH 184/694] [Mono.Debugger.Soft] minor code cleanup --- .../Mono.Debugger.Soft/PrimitiveValue.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/PrimitiveValue.cs b/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/PrimitiveValue.cs index 696f6493f40..2e9c806f8bb 100644 --- a/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/PrimitiveValue.cs +++ b/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/PrimitiveValue.cs @@ -22,8 +22,11 @@ public object Value { public override bool Equals (object obj) { if (value == obj) return true; - if (obj != null && obj is PrimitiveValue) - return value == (obj as PrimitiveValue).Value; + + var primitive = obj as PrimitiveValue; + if (primitive != null) + return value == primitive.Value; + return base.Equals (obj); } From f462bcc9447abf3f0f2a336cbf5d94756311cf57 Mon Sep 17 00:00:00 2001 From: Martin Baulig Date: Tue, 10 Jun 2014 19:13:10 +0200 Subject: [PATCH 185/694] [Http]: Only recycle ServicePoints from the idle timer (fixes #19823). Thanks a lot for Martin Potter to find and report the race condition which was causing the problem. ServicePointManager.RecycleServicePoints() was a left-over from the old times when we didn't have an idle-timer based approach. --- .../System/System.Net/ServicePointManager.cs | 39 ------------------- 1 file changed, 39 deletions(-) diff --git a/mcs/class/System/System.Net/ServicePointManager.cs b/mcs/class/System/System.Net/ServicePointManager.cs index 26578856fae..66cdc7296fe 100644 --- a/mcs/class/System/System.Net/ServicePointManager.cs +++ b/mcs/class/System/System.Net/ServicePointManager.cs @@ -264,7 +264,6 @@ public static int MaxServicePoints { throw new ArgumentException ("value"); maxServicePoints = value; - RecycleServicePoints (); } } @@ -329,9 +328,6 @@ public static ServicePoint FindServicePoint (Uri address, IWebProxy proxy) if (address == null) throw new ArgumentNullException ("address"); - if ((servicePoints.Count % 4) == 0) - RecycleServicePoints (); - var origAddress = new Uri (address.Scheme + "://" + address.Authority); bool usesProxy = false; @@ -378,41 +374,6 @@ public static ServicePoint FindServicePoint (Uri address, IWebProxy proxy) return sp; } - // Internal Methods - - static void RecycleServicePoints () - { - lock (servicePoints) { - var toRemove = new ArrayList (); - var idleList = new SortedDictionary (); - IDictionaryEnumerator e = servicePoints.GetEnumerator (); - while (e.MoveNext ()) { - ServicePoint sp = (ServicePoint) e.Value; - DateTime idleSince; - if (sp.CheckAvailableForRecycling (out idleSince)) { - toRemove.Add (e.Key); - continue; - } - - while (idleList.ContainsKey (idleSince)) - idleSince = idleSince.AddMilliseconds (1); - idleList.Add (idleSince, sp); - } - - for (int i = 0; i < toRemove.Count; i++) - servicePoints.Remove (toRemove [i]); - - if (maxServicePoints == 0 || servicePoints.Count <= maxServicePoints) - return; - - // get rid of the ones with the longest idle time - foreach (var sp in idleList.Values) { - if (servicePoints.Count <= maxServicePoints) - break; - servicePoints.Remove (sp); - } - } - } #if SECURITY_DEP internal class ChainValidationHelper { object sender; From 9aa982e166b1cd2f331a5c13eb772b40e40cfc64 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Tue, 10 Jun 2014 20:14:09 +0100 Subject: [PATCH 186/694] [windows] Return early in the vectored exception handler if the thread is not managed by the runtime. --- mono/mini/exceptions-amd64.c | 4 ++++ mono/mini/exceptions-x86.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/mono/mini/exceptions-amd64.c b/mono/mini/exceptions-amd64.c index b3dca7ecaa9..a5cf1105680 100644 --- a/mono/mini/exceptions-amd64.c +++ b/mono/mini/exceptions-amd64.c @@ -77,6 +77,10 @@ static LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep) LONG res; MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id); + /* If the thread is not managed by the runtime return early */ + if (!jit_tls) + return EXCEPTION_CONTINUE_SEARCH; + jit_tls->mono_win_chained_exception_needs_run = FALSE; res = EXCEPTION_CONTINUE_EXECUTION; diff --git a/mono/mini/exceptions-x86.c b/mono/mini/exceptions-x86.c index a52e5cec446..6b5c061a780 100644 --- a/mono/mini/exceptions-x86.c +++ b/mono/mini/exceptions-x86.c @@ -197,6 +197,10 @@ LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep) LONG res; MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id); + /* If the thread is not managed by the runtime return early */ + if (!jit_tls) + return EXCEPTION_CONTINUE_SEARCH; + jit_tls->mono_win_chained_exception_needs_run = FALSE; res = EXCEPTION_CONTINUE_EXECUTION; From db0132029e8d0f34cc7412476f1568b667725a0c Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 10 Jun 2014 15:15:56 -0400 Subject: [PATCH 187/694] [Mono.Debugger.Soft] Improved ILInterpreter to eval properties that return a primitive constant --- .../Mono.Debugger.Soft/ILInterpreter.cs | 314 +++++++++++++++++- 1 file changed, 297 insertions(+), 17 deletions(-) diff --git a/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/ILInterpreter.cs b/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/ILInterpreter.cs index e0175f36bdf..d004991988b 100644 --- a/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/ILInterpreter.cs +++ b/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/ILInterpreter.cs @@ -23,8 +23,13 @@ public Value Evaluate (Value this_val, Value[] args) { // IL_0008: br IL_000d // IL_000d: ldloc.0 // IL_000e: ret + // ... or returns a simple constant: + // IL_0000: ldc.i4 1024 + // IL_0005: conv.i8 + // IL_0006: ret if (args != null && args.Length != 0) - throw new NotSupportedException (); + throw new NotSupportedException (); + if (method.IsStatic || method.DeclaringType.IsValueType || this_val == null || !(this_val is ObjectMirror)) throw new NotSupportedException (); @@ -32,58 +37,333 @@ public Value Evaluate (Value this_val, Value[] args) { if (instructions.Count > 16) throw new NotSupportedException (); - Value[] stack = new Value [16]; + var stack = new Value [16]; + var ins = instructions [0]; Value locals_0 = null; - Value res = null; - - int sp = 0; int ins_count = 0; - var ins = instructions [0]; + int sp = 0; + while (ins != null) { if (ins_count > 16) throw new NotImplementedException (); - ins_count ++; + var next = ins.Next; + ins_count++; var op = ins.OpCode; if (op == OpCodes.Nop) { } else if (op == OpCodes.Ldarg_0) { - if (sp > 0) + if (sp != 0) throw new NotSupportedException (); + stack [sp++] = this_val; } else if (op == OpCodes.Ldfld) { if (sp != 1) throw new NotSupportedException (); - var obj = (ObjectMirror)stack [--sp]; - var field = (FieldInfoMirror)ins.Operand; + + var obj = (ObjectMirror) stack [--sp]; + var field = (FieldInfoMirror) ins.Operand; try { stack [sp++] = obj.GetValue (field); } catch (ArgumentException) { throw new NotSupportedException (); } + } else if (op == OpCodes.Ldc_I4_0) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, 0); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Ldc_I4_1) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, 1); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Ldc_I4_2) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, 2); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Ldc_I4_3) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, 3); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Ldc_I4_4) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, 4); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Ldc_I4_5) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, 5); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Ldc_I4_6) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, 6); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Ldc_I4_7) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, 7); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Ldc_I4_8) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, 8); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Ldc_I4_M1) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, -1); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Ldc_I4) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, ins.Operand); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Ldc_I4_S) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, ins.Operand); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Ldc_I8) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, ins.Operand); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Ldc_R4) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, ins.Operand); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Ldc_R8) { + if (sp != 0) + throw new NotSupportedException (); + + try { + stack [sp++] = new PrimitiveValue (method.VirtualMachine, ins.Operand); + } catch (ArgumentException) { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Conv_I) { + if (sp != 1) + throw new NotSupportedException (); + + try { + var primitive = (PrimitiveValue) stack [--sp]; + stack [sp++] = new PrimitiveValue (method.VirtualMachine, Convert.ToInt32 (primitive.Value)); + } catch { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Conv_I1) { + if (sp != 1) + throw new NotSupportedException (); + + try { + var primitive = (PrimitiveValue) stack [--sp]; + stack [sp++] = new PrimitiveValue (method.VirtualMachine, Convert.ToSByte (primitive.Value)); + } catch { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Conv_U1) { + if (sp != 1) + throw new NotSupportedException (); + + try { + var primitive = (PrimitiveValue) stack [--sp]; + stack [sp++] = new PrimitiveValue (method.VirtualMachine, Convert.ToByte (primitive.Value)); + } catch { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Conv_I2) { + if (sp != 1) + throw new NotSupportedException (); + + try { + var primitive = (PrimitiveValue) stack [--sp]; + stack [sp++] = new PrimitiveValue (method.VirtualMachine, Convert.ToInt16 (primitive.Value)); + } catch { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Conv_U2) { + if (sp != 1) + throw new NotSupportedException (); + + try { + var primitive = (PrimitiveValue) stack [--sp]; + stack [sp++] = new PrimitiveValue (method.VirtualMachine, Convert.ToUInt16 (primitive.Value)); + } catch { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Conv_I4) { + if (sp != 1) + throw new NotSupportedException (); + + try { + var primitive = (PrimitiveValue) stack [--sp]; + stack [sp++] = new PrimitiveValue (method.VirtualMachine, Convert.ToInt32 (primitive.Value)); + } catch { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Conv_U4) { + if (sp != 1) + throw new NotSupportedException (); + + try { + var primitive = (PrimitiveValue) stack [--sp]; + stack [sp++] = new PrimitiveValue (method.VirtualMachine, Convert.ToUInt32 (primitive.Value)); + } catch { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Conv_I8) { + if (sp != 1) + throw new NotSupportedException (); + + try { + var primitive = (PrimitiveValue) stack [--sp]; + stack [sp++] = new PrimitiveValue (method.VirtualMachine, Convert.ToInt64 (primitive.Value)); + } catch { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Conv_U8) { + if (sp != 1) + throw new NotSupportedException (); + + try { + var primitive = (PrimitiveValue) stack [--sp]; + stack [sp++] = new PrimitiveValue (method.VirtualMachine, Convert.ToUInt64 (primitive.Value)); + } catch { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Conv_R4) { + if (sp != 1) + throw new NotSupportedException (); + + try { + var primitive = (PrimitiveValue) stack [--sp]; + stack [sp++] = new PrimitiveValue (method.VirtualMachine, Convert.ToSingle (primitive.Value)); + } catch { + throw new NotSupportedException (); + } + } else if (op == OpCodes.Conv_R8) { + if (sp != 1) + throw new NotSupportedException (); + + try { + var primitive = (PrimitiveValue) stack [--sp]; + stack [sp++] = new PrimitiveValue (method.VirtualMachine, Convert.ToDouble (primitive.Value)); + } catch { + throw new NotSupportedException (); + } } else if (op == OpCodes.Stloc_0) { if (sp != 1) throw new NotSupportedException (); + locals_0 = stack [--sp]; } else if (op == OpCodes.Br) { - next = (ILInstruction)ins.Operand; + next = (ILInstruction) ins.Operand; } else if (op == OpCodes.Ldloc_0) { if (sp != 0) throw new NotSupportedException (); + stack [sp++] = locals_0; } else if (op == OpCodes.Ret) { - if (sp == 0) - res = null; - else - res = stack [--sp]; - break; + if (sp > 0) { + var res = stack [--sp]; + + var primitive = res as PrimitiveValue; + if (method.ReturnType.IsPrimitive && primitive != null) { + // cast the primitive value to the return type + try { + switch (method.ReturnType.CSharpName) { + case "double": res = new PrimitiveValue (method.VirtualMachine, Convert.ToDouble (primitive.Value)); break; + case "float": res = new PrimitiveValue (method.VirtualMachine, Convert.ToSingle (primitive.Value)); break; + case "ulong": res = new PrimitiveValue (method.VirtualMachine, Convert.ToUInt64 (primitive.Value)); break; + case "long": res = new PrimitiveValue (method.VirtualMachine, Convert.ToInt64 (primitive.Value)); break; + case "uint": res = new PrimitiveValue (method.VirtualMachine, Convert.ToUInt32 (primitive.Value)); break; + case "int": res = new PrimitiveValue (method.VirtualMachine, Convert.ToInt32 (primitive.Value)); break; + case "ushort": res = new PrimitiveValue (method.VirtualMachine, Convert.ToUInt16 (primitive.Value)); break; + case "short": res = new PrimitiveValue (method.VirtualMachine, Convert.ToInt16 (primitive.Value)); break; + case "sbyte": res = new PrimitiveValue (method.VirtualMachine, Convert.ToSByte (primitive.Value)); break; + case "byte": res = new PrimitiveValue (method.VirtualMachine, Convert.ToByte (primitive.Value)); break; + case "char": res = new PrimitiveValue (method.VirtualMachine, Convert.ToChar (primitive.Value)); break; + case "bool": res = new PrimitiveValue (method.VirtualMachine, Convert.ToBoolean (primitive.Value)); break; + } + } catch { + throw new NotSupportedException (); + } + } + + return res; + } + + return null; } else { throw new NotSupportedException (); } + ins = next; } - return res; + return null; } } } From d5f7694acc99fcf55386e7b0bba223d2cf9db93b Mon Sep 17 00:00:00 2001 From: Martin Baulig Date: Tue, 10 Jun 2014 20:29:35 +0200 Subject: [PATCH 188/694] [System.Net.Http]: Always add "Content-Length" in HttpClientHandler.SendAsync(). This has been reported on the forums: http://forums.xamarin.com/discussion/17770/length-required-error-in-http-post-since-latest-release --- .../System.Net.Http/HttpClientHandler.cs | 5 +++ .../Test/System.Net.Http/HttpClientTest.cs | 32 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs b/mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs index fd9e444f7ed..7f74497c60b 100644 --- a/mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs +++ b/mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs @@ -327,6 +327,11 @@ protected async internal override Task SendAsync (HttpReque var stream = await wrequest.GetRequestStreamAsync ().ConfigureAwait (false); await request.Content.CopyToAsync (stream).ConfigureAwait (false); + } else if (HttpMethod.Post.Equals (request.Method) || HttpMethod.Put.Equals (request.Method) || HttpMethod.Delete.Equals (request.Method)) { + // Explicitly set this to make sure we're sending a "Content-Length: 0" header. + // This fixes the issue that's been reported on the forums: + // http://forums.xamarin.com/discussion/17770/length-required-error-in-http-post-since-latest-release + wrequest.ContentLength = 0; } HttpWebResponse wresponse = null; diff --git a/mcs/class/System.Net.Http/Test/System.Net.Http/HttpClientTest.cs b/mcs/class/System.Net.Http/Test/System.Net.Http/HttpClientTest.cs index edcd18fe2a4..d2871f60875 100644 --- a/mcs/class/System.Net.Http/Test/System.Net.Http/HttpClientTest.cs +++ b/mcs/class/System.Net.Http/Test/System.Net.Http/HttpClientTest.cs @@ -533,6 +533,38 @@ public void Send_Complete_Content_MaxResponseContentBufferSize_Error () } } + [Test] + public void Send_Complete_NoContent () + { + foreach (var method in new HttpMethod[] { HttpMethod.Post, HttpMethod.Put, HttpMethod.Delete }) { + bool? failed = null; + var listener = CreateListener (l => { + try { + var request = l.Request; + + Assert.AreEqual (2, request.Headers.Count, "#1"); + Assert.AreEqual ("0", request.Headers ["Content-Length"], "#1b"); + Assert.AreEqual (method.Method, request.HttpMethod, "#2"); + failed = false; + } catch { + failed = true; + } + }); + + try { + var client = new HttpClient (); + var request = new HttpRequestMessage (method, LocalServer); + var response = client.SendAsync (request, HttpCompletionOption.ResponseHeadersRead).Result; + + Assert.AreEqual ("", response.Content.ReadAsStringAsync ().Result, "#100"); + Assert.AreEqual (HttpStatusCode.OK, response.StatusCode, "#101"); + Assert.AreEqual (false, failed, "#102"); + } finally { + listener.Close (); + } + } + } + [Test] public void Send_Complete_Error () { From 5e33f9eccf13d6ef7bb675c1cfb9929f96aba786 Mon Sep 17 00:00:00 2001 From: Martin Baulig Date: Tue, 10 Jun 2014 21:22:11 +0200 Subject: [PATCH 189/694] [Http]: Fix digest authentication (bug #18799). We did not correctly parse key-value pairs without quotes in the challenge. --- mcs/class/System/System.Net/DigestClient.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/System/System.Net/DigestClient.cs b/mcs/class/System/System.Net/DigestClient.cs index be618771eb9..f570a739650 100644 --- a/mcs/class/System/System.Net/DigestClient.cs +++ b/mcs/class/System/System.Net/DigestClient.cs @@ -181,7 +181,7 @@ bool GetKeywordAndValue (out string key, out string value) } value = header.Substring (beginQ, pos - beginQ); - pos += 2; + pos += useQuote ? 2 : 1; return true; } } From aecf3db62b90c193fb33e3671c1ec920beecf709 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Tue, 10 Jun 2014 21:30:50 +0200 Subject: [PATCH 190/694] [mcs] Implement rethrow support in awaited catch clause --- mcs/mcs/codegen.cs | 2 ++ mcs/mcs/statement.cs | 63 +++++++++++++++++++++++++++++----- mcs/tests/test-async-63.cs | 2 +- mcs/tests/test-async-65.cs | 41 ++++++++++++++++++++++ mcs/tests/test-ex-filter-03.cs | 21 ++++++++++++ mcs/tests/ver-il-net_4_5.xml | 33 +++++++++++++++++- 6 files changed, 151 insertions(+), 11 deletions(-) create mode 100644 mcs/tests/test-async-65.cs create mode 100644 mcs/tests/test-ex-filter-03.cs diff --git a/mcs/mcs/codegen.cs b/mcs/mcs/codegen.cs index ff77e33340a..d310043c0b3 100644 --- a/mcs/mcs/codegen.cs +++ b/mcs/mcs/codegen.cs @@ -204,6 +204,8 @@ public List StatementEpilogue { } } + public LocalVariable AsyncThrowVariable { get; set; } + #endregion public void AddStatementEpilog (IExpressionCleanup cleanupExpression) diff --git a/mcs/mcs/statement.cs b/mcs/mcs/statement.cs index 09d7414e43a..05387de792f 100644 --- a/mcs/mcs/statement.cs +++ b/mcs/mcs/statement.cs @@ -1781,9 +1781,20 @@ public override bool Resolve (BlockContext ec) protected override void DoEmit (EmitContext ec) { - if (expr == null) - ec.Emit (OpCodes.Rethrow); - else { + if (expr == null) { + var atv = ec.AsyncThrowVariable; + if (atv != null) { + if (atv.HoistedVariant != null) { + atv.HoistedVariant.Emit (ec); + } else { + atv.Emit (ec); + } + + ec.Emit (OpCodes.Throw); + } else { + ec.Emit (OpCodes.Rethrow); + } + } else { expr.Emit (ec); ec.Emit (OpCodes.Throw); @@ -2888,10 +2899,12 @@ public override void Emit (EmitContext ec) DoEmit (ec); } - protected void EmitScopeInitializers (EmitContext ec) + public void EmitScopeInitializers (EmitContext ec) { foreach (Statement s in scope_initializers) s.Emit (ec); + + scope_initializers = null; } protected override bool DoFlowAnalysis (FlowAnalysisContext fc) @@ -6391,6 +6404,14 @@ protected override void DoEmit (EmitContext ec) if (li != null) EmitCatchVariableStore (ec); + + if (Block.HasAwait) { + Block.EmitScopeInitializers (ec); + } else { + Block.Emit (ec); + } + + return; } else { if (IsGeneral) ec.BeginCatchBlock (ec.BuiltinTypes.Object); @@ -6421,7 +6442,7 @@ void EmitCatchVariableStore (EmitContext ec) hoisted_temp = new LocalTemporary (li.Type); hoisted_temp.Store (ec); - // switch to assigning from the temporary variable and not from top of the stack + // switch to assignment from temporary variable and not from top of the stack assign.UpdateSource (hoisted_temp); } } @@ -6429,11 +6450,16 @@ void EmitCatchVariableStore (EmitContext ec) public override bool Resolve (BlockContext bc) { using (bc.Set (ResolveContext.Options.CatchScope)) { - if (type_expr != null) { + if (type_expr == null) { + CreateExceptionVariable (bc.Module.Compiler.BuiltinTypes.Object); + } else { type = type_expr.ResolveAsType (bc); if (type == null) return false; + if (li == null) + CreateExceptionVariable (type); + if (type.BuiltinType != BuiltinTypeSpec.Type.Exception && !TypeSpec.IsBaseClass (type, bc.BuiltinTypes.Exception, false)) { bc.Report.Error (155, loc, "The type caught or thrown must be derived from System.Exception"); } else if (li != null) { @@ -6462,9 +6488,21 @@ public override bool Resolve (BlockContext bc) } } + void CreateExceptionVariable (TypeSpec type) + { + if (!Block.HasAwait) + return; + + // TODO: Scan the block for rethrow expression + //if (!Block.HasRethrow) + // return; + + li = LocalVariable.CreateCompilerGenerated (type, block, Location.Null); + } + protected override bool DoFlowAnalysis (FlowAnalysisContext fc) { - if (li != null) { + if (li != null && !li.IsCompilerGenerated) { fc.SetVariableAssigned (li.VariableInfo, true); } @@ -6745,13 +6783,20 @@ protected sealed override void DoEmit (EmitContext ec) // 0 value is default label ec.MarkLabel (labels [0]); + ec.Emit (OpCodes.Br, end); + var atv = ec.AsyncThrowVariable; + Catch c = null; for (int i = 0; i < catch_sm.Count; ++i) { - ec.Emit (OpCodes.Br, end); + if (c != null && c.Block.HasReachableClosingBrace) + ec.Emit (OpCodes.Br, end); ec.MarkLabel (labels [i + 1]); - catch_sm [i].Block.Emit (ec); + c = catch_sm [i]; + ec.AsyncThrowVariable = c.Variable; + c.Block.Emit (ec); } + ec.AsyncThrowVariable = atv; ec.MarkLabel (end); } diff --git a/mcs/tests/test-async-63.cs b/mcs/tests/test-async-63.cs index bd3e5f0c317..4572d7e2eda 100644 --- a/mcs/tests/test-async-63.cs +++ b/mcs/tests/test-async-63.cs @@ -67,7 +67,7 @@ public static int Main () TestSingleAwait (false).Wait (); if (counter != 2) - return 1; + return 2; counter = 0; diff --git a/mcs/tests/test-async-65.cs b/mcs/tests/test-async-65.cs new file mode 100644 index 00000000000..0492da89af9 --- /dev/null +++ b/mcs/tests/test-async-65.cs @@ -0,0 +1,41 @@ +using System; +using System.Threading.Tasks; + +class C +{ + static int counter; + + public static async Task TestRethrow () + { + try { + throw new ApplicationException (); + } catch (ApplicationException) { + Console.WriteLine ("x1a"); + counter = 1; + await Task.Delay (1); + Console.WriteLine ("x2a"); + counter = 3; + throw; + } catch { + counter = 9; + await Task.Delay (1); + throw; + } + } + + public static int Main () + { + try { + TestRethrow ().Wait (); + } catch (AggregateException e) { + if (!(e.InnerException is ApplicationException)) + return 1; + } + + if (counter != 3) + return 2; + + Console.WriteLine ("ok"); + return 0; + } +} diff --git a/mcs/tests/test-ex-filter-03.cs b/mcs/tests/test-ex-filter-03.cs new file mode 100644 index 00000000000..d2a3e910413 --- /dev/null +++ b/mcs/tests/test-ex-filter-03.cs @@ -0,0 +1,21 @@ +using System; + +class X +{ + public static int Main () + { + try { + bool x = true; + try { + throw new ApplicationException (); + } catch (NullReferenceException) if (x) { + throw; + } + + return 1; + } catch (ApplicationException) { + Console.WriteLine ("ok"); + return 0; + } + } +} \ No newline at end of file diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index a372ef6ab23..b00d686e7ef 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -62763,7 +62763,7 @@ - 410 + 411 13 @@ -62794,6 +62794,27 @@ + + + + 33 + + + 86 + + + 7 + + + + + 339 + + + 13 + + + @@ -64282,6 +64303,16 @@ + + + + 52 + + + 7 + + + From 7cb33a4fcc594ea638240639872a39e3e50daa51 Mon Sep 17 00:00:00 2001 From: Martin Baulig Date: Tue, 10 Jun 2014 23:05:35 +0200 Subject: [PATCH 191/694] [Http]: Cosmetic, remove some dead code. The is no reason to ever invoke the callback on the ThreadPool, it would in fact only cause trouble. Marek's commit db92449f was correct, I removed the commented out code and the no longer used method. --- mcs/class/System/System.Net/SimpleAsyncResult.cs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/mcs/class/System/System.Net/SimpleAsyncResult.cs b/mcs/class/System/System.Net/SimpleAsyncResult.cs index 4d143153ddf..b18d2adf34a 100644 --- a/mcs/class/System/System.Net/SimpleAsyncResult.cs +++ b/mcs/class/System/System.Net/SimpleAsyncResult.cs @@ -159,18 +159,10 @@ protected void DoCallback_internal () { if (!callbackDone && cb != null) { callbackDone = true; -// if (true || synch) - cb (this); -// else -// ThreadPool.QueueUserWorkItem (CB, null); + cb (this); } } - void CB (object unused) - { - cb (this); - } - internal void WaitUntilComplete () { if (IsCompleted) From d2f66f2d9b4de1d2f79f029b7bec10581084601b Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Tue, 10 Jun 2014 17:37:40 -0400 Subject: [PATCH 192/694] [sgen] Fix an infinite loop in find_previous_pointer_fragment due to remove CAS'ing the wrong value. The fragment list has one invariant, the next pointer is tagged if the current fragment is been deleted, which means the list head can never point to a tagged pointer. If this invariant is broken, the code in find_previous_pointer_fragment will end up in an infinite loop. The infinite loop happens in this simplified fragment: try_again: prev = &allocator->alloc_head; 1) cur = unmask (*prev); while (1) { 2) if (*prev != cur) goto try_again; So assume allocator->alloc_head points to 0x121, which is tagged. So execution goes like this: 1) cur is set to 0x120 2) *prev (value 0x121) is different than cur (value 0x120) so retry. The above will loop forever as the fixup code never touches allocator->alloc_head. Now that we understand the infinite loop, let's see how the remove code can trigger it. Use use the following notation in the event sequence: -> a non tagged pointer -*> a tagged pointer first CAS: InterlockedCompareExchangePointer ((volatile gpointer*)&frag->next, mask (next, 1), next) second CAS: InterlockedCompareExchangePointer ((volatile gpointer*)prev_ptr, next, frag) Assuming the following initial fragment list and two threads removing two separate fragments: fragment list; -> A -> B -> C thread 1 removes A thread 2 removes B thread 2 succeed the first CAS -> A -> B -*> C thread 1 succeed the first CAS -> A -*> B -*> C thread 2 fail the second CAS because of thread 1 -> A -*> B -*> C thread 1 succeed the second CAS -> B -*> C thread 2 succeed the second CAS and set prev_ptr to next, which at this point is a tagged pointer. Leaving the fragment list like this: -*> C After the last CAS, we end up with alloc_head with a tagged pointer, which will cause the infinite loop we previously explained. The fix is to unmask the value we store in the second CAS, as the objective is to link two live fragments and not flag the previous fragment for deletion. The exact same bug exists in mono-linked-list-set and was fixed there. --- mono/metadata/sgen-nursery-allocator.c | 4 ++-- mono/utils/mono-linked-list-set.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mono/metadata/sgen-nursery-allocator.c b/mono/metadata/sgen-nursery-allocator.c index 8e3dc1820ee..4ac1aa0c211 100644 --- a/mono/metadata/sgen-nursery-allocator.c +++ b/mono/metadata/sgen-nursery-allocator.c @@ -414,7 +414,7 @@ par_alloc_from_fragment (SgenFragmentAllocator *allocator, SgenFragment *frag, s /*frag->next read must happen before the first CAS*/ mono_memory_write_barrier (); - /*Fail if the next done is removed concurrently and its CAS wins */ + /*Fail if the next node is removed concurrently and its CAS wins */ if (InterlockedCompareExchangePointer ((volatile gpointer*)&frag->next, mask (next, 1), next) != next) { continue; } @@ -424,7 +424,7 @@ par_alloc_from_fragment (SgenFragmentAllocator *allocator, SgenFragment *frag, s mono_memory_write_barrier (); /* Fail if the previous node was deleted and its CAS wins */ - if (InterlockedCompareExchangePointer ((volatile gpointer*)prev_ptr, next, frag) != frag) { + if (InterlockedCompareExchangePointer ((volatile gpointer*)prev_ptr, unmask (next), frag) != frag) { prev_ptr = find_previous_pointer_fragment (allocator, frag); continue; } diff --git a/mono/utils/mono-linked-list-set.c b/mono/utils/mono-linked-list-set.c index 3536d25d844..b7391962eaa 100644 --- a/mono/utils/mono-linked-list-set.c +++ b/mono/utils/mono-linked-list-set.c @@ -188,7 +188,7 @@ mono_lls_remove (MonoLinkedListSet *list, MonoThreadHazardPointers *hp, MonoLink continue; /* The second CAS must happen before the first. */ mono_memory_write_barrier (); - if (InterlockedCompareExchangePointer ((volatile gpointer*)prev, next, cur) == cur) { + if (InterlockedCompareExchangePointer ((volatile gpointer*)prev, mono_lls_pointer_unmask (next), cur) == cur) { /* The CAS must happen before the hazard pointer clear. */ mono_memory_write_barrier (); mono_hazard_pointer_clear (hp, 1); From be589710f537b4d3f54384066296e8ee1b3caf6e Mon Sep 17 00:00:00 2001 From: Alexandre Mutel Date: Fri, 7 Feb 2014 07:19:07 +0900 Subject: [PATCH 193/694] [Mono.Linker] Add support for with static method and pre-mark them if necessary --- mcs/tools/linker/Mono.Linker.Steps/MarkStep.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/mcs/tools/linker/Mono.Linker.Steps/MarkStep.cs b/mcs/tools/linker/Mono.Linker.Steps/MarkStep.cs index 30b7779f586..430f2c2c885 100644 --- a/mcs/tools/linker/Mono.Linker.Steps/MarkStep.cs +++ b/mcs/tools/linker/Mono.Linker.Steps/MarkStep.cs @@ -290,12 +290,28 @@ void MarkAssembly (AssemblyDefinition assembly) if (CheckProcessed (assembly)) return; + ProcessModule (assembly); + MarkCustomAttributes (assembly); foreach (ModuleDefinition module in assembly.Modules) MarkCustomAttributes (module); } + void ProcessModule (AssemblyDefinition assembly) + { + // Pre-mark if there is any methods as they need to be executed + // at assembly load time + foreach (TypeDefinition type in assembly.MainModule.Types) + { + if (type.Name == "" && type.HasMethods) + { + MarkType (type); + break; + } + } + } + protected void MarkField (FieldReference reference) { // if (IgnoreScope (reference.DeclaringType.Scope)) From 121a4dd89414bd3da568c567945f221bca344c75 Mon Sep 17 00:00:00 2001 From: Alexandre Mutel Date: Sat, 8 Feb 2014 00:33:23 +0900 Subject: [PATCH 194/694] [Mono.Linker] Add support for using the linker with assemblies referencing WPF --- mcs/tools/linker/Mono.Linker/LinkContext.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mcs/tools/linker/Mono.Linker/LinkContext.cs b/mcs/tools/linker/Mono.Linker/LinkContext.cs index 8d97f8dc150..c4d71083cd5 100644 --- a/mcs/tools/linker/Mono.Linker/LinkContext.cs +++ b/mcs/tools/linker/Mono.Linker/LinkContext.cs @@ -217,6 +217,14 @@ static bool IsCore (AssemblyNameReference name) case "mscorlib": case "Accessibility": case "Mono.Security": + // WPF + case "PresentationFramework": + case "PresentationCore": + case "WindowsBase": + case "UIAutomationProvider": + case "UIAutomationTypes": + case "PresentationUI": + case "ReachFramework": return true; default: return name.Name.StartsWith ("System") From 83a5fe8f1a07258571ea9ac4e4f9fed6f0e93336 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Wed, 11 Jun 2014 10:07:20 +0200 Subject: [PATCH 195/694] [mcs] Flow analysis of binary expressions not using logical operators. Fixes #20515 --- mcs/mcs/expression.cs | 4 ---- mcs/tests/test-895.cs | 21 +++++++++++++++++++++ mcs/tests/ver-il-net_4_5.xml | 16 ++++++++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 mcs/tests/test-895.cs diff --git a/mcs/mcs/expression.cs b/mcs/mcs/expression.cs index 6a750145162..a028376d352 100644 --- a/mcs/mcs/expression.cs +++ b/mcs/mcs/expression.cs @@ -2611,14 +2611,10 @@ void Error_OperatorCannotBeApplied (ResolveContext ec, Expression left, Expressi public override void FlowAnalysis (FlowAnalysisContext fc) { if ((oper & Operator.LogicalMask) == 0) { - var fc_ontrue = fc.DefiniteAssignmentOnTrue; - var fc_onfalse = fc.DefiniteAssignmentOnFalse; fc.DefiniteAssignmentOnTrue = fc.DefiniteAssignmentOnFalse = fc.DefiniteAssignment; left.FlowAnalysis (fc); fc.DefiniteAssignmentOnTrue = fc.DefiniteAssignmentOnFalse = fc.DefiniteAssignment; right.FlowAnalysis (fc); - fc.DefiniteAssignmentOnTrue = fc_ontrue; - fc.DefiniteAssignmentOnFalse = fc_onfalse; return; } diff --git a/mcs/tests/test-895.cs b/mcs/tests/test-895.cs new file mode 100644 index 00000000000..bef7982680c --- /dev/null +++ b/mcs/tests/test-895.cs @@ -0,0 +1,21 @@ +using System; + +class X +{ + public void Test (int g, out int results) + { + if ((results = Foo (g > 0 ? 1 : 2)) != 4) + { + Console.WriteLine (results); + } + } + + int Foo (object o) + { + return 4; + } + + public static void Main () + { + } +} \ No newline at end of file diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index b00d686e7ef..f95d9f20854 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -49941,6 +49941,22 @@ + + + + 47 + + + 10 + + + 2 + + + 7 + + + From 39a52aff4ce2089639b1688fef2b76b260c43d6a Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Wed, 11 Jun 2014 12:02:33 +0200 Subject: [PATCH 196/694] [mcs] Inflate nested pointer containers too. --- mcs/mcs/generic.cs | 17 +++++++++++------ mcs/tests/gtest-615.cs | 21 +++++++++++++++++++++ mcs/tests/ver-il-net_4_5.xml | 20 ++++++++++++++++++++ 3 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 mcs/tests/gtest-615.cs diff --git a/mcs/mcs/generic.cs b/mcs/mcs/generic.cs index 89fd1a2e6ac..d97c7f3b82a 100644 --- a/mcs/mcs/generic.cs +++ b/mcs/mcs/generic.cs @@ -1457,13 +1457,18 @@ public TypeSpec Inflate (TypeSpec type) if (tp != null) return Inflate (tp); - var ac = type as ArrayContainer; - if (ac != null) { - var et = Inflate (ac.Element); - if (et != ac.Element) - return ArrayContainer.MakeType (context.Module, et, ac.Rank); + var ec = type as ElementTypeSpec; + if (ec != null) { + var et = Inflate (ec.Element); + if (et != ec.Element) { + var ac = ec as ArrayContainer; + if (ac != null) + return ArrayContainer.MakeType (context.Module, et, ac.Rank); + + throw new NotImplementedException (); + } - return ac; + return ec; } if (type.Kind == MemberKind.MissingType) diff --git a/mcs/tests/gtest-615.cs b/mcs/tests/gtest-615.cs new file mode 100644 index 00000000000..f20ee5733e3 --- /dev/null +++ b/mcs/tests/gtest-615.cs @@ -0,0 +1,21 @@ +// Compiler options: -unsafe + +unsafe class X +{ + struct S + { + } + + public class N + { + S* s; + } +} + +public class C +{ + public static void Main () + { + new X.N (); + } +} \ No newline at end of file diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index f95d9f20854..7002be607ec 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -19155,6 +19155,26 @@ + + + + 7 + + + + + 7 + + + + + 8 + + + 7 + + + From 1e4fd01f6d4d563a3dc861dc40401e5e7123255c Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Wed, 11 Jun 2014 14:24:34 +0200 Subject: [PATCH 197/694] [mcs] Resolve event expression when testing left side expression. Fixes #20493 --- mcs/errors/cs0070-2.cs | 24 ++++++++++++++++++++++++ mcs/mcs/expression.cs | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 mcs/errors/cs0070-2.cs diff --git a/mcs/errors/cs0070-2.cs b/mcs/errors/cs0070-2.cs new file mode 100644 index 00000000000..95f9cdb61d8 --- /dev/null +++ b/mcs/errors/cs0070-2.cs @@ -0,0 +1,24 @@ +// CS0070: The event `A.evt' can only appear on the left hand side of += or -= when used outside of the type `A' +// Line: 22 + +using System; + +public static class EventExtensions +{ + public static void Raise (this EventHandler h) + { + } +} + +public class A +{ + public event EventHandler evt; +} + +public class B : A +{ + public void Run() + { + Action a = () => evt.Raise (); + } +} \ No newline at end of file diff --git a/mcs/mcs/expression.cs b/mcs/mcs/expression.cs index a028376d352..40d1d1fb03d 100644 --- a/mcs/mcs/expression.cs +++ b/mcs/mcs/expression.cs @@ -8813,7 +8813,7 @@ public override Expression LookupNameExpression (ResolveContext rc, MemberLookup // with disable flow analysis as we don't know whether left side expression // is used as variable or type // - if (expr is VariableReference || expr is ConstantExpr || expr is Linq.TransparentMemberAccess) { + if (expr is VariableReference || expr is ConstantExpr || expr is Linq.TransparentMemberAccess || expr is EventExpr) { expr = expr.Resolve (rc); } else if (expr is TypeParameterExpr) { expr.Error_UnexpectedKind (rc, flags, sn.Location); From 7347c5a19518ab5512fda27f2f209155755a9dc7 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Wed, 11 Jun 2014 15:13:00 +0200 Subject: [PATCH 198/694] [mcs] Check for missing dependencies of container types. Fixes #20382 --- mcs/errors/CS0012-23-lib.il | 26 ++++++++++++++++++++++++++ mcs/errors/Makefile | 2 +- mcs/errors/cs0012-23.cs | 11 +++++++++++ mcs/mcs/typespec.cs | 5 +++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 mcs/errors/CS0012-23-lib.il create mode 100644 mcs/errors/cs0012-23.cs diff --git a/mcs/errors/CS0012-23-lib.il b/mcs/errors/CS0012-23-lib.il new file mode 100644 index 00000000000..2f99677e1c1 --- /dev/null +++ b/mcs/errors/CS0012-23-lib.il @@ -0,0 +1,26 @@ +.assembly extern mscorlib +{ +} + +.assembly extern System.Core +{ +} + +.assembly extern 'CS0012-lib-missing' +{ +} + +.assembly 'CS0012-23-lib' +{ + .hash algorithm 0x00008004 + .ver 0:0:0:0 +} + +.module 'CS0012-23-lib.dll' + + +.class public abstract auto ansi sealed beforefieldinit B + extends [mscorlib]System.Object +{ + .field public static valuetype ['CS0012-lib-missing']Struct`1[] ArrayMember +} diff --git a/mcs/errors/Makefile b/mcs/errors/Makefile index e4660f8df86..f994abac1ea 100644 --- a/mcs/errors/Makefile +++ b/mcs/errors/Makefile @@ -21,7 +21,7 @@ DISTFILES = \ $(wildcard dlls/second/*.cs) TEST_SUPPORT_FILES = \ - CS0012-lib.dll CS0012-2-lib.dll CS0012-3-lib.dll CS0012-4-lib.dll CS0012-5-lib.dll CS0012-6-lib.dll CS0012-9-lib.dll CS0012-10-lib.dll CS0012-11-lib.dll CS0012-12-lib.dll CS0012-13-lib.dll CS0012-14-lib.dll CS0012-15-lib.dll CS0012-16-lib.dll CS0012-17-lib.dll CS0012-18-lib.dll CS0012-21-lib.dll CS0012-22-lib.dll CS0019-71-lib.dll CS0029-26-lib.dll \ + CS0012-lib.dll CS0012-2-lib.dll CS0012-3-lib.dll CS0012-4-lib.dll CS0012-5-lib.dll CS0012-6-lib.dll CS0012-9-lib.dll CS0012-10-lib.dll CS0012-11-lib.dll CS0012-12-lib.dll CS0012-13-lib.dll CS0012-14-lib.dll CS0012-15-lib.dll CS0012-16-lib.dll CS0012-17-lib.dll CS0012-18-lib.dll CS0012-21-lib.dll CS0012-22-lib.dll CS0012-23-lib.dll CS0019-71-lib.dll CS0029-26-lib.dll \ CS0103-2-lib.dll CS0118-2-lib.dll CS0122-8-lib.dll CS0122-10-lib.dll CS0122-14-lib.dll CS0122-15-lib.dll CS0122-19-lib.dll CS0122-35-lib.dll CS0122-36-lib.dll CS0143-lib.dll CS0144-3-lib.dll CS0165-19-lib.dll \ CS0205-3-lib.dll CS0246-29-lib.dll CS0229-3-lib.dll CS0229-4-lib.dll CS0266-25-lib.dll \ CS0315-2-lib.dll \ diff --git a/mcs/errors/cs0012-23.cs b/mcs/errors/cs0012-23.cs new file mode 100644 index 00000000000..a8b454ac67f --- /dev/null +++ b/mcs/errors/cs0012-23.cs @@ -0,0 +1,11 @@ +// CS0012: The type `Struct`1' is defined in an assembly that is not referenced. Consider adding a reference to assembly `CS0012-lib-missing, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' +// Line: 9 +// Compiler options: -r:CS0012-23-lib.dll + +public class C +{ + public static void Main () + { + var val = B.ArrayMember; + } +} \ No newline at end of file diff --git a/mcs/mcs/typespec.cs b/mcs/mcs/typespec.cs index 339addfd15e..0da8133fbd2 100644 --- a/mcs/mcs/typespec.cs +++ b/mcs/mcs/typespec.cs @@ -1936,6 +1936,11 @@ public static ArrayContainer MakeType (ModuleContainer module, TypeSpec element, return ac; } + + public override List ResolveMissingDependencies (MemberSpec caller) + { + return Element.ResolveMissingDependencies (caller); + } } class ReferenceContainer : ElementTypeSpec From bad5ef8453b25f9bf7e31487b37153e5a35669e8 Mon Sep 17 00:00:00 2001 From: Martin Baulig Date: Wed, 11 Jun 2014 18:50:47 +0200 Subject: [PATCH 199/694] [Http]: Fix a potential race condition in the WebConnectionGroup's connection list. Remove the "ConnectionState" from the connection list before closing the connection, this should avoid ServicePoint.SendRequest() ever crashing with a NullReferenceException due to getting a null return value from WebConnectionGroup.GetConnection(). --- .../System/System.Net/WebConnectionGroup.cs | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/mcs/class/System/System.Net/WebConnectionGroup.cs b/mcs/class/System/System.Net/WebConnectionGroup.cs index 0348aeebe42..5e142154f91 100644 --- a/mcs/class/System/System.Net/WebConnectionGroup.cs +++ b/mcs/class/System/System.Net/WebConnectionGroup.cs @@ -70,14 +70,16 @@ public void Close () //TODO: abort requests or wait for them to finish lock (sPoint) { closing = true; - foreach (var cnc in connections) { - if (cnc.Connection == null) - continue; - cnc.Connection.Close (false); - cnc.Connection = null; + var iter = connections.First; + while (iter != null) { + var cnc = iter.Value.Connection; + var node = iter; + iter = iter.Next; + + connections.Remove (node); + cnc.Close (false); OnConnectionClosed (); } - connections.Clear (); } } @@ -120,7 +122,7 @@ static void PrepareSharingNtlm (WebConnection cnc, HttpWebRequest request) ConnectionState FindIdleConnection () { foreach (var cnc in connections) { - if (cnc.Busy || cnc.Connection == null) + if (cnc.Busy) continue; connections.Remove (cnc); @@ -140,7 +142,7 @@ WebConnection CreateOrReuseConnection (HttpWebRequest request, out bool created) return cnc.Connection; } - if (sPoint.ConnectionLimit > connections.Count) { + if (sPoint.ConnectionLimit > connections.Count || connections.Count == 0) { created = true; cnc = new ConnectionState (this); connections.AddFirst (cnc); @@ -177,14 +179,11 @@ internal bool TryRecycle (TimeSpan maxIdleTime, ref DateTime idleSince) } int count = 0; - for (var node = connections.First; node != null; node = node.Next) { - var cnc = node.Value; - - if (cnc.Connection == null) { - connections.Remove (node); - OnConnectionClosed (); - continue; - } + var iter = connections.First; + while (iter != null) { + var cnc = iter.Value; + var node = iter; + iter = iter.Next; ++count; if (cnc.Busy) @@ -205,7 +204,7 @@ internal bool TryRecycle (TimeSpan maxIdleTime, ref DateTime idleSince) if (connectionsToClose == null) connectionsToClose = new List (); connectionsToClose.Add (cnc.Connection); - cnc.Connection = null; + connections.Remove (node); } recycled = connections.Count == 0; @@ -224,7 +223,10 @@ internal bool TryRecycle (TimeSpan maxIdleTime, ref DateTime idleSince) } class ConnectionState : IWebConnectionState { - public WebConnection Connection; + public WebConnection Connection { + get; + private set; + } public WebConnectionGroup Group { get; From 254c71b06049a60dc49e3e2163c842ea657e7a78 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Wed, 11 Jun 2014 19:09:01 +0200 Subject: [PATCH 200/694] [jit] Don't emit a write barrier when writing to the delegate->method field, its not needed. --- mono/mini/method-to-ir.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mono/mini/method-to-ir.c b/mono/mini/method-to-ir.c index 78c25126a41..e667acb1664 100644 --- a/mono/mini/method-to-ir.c +++ b/mono/mini/method-to-ir.c @@ -4526,11 +4526,6 @@ handle_delegate_ctor (MonoCompile *cfg, MonoClass *klass, MonoInst *target, Mono /* 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); - 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, method)); - emit_write_barrier (cfg, ptr, method_ins); - } /* * To avoid looking up the compiled code belonging to the target method * in mono_delegate_trampoline (), we allocate a per-domain memory slot to From eab18c98cb7c5826b886d7e260baa672489cfce1 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 11 Jun 2014 18:27:15 -0400 Subject: [PATCH 201/694] [Mono.Debugger.Soft] Handle cases where the instruction list is empty --- .../Mono.Debugger.Soft/Mono.Debugger.Soft/ILInterpreter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/ILInterpreter.cs b/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/ILInterpreter.cs index d004991988b..b4d6073819c 100644 --- a/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/ILInterpreter.cs +++ b/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/ILInterpreter.cs @@ -34,7 +34,7 @@ public Value Evaluate (Value this_val, Value[] args) { throw new NotSupportedException (); var instructions = body.Instructions; - if (instructions.Count > 16) + if (instructions.Count < 1 || instructions.Count > 16) throw new NotSupportedException (); var stack = new Value [16]; From a97fb68e66927deb887fb05d426c5ad14b81ab3b Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Thu, 12 Jun 2014 17:46:18 +0200 Subject: [PATCH 202/694] [mcs] Add support for await in finally clause --- mcs/errors/cs1984.cs | 21 ------------ mcs/mcs/async.cs | 4 --- mcs/mcs/statement.cs | 64 ++++++++++++++++++++++++++++++++++-- mcs/tests/test-async-66.cs | 42 +++++++++++++++++++++++ mcs/tests/ver-il-net_4_5.xml | 21 ++++++++++++ 5 files changed, 125 insertions(+), 27 deletions(-) delete mode 100644 mcs/errors/cs1984.cs create mode 100644 mcs/tests/test-async-66.cs diff --git a/mcs/errors/cs1984.cs b/mcs/errors/cs1984.cs deleted file mode 100644 index cf998413a14..00000000000 --- a/mcs/errors/cs1984.cs +++ /dev/null @@ -1,21 +0,0 @@ -// CS1984: The `await' operator cannot be used in the body of a finally clause -// Line: 13 - -using System; -using System.Threading.Tasks; - -class C -{ - public async Task Test () - { - try { - } finally { - await Call (); - } - } - - static Task Call () - { - return null; - } -} diff --git a/mcs/mcs/async.cs b/mcs/mcs/async.cs index ea0d9c4a241..5d8f65053bf 100644 --- a/mcs/mcs/async.cs +++ b/mcs/mcs/async.cs @@ -74,10 +74,6 @@ public override void FlowAnalysis (FlowAnalysisContext fc) protected override Expression DoResolve (ResolveContext rc) { - if (rc.HasSet (ResolveContext.Options.FinallyScope)) { - rc.Report.Error (1984, loc, "The `await' operator cannot be used in the body of a finally clause"); - } - if (rc.HasSet (ResolveContext.Options.LockScope)) { rc.Report.Error (1996, loc, "The `await' operator cannot be used in the body of a lock statement"); diff --git a/mcs/mcs/statement.cs b/mcs/mcs/statement.cs index 05387de792f..fadc2bf8e0f 100644 --- a/mcs/mcs/statement.cs +++ b/mcs/mcs/statement.cs @@ -5470,7 +5470,7 @@ protected sealed override void DoEmit (EmitContext ec) EmitTryBodyPrepare (ec); EmitTryBody (ec); - ec.BeginFinallyBlock (); + bool begin = EmitBeginFinallyBlock (ec); Label start_finally = ec.DefineLabel (); if (resume_points != null) { @@ -5498,7 +5498,8 @@ protected sealed override void DoEmit (EmitContext ec) EmitFinallyBody (ec); } - ec.EndExceptionBlock (); + if (begin) + ec.EndExceptionBlock (); } public override void EmitForDispose (EmitContext ec, LocalBuilder pc, Label end, bool have_dispatcher) @@ -5572,6 +5573,12 @@ protected override bool DoFlowAnalysis (FlowAnalysisContext fc) return res; } + protected virtual bool EmitBeginFinallyBlock (EmitContext ec) + { + ec.BeginFinallyBlock (); + return true; + } + public override Reachability MarkReachable (Reachability rc) { base.MarkReachable (rc); @@ -6576,9 +6583,62 @@ protected override void EmitTryBody (EmitContext ec) stmt.Emit (ec); } + protected override bool EmitBeginFinallyBlock (EmitContext ec) + { + if (fini.HasAwait) + return false; + + return base.EmitBeginFinallyBlock (ec); + } + public override void EmitFinallyBody (EmitContext ec) { + StackFieldExpr exception_field; + + if (fini.HasAwait) { + // + // Emits catch block like + // + // catch (object temp) { + // this.exception_field = temp; + // } + // + var type = ec.BuiltinTypes.Object; + ec.BeginCatchBlock (type); + + var temp = ec.GetTemporaryLocal (type); + ec.Emit (OpCodes.Stloc, temp); + + exception_field = ec.GetTemporaryField (type); + ec.EmitThis (); + ec.Emit (OpCodes.Ldloc, temp); + exception_field.EmitAssignFromStack (ec); + + ec.EndExceptionBlock (); + + ec.FreeTemporaryLocal (temp, type); + } else { + exception_field = null; + } + fini.Emit (ec); + + if (exception_field != null) { + // + // Emits exception rethrow + // + // if (this.exception_field != null) + // throw this.exception_field; + // + exception_field.Emit (ec); + var skip_throw = ec.DefineLabel (); + ec.Emit (OpCodes.Brfalse_S, skip_throw); + exception_field.Emit (ec); + ec.Emit (OpCodes.Throw); + ec.MarkLabel (skip_throw); + + exception_field.IsAvailableForReuse = true; + } } protected override bool DoFlowAnalysis (FlowAnalysisContext fc) diff --git a/mcs/tests/test-async-66.cs b/mcs/tests/test-async-66.cs new file mode 100644 index 00000000000..bbba0980228 --- /dev/null +++ b/mcs/tests/test-async-66.cs @@ -0,0 +1,42 @@ +using System; +using System.Threading.Tasks; + +class TestFinally +{ + static int counter; + + async static Task Test (bool throwException) + { + try { + if (throwException) + throw new ApplicationException (); + + ++counter; + System.Console.WriteLine (); + } finally { + counter += 10; + await Task.Delay (2); + counter += 100; + } + counter += 1000; + } + + static int Main () + { + Test (false).Wait (); + if (counter != 1111) + return 1; + + counter = 0; + try { + Test (true).Wait (); + return 2; + } catch (AggregateException) { + } + + if (counter != 110) + return 3; + + return 0; + } +} \ No newline at end of file diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index 7002be607ec..54d7dcfddc9 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -62851,6 +62851,27 @@ + + + + 41 + + + 95 + + + 7 + + + + + 277 + + + 13 + + + From 9ae8e72ceb542168f8e0c5b0a8a3bde12c1a6446 Mon Sep 17 00:00:00 2001 From: Brezae Vlad Date: Thu, 12 Jun 2014 21:48:51 +0300 Subject: [PATCH 203/694] [jit] Fix bug when using pushless code and reenable the feature. --- mono/mini/mini-x86.c | 4 +--- mono/mini/mini-x86.h | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/mono/mini/mini-x86.c b/mono/mini/mini-x86.c index 18b3001e663..6026ca622a9 100644 --- a/mono/mini/mini-x86.c +++ b/mono/mini/mini-x86.c @@ -3486,9 +3486,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_START_HANDLER: { MonoInst *spvar = mono_find_spvar_for_region (cfg, bb->region); x86_mov_membase_reg (code, spvar->inst_basereg, spvar->inst_offset, X86_ESP, 4); - if ((MONO_BBLOCK_IS_IN_REGION (bb, MONO_REGION_FINALLY) || - MONO_BBLOCK_IS_IN_REGION (bb, MONO_REGION_FAULT)) && - cfg->param_area && cfg->arch.no_pushes) { + if (cfg->param_area && cfg->arch.no_pushes) { x86_alu_reg_imm (code, X86_SUB, X86_ESP, ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT)); } break; diff --git a/mono/mini/mini-x86.h b/mono/mini/mini-x86.h index 7ddc2f69cd7..4e2f94bd80a 100644 --- a/mono/mini/mini-x86.h +++ b/mono/mini/mini-x86.h @@ -74,7 +74,7 @@ struct sigcontext { #endif /* HAVE_WORKING_SIGALTSTACK */ #endif /* !HOST_WIN32 */ -// #define MONO_X86_NO_PUSHES 1 +#define MONO_X86_NO_PUSHES 1 #define MONO_ARCH_SUPPORT_TASKLETS 1 From 74b24b0e55478fd4f367798ecfdd7d93519b9d9e Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Fri, 13 Jun 2014 11:22:03 +0200 Subject: [PATCH 204/694] [mcs] Handle catch filter with await-ed rethrow and exception filters --- mcs/mcs/statement.cs | 11 +++-- mcs/tests/test-ex-filter-04.cs | 74 ++++++++++++++++++++++++++++++++++ mcs/tests/ver-il-net_4_5.xml | 35 ++++++++++++++++ 3 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 mcs/tests/test-ex-filter-04.cs diff --git a/mcs/mcs/statement.cs b/mcs/mcs/statement.cs index fadc2bf8e0f..bd4cd79e8b5 100644 --- a/mcs/mcs/statement.cs +++ b/mcs/mcs/statement.cs @@ -6458,7 +6458,11 @@ public override bool Resolve (BlockContext bc) { using (bc.Set (ResolveContext.Options.CatchScope)) { if (type_expr == null) { - CreateExceptionVariable (bc.Module.Compiler.BuiltinTypes.Object); + if (CreateExceptionVariable (bc.Module.Compiler.BuiltinTypes.Object) && Filter != null) { + Expression source = new EmptyExpression (li.Type); + assign = new CompilerAssign (new LocalVariableReference (li, Location.Null), source, Location.Null); + Block.AddScopeStatement (new StatementExpression (assign, Location.Null)); + } } else { type = type_expr.ResolveAsType (bc); if (type == null) @@ -6495,16 +6499,17 @@ public override bool Resolve (BlockContext bc) } } - void CreateExceptionVariable (TypeSpec type) + bool CreateExceptionVariable (TypeSpec type) { if (!Block.HasAwait) - return; + return false; // TODO: Scan the block for rethrow expression //if (!Block.HasRethrow) // return; li = LocalVariable.CreateCompilerGenerated (type, block, Location.Null); + return true; } protected override bool DoFlowAnalysis (FlowAnalysisContext fc) diff --git a/mcs/tests/test-ex-filter-04.cs b/mcs/tests/test-ex-filter-04.cs new file mode 100644 index 00000000000..122accb2eee --- /dev/null +++ b/mcs/tests/test-ex-filter-04.cs @@ -0,0 +1,74 @@ +using System; +using System.Threading.Tasks; + +class X +{ + static Exception ex = new ApplicationException (); + + public static int Main () + { + if (Test (5, null).Result != 5) + return 1; + + try { + Test (5, ex).Wait (); + return 2; + } catch (AggregateException ae) { + if (ae.InnerException != ex) + return 3; + } + + try { + Test (15, ex).Wait (); + return 4; + } catch (AggregateException ae) { + if (ae.InnerException != ex) + return 5; + } + + try { + TestGeneric (5).Wait (); + return 10; + } catch (AggregateException ae) { + if (ae.InnerException != ex) + return 11; + } + + try { + TestGeneric (15).Wait (); + return 12; + } catch (AggregateException ae) { + if (ae.InnerException != ex) + return 13; + } + + return 0; + } + + async static Task Test (int x, Exception e) + { + try { + Console.WriteLine (x); + if (e != null) + throw e; + } catch (Exception) if (x != 15) { + await Task.FromResult (0); + throw; + } + + return x; + } + + async static Task TestGeneric (int x) + { + try { + Console.WriteLine (x); + throw ex; + } catch if (x != 15) { + await Task.FromResult (0); + throw; + } + + return x; + } +} \ No newline at end of file diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index 54d7dcfddc9..d4ea8e30e48 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -64370,6 +64370,41 @@ + + + + 253 + + + 49 + + + 41 + + + 7 + + + 11 + + + + + 281 + + + 13 + + + + + 250 + + + 13 + + + From 93f8df65f9098eee4d735bffb54ee0a92f64226c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 13 Jun 2014 15:32:42 +0200 Subject: [PATCH 205/694] Disable push-less x86 code for now. Breaks stuff: https://wrench.mono-project.com/Wrench/ViewLane.aspx?lane_id=10&host_id=8&revision_id=68534 --- mono/mini/mini-x86.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/mini/mini-x86.h b/mono/mini/mini-x86.h index 4e2f94bd80a..2f7eaca37b6 100644 --- a/mono/mini/mini-x86.h +++ b/mono/mini/mini-x86.h @@ -74,7 +74,7 @@ struct sigcontext { #endif /* HAVE_WORKING_SIGALTSTACK */ #endif /* !HOST_WIN32 */ -#define MONO_X86_NO_PUSHES 1 +/* #define MONO_X86_NO_PUSHES 1 */ #define MONO_ARCH_SUPPORT_TASKLETS 1 From a3f242b793472e3b9065623842755c3b3c61997c Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Fri, 13 Jun 2014 15:55:38 +0200 Subject: [PATCH 206/694] [x86] Reduce some code duplication in the x86 call opcodes. --- mono/mini/mini-x86.c | 86 +++++++++++++++++++++++--------------------- 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/mono/mini/mini-x86.c b/mono/mini/mini-x86.c index 6026ca622a9..e34cc794067 100644 --- a/mono/mini/mini-x86.c +++ b/mono/mini/mini-x86.c @@ -3322,11 +3322,52 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_VCALL2: case OP_VOIDCALL: case OP_CALL: + case OP_FCALL_REG: + case OP_LCALL_REG: + case OP_VCALL_REG: + case OP_VCALL2_REG: + case OP_VOIDCALL_REG: + case OP_CALL_REG: + case OP_FCALL_MEMBASE: + case OP_LCALL_MEMBASE: + case OP_VCALL_MEMBASE: + case OP_VCALL2_MEMBASE: + case OP_VOIDCALL_MEMBASE: + case OP_CALL_MEMBASE: call = (MonoCallInst*)ins; - if (ins->flags & MONO_INST_HAS_METHOD) - code = emit_call (cfg, code, MONO_PATCH_INFO_METHOD, call->method); - else - code = emit_call (cfg, code, MONO_PATCH_INFO_ABS, call->fptr); + + switch (ins->opcode) { + case OP_FCALL: + case OP_LCALL: + case OP_VCALL: + case OP_VCALL2: + case OP_VOIDCALL: + case OP_CALL: + if (ins->flags & MONO_INST_HAS_METHOD) + code = emit_call (cfg, code, MONO_PATCH_INFO_METHOD, call->method); + else + code = emit_call (cfg, code, MONO_PATCH_INFO_ABS, call->fptr); + break; + case OP_FCALL_REG: + case OP_LCALL_REG: + case OP_VCALL_REG: + case OP_VCALL2_REG: + case OP_VOIDCALL_REG: + case OP_CALL_REG: + x86_call_reg (code, ins->sreg1); + break; + case OP_FCALL_MEMBASE: + case OP_LCALL_MEMBASE: + case OP_VCALL_MEMBASE: + case OP_VCALL2_MEMBASE: + case OP_VOIDCALL_MEMBASE: + case OP_CALL_MEMBASE: + x86_call_membase (code, ins->sreg1, ins->inst_offset); + break; + default: + g_assert_not_reached (); + break; + } ins->flags |= MONO_INST_GC_CALLSITE; ins->backend.pc_offset = code - cfg->native_code; if (call->stack_usage && !CALLCONV_IS_STDCALL (call->signature) && !cfg->arch.no_pushes) { @@ -3353,43 +3394,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } code = emit_move_return_value (cfg, ins, code); break; - case OP_FCALL_REG: - case OP_LCALL_REG: - case OP_VCALL_REG: - case OP_VCALL2_REG: - case OP_VOIDCALL_REG: - case OP_CALL_REG: - call = (MonoCallInst*)ins; - x86_call_reg (code, ins->sreg1); - ins->flags |= MONO_INST_GC_CALLSITE; - ins->backend.pc_offset = code - cfg->native_code; - if (call->stack_usage && !CALLCONV_IS_STDCALL (call->signature) && !cfg->arch.no_pushes) { - if (call->stack_usage == 4) - x86_pop_reg (code, X86_ECX); - else - x86_alu_reg_imm (code, X86_ADD, X86_ESP, call->stack_usage); - } - code = emit_move_return_value (cfg, ins, code); - break; - case OP_FCALL_MEMBASE: - case OP_LCALL_MEMBASE: - case OP_VCALL_MEMBASE: - case OP_VCALL2_MEMBASE: - case OP_VOIDCALL_MEMBASE: - case OP_CALL_MEMBASE: - call = (MonoCallInst*)ins; - - x86_call_membase (code, ins->sreg1, ins->inst_offset); - ins->flags |= MONO_INST_GC_CALLSITE; - ins->backend.pc_offset = code - cfg->native_code; - if (call->stack_usage && !CALLCONV_IS_STDCALL (call->signature) && !cfg->arch.no_pushes) { - if (call->stack_usage == 4) - x86_pop_reg (code, X86_ECX); - else - x86_alu_reg_imm (code, X86_ADD, X86_ESP, call->stack_usage); - } - code = emit_move_return_value (cfg, ins, code); - break; case OP_X86_PUSH: g_assert (!cfg->arch.no_pushes); x86_push_reg (code, ins->sreg1); From 5e2cd9c29ff18e9edc8f19a1dc147f81be5b9470 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Fri, 13 Jun 2014 16:15:19 +0200 Subject: [PATCH 207/694] since gerror.c requires vasprintf.h, we need to add that file so that it becomes part of the tarball --- eglib/src/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/eglib/src/Makefile.am b/eglib/src/Makefile.am index a0baeea025f..70d519ea225 100644 --- a/eglib/src/Makefile.am +++ b/eglib/src/Makefile.am @@ -32,6 +32,7 @@ libeglib_la_SOURCES = \ garray.c \ gbytearray.c \ gerror.c \ + vasprintf.h \ ghashtable.c \ giconv.c \ gmem.c \ From 805bcf7e82922142e2b163afa8174b582d5ca2f1 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Fri, 13 Jun 2014 16:23:24 +0200 Subject: [PATCH 208/694] [x86] Pop the vtype return addr from the stack in no pushes mode too. --- mono/mini/mini-x86.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/mono/mini/mini-x86.c b/mono/mini/mini-x86.c index e34cc794067..8a95cabcb5c 100644 --- a/mono/mini/mini-x86.c +++ b/mono/mini/mini-x86.c @@ -217,6 +217,8 @@ typedef struct { /* The index of the vret arg in the argument list */ int vret_arg_index; int vret_arg_offset; + /* Argument space popped by the callee */ + int callee_stack_pop; ArgInfo ret; ArgInfo sig_cookie; ArgInfo args [1]; @@ -593,6 +595,11 @@ get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoM stack_size += cinfo->stack_align_amount; } + if (cinfo->vtype_retaddr) { + /* if the function returns a struct on stack, the called method already does a ret $0x4 */ + cinfo->callee_stack_pop = 4; + } + cinfo->stack_usage = stack_size; cinfo->reg_usage = gr; cinfo->freg_usage = fr; @@ -1431,6 +1438,7 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) sig_ret = mini_replace_type (sig->ret); cinfo = get_call_info (cfg->generic_sharing_context, cfg->mempool, sig); + call->call_info = cinfo; if (!sig->pinvoke && (sig->call_convention == MONO_CALL_VARARG)) sentinelpos = sig->sentinelpos + (sig->hasthis ? 1 : 0); @@ -1675,8 +1683,8 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) } /* if the function returns a struct on stack, the called method already does a ret $0x4 */ - if (cinfo->ret.storage != ArgValuetypeInReg) - cinfo->stack_usage -= 4; + if (!cfg->arch.no_pushes) + cinfo->stack_usage -= cinfo->callee_stack_pop; } call->stack_usage = cinfo->stack_usage; @@ -3333,8 +3341,11 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_VCALL_MEMBASE: case OP_VCALL2_MEMBASE: case OP_VOIDCALL_MEMBASE: - case OP_CALL_MEMBASE: + case OP_CALL_MEMBASE: { + CallInfo *cinfo; + call = (MonoCallInst*)ins; + cinfo = (CallInfo*)call->call_info; switch (ins->opcode) { case OP_FCALL: @@ -3391,9 +3402,13 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } else { x86_alu_reg_imm (code, X86_ADD, X86_ESP, call->stack_usage); } + } else if (cinfo->callee_stack_pop && cfg->arch.no_pushes) { + /* Have to compensate for the stack space popped by the callee */ + x86_alu_reg_imm (code, X86_SUB, X86_ESP, cinfo->callee_stack_pop); } code = emit_move_return_value (cfg, ins, code); break; + } case OP_X86_PUSH: g_assert (!cfg->arch.no_pushes); x86_push_reg (code, ins->sreg1); @@ -5658,8 +5673,8 @@ mono_arch_emit_epilog (MonoCompile *cfg) MonoJitArgumentInfo *arg_info = alloca (sizeof (MonoJitArgumentInfo) * (sig->param_count + 1)); stack_to_pop = mono_arch_get_argument_info (NULL, sig, sig->param_count, arg_info); - } else if (cinfo->vtype_retaddr && !cfg->arch.no_pushes) - stack_to_pop = 4; + } else if (cinfo->callee_stack_pop) + stack_to_pop = cinfo->callee_stack_pop; else stack_to_pop = 0; From 3f6b2feebdeb66bb3b154d1bd3fba96fd81bf41e Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Fri, 13 Jun 2014 14:31:02 +0200 Subject: [PATCH 209/694] [mcs] Keep stack populated when array initializer contains await --- mcs/mcs/expression.cs | 4 +++- mcs/tests/test-async-67.cs | 24 ++++++++++++++++++++++++ mcs/tests/ver-il-net_4_5.xml | 24 ++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 mcs/tests/test-async-67.cs diff --git a/mcs/mcs/expression.cs b/mcs/mcs/expression.cs index 40d1d1fb03d..90481aa6611 100644 --- a/mcs/mcs/expression.cs +++ b/mcs/mcs/expression.cs @@ -7565,7 +7565,9 @@ void EmitDynamicInitializers (EmitContext ec, bool emitConstants, StackFieldExpr public override void Emit (EmitContext ec) { - EmitToFieldSource (ec); + var await_field = EmitToFieldSource (ec); + if (await_field != null) + await_field.Emit (ec); } protected sealed override FieldExpr EmitToFieldSource (EmitContext ec) diff --git a/mcs/tests/test-async-67.cs b/mcs/tests/test-async-67.cs new file mode 100644 index 00000000000..2348dc7ff7d --- /dev/null +++ b/mcs/tests/test-async-67.cs @@ -0,0 +1,24 @@ +using System; +using System.Threading.Tasks; + +class Test +{ + public static async Task Run () + { + return new int[] { + 1, await Task.Factory.StartNew (() => 2) + }; + } + + public static int Main () + { + var t = Run ().Result; + if (t [0] != 1) + return 1; + + if (t [1] != 2) + return 2; + + return 0; + } +} \ No newline at end of file diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index d4ea8e30e48..eae31813a36 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -62872,6 +62872,30 @@ + + + + 33 + + + 53 + + + 7 + + + + + 239 + + + 13 + + + 9 + + + From 66a9644ee87b9ded332ea4c70e8cdee550ba3a5c Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Fri, 13 Jun 2014 16:18:06 +0200 Subject: [PATCH 210/694] [mcs] Emit correct value type collection initialization when second initializer uses await --- mcs/mcs/expression.cs | 18 ++++++++++++++++- mcs/tests/test-async-15.cs | 38 ++++++++++++++++++++++++++++++++---- mcs/tests/ver-il-net_4_5.xml | 28 ++++++++++++++++++++++++-- 3 files changed, 77 insertions(+), 7 deletions(-) diff --git a/mcs/mcs/expression.cs b/mcs/mcs/expression.cs index 90481aa6611..96431ffa393 100644 --- a/mcs/mcs/expression.cs +++ b/mcs/mcs/expression.cs @@ -6762,7 +6762,7 @@ public override void Emit (EmitContext ec) if (!Emit (ec, v)) v.Emit (ec); } - + public override void EmitStatement (EmitContext ec) { LocalTemporary v = null; @@ -11064,6 +11064,20 @@ protected override Expression DoResolve (ResolveContext ec) return e; } + public override void Emit (EmitContext ec) + { + if (method == null && TypeSpec.IsValueType (type) && initializers.Initializers.Count > 1 && initializers.ContainsEmitWithAwait ()) { + var fe = ec.GetTemporaryField (type); + + if (!Emit (ec, fe)) + fe.Emit (ec); + + return; + } + + base.Emit (ec); + } + public override bool Emit (EmitContext ec, IMemoryLocation target) { bool left_on_stack; @@ -11080,6 +11094,8 @@ public override bool Emit (EmitContext ec, IMemoryLocation target) LocalTemporary temp = null; instance = target as LocalTemporary; + if (instance == null) + instance = target as StackFieldExpr; if (instance == null) { if (!left_on_stack) { diff --git a/mcs/tests/test-async-15.cs b/mcs/tests/test-async-15.cs index a1da25f39d5..a3ae814086e 100644 --- a/mcs/tests/test-async-15.cs +++ b/mcs/tests/test-async-15.cs @@ -1,8 +1,8 @@ -// Compiler options: -langversion:future - using System; using System.Threading.Tasks; using System.Threading; +using System.Collections; +using System.Collections.Generic; interface IFoo { @@ -25,12 +25,28 @@ public void SetValue (int value) } } +struct S2 : IEnumerable +{ + public List Values; + + public void Add (int x) + { + if (Values == null) + Values = new List (); + + Values.Add(x); + } + + public IEnumerator GetEnumerator() + { + return Values as IEnumerator; + } +} + class Tester { async Task NewInitTestGen () where T : struct, IFoo { - int value = 9; - var s = new T () { Value = await Task.Factory.StartNew (() => 13).ConfigureAwait (false) }; @@ -40,6 +56,16 @@ async Task NewInitTestGen () where T : struct, IFoo return s; } + + static async Task NewInitCol () + { + var s = new S2 { + await Task.FromResult (1), + await Task.Factory.StartNew (() => 2) + }; + + return s.Values [0] + s.Values [1]; + } public static int Main () { @@ -51,6 +77,10 @@ public static int Main () if (t.Result.Value != 13) return 2; + + var v = NewInitCol ().Result; + if (v != 3) + return 3; return 0; } diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index eae31813a36..ce3b065091b 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -60379,7 +60379,7 @@ 33 - 82 + 107 7 @@ -60387,7 +60387,7 @@ - 306 + 298 10 @@ -60396,6 +60396,30 @@ 13 + + + 36 + + + 20 + + + + + 33 + + + + + 370 + + + 13 + + + 9 + + From 9fba4956398e880d0a2cf47d1caed2e3137e9065 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Fri, 13 Jun 2014 17:33:43 +0200 Subject: [PATCH 211/694] [corlib] Set AggregateException message text in all overloads --- mcs/class/corlib/System/AggregateException.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/corlib/System/AggregateException.cs b/mcs/class/corlib/System/AggregateException.cs index 067cd64d6f6..06bfc20324d 100644 --- a/mcs/class/corlib/System/AggregateException.cs +++ b/mcs/class/corlib/System/AggregateException.cs @@ -63,7 +63,7 @@ protected AggregateException (SerializationInfo info, StreamingContext context) } public AggregateException (params Exception[] innerExceptions) - : this (string.Empty, innerExceptions) + : this (defaultMessage, innerExceptions) { } From 429c2c7f429fb0e0a3f1d6304536077e3c7d44b5 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Fri, 13 Jun 2014 17:34:43 +0200 Subject: [PATCH 212/694] [mcs] Always store hidden catch variable when clause contains await --- mcs/mcs/statement.cs | 22 +++++++++++----------- mcs/tests/test-async-65.cs | 21 +++++++++++++++++---- mcs/tests/ver-il-net_4_5.xml | 14 ++++++++------ 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/mcs/mcs/statement.cs b/mcs/mcs/statement.cs index bd4cd79e8b5..ced42136ea5 100644 --- a/mcs/mcs/statement.cs +++ b/mcs/mcs/statement.cs @@ -6419,17 +6419,17 @@ protected override void DoEmit (EmitContext ec) } return; - } else { - if (IsGeneral) - ec.BeginCatchBlock (ec.BuiltinTypes.Object); - else - ec.BeginCatchBlock (CatchType); + } - if (li != null) { - EmitCatchVariableStore (ec); - } else { - ec.Emit (OpCodes.Pop); - } + if (IsGeneral) + ec.BeginCatchBlock (ec.BuiltinTypes.Object); + else + ec.BeginCatchBlock (CatchType); + + if (li != null) { + EmitCatchVariableStore (ec); + } else { + ec.Emit (OpCodes.Pop); } if (!Block.HasAwait) @@ -6458,7 +6458,7 @@ public override bool Resolve (BlockContext bc) { using (bc.Set (ResolveContext.Options.CatchScope)) { if (type_expr == null) { - if (CreateExceptionVariable (bc.Module.Compiler.BuiltinTypes.Object) && Filter != null) { + if (CreateExceptionVariable (bc.Module.Compiler.BuiltinTypes.Object)) { Expression source = new EmptyExpression (li.Type); assign = new CompilerAssign (new LocalVariableReference (li, Location.Null), source, Location.Null); Block.AddScopeStatement (new StatementExpression (assign, Location.Null)); diff --git a/mcs/tests/test-async-65.cs b/mcs/tests/test-async-65.cs index 0492da89af9..39672366915 100644 --- a/mcs/tests/test-async-65.cs +++ b/mcs/tests/test-async-65.cs @@ -5,10 +5,10 @@ class C { static int counter; - public static async Task TestRethrow () + public static async Task TestRethrow (Exception e) { try { - throw new ApplicationException (); + throw e; } catch (ApplicationException) { Console.WriteLine ("x1a"); counter = 1; @@ -19,22 +19,35 @@ public static async Task TestRethrow () } catch { counter = 9; await Task.Delay (1); + Console.WriteLine ("ga"); throw; } } public static int Main () { + var ex = new ApplicationException (); try { - TestRethrow ().Wait (); + TestRethrow (ex).Wait (); } catch (AggregateException e) { - if (!(e.InnerException is ApplicationException)) + if (e.InnerException != ex) return 1; } if (counter != 3) return 2; + var ex2 = new NotSupportedException (); + try { + TestRethrow (ex2).Wait (); + } catch (AggregateException e) { + if (e.InnerException != ex2) + return 3; + } + + if (counter != 9) + return 4; + Console.WriteLine ("ok"); return 0; } diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index ce3b065091b..b9acb70491d 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -62823,7 +62823,7 @@ - 411 + 419 13 @@ -62856,11 +62856,8 @@ - - 33 - - 86 + 161 7 @@ -62868,12 +62865,17 @@ - 339 + 363 13 + + + 41 + + From 159f2dc89d2d46403c535ca4f7a4675d021df244 Mon Sep 17 00:00:00 2001 From: Joseph Portaro Date: Fri, 13 Jun 2014 11:55:37 -0400 Subject: [PATCH 213/694] Added fix for Bug 11630 --- mcs/class/corlib/System/DateTime.cs | 7 +++++++ mcs/class/corlib/Test/System/DateTimeTest.cs | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/mcs/class/corlib/System/DateTime.cs b/mcs/class/corlib/System/DateTime.cs index c3da055efc0..30bc6f8edf8 100644 --- a/mcs/class/corlib/System/DateTime.cs +++ b/mcs/class/corlib/System/DateTime.cs @@ -214,6 +214,10 @@ public struct DateTime : IFormattable, IConvertible, IComparable, ISerializable, "yyyy/MMMM", }; + private static readonly string[] ExoticAndNonStandardFormats = new string[] { + "ddMMMyyyy" + }; + private enum Which { Day, @@ -927,6 +931,9 @@ internal static bool CoreParse (string s, IFormatProvider provider, DateTimeStyl if (ParseExact (s, dfi.GetAllDateTimePatternsInternal (), dfi, styles, out result, false, ref longYear, setExceptionOnError, ref exception)) return true; + if (ParseExact (s, ExoticAndNonStandardFormats, dfi, styles, out result, false, ref longYear, setExceptionOnError, ref exception)) + return true; + if (!setExceptionOnError) return false; diff --git a/mcs/class/corlib/Test/System/DateTimeTest.cs b/mcs/class/corlib/Test/System/DateTimeTest.cs index 0e7b294f3b9..343e723be82 100644 --- a/mcs/class/corlib/Test/System/DateTimeTest.cs +++ b/mcs/class/corlib/Test/System/DateTimeTest.cs @@ -1216,6 +1216,15 @@ public void Parse_Bug71289b () DateTime.Parse ("Sat,,, 01,,, Oct,,, ,,,1994 03:00:00", CultureInfo.InvariantCulture); } + [Test] + public void TryParse_Bug11630 () + { + DateTime parsed; + + Assert.IsTrue (DateTime.TryParse ("10Feb2013", out parsed)); + Assert.AreEqual (new DateTime (2013, 2, 10), parsed); + } + [Test] [ExpectedException (typeof (FormatException))] public void Parse_CommaAfterHours () From 59fd337839b6eb3ad740493278078c04687d89f9 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Fri, 13 Jun 2014 12:16:31 -0400 Subject: [PATCH 214/694] [runtime] Rewrite MemoryMappedFile to support named mappings. --- .../SafeMemoryMappedViewHandle.cs | 9 +- .../MemoryMappedFile.cs | 612 ++++-------------- .../MemoryMappedViewAccessor.cs | 24 +- .../MemoryMappedViewStream.cs | 29 +- mono/metadata/Makefile.am.in | 6 +- mono/metadata/file-mmap-posix.c | 514 +++++++++++++++ mono/metadata/file-mmap-windows.c | 70 ++ mono/metadata/file-mmap.h | 34 + mono/metadata/icall-def.h | 12 +- mono/metadata/icall.c | 1 + 10 files changed, 782 insertions(+), 529 deletions(-) create mode 100644 mono/metadata/file-mmap-posix.c create mode 100644 mono/metadata/file-mmap-windows.c create mode 100644 mono/metadata/file-mmap.h diff --git a/mcs/class/System.Core/Microsoft.Win32.SafeHandles/SafeMemoryMappedViewHandle.cs b/mcs/class/System.Core/Microsoft.Win32.SafeHandles/SafeMemoryMappedViewHandle.cs index b7cf6b04c72..73f12afc504 100644 --- a/mcs/class/System.Core/Microsoft.Win32.SafeHandles/SafeMemoryMappedViewHandle.cs +++ b/mcs/class/System.Core/Microsoft.Win32.SafeHandles/SafeMemoryMappedViewHandle.cs @@ -37,14 +37,17 @@ namespace Microsoft.Win32.SafeHandles { public sealed class SafeMemoryMappedViewHandle : SafeBuffer { - internal SafeMemoryMappedViewHandle (IntPtr handle, long size) : base (true) { - this.handle = handle; + IntPtr mmap_handle; + + internal SafeMemoryMappedViewHandle (IntPtr mmap_handle, IntPtr base_address, long size) : base (true) { + this.mmap_handle = mmap_handle; + this.handle = base_address; Initialize ((ulong)size); } protected override bool ReleaseHandle () { if (this.handle != (IntPtr) (-1)) - return MemoryMapImpl.Unmap (this.handle, ByteLength); + return MemoryMapImpl.Unmap (this.mmap_handle); throw new NotImplementedException (); } } diff --git a/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedFile.cs b/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedFile.cs index 7fa4586a44b..feaaa5ab984 100644 --- a/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedFile.cs +++ b/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedFile.cs @@ -32,464 +32,84 @@ using System.Collections.Generic; using Microsoft.Win32.SafeHandles; using System.Runtime.InteropServices; - - -#if !MOBILE -using Mono.Unix.Native; -using Mono.Unix; -#else using System.Runtime.CompilerServices; -#endif + namespace System.IO.MemoryMappedFiles { - internal static partial class MemoryMapImpl { - static Exception ArgumentCapacity () - { - return new ArgumentException ("A positive capacity must be specified for a Memory Mapped File backed by an empty file."); - } - - static Exception CapacitySmallerThanSize () - { - return new ArgumentOutOfRangeException ("The capacity may not be smaller than the file size."); - } - } - - -#if !MOBILE - partial class MemoryMapImpl { - // - // Turns the FileMode into the first half of open(2) flags - // - static OpenFlags ToUnixMode (FileMode mode) - { - switch (mode){ - case FileMode.CreateNew: - return OpenFlags.O_CREAT | OpenFlags.O_EXCL; - - case FileMode.Create: - return OpenFlags.O_CREAT | OpenFlags.O_TRUNC; - - case FileMode.OpenOrCreate: - return OpenFlags.O_CREAT; - - case FileMode.Truncate: - return OpenFlags.O_TRUNC; - - case FileMode.Append: - return OpenFlags.O_APPEND; - default: - case FileMode.Open: - return 0; - } - } - - // - // Turns the MemoryMappedFileAccess into the second half of open(2) flags - // - static OpenFlags ToUnixMode (MemoryMappedFileAccess access) - { - switch (access){ - case MemoryMappedFileAccess.CopyOnWrite: - case MemoryMappedFileAccess.ReadWriteExecute: - case MemoryMappedFileAccess.ReadWrite: - return OpenFlags.O_RDWR; - - case MemoryMappedFileAccess.Write: - return OpenFlags.O_WRONLY; - - case MemoryMappedFileAccess.ReadExecute: - case MemoryMappedFileAccess.Read: - default: - return OpenFlags.O_RDONLY; - } - } - - static MmapProts ToUnixProts (MemoryMappedFileAccess access) - { - switch (access){ - case MemoryMappedFileAccess.ReadWrite: - return MmapProts.PROT_WRITE | MmapProts.PROT_READ; - - case MemoryMappedFileAccess.Write: - return MmapProts.PROT_WRITE; - - case MemoryMappedFileAccess.CopyOnWrite: - return MmapProts.PROT_WRITE | MmapProts.PROT_READ; - - case MemoryMappedFileAccess.ReadExecute: - return MmapProts.PROT_EXEC; - - case MemoryMappedFileAccess.ReadWriteExecute: - return MmapProts.PROT_WRITE | MmapProts.PROT_READ | MmapProts.PROT_EXEC; - - case MemoryMappedFileAccess.Read: - default: - return MmapProts.PROT_READ; - } - } - - internal static int Open (string path, FileMode mode, ref long capacity, MemoryMappedFileAccess access) - { - if (MonoUtil.IsUnix){ - Stat buf; - - int result = Syscall.stat (path, out buf); - - if (mode == FileMode.Truncate || mode == FileMode.Append || mode == FileMode.Open){ - if (result == -1) - UnixMarshal.ThrowExceptionForLastError (); - } - if (mode == FileMode.CreateNew && result == 0) - throw new IOException ("The file already exists"); - - if (result == 0){ - if (capacity == 0) { - // Special files such as FIFOs, sockets, and devices can - // have a size of 0. Specifying a capacity for these - // also makes little sense, so don't do the check if the - // file is one of these. - if (buf.st_size == 0 && - (buf.st_mode & (FilePermissions.S_IFCHR | - FilePermissions.S_IFBLK | - FilePermissions.S_IFIFO | - FilePermissions.S_IFSOCK)) == 0) { - throw ArgumentCapacity (); - } - - capacity = buf.st_size; - } else if (capacity < buf.st_size) { - throw CapacitySmallerThanSize (); - } - } else { - if (mode == FileMode.CreateNew){ - if (capacity == 0) - throw ArgumentCapacity (); - } - } - - int fd = Syscall.open (path, ToUnixMode (mode) | ToUnixMode (access), FilePermissions.DEFFILEMODE); - - if (fd == -1) - UnixMarshal.ThrowExceptionForLastError (); - return fd; - } - - throw new NotImplementedException (); - } - - internal static void CloseFD (int fd) { - Syscall.close (fd); - } - - internal static void Flush (int fd) { - if (MonoUtil.IsUnix) - Syscall.fsync (fd); - else - throw new NotImplementedException ("Not implemented on Windows"); - - } - - static int pagesize; - - internal static unsafe void Map (int file_handle, long offset, ref long size, MemoryMappedFileAccess access, out IntPtr map_addr, out int offset_diff) - { - if (!MonoUtil.IsUnix) - throw new NotImplementedException ("Not implemented on windows."); - - if (pagesize == 0) - pagesize = Syscall.getpagesize (); - - Stat buf; - Syscall.fstat (file_handle, out buf); - long fsize = buf.st_size; - - if (size == 0 || size > fsize) - size = fsize; - - // Align offset - long real_offset = offset & ~(pagesize - 1); - - offset_diff = (int)(offset - real_offset); - - // FIXME: Need to determine the unix fd for the file, Handle is only - // equal to it by accident - // - // The new API no longer uses FileStream everywhere, but exposes instead - // the filename (with one exception), we could move this API to use - // file descriptors instead of the FileStream plus its Handle. - // - map_addr = Syscall.mmap (IntPtr.Zero, (ulong) size, - ToUnixProts (access), - access == MemoryMappedFileAccess.CopyOnWrite ? MmapFlags.MAP_PRIVATE : MmapFlags.MAP_SHARED, - file_handle, real_offset); - - if (map_addr == (IntPtr)(-1)) - throw new IOException ("mmap failed for fd#" + file_handle + "(" + offset + ", " + size + ")"); - } - - internal static bool Unmap (IntPtr map_addr, ulong map_size) - { - if (!MonoUtil.IsUnix) - return false; - return Syscall.munmap (map_addr, map_size) == 0; - } - - static void ConfigureUnixFD (IntPtr handle, HandleInheritability h) - { - // TODO: Mono.Posix is lacking O_CLOEXEC definitions for fcntl. - } - - - [DllImport("kernel32", SetLastError = true)] - static extern bool SetHandleInformation (IntPtr hObject, int dwMask, int dwFlags); - static void ConfigureWindowsFD (IntPtr handle, HandleInheritability h) - { - SetHandleInformation (handle, 1 /* FLAG_INHERIT */, h == HandleInheritability.None ? 0 : 1); - } - - internal static void ConfigureFD (IntPtr handle, HandleInheritability inheritability) - { - if (MonoUtil.IsUnix) - ConfigureUnixFD (handle, inheritability); - else - ConfigureWindowsFD (handle, inheritability); - } - - } -#else - partial class MemoryMapImpl { - [DllImport ("libc")] - static extern int fsync (int fd); - - [DllImport ("libc")] - static extern int close (int fd); - - [DllImport ("libc")] - static extern int fcntl (int fd, int cmd, int arg0); - - //XXX check if android off_t is 64bits or not. on iOS / darwin it is. - [DllImport ("libc")] - static extern IntPtr mmap (IntPtr addr, IntPtr len, int prot, int flags, int fd, long offset); - - [DllImport ("libc")] - static extern int munmap (IntPtr addr, IntPtr size); - - [DllImport ("libc", SetLastError=true)] - static extern int open (string path, int flags, int access); - -#if MONODROID - [DllImport ("__Internal")] - static extern int monodroid_getpagesize (); - - static int getpagesize () - { - return monodroid_getpagesize (); - } -#else - [DllImport ("libc")] - static extern int getpagesize (); -#endif - + internal static class MemoryMapImpl { [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern long mono_filesize_from_path (string str); + static extern IntPtr OpenFileInternal (string path, FileMode mode, string mapName, out long capacity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, out int error); [MethodImplAttribute (MethodImplOptions.InternalCall)] - static extern long mono_filesize_from_fd (int fd); - - //Values valid on iOS/OSX and android ndk r6 - const int F_GETFD = 1; - const int F_SETFD = 2; - const int FD_CLOEXEC = 1; - const int DEFFILEMODE = 0x666; - - const int O_RDONLY = 0x0; - const int O_WRONLY = 0x1; - const int O_RDWR = 0x2; + static extern IntPtr OpenHandleInternal (IntPtr handle, string mapName, out long capacity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, out int error); - const int PROT_READ = 0x1; - const int PROT_WRITE = 0x2; - const int PROT_EXEC = 0x4; - - const int MAP_PRIVATE = 0x2; - const int MAP_SHARED = 0x1; - - const int EINVAL = 22; - -#if MONODROID - const int O_CREAT = 0x040; - const int O_TRUNC = 0x080; - const int O_EXCL = 0x200; - - const int ENAMETOOLONG = 63; -#else - /* MONOTOUCH - usr/include/sys/fcntl.h */ - const int O_CREAT = 0x0200; - const int O_TRUNC = 0x0400; - const int O_EXCL = 0x0800; - - // usr/include/sys/errno.h - const int ENAMETOOLONG = 63; -#endif + [MethodImplAttribute (MethodImplOptions.InternalCall)] + internal extern static void CloseMapping (IntPtr handle); - static int ToUnixMode (FileMode mode) - { - switch (mode) { - case FileMode.CreateNew: - return O_CREAT | O_EXCL; - - case FileMode.Create: - return O_CREAT | O_TRUNC; - - case FileMode.OpenOrCreate: - return O_CREAT; - - case FileMode.Truncate: - return O_TRUNC; - default: - case FileMode.Open: - return 0; - } - } + [MethodImplAttribute (MethodImplOptions.InternalCall)] + internal extern static void Flush (IntPtr file_handle); - // - // Turns the MemoryMappedFileAccess into the second half of open(2) flags - // - static int ToUnixMode (MemoryMappedFileAccess access) - { - switch (access) { - case MemoryMappedFileAccess.CopyOnWrite: - case MemoryMappedFileAccess.ReadWriteExecute: - case MemoryMappedFileAccess.ReadWrite: - return O_RDWR; - - case MemoryMappedFileAccess.Write: - return O_WRONLY; + [MethodImplAttribute (MethodImplOptions.InternalCall)] + internal extern static void ConfigureHandleInheritability (IntPtr handle, HandleInheritability inheritability); - case MemoryMappedFileAccess.ReadExecute: - case MemoryMappedFileAccess.Read: - default: - return O_RDONLY; - } - } + [MethodImplAttribute (MethodImplOptions.InternalCall)] + internal extern static bool Unmap (IntPtr mmap_handle); - static int ToUnixProts (MemoryMappedFileAccess access) - { - switch (access){ - case MemoryMappedFileAccess.ReadWrite: - return PROT_WRITE | PROT_READ; - - case MemoryMappedFileAccess.Write: - return PROT_WRITE; - - case MemoryMappedFileAccess.CopyOnWrite: - return PROT_WRITE | PROT_READ; - - case MemoryMappedFileAccess.ReadExecute: - return PROT_EXEC; - - case MemoryMappedFileAccess.ReadWriteExecute: - return PROT_WRITE | PROT_READ | PROT_EXEC; - - case MemoryMappedFileAccess.Read: + [MethodImplAttribute (MethodImplOptions.InternalCall)] + extern static int MapInternal (IntPtr handle, long offset, ref long size, MemoryMappedFileAccess access, out IntPtr mmap_handle, out IntPtr base_address); + + internal static void Map (IntPtr handle, long offset, ref long size, MemoryMappedFileAccess access, out IntPtr mmap_handle, out IntPtr base_address) + { + int error = MapInternal (handle, offset, ref size, access, out mmap_handle, out base_address); + if (error != 0) + throw CreateException (error, ""); + } + + static Exception CreateException (int error, string path) { + switch (error){ + case 1: + return new ArgumentException ("A positive capacity must be specified for a Memory Mapped File backed by an empty file."); + case 2: + return new ArgumentOutOfRangeException ("The capacity may not be smaller than the file size."); + case 3: + return new FileNotFoundException (path); + case 4: + return new IOException ("The file already exists"); + case 5: + return new PathTooLongException (); + case 6: + return new IOException ("Could not open file"); + case 7: + return new ArgumentException ("Capacity must be bigger than zero for non-file mappings"); + case 8: + return new ArgumentException ("Invalid FileMode value."); + case 9: + return new IOException ("Could not map file"); default: - return PROT_READ; + return new IOException ("Failed with unknown error code " + error); } } - static void ThrowErrorFromErrno (int errno) + internal static IntPtr OpenFile (string path, FileMode mode, string mapName, out long capacity, MemoryMappedFileAccess access, MemoryMappedFileOptions options) { - switch (errno) { - case EINVAL: throw new ArgumentException (); - case ENAMETOOLONG: throw new PathTooLongException (); - default: throw new IOException ("Failed with errno " + errno); - } - } - - internal static int Open (string path, FileMode mode, ref long capacity, MemoryMappedFileAccess access) - { - long file_size = mono_filesize_from_path (path); - - Console.WriteLine ("{0} is {1} big", path, file_size); - if (mode == FileMode.Truncate || mode == FileMode.Append || mode == FileMode.Open){ - if (file_size < 0) - throw new FileNotFoundException (path); - if (capacity == 0) - capacity = file_size; - if (capacity < file_size) - throw CapacitySmallerThanSize (); - } else { - if (mode == FileMode.CreateNew){ - if (file_size >= 0) - throw new IOException ("The file already exists"); - if (capacity == 0) - throw ArgumentCapacity (); - } - } - - int fd = open (path, ToUnixMode (mode) | ToUnixMode (access), DEFFILEMODE); - - if (fd == -1) - ThrowErrorFromErrno (Marshal.GetLastWin32Error ()); - return fd; - } - - internal static void CloseFD (int fd) - { - close (fd); - } - - internal static void Flush (int fd) - { - fsync (fd); - } - - internal static bool Unmap (IntPtr map_addr, ulong map_size) - { - return munmap (map_addr, (IntPtr)map_size) == 0; - } - - static int pagesize; - - internal static unsafe void Map (int file_handle, long offset, ref long size, MemoryMappedFileAccess access, out IntPtr map_addr, out int offset_diff) - { - if (pagesize == 0) - pagesize = getpagesize (); - - long fsize = mono_filesize_from_fd (file_handle); - if (fsize < 0) - throw new FileNotFoundException (); - - if (size == 0 || size > fsize) - size = fsize; - - // Align offset - long real_offset = offset & ~(pagesize - 1); - - offset_diff = (int)(offset - real_offset); - - map_addr = mmap (IntPtr.Zero, (IntPtr) size, - ToUnixProts (access), - access == MemoryMappedFileAccess.CopyOnWrite ? MAP_PRIVATE : MAP_SHARED, - file_handle, real_offset); - - if (map_addr == (IntPtr)(-1)) - throw new IOException ("mmap failed for fd#" + file_handle + "(" + offset + ", " + size + ")"); + int error = 0; + IntPtr res = OpenFileInternal (path, mode, mapName, out capacity, access, options, out error); + if (error != 0) + throw CreateException (error, path); + return res; } - internal static void ConfigureFD (IntPtr handle, HandleInheritability inheritability) + internal static IntPtr OpenHandle (IntPtr handle, string mapName, out long capacity, MemoryMappedFileAccess access, MemoryMappedFileOptions options) { - int fd = (int)handle; - int flags = fcntl (fd, F_GETFD, 0); - if (inheritability == HandleInheritability.None) - flags &= ~FD_CLOEXEC; - else - flags |= FD_CLOEXEC; - fcntl (fd, F_SETFD, flags); + int error = 0; + IntPtr res = OpenHandleInternal (handle, mapName, out capacity, access, options, out error); + if (error != 0) + throw CreateException (error, ""); + return res; } - } -#endif + public class MemoryMappedFile : IDisposable { MemoryMappedFileAccess fileAccess; @@ -504,7 +124,7 @@ public class MemoryMappedFile : IDisposable { // FileStream stream; bool keepOpen; - int unix_fd; + IntPtr handle; public static MemoryMappedFile CreateFromFile (string path) { @@ -513,7 +133,21 @@ public static MemoryMappedFile CreateFromFile (string path) public static MemoryMappedFile CreateFromFile (string path, FileMode mode) { - return CreateFromFile (path, mode, null, 0, MemoryMappedFileAccess.ReadWrite); + long capacity = 0; + if (path == null) + throw new ArgumentNullException ("path"); + if (path.Length == 0) + throw new ArgumentException ("path"); + if (mode == FileMode.Append) + throw new ArgumentException ("mode"); + + IntPtr handle = MemoryMapImpl.OpenFile (path, mode, null, out capacity, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.DelayAllocatePages); + + return new MemoryMappedFile () { + handle = handle, + fileAccess = MemoryMappedFileAccess.ReadWrite, + fileCapacity = capacity + }; } public static MemoryMappedFile CreateFromFile (string path, FileMode mode, string mapName) @@ -539,26 +173,21 @@ public static MemoryMappedFile CreateFromFile (string path, FileMode mode, strin if (capacity < 0) throw new ArgumentOutOfRangeException ("capacity"); - int fd = MemoryMapImpl.Open (path, mode, ref capacity, access); + IntPtr handle = MemoryMapImpl.OpenFile (path, mode, mapName, out capacity, access, MemoryMappedFileOptions.DelayAllocatePages); return new MemoryMappedFile () { - unix_fd = fd, + handle = handle, fileAccess = access, name = mapName, fileCapacity = capacity }; } -#if MOBILE - public static MemoryMappedFile CreateFromFile (FileStream fileStream, string mapName, long capacity, MemoryMappedFileAccess access, - HandleInheritability inheritability, - bool leaveOpen) -#else + [MonoLimitation ("memoryMappedFileSecurity is currently ignored")] public static MemoryMappedFile CreateFromFile (FileStream fileStream, string mapName, long capacity, MemoryMappedFileAccess access, MemoryMappedFileSecurity memoryMappedFileSecurity, HandleInheritability inheritability, bool leaveOpen) -#endif { if (fileStream == null) throw new ArgumentNullException ("fileStream"); @@ -567,86 +196,92 @@ public static MemoryMappedFile CreateFromFile (FileStream fileStream, string map if ((!MonoUtil.IsUnix && capacity == 0 && fileStream.Length == 0) || (capacity > fileStream.Length)) throw new ArgumentException ("capacity"); - MemoryMapImpl.ConfigureFD (fileStream.Handle, inheritability); + IntPtr handle = MemoryMapImpl.OpenHandle (fileStream.Handle, mapName, out capacity, access, MemoryMappedFileOptions.DelayAllocatePages); + + MemoryMapImpl.ConfigureHandleInheritability (handle, inheritability); return new MemoryMappedFile () { - stream = fileStream, + handle = handle, fileAccess = access, name = mapName, fileCapacity = capacity, + + stream = fileStream, keepOpen = leaveOpen }; } - [MonoLimitation ("CreateNew requires that mapName be a file name on Unix")] + + static MemoryMappedFile CoreShmCreate (string mapName, long capacity, MemoryMappedFileAccess access, + MemoryMappedFileOptions options, MemoryMappedFileSecurity memoryMappedFileSecurity, + HandleInheritability inheritability, FileMode mode) + { + if (mapName != null && mapName.Length == 0) + throw new ArgumentException ("mapName"); + if (capacity < 0) + throw new ArgumentOutOfRangeException ("capacity"); + + IntPtr handle = MemoryMapImpl.OpenFile (null, mode, mapName, out capacity, access, options); + + return new MemoryMappedFile () { + handle = handle, + fileAccess = access, + name = mapName, + fileCapacity = capacity + }; + } + + [MonoLimitation ("Named mappings scope is process local")] public static MemoryMappedFile CreateNew (string mapName, long capacity) { -#if MOBILE - return CreateNew (mapName, capacity, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.DelayAllocatePages, 0); -#else - return CreateNew (mapName, capacity, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.DelayAllocatePages, null, 0); -#endif + return CreateNew (mapName, capacity, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.DelayAllocatePages, null, HandleInheritability.None); } - [MonoLimitation ("CreateNew requires that mapName be a file name on Unix")] + [MonoLimitation ("Named mappings scope is process local")] public static MemoryMappedFile CreateNew (string mapName, long capacity, MemoryMappedFileAccess access) { -#if MOBILE - return CreateNew (mapName, capacity, access, MemoryMappedFileOptions.DelayAllocatePages, 0); -#else - return CreateNew (mapName, capacity, access, MemoryMappedFileOptions.DelayAllocatePages, null, 0); -#endif + return CreateNew (mapName, capacity, access, MemoryMappedFileOptions.DelayAllocatePages, null, HandleInheritability.None); } -#if MOBILE - public static MemoryMappedFile CreateNew (string mapName, long capacity, MemoryMappedFileAccess access, - MemoryMappedFileOptions options, - HandleInheritability handleInheritability) -#else - [MonoLimitation ("CreateNew requires that mapName be a file name on Unix; options and memoryMappedFileSecurity are ignored")] + [MonoLimitation ("Named mappings scope is process local; options and memoryMappedFileSecurity are ignored")] public static MemoryMappedFile CreateNew (string mapName, long capacity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, MemoryMappedFileSecurity memoryMappedFileSecurity, HandleInheritability inheritability) -#endif { - return CreateFromFile (mapName, FileMode.CreateNew, mapName, capacity, access); + return CoreShmCreate (mapName, capacity, access, options, memoryMappedFileSecurity, inheritability, FileMode.CreateNew); } - [MonoLimitation ("CreateOrOpen requires that mapName be a file name on Unix")] + [MonoLimitation ("Named mappings scope is process local")] public static MemoryMappedFile CreateOrOpen (string mapName, long capacity) { return CreateOrOpen (mapName, capacity, MemoryMappedFileAccess.ReadWrite); } - [MonoLimitation ("CreateOrOpen requires that mapName be a file name on Unix")] + [MonoLimitation ("Named mappings scope is process local")] public static MemoryMappedFile CreateOrOpen (string mapName, long capacity, MemoryMappedFileAccess access) { - return CreateFromFile (mapName, FileMode.OpenOrCreate, mapName, capacity, access); + return CreateOrOpen (mapName, capacity, access, MemoryMappedFileOptions.DelayAllocatePages, null, HandleInheritability.None); } - [MonoTODO] -#if MOBILE - public static MemoryMappedFile CreateOrOpen (string mapName, long capacity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, HandleInheritability inheritability) -#else + [MonoLimitation ("Named mappings scope is process local")] public static MemoryMappedFile CreateOrOpen (string mapName, long capacity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, MemoryMappedFileSecurity memoryMappedFileSecurity, HandleInheritability inheritability) -#endif { - throw new NotImplementedException (); + return CoreShmCreate (mapName, capacity, access, options, memoryMappedFileSecurity, inheritability, FileMode.OpenOrCreate); } - [MonoTODO] + [MonoLimitation ("Named mappings scope is process local")] public static MemoryMappedFile OpenExisting (string mapName) { throw new NotImplementedException (); } - [MonoTODO] + [MonoLimitation ("Named mappings scope is process local")] public static MemoryMappedFile OpenExisting (string mapName, MemoryMappedFileRights desiredAccessRights) { throw new NotImplementedException (); } - [MonoTODO] + [MonoLimitation ("Named mappings scope is process local")] public static MemoryMappedFile OpenExisting (string mapName, MemoryMappedFileRights desiredAccessRights, HandleInheritability inheritability) { throw new NotImplementedException (); @@ -654,7 +289,7 @@ public static MemoryMappedFile OpenExisting (string mapName, MemoryMappedFileRig public MemoryMappedViewStream CreateViewStream () { - return CreateViewStream (0, 0); + return CreateViewStream (0, 0);//FIXME this is wrong } public MemoryMappedViewStream CreateViewStream (long offset, long size) @@ -664,7 +299,7 @@ public MemoryMappedViewStream CreateViewStream (long offset, long size) public MemoryMappedViewStream CreateViewStream (long offset, long size, MemoryMappedFileAccess access) { - return new MemoryMappedViewStream (stream != null ? (int)stream.Handle : unix_fd, offset, size, access); + return new MemoryMappedViewStream (handle, offset, size, access); } public MemoryMappedViewAccessor CreateViewAccessor () @@ -679,9 +314,7 @@ public MemoryMappedViewAccessor CreateViewAccessor (long offset, long size) public MemoryMappedViewAccessor CreateViewAccessor (long offset, long size, MemoryMappedFileAccess access) { - int file_handle = stream != null ? (int) stream.Handle : unix_fd; - - return new MemoryMappedViewAccessor (file_handle, offset, size, access); + return new MemoryMappedViewAccessor (handle, offset, size, access); } MemoryMappedFile () @@ -699,17 +332,15 @@ protected virtual void Dispose (bool disposing) if (stream != null){ if (keepOpen == false) stream.Close (); - unix_fd = -1; stream = null; } - if (unix_fd != -1) { - MemoryMapImpl.CloseFD (unix_fd); - unix_fd = -1; + if (handle != IntPtr.Zero) { + MemoryMapImpl.CloseMapping (handle); + handle = IntPtr.Zero; } } } -#if !MOBILE [MonoTODO] public MemoryMappedFileSecurity GetAccessControl () { @@ -721,7 +352,6 @@ public void SetAccessControl (MemoryMappedFileSecurity memoryMappedFileSecurity) { throw new NotImplementedException (); } -#endif [MonoTODO] public SafeMemoryMappedFileHandle SafeMemoryMappedFileHandle { diff --git a/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedViewAccessor.cs b/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedViewAccessor.cs index 0535337210d..c66acdb55c6 100644 --- a/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedViewAccessor.cs +++ b/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedViewAccessor.cs @@ -36,14 +36,12 @@ namespace System.IO.MemoryMappedFiles { public sealed class MemoryMappedViewAccessor : UnmanagedMemoryAccessor, IDisposable { - int file_handle; - IntPtr mmap_addr; - SafeMemoryMappedViewHandle handle; + IntPtr mmap_handle; + SafeMemoryMappedViewHandle safe_handle; - internal MemoryMappedViewAccessor (int file_handle, long offset, long size, MemoryMappedFileAccess access) + internal MemoryMappedViewAccessor (IntPtr handle, long offset, long size, MemoryMappedFileAccess access) { - this.file_handle = file_handle; - Create (offset, size, access); + Create (handle, offset, size, access); } static FileAccess ToFileAccess (MemoryMappedFileAccess access) @@ -64,19 +62,19 @@ static FileAccess ToFileAccess (MemoryMappedFileAccess access) } } - unsafe void Create (long offset, long size, MemoryMappedFileAccess access) + unsafe void Create (IntPtr handle, long offset, long size, MemoryMappedFileAccess access) { - int offset_diff; + IntPtr base_address; - MemoryMapImpl.Map (file_handle, offset, ref size, access, out mmap_addr, out offset_diff); + MemoryMapImpl.Map (handle, offset, ref size, access, out mmap_handle, out base_address); + safe_handle = new SafeMemoryMappedViewHandle (mmap_handle, base_address, size); - handle = new SafeMemoryMappedViewHandle ((IntPtr)((long)mmap_addr + offset_diff), size); - Initialize (handle, 0, size, ToFileAccess (access)); + Initialize (safe_handle, 0, size, ToFileAccess (access)); } public SafeMemoryMappedViewHandle SafeMemoryMappedViewHandle { get { - return handle; + return safe_handle; } } @@ -91,7 +89,7 @@ void IDisposable.Dispose () { public void Flush () { - MemoryMapImpl.Flush (file_handle); + MemoryMapImpl.Flush (mmap_handle); } } } diff --git a/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedViewStream.cs b/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedViewStream.cs index 0f6aa75dc42..651e2d0d262 100644 --- a/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedViewStream.cs +++ b/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedViewStream.cs @@ -35,15 +35,12 @@ namespace System.IO.MemoryMappedFiles { public sealed class MemoryMappedViewStream : UnmanagedMemoryStream { - IntPtr mmap_addr; - ulong mmap_size; + IntPtr mmap_handle; object monitor; - int fd; - internal MemoryMappedViewStream (int fd, long offset, long size, MemoryMappedFileAccess access) { - this.fd = fd; + internal MemoryMappedViewStream (IntPtr handle, long offset, long size, MemoryMappedFileAccess access) { monitor = new Object (); - CreateStream (fd, offset, size, access); + CreateStream (handle, offset, size, access); } public SafeMemoryMappedViewHandle SafeMemoryMappedViewHandle { @@ -52,13 +49,13 @@ public SafeMemoryMappedViewHandle SafeMemoryMappedViewHandle { } } - unsafe void CreateStream (int fd, long offset, long size, MemoryMappedFileAccess access) + unsafe void CreateStream (IntPtr handle, long offset, long size, MemoryMappedFileAccess access) { - int offset_diff; - mmap_size = (ulong) size; - MemoryMapImpl.Map (fd, offset, ref size, access, out mmap_addr, out offset_diff); - FileAccess faccess; + IntPtr base_address; + + MemoryMapImpl.Map (handle, offset, ref size, access, out mmap_handle, out base_address); + FileAccess faccess; switch (access) { case MemoryMappedFileAccess.ReadWrite: faccess = FileAccess.ReadWrite; @@ -72,23 +69,23 @@ unsafe void CreateStream (int fd, long offset, long size, MemoryMappedFileAccess default: throw new NotImplementedException ("access mode " + access + " not supported."); } - Initialize ((byte*)mmap_addr + offset_diff, size, size, faccess); + Initialize ((byte*)base_address, size, size, faccess); } protected override void Dispose (bool disposing) { base.Dispose (disposing); lock (monitor) { - if (mmap_addr != (IntPtr)(-1)) { - MemoryMapImpl.Unmap (mmap_addr, mmap_size); - mmap_addr = (IntPtr)(-1); + if (mmap_handle != (IntPtr)(-1)) { + MemoryMapImpl.Unmap (mmap_handle); + mmap_handle = (IntPtr)(-1); } } } public override void Flush () { - MemoryMapImpl.Flush (fd); + MemoryMapImpl.Flush (mmap_handle); } } } diff --git a/mono/metadata/Makefile.am.in b/mono/metadata/Makefile.am.in index 92fc55dc658..70591c7ba41 100644 --- a/mono/metadata/Makefile.am.in +++ b/mono/metadata/Makefile.am.in @@ -193,7 +193,11 @@ common_sources = \ verify.c \ verify-internals.h \ wrapper-types.h \ - reflection-internals.h + reflection-internals.h \ + file-mmap-posix.c \ + file-mmap-windows.c \ + file-mmap.h + # These source files have compile time dependencies on GC code gc_dependent_sources = \ diff --git a/mono/metadata/file-mmap-posix.c b/mono/metadata/file-mmap-posix.c new file mode 100644 index 00000000000..afd97b22ed5 --- /dev/null +++ b/mono/metadata/file-mmap-posix.c @@ -0,0 +1,514 @@ +/* + * file-mmap-posix.c: File mmap internal calls + * + * Author: + * Rodrigo Kumpera + * + * Copyright 2014 Xamarin Inc (http://www.xamarin.com) + */ + +#include + +#ifndef TARGET_WIN32 + +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#if HAVE_SYS_MMAN_H +#include +#endif + +#include + + +#include +#include +#include +#include +#include +#include + +enum { + MMAP_KIND_FILE = 1, + MMAP_KIND_MEMORY = 2 +}; + +typedef struct { + int kind; + int ref_count; + gint64 capacity; + char *name; +} Handle; + +typedef struct { + Handle handle; + int fd; +} FileHandle; + +typedef struct { + Handle handle; + void *address; + size_t length; +} MemoryHandle; + +typedef struct { + void *address; + void *free_handle; + int kind; + size_t length; +} MmapHandle; + +enum { + BAD_CAPACITY_FOR_FILE_BACKED = 1, + CAPACITY_SMALLER_THAN_FILE_SIZE, + FILE_NOT_FOUND, + FILE_ALREADY_EXISTS, + PATH_TOO_LONG, + COULD_NOT_OPEN, + CAPACITY_MUST_BE_POSITIVE, + INVALID_FILE_MODE, + COULD_NOT_MAP_MEMORY +}; + +enum { + FILE_MODE_CREATE_NEW = 1, + FILE_MODE_CREATE = 2, + FILE_MODE_OPEN = 3, + FILE_MODE_OPEN_OR_CREATE = 4, + FILE_MODE_TRUNCATE = 5, + FILE_MODE_APPEND = 6, +}; + +enum { + MMAP_FILE_ACCESS_READ_WRITE = 0, + MMAP_FILE_ACCESS_READ = 1, + MMAP_FILE_ACCESS_WRITE = 2, + MMAP_FILE_ACCESS_COPY_ON_WRITE = 3, + MMAP_FILE_ACCESS_READ_EXECUTE = 4, + MMAP_FILE_ACCESS_READ_WRITE_EXECUTE = 5, +}; + + +static int mmap_init_state; +static mono_mutex_t named_regions_mutex; +static GHashTable *named_regions; + + +static gint64 +align_up_to_page_size (gint64 size) +{ + gint64 page_size = mono_pagesize (); + return (size + page_size - 1) & ~(page_size - 1); +} + +static gint64 +align_down_to_page_size (gint64 size) +{ + gint64 page_size = mono_pagesize (); + return size & ~(page_size - 1); +} + +static void +file_mmap_init (void) +{ +retry: + switch (mmap_init_state) { + case 0: + if (InterlockedCompareExchange (&mmap_init_state, 1, 0) != 0) + goto retry; + named_regions = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); + mono_mutex_init (&named_regions_mutex); + + mono_atomic_store_release (&mmap_init_state, 2); + break; + + case 1: + do { + g_usleep (1000); /* Been init'd by other threads, this is very rare. */ + } while (mmap_init_state != 2); + break; + case 2: + break; + default: + g_error ("Invalid init state %d", mmap_init_state); + } +} + +static void +named_regions_lock (void) +{ + file_mmap_init (); + mono_mutex_lock (&named_regions_mutex); +} + +static void +named_regions_unlock (void) +{ + mono_mutex_unlock (&named_regions_mutex); +} + + +static int +file_mode_to_unix (int mode) +{ + switch (mode) { + case FILE_MODE_CREATE_NEW: + return O_CREAT | O_EXCL; + case FILE_MODE_CREATE: + return O_CREAT | O_TRUNC; + case FILE_MODE_OPEN: + return 0; + case FILE_MODE_OPEN_OR_CREATE: + return O_CREAT; + case FILE_MODE_TRUNCATE: + return O_TRUNC; + case FILE_MODE_APPEND: + return O_APPEND; + default: + g_error ("unknown FileMode %d", mode); + } +} + +static int +access_mode_to_unix (int access) +{ + switch (access) { + case MMAP_FILE_ACCESS_READ_WRITE: + case MMAP_FILE_ACCESS_COPY_ON_WRITE: + case MMAP_FILE_ACCESS_READ_WRITE_EXECUTE: + return O_RDWR; + case MMAP_FILE_ACCESS_READ: + case MMAP_FILE_ACCESS_READ_EXECUTE: + return O_RDONLY; + case MMAP_FILE_ACCESS_WRITE: + return O_WRONLY; + default: + g_error ("unknown MemoryMappedFileAccess %d", access); + } +} + +static int +acess_to_mmap_flags (int access) +{ + switch (access) { + case MMAP_FILE_ACCESS_READ_WRITE: + return MONO_MMAP_WRITE | MONO_MMAP_READ | MONO_MMAP_PRIVATE; + + case MMAP_FILE_ACCESS_WRITE: + return MONO_MMAP_WRITE | MONO_MMAP_PRIVATE; + + case MMAP_FILE_ACCESS_COPY_ON_WRITE: + return MONO_MMAP_WRITE | MONO_MMAP_READ; + + case MMAP_FILE_ACCESS_READ_EXECUTE: + return MONO_MMAP_EXEC | MONO_MMAP_PRIVATE | MONO_MMAP_SHARED; + + case MMAP_FILE_ACCESS_READ_WRITE_EXECUTE: + return MONO_MMAP_WRITE | MONO_MMAP_READ | MONO_MMAP_EXEC | MONO_MMAP_PRIVATE; + + case MMAP_FILE_ACCESS_READ: + return MONO_MMAP_READ | MONO_MMAP_PRIVATE; + default: + g_error ("unknown MemoryMappedFileAccess %d", access); + } +} + +/* +XXX implement options +*/ +static void* +open_file_map (MonoString *path, int input_fd, int mode, gint64 *capacity, int access, int options, int *error) +{ + struct stat buf; + char *c_path = path ? mono_string_to_utf8 (path) : NULL; + FileHandle *handle = NULL; + int result, fd; + + if (path) + result = stat (c_path, &buf); + else + result = fstat (input_fd, &buf); + + if (mode == FILE_MODE_TRUNCATE || mode == FILE_MODE_APPEND || mode == FILE_MODE_OPEN) { + if (result == -1) { //XXX translate errno? + *error = FILE_NOT_FOUND; + goto done; + } + } + + if (mode == FILE_MODE_CREATE_NEW && result == 0) { + *error = FILE_ALREADY_EXISTS; + goto done; + } + + if (result == 0) { + if (*capacity == 0) { + /** + * Special files such as FIFOs, sockets, and devices can have a size of 0. Specifying a capacity for these + * also makes little sense, so don't do the check if th file is one of these. + */ + if (buf.st_size == 0 && (buf.st_mode & (S_IFCHR | S_IFBLK | S_IFIFO | S_IFSOCK)) == 0) { + *error = CAPACITY_SMALLER_THAN_FILE_SIZE; + goto done; + } + *capacity = buf.st_size; + } else if (*capacity < buf.st_size) { + *error = CAPACITY_SMALLER_THAN_FILE_SIZE; + goto done; + } + } else { + if (mode == FILE_MODE_CREATE_NEW && *capacity == 0) { + *error = CAPACITY_SMALLER_THAN_FILE_SIZE; + goto done; + } + } + + if (path) //FIXME use io portability? + fd = open (c_path, file_mode_to_unix (mode) | access_mode_to_unix (access), DEFFILEMODE); + else + fd = dup (input_fd); + + if (fd == -1) { //XXX translate errno? + *error = COULD_NOT_OPEN; + goto done; + } + + *capacity = align_up_to_page_size ((size_t)*capacity); + + if (*capacity > buf.st_size) + ftruncate (fd, (off_t)*capacity); + + handle = g_new0 (FileHandle, 1); + handle->handle.kind = MMAP_KIND_FILE; + handle->handle.ref_count = 1; + handle->handle.capacity = *capacity; + handle->fd = fd; + +done: + g_free (c_path); + return (void*)handle; +} + +static void* +open_memory_map (MonoString *mapName, int mode, gint64 *capacity, int access, int options, int *error) +{ + char *c_mapName; + MemoryHandle *handle; + if (*capacity <= 1) { + *error = CAPACITY_MUST_BE_POSITIVE; + return NULL; + } + + if (!(mode == FILE_MODE_CREATE_NEW || mode == FILE_MODE_OPEN_OR_CREATE || mode == FILE_MODE_OPEN)) { + *error = INVALID_FILE_MODE; + return NULL; + } + + c_mapName = mono_string_to_utf8 (mapName); + + named_regions_lock (); + handle = (MemoryHandle*)g_hash_table_lookup (named_regions, c_mapName); + if (handle) { + if (mode == FILE_MODE_CREATE_NEW) + *error = FILE_ALREADY_EXISTS; + + handle->handle.ref_count++; + //XXX should we ftruncate if the file is smaller than capacity? + } else { + if (mode == FILE_MODE_OPEN) + *error = FILE_NOT_FOUND; + + *capacity = align_up_to_page_size (*capacity); + + handle = g_new0 (MemoryHandle, 1); + handle->handle.kind = MMAP_KIND_MEMORY; + handle->handle.ref_count = 1; + handle->handle.capacity = *capacity; + handle->handle.name = g_strdup (c_mapName); + + //FIXME compute RWX from access + handle->address = mono_valloc (NULL, (size_t)*capacity, MONO_MMAP_READ | MONO_MMAP_WRITE | MONO_MMAP_PRIVATE | MONO_MMAP_ANON); + handle->length = (size_t)*capacity; + g_hash_table_insert (named_regions, handle->handle.name, handle); + } + + named_regions_unlock (); + + g_free (c_mapName); + return handle; +} + + +void * +mono_mmap_open_file (MonoString *path, int mode, MonoString *mapName, gint64 *capacity, int access, int options, int *error) +{ + g_assert (path || mapName); + + if (!mapName) + return open_file_map (path, -1, mode, capacity, access, options, error); + + if (path) { + FileHandle *file_handle; + char *c_mapName = mono_string_to_utf8 (mapName); + + named_regions_lock (); + file_handle = (FileHandle*)g_hash_table_lookup (named_regions, c_mapName); + if (file_handle) { + *error = FILE_ALREADY_EXISTS; + file_handle = NULL; + } else { + file_handle = open_file_map (path, -1, mode, capacity, access, options, error); + if (file_handle) { + file_handle->handle.name = g_strdup (c_mapName); + g_hash_table_insert (named_regions, file_handle->handle.name, file_handle); + } + } + named_regions_unlock (); + + g_free (c_mapName); + return file_handle; + } + + return open_memory_map (mapName, mode, capacity, access, options, error); +} + +void * +mono_mmap_open_handle (void *handle, MonoString *mapName, gint64 *capacity, int access, int options, int *error) +{ + FileHandle *file_handle; + char *c_mapName = mono_string_to_utf8 (mapName); + + named_regions_lock (); + file_handle = (FileHandle*)g_hash_table_lookup (named_regions, c_mapName); + if (file_handle) { + *error = FILE_ALREADY_EXISTS; + file_handle = NULL; + } else { + //XXX we're exploiting wapi HANDLE == FD equivalence. THIS IS FRAGILE, create a _wapi_handle_to_fd call + file_handle = open_file_map (NULL, GPOINTER_TO_INT (handle), FILE_MODE_OPEN, capacity, access, options, error); + file_handle->handle.name = g_strdup (c_mapName); + g_hash_table_insert (named_regions, file_handle->handle.name, file_handle); + } + named_regions_unlock (); + + g_free (c_mapName); + return file_handle; +} + +void +mono_mmap_close (void *mmap_handle) +{ + Handle *handle = mmap_handle; + + named_regions_lock (); + --handle->ref_count; + if (handle->ref_count == 0) { + if (handle->name) + g_hash_table_remove (named_regions, handle->name); + + g_free (handle->name); + if (handle->kind == MMAP_KIND_MEMORY) + mono_vfree (((MemoryHandle*)handle)->address, ((MemoryHandle*)handle)->length); + else + close (((FileHandle*)handle)->fd); + g_free (handle); + } + named_regions_unlock (); +} + +void +mono_mmap_configure_inheritability (void *mmap_handle, gboolean inheritability) +{ + FileHandle *h = mmap_handle; + int fd, flags; + + if (h->handle.kind != MMAP_KIND_FILE) + return; + + fd = h->fd; + flags = fcntl (fd, F_GETFD, 0); + if (inheritability) + flags &= ~FD_CLOEXEC; + else + flags |= FD_CLOEXEC; + fcntl (fd, F_SETFD, flags); +} + +void +mono_mmap_flush (void *mmap_handle) +{ + MmapHandle *h = mmap_handle; + + if (h) + msync (h->address, h->length, MS_SYNC); +} + +int +mono_mmap_map (void *handle, gint64 offset, gint64 *size, int access, void **mmap_handle, void **base_address) +{ + gint64 mmap_offset = 0; + Handle *h = handle; + MmapHandle res = { 0 }; + if (h->kind == MMAP_KIND_FILE) { + FileHandle *fh = (FileHandle*)h; + size_t eff_size = *size; + struct stat buf = { 0 }; + fstat (fh->fd, &buf); //FIXME error handling + + if (eff_size == 0 || eff_size > buf.st_size) + eff_size = buf.st_size; + *size = eff_size; + + mmap_offset = align_down_to_page_size (offset); + eff_size += (offset - mmap_offset); + //FIXME translate some interesting errno values + res.address = mono_file_map ((size_t)eff_size, acess_to_mmap_flags (access), fh->fd, mmap_offset, &res.free_handle); + res.length = eff_size; + res.kind = MMAP_KIND_FILE; + + } else { + MemoryHandle *mh = (MemoryHandle*)h; + size_t eff_size = *size; + + if (!eff_size) + eff_size = *size = mh->length; + mmap_offset = (size_t)mmap_offset; + res.address = (char*)mh->address + offset; + res.length = (size_t)size; + res.kind = MMAP_KIND_MEMORY; + } + + if (res.address) { + *mmap_handle = g_memdup (&res, sizeof (MmapHandle)); + *base_address = (char*)res.address + (offset - mmap_offset); + return 0; + } + + *mmap_handle = NULL; + *base_address = NULL; + return COULD_NOT_MAP_MEMORY; +} + +gboolean +mono_mmap_unmap (void *mmap_handle) +{ + int res = 0; + MmapHandle *h = mmap_handle; + + if (h->kind == MMAP_KIND_FILE) + res = mono_file_unmap (h->address, h->free_handle); + + g_free (h); + return res == 0; +} + +#endif diff --git a/mono/metadata/file-mmap-windows.c b/mono/metadata/file-mmap-windows.c new file mode 100644 index 00000000000..78203ad47a8 --- /dev/null +++ b/mono/metadata/file-mmap-windows.c @@ -0,0 +1,70 @@ +/* + * file-mmap-posix.c: File mmap internal calls + * + * Author: + * Rodrigo Kumpera + * + * Copyright 2014 Xamarin Inc (http://www.xamarin.com) + */ + +#include + +#ifdef TARGET_WIN32 + +#include +#include +#include + + +#include +#include + +void * +mono_mmap_open_file (MonoString *path, int mode, MonoString *mapName, gint64 *capacity, int access, int options, int *error) +{ + g_error ("No windows backend"); + return NULL; +} + +void * +mono_mmap_open_handle (void *handle, MonoString *mapName, gint64 *capacity, int access, int options, int *error) +{ + g_error ("No windows backend"); + return NULL; +} + +void +mono_mmap_close (void *mmap_handle) +{ + g_error ("No windows backend"); +} + +void +mono_mmap_configure_inheritability (void *mmap_handle, gboolean inheritability) +{ + g_error ("No windows backend"); +} + +void +mono_mmap_flush (void *mmap_handle) +{ + g_error ("No windows backend"); +} + + + +int +mono_mmap_map (void *handle, gint64 offset, gint64 *size, int access, void **mmap_handle, void **base_address) +{ + g_error ("No windows backend"); + return 0; +} + +gboolean +mono_mmap_unmap (void *mmap_handle) +{ + g_error ("No windows backend"); + return TRUE; +} + +#endif diff --git a/mono/metadata/file-mmap.h b/mono/metadata/file-mmap.h new file mode 100644 index 00000000000..1d750167254 --- /dev/null +++ b/mono/metadata/file-mmap.h @@ -0,0 +1,34 @@ +/* + * file-mmap.h: Managed mmap wrappers. + * + * Authors: + * Rodrigo Kumpera + * + * Copyright 2014 Xamarin Inc (http://www.xamarin.com) + */ + +#ifndef _MONO_METADATA_FILE_MMAP_H_ +#define _MONO_METADATA_FILE_MMAP_H_ + +#include +#include + +#include +#include +#include + +extern void mono_mmap_close (void *mmap_handle) MONO_INTERNAL; + +extern void mono_mmap_configure_inheritability (void *mmap_handle, gboolean inheritability) MONO_INTERNAL; + +extern void mono_mmap_flush (void *mmap_handle) MONO_INTERNAL; + +extern void *mono_mmap_open_file (MonoString *string, int mode, MonoString *mapName, gint64 *capacity, int access, int options, int *error) MONO_INTERNAL; + +extern void *mono_mmap_open_handle (void *handle, MonoString *mapName, gint64 *capacity, int access, int options, int *error) MONO_INTERNAL; + +extern int mono_mmap_map (void *handle, gint64 offset, gint64 *size, int access, void **mmap_handle, void **base_address) MONO_INTERNAL; + +extern gboolean mono_mmap_unmap (void *base_address) MONO_INTERNAL; + +#endif /* _MONO_METADATA_FILE_MMAP_H_ */ diff --git a/mono/metadata/icall-def.h b/mono/metadata/icall-def.h index 0582798fc79..028319dcfe0 100644 --- a/mono/metadata/icall-def.h +++ b/mono/metadata/icall-def.h @@ -315,12 +315,14 @@ ICALL(INOW_1, "AddWatch", ves_icall_System_IO_InotifyWatcher_AddWatch) ICALL(INOW_2, "GetInotifyInstance", ves_icall_System_IO_InotifyWatcher_GetInotifyInstance) ICALL(INOW_3, "RemoveWatch", ves_icall_System_IO_InotifyWatcher_RemoveWatch) -#if defined (TARGET_IOS) || defined (TARGET_ANDROID) ICALL_TYPE(MMAPIMPL, "System.IO.MemoryMappedFiles.MemoryMapImpl", MMAPIMPL_1) -ICALL(MMAPIMPL_1, "mono_filesize_from_fd", mono_filesize_from_fd) -ICALL(MMAPIMPL_2, "mono_filesize_from_path", mono_filesize_from_path) -#endif - +ICALL(MMAPIMPL_1, "CloseMapping", mono_mmap_close) +ICALL(MMAPIMPL_2, "ConfigureHandleInheritability", mono_mmap_configure_inheritability) +ICALL(MMAPIMPL_3, "Flush", mono_mmap_flush) +ICALL(MMAPIMPL_4, "MapInternal", mono_mmap_map) +ICALL(MMAPIMPL_5, "OpenFileInternal", mono_mmap_open_file) +ICALL(MMAPIMPL_6, "OpenHandleInternal", mono_mmap_open_handle) +ICALL(MMAPIMPL_7, "Unmap", mono_mmap_unmap) ICALL_TYPE(MONOIO, "System.IO.MonoIO", MONOIO_1) ICALL(MONOIO_1, "Close(intptr,System.IO.MonoIOError&)", ves_icall_System_IO_MonoIO_Close) diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c index b05892a7a2a..b320933a0a8 100644 --- a/mono/metadata/icall.c +++ b/mono/metadata/icall.c @@ -75,6 +75,7 @@ #include #include #include +#include #include #include #include From c5c1dc716e75506b184527c33de0809e1896e9f5 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Fri, 13 Jun 2014 14:35:55 -0400 Subject: [PATCH 215/694] [runtime] Fix share/private flags when doing file mmap. --- mono/metadata/file-mmap-posix.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mono/metadata/file-mmap-posix.c b/mono/metadata/file-mmap-posix.c index afd97b22ed5..6066136e65a 100644 --- a/mono/metadata/file-mmap-posix.c +++ b/mono/metadata/file-mmap-posix.c @@ -201,22 +201,22 @@ acess_to_mmap_flags (int access) { switch (access) { case MMAP_FILE_ACCESS_READ_WRITE: - return MONO_MMAP_WRITE | MONO_MMAP_READ | MONO_MMAP_PRIVATE; + return MONO_MMAP_WRITE | MONO_MMAP_READ | MONO_MMAP_SHARED; case MMAP_FILE_ACCESS_WRITE: - return MONO_MMAP_WRITE | MONO_MMAP_PRIVATE; + return MONO_MMAP_WRITE | MONO_MMAP_SHARED; case MMAP_FILE_ACCESS_COPY_ON_WRITE: - return MONO_MMAP_WRITE | MONO_MMAP_READ; + return MONO_MMAP_WRITE | MONO_MMAP_READ | MONO_MMAP_PRIVATE; case MMAP_FILE_ACCESS_READ_EXECUTE: return MONO_MMAP_EXEC | MONO_MMAP_PRIVATE | MONO_MMAP_SHARED; case MMAP_FILE_ACCESS_READ_WRITE_EXECUTE: - return MONO_MMAP_WRITE | MONO_MMAP_READ | MONO_MMAP_EXEC | MONO_MMAP_PRIVATE; + return MONO_MMAP_WRITE | MONO_MMAP_READ | MONO_MMAP_EXEC | MONO_MMAP_SHARED; case MMAP_FILE_ACCESS_READ: - return MONO_MMAP_READ | MONO_MMAP_PRIVATE; + return MONO_MMAP_READ | MONO_MMAP_SHARED; default: g_error ("unknown MemoryMappedFileAccess %d", access); } From 66aaa61cb7a33ffd84458e207ba780a3716a5023 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Fri, 13 Jun 2014 14:47:54 -0400 Subject: [PATCH 216/694] [System.Core] Add new tests for MemoryMappedFile. --- .../MemoryMappedFileTest.cs | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/mcs/class/System.Core/Test/System.IO.MemoryMappedFiles/MemoryMappedFileTest.cs b/mcs/class/System.Core/Test/System.IO.MemoryMappedFiles/MemoryMappedFileTest.cs index 5dee58b704b..8e47c0a8fff 100644 --- a/mcs/class/System.Core/Test/System.IO.MemoryMappedFiles/MemoryMappedFileTest.cs +++ b/mcs/class/System.Core/Test/System.IO.MemoryMappedFiles/MemoryMappedFileTest.cs @@ -51,6 +51,13 @@ void AssertThrows (Action del) where ExType : Exception { Assert.IsTrue (thrown); } + static int named_index; + static String MkNamedMapping () + { + return "test-" + named_index++; + } + + static string tempDir = Path.Combine (Path.GetTempPath (), typeof (MemoryMappedFileTest).FullName); string fname; @@ -206,6 +213,98 @@ public unsafe void ViewReadArray () { Assert.AreEqual ("Hello", s); } } + + + [Test] + public void NamedMappingToInvalidFile () + { + var fileName = Path.Combine (tempDir, "temp_file_123"); + if (File.Exists (fileName)) + File.Delete (fileName); + var memoryMappedFile90 = MemoryMappedFile.CreateNew (fileName, 4194304, MemoryMappedFileAccess.ReadWrite); + memoryMappedFile90.CreateViewStream (4186112, 3222, MemoryMappedFileAccess.Write); + } + + [Test] + public void CreateTheSameAreaTwiceShouldFail () + { + var name = MkNamedMapping (); + using (var m0 = MemoryMappedFile.CreateNew(name, 4096, MemoryMappedFileAccess.ReadWrite)) { + try { + using (var m1 = MemoryMappedFile.CreateNew (name, 4096, MemoryMappedFileAccess.ReadWrite)) { + Assert.Fail ("Must fail"); + } + } catch (IOException) {} + } + } + + [Test] + public void MapAFileToAMemoryAreaShouldFail () + { + var name = MkNamedMapping (); + using (var m0 = MemoryMappedFile.CreateNew(name, 4096, MemoryMappedFileAccess.ReadWrite)) { + try { + using (var m1 = MemoryMappedFile.CreateFromFile (fname, FileMode.OpenOrCreate, name)) { + Assert.Fail ("Must fail"); + } + } catch (IOException) {} + } + } + + [Test] + public void NamedMappingsShareMemoryArea () + { + var name = MkNamedMapping (); + using (var m0 = MemoryMappedFile.CreateNew(name, 4096, MemoryMappedFileAccess.ReadWrite)) { + using (var m1 = MemoryMappedFile.CreateOrOpen (name, 4096, MemoryMappedFileAccess.ReadWrite)) { + using (MemoryMappedViewAccessor v0 = m0.CreateViewAccessor (), v1 = m1.CreateViewAccessor ()) { + v0.Write (10, 0x12345); + Assert.AreEqual (0x12345, v1.ReadInt32 (10)); + } + } + } + } + + [Test] + public void NamedFileCanBeOpen () + { + var name = MkNamedMapping (); + using (var sw = new FileStream (fname, FileMode.Open)) { + byte[] b = new byte[20]; + for (int i = 0; i < 20; ++i) + b[i] = 0xFF; + sw.Write (b, 0, 20); + } + + using (var m0 = MemoryMappedFile.CreateFromFile (fname, FileMode.Open, name)) { + using (var m1 = MemoryMappedFile.CreateOrOpen (name, 4096)) { + using (MemoryMappedViewAccessor v0 = m0.CreateViewAccessor (), v1 = m1.CreateViewAccessor ()) { + v0.Write (10, 0x11223344); + Assert.AreEqual (0x11223344, v1.ReadInt32 (10)); + } + } + } + } + + [Test] + public void MapAtEdgeOfPage () + { + using (var f = new FileStream (fname, FileMode.Open)) { + var b = new byte [4096]; + for (int i = 0; i < 4096; ++i) + b[i] = 0xAA; + for (int i = 0; i < 2; ++i) + f.Write (b, 0, 4096); + } + var m0 = MemoryMappedFile.CreateFromFile (fname, FileMode.Open); + var v0 = m0.CreateViewAccessor (500, 4096); + var v1 = m0.CreateViewAccessor (0, 4096 * 2); + for (int i = 0; i < 4096; ++i) { + Assert.AreEqual (0xAA, v1.ReadByte (i + 500)); + v0.Write (i, (byte)0xFF); + Assert.AreEqual (0xFF, v1.ReadByte (i + 500)); + } + } } } From d8d1b0be6baf6f8881871592b040d85be790926c Mon Sep 17 00:00:00 2001 From: Larry O'Brien Date: Thu, 12 Jun 2014 13:25:44 -1000 Subject: [PATCH 217/694] Monodoc: Fix for CDATA bug (https://bugzilla.xamarin.com/show_bug.cgi?id=17850). Reverts 3f361e1a263fc23680beab62eadde0cd3e4ac64d Removed code that stripped CDATA statements (but not blocks) from input when showing a namespace page: The function Ecma2Html.WrapStream(TextReader,Dictionary) very explicitly returns a new `AvoidCDataTextReader` when the system is showing a namespace. The `AvoidCDataTextReader` strips the CDATA statement, but not it's internal contents. The intent, according to AvoidCDataTextReaderTests, is to allow class summaries of this form: "Addressbook APIs. " But that form is not desired. The bug arose because the input to `WrapStream` is very large (it actually includes the entire *description* for each class and member in the namespace!). If any CDATA-block contained entities such as, e.g., < or >, the resulting XML would (obviously) be ill-formed: "This should be valid ]]> " would throw because the would be attempted to be parsed as XML. Obviously, samples that contain generics or lambda or XAML would cause this problem. Although an XMLException was thrown, Macdoc swallows the exception in DocTools.GetHTML(). That is why this caused a silent failure on macdoc and was visible on Webdoc. --- .../Monodoc/generators/html/Ecma2Html.cs | 112 +++--------------- .../AvoidCDataTextReaderTests.cs | 86 -------------- 2 files changed, 18 insertions(+), 180 deletions(-) delete mode 100644 mcs/class/monodoc/Test/Monodoc.Generators/AvoidCDataTextReaderTests.cs diff --git a/mcs/class/monodoc/Monodoc/generators/html/Ecma2Html.cs b/mcs/class/monodoc/Monodoc/generators/html/Ecma2Html.cs index c15c6137786..04353c45469 100644 --- a/mcs/class/monodoc/Monodoc/generators/html/Ecma2Html.cs +++ b/mcs/class/monodoc/Monodoc/generators/html/Ecma2Html.cs @@ -63,14 +63,21 @@ public string Htmlize (XmlReader ecma_xml, Dictionary extraArgs) public string Htmlize (XmlReader ecma_xml, XsltArgumentList args) { - EnsureTransform (); - - var output = new StringBuilder (); - ecma_transform.Transform (ecma_xml, - args, - XmlWriter.Create (output, ecma_transform.OutputSettings), - CreateDocumentResolver ()); - return output.ToString (); + try{ + EnsureTransform (); + + var output = new StringBuilder (); + ecma_transform.Transform (ecma_xml, + args, + XmlWriter.Create (output, ecma_transform.OutputSettings), + CreateDocumentResolver ()); + return output.ToString (); + } + catch(Exception x) + { + var msg = x.ToString (); + return msg; + } } protected virtual XmlResolver CreateDocumentResolver () @@ -81,21 +88,14 @@ protected virtual XmlResolver CreateDocumentResolver () public string Export (Stream stream, Dictionary extraArgs) { - return Htmlize (XmlReader.Create (WrapStream (new StreamReader (stream), extraArgs)), extraArgs); + return Htmlize (XmlReader.Create (new StreamReader(stream)), extraArgs); } public string Export (string input, Dictionary extraArgs) { - return Htmlize (XmlReader.Create (WrapStream (new StringReader (input), extraArgs)), extraArgs); + return Htmlize (XmlReader.Create (new StringReader(input)), extraArgs); } - TextReader WrapStream (TextReader initialReader, Dictionary renderArgs) - { - string show; - if (renderArgs.TryGetValue ("show", out show) && show == "namespace") - return new AvoidCDataTextReader (initialReader); - return initialReader; - } static void EnsureTransform () { @@ -329,81 +329,5 @@ public bool IsToBeAdded(string text) } } } - - public class AvoidCDataTextReader : TextReader - { - static readonly char[] CDataPattern = new[] { - '<', '!', '[', 'C', 'D', 'A', 'T', 'A', '[' - }; - static readonly char[] CDataClosingPattern = new[] { - ']', ']', '>' - }; - TextReader wrappedReader; - char[] backingArray = new char[9]; // " 0; - } else if (currentIndex == eofIndex) { - return false; - } - if (!inCData && PatternDetect (CDataPattern)) { - inCData = true; - ReadLength (CDataPattern.Length); - return EnsureBuffer (); - } - if (inCData && PatternDetect (CDataClosingPattern)) { - inCData = false; - ReadLength (CDataClosingPattern.Length); - return EnsureBuffer (); - } - - return true; - } - - bool PatternDetect (char[] pattern) - { - return backingArray[currentIndex] == pattern[0] && Enumerable.Range (1, pattern.Length - 1).All (i => backingArray[(currentIndex + i) % backingArray.Length] == pattern[i]); - } - } + } diff --git a/mcs/class/monodoc/Test/Monodoc.Generators/AvoidCDataTextReaderTests.cs b/mcs/class/monodoc/Test/Monodoc.Generators/AvoidCDataTextReaderTests.cs deleted file mode 100644 index 5ab8e84b809..00000000000 --- a/mcs/class/monodoc/Test/Monodoc.Generators/AvoidCDataTextReaderTests.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Xml; -using System.Collections.Generic; - -using NUnit.Framework; - -using Monodoc; -using Monodoc.Generators; -using Monodoc.Generators.Html; - -namespace MonoTests.Monodoc.Generators -{ - [TestFixture] - public class AvoidCDataTextReaderTest - { - void AssertSameInputOutput (string expected, string input) - { - var processed = new AvoidCDataTextReader (new StringReader (input)).ReadToEnd (); - Assert.AreEqual (expected, processed); - } - - [Test] - public void NoCDataXmlTest () - { - var input = @"Addressbook APIs. - Provides access to the system Address Book. - "; - - AssertSameInputOutput (input, input); - } - - [Test] - public void WithCDataXmlTest () - { - var input = @"Addressbook APIs. - "; - - AssertSameInputOutput (input.Replace ("", string.Empty), input); - } - - [Test] - public void PartialCDataXmlTest () - { - var input = @"Addressbook APIs. - "; - - AssertSameInputOutput (input, input); - } - - [Test] - public void FinishWithPartialCDataXmlTest () - { - var input = @"Addressbook APIs. - Provides access to the system Address Book. - Addressbook APIs. - Provides access to the system Address Book. - Date: Sat, 14 Jun 2014 00:43:12 +0300 Subject: [PATCH 218/694] [x86] Fix initialization of stackalloc-ed memory in no pushes mode. --- mono/mini/mini-x86.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mono/mini/mini-x86.c b/mono/mini/mini-x86.c index 8a95cabcb5c..d048ce6159d 100644 --- a/mono/mini/mini-x86.c +++ b/mono/mini/mini-x86.c @@ -2350,6 +2350,8 @@ mono_emit_stack_alloc (MonoCompile *cfg, guchar *code, MonoInst* tree) x86_alu_reg_reg (code, X86_XOR, X86_EAX, X86_EAX); x86_lea_membase (code, X86_EDI, X86_ESP, offset); + if (cfg->param_area && cfg->arch.no_pushes) + x86_alu_reg_imm (code, X86_ADD, X86_EDI, cfg->param_area); x86_cld (code); x86_prefix (code, X86_REP_PREFIX); x86_stosl (code); From 79e70b4692a9ac7bd1ab0e3f0be1d4b5aa9a6152 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Sat, 14 Jun 2014 22:40:16 +0200 Subject: [PATCH 219/694] [arm] Add an enum for gsharedvt argument marshalling conventions. --- mono/mini/mini-arm.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/mono/mini/mini-arm.h b/mono/mini/mini-arm.h index cba8a33a744..131d4330016 100644 --- a/mono/mini/mini-arm.h +++ b/mono/mini/mini-arm.h @@ -124,6 +124,17 @@ * reproduceable results for benchmarks */ #define MONO_ARCH_CODE_ALIGNMENT 32 +/* Argument marshallings for calls between gsharedvt and normal code */ +typedef enum { + GSHAREDVT_ARG_NONE = 0, + GSHAREDVT_ARG_BYVAL_TO_BYREF = 1, + GSHAREDVT_ARG_BYREF_TO_BYVAL = 2, + GSHAREDVT_ARG_BYREF_TO_BYVAL_I1 = 3, + GSHAREDVT_ARG_BYREF_TO_BYVAL_I2 = 4, + GSHAREDVT_ARG_BYREF_TO_BYVAL_U1 = 5, + GSHAREDVT_ARG_BYREF_TO_BYVAL_U2 = 6 +} GSharedVtArgMarshal; + /* Return value marshalling for calls between gsharedvt and normal code */ typedef enum { GSHAREDVT_RET_NONE = 0, From a6df42cfa9f28c1bd7ecdd872217de61aff0991e Mon Sep 17 00:00:00 2001 From: Brezae Vlad Date: Sun, 15 Jun 2014 00:05:42 +0300 Subject: [PATCH 220/694] [x86] Align stackalloc-ed memory in no pushes mode. --- mono/mini/mini-x86.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mono/mini/mini-x86.c b/mono/mini/mini-x86.c index d048ce6159d..3de9b0be1a2 100644 --- a/mono/mini/mini-x86.c +++ b/mono/mini/mini-x86.c @@ -2300,9 +2300,10 @@ mono_emit_stack_alloc (MonoCompile *cfg, guchar *code, MonoInst* tree) x86_push_reg (code, X86_EDI); x86_mov_reg_imm (code, X86_ECX, (0x1000 >> 2)); x86_alu_reg_reg (code, X86_XOR, X86_EAX, X86_EAX); - x86_lea_membase (code, X86_EDI, X86_ESP, 12); if (cfg->param_area && cfg->arch.no_pushes) - x86_alu_reg_imm (code, X86_ADD, X86_EDI, cfg->param_area); + x86_lea_membase (code, X86_EDI, X86_ESP, 12 + ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT)); + else + x86_lea_membase (code, X86_EDI, X86_ESP, 12); x86_cld (code); x86_prefix (code, X86_REP_PREFIX); x86_stosl (code); @@ -2349,9 +2350,10 @@ mono_emit_stack_alloc (MonoCompile *cfg, guchar *code, MonoInst* tree) x86_mov_reg_reg (code, X86_ECX, sreg, 4); x86_alu_reg_reg (code, X86_XOR, X86_EAX, X86_EAX); - x86_lea_membase (code, X86_EDI, X86_ESP, offset); if (cfg->param_area && cfg->arch.no_pushes) - x86_alu_reg_imm (code, X86_ADD, X86_EDI, cfg->param_area); + x86_lea_membase (code, X86_EDI, X86_ESP, offset + ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT)); + else + x86_lea_membase (code, X86_EDI, X86_ESP, offset); x86_cld (code); x86_prefix (code, X86_REP_PREFIX); x86_stosl (code); @@ -3458,7 +3460,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) code = mono_emit_stack_alloc (cfg, code, ins); x86_mov_reg_reg (code, ins->dreg, X86_ESP, 4); if (cfg->param_area && cfg->arch.no_pushes) - x86_alu_reg_imm (code, X86_ADD, ins->dreg, cfg->param_area); + x86_alu_reg_imm (code, X86_ADD, ins->dreg, ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT)); break; case OP_LOCALLOC_IMM: { guint32 size = ins->inst_imm; @@ -3476,7 +3478,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) x86_mov_reg_reg (code, ins->dreg, X86_ESP, 4); } if (cfg->param_area && cfg->arch.no_pushes) - x86_alu_reg_imm (code, X86_ADD, ins->dreg, cfg->param_area); + x86_alu_reg_imm (code, X86_ADD, ins->dreg, ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT)); break; } case OP_THROW: { From d798c91b0112fd546f1be719bc75c796a17cc9fe Mon Sep 17 00:00:00 2001 From: Jaroslav Imrich Date: Sun, 15 Jun 2014 00:32:15 +0200 Subject: [PATCH 221/694] Support both unencrypted PKCS#12 and PKCS#12 encrypted with an empty password in X509Certificate2 constructor --- .../X509Certificate2.cs | 14 ++++++++++- .../X509Certificate2Test.cs | 23 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/mcs/class/System/System.Security.Cryptography.X509Certificates/X509Certificate2.cs b/mcs/class/System/System.Security.Cryptography.X509Certificates/X509Certificate2.cs index 701b4c534d0..229999df718 100644 --- a/mcs/class/System/System.Security.Cryptography.X509Certificates/X509Certificate2.cs +++ b/mcs/class/System/System.Security.Cryptography.X509Certificates/X509Certificate2.cs @@ -428,7 +428,19 @@ private string GetValueAsString (ASN1 pair) private MX.X509Certificate ImportPkcs12 (byte[] rawData, string password) { - MX.PKCS12 pfx = (password == null) ? new MX.PKCS12 (rawData) : new MX.PKCS12 (rawData, password); + MX.PKCS12 pfx = null; + if (string.IsNullOrEmpty (password)) { + try { + // Support both unencrypted PKCS#12.. + pfx = new MX.PKCS12 (rawData, (string)null); + } catch { + // ..and PKCS#12 encrypted with an empty password + pfx = new MX.PKCS12 (rawData, string.Empty); + } + } else { + pfx = new MX.PKCS12 (rawData, password); + } + if (pfx.Certificates.Count == 0) { // no certificate was found return null; diff --git a/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/X509Certificate2Test.cs b/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/X509Certificate2Test.cs index 19a7c19f821..9fceaca05ca 100644 --- a/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/X509Certificate2Test.cs +++ b/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/X509Certificate2Test.cs @@ -286,6 +286,23 @@ public class X509Certificate2Test { 0x89, 0x53, 0xBD, 0x10, 0xAA, 0x1E, 0xC6, 0x41, 0x7C, 0x71, 0xCA, 0x47, 0x79, 0x60, 0x95, 0x2E, 0xAB, 0xF6, 0x17, 0xBE, 0x1D, 0xF1, 0x05, 0xAD, 0x76, 0xD8, 0xBB, 0xF2, 0xBB, 0x36, 0xEE, 0xCD, 0xAA, 0xBC, 0xBA, 0xBE, 0x94, 0x42, 0x9A, 0xA8, 0xEE, 0xE5, 0x93, 0x5C, 0x3C, 0x23, 0xE2, 0x75, 0xD3, 0x59, 0xB4, 0xB3, 0xC4, 0x01, 0xBB, 0xC9, 0x05, 0xFE, 0xFA, 0x1B, 0x31, 0x7A, 0x15, 0x29, 0x91, 0xE6, 0xB9, 0xB2, 0x1E, 0xF9, 0x36, 0xC5, 0x17, 0xB9, 0x9D, 0x32, 0x0D, 0x0D, 0x80, 0x4A, 0x0D, 0x14, 0xB4, 0xDF, 0x89, 0x3A, 0x4B, 0xCA, 0x4B, 0xDE, 0xF8, 0xC0, 0x1B, 0xA6, 0x6D, 0xD9, 0x19, 0xFB, 0x0E, 0x02, 0x22, 0x82, 0x8E, 0x25, 0x8E, 0x9F, 0xD5, 0x7B, 0xB6, 0x14, 0x15, 0x08, 0x61, 0xCD, 0xA6, 0xB3, 0x0F, 0xC8, 0xE8, 0xF9, 0xEE, 0xDB, 0xAF, 0x25, 0x40, 0x01, 0x85, 0x0E, 0x89, 0x0D, 0x0D, 0x85, 0xA6, 0xA3, 0xC9, 0x65, 0x64, 0x8A, 0xD1, 0xF7, 0x55, 0xF9, 0x31, 0x24, 0x41, 0x30, 0x3B, 0x30, 0x1F, 0x30, 0x07, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x04, 0x14, 0xD4, 0x77, 0x3F, 0x92, 0xB6, 0xA6, 0x1B, 0xD5, 0x7F, 0xC1, 0x1B, 0x93, 0xB3, 0x6E, 0x87, 0x67, 0x80, 0xE7, 0x4C, 0x7C, 0x04, 0x14, 0x58, 0x4C, 0x92, 0xDD, 0x0B, 0xEF, 0x09, 0x35, 0xE0, 0x06, 0x33, 0x54, 0xB2, 0xA8, 0x8E, 0x0C, 0x60, 0x67, 0xB5, 0x0F, 0x02, 0x02, 0x07, 0xD0 }; + + public static byte[] openssl_emptypwd_pfx = { 0x30, 0x82, 0x06, 0x19, 0x02, 0x01, 0x03, 0x30, 0x82, 0x05, 0xDF, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0xA0, 0x82, 0x05, 0xD0, 0x04, 0x82, 0x05, 0xCC, 0x30, 0x82, 0x05, 0xC8, 0x30, 0x82, 0x02, 0xC7, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x06, 0xA0, 0x82, 0x02, 0xB8, 0x30, 0x82, 0x02, 0xB4, 0x02, 0x01, 0x00, 0x30, 0x82, 0x02, 0xAD, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0x30, 0x1C, 0x06, 0x0A, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x01, 0x06, 0x30, 0x0E, 0x04, 0x08, 0xE4, 0x0A, 0x2F, 0x48, 0xE6, 0x07, 0x62, + 0x5D, 0x02, 0x02, 0x08, 0x00, 0x80, 0x82, 0x02, 0x80, 0x35, 0x6F, 0x44, 0xFA, 0xA8, 0x0D, 0x41, 0xBA, 0x1A, 0xAE, 0xB1, 0xFB, 0xA4, 0xBB, 0x91, 0x28, 0x75, 0x19, 0xF8, 0x1C, 0x0E, 0xB4, 0xCE, 0x2A, 0x5C, 0x28, 0x2E, 0x34, 0x6F, 0x9B, 0x5F, 0x94, 0x16, 0x33, 0xE0, 0x36, 0x50, 0x5D, 0x47, 0x74, 0x42, 0x4E, 0xCC, 0xA0, 0x7F, 0x8C, 0x32, 0x26, 0x7A, 0x5F, 0x24, 0xB1, 0xEB, 0xD8, 0x2C, 0xE3, 0x6D, 0xC2, 0x3C, 0xBC, 0x3B, 0x0A, 0x78, 0x39, 0x88, 0x24, 0x9E, 0x94, 0x15, 0xC3, 0x43, 0xE0, 0x25, 0x31, 0x3F, 0xB0, 0xDA, 0xF8, 0x4E, 0x37, 0x56, 0xD4, 0xAE, 0x75, 0x28, 0x30, 0x67, 0x5F, 0xBF, 0xF9, 0x7D, + 0xDC, 0xF6, 0x1A, 0x02, 0xF0, 0x65, 0xBF, 0x0A, 0x4D, 0x39, 0x16, 0xC7, 0x57, 0x9A, 0xA1, 0x7C, 0xF0, 0x4B, 0xDD, 0x0E, 0xAF, 0x4E, 0xA9, 0xC8, 0x85, 0x89, 0xCB, 0xB8, 0xD3, 0x96, 0x5F, 0x0C, 0xCB, 0x85, 0xBD, 0xEB, 0x11, 0x00, 0x3B, 0x34, 0xB6, 0x6B, 0xCE, 0x32, 0x75, 0x09, 0x8C, 0x09, 0x3B, 0x13, 0x9D, 0x9F, 0xC1, 0x72, 0x8F, 0xC5, 0x9E, 0x90, 0x89, 0x7C, 0x3A, 0x64, 0xC2, 0x27, 0xD5, 0xF5, 0x6B, 0x23, 0x2C, 0x32, 0xEF, 0xB4, 0x2C, 0x09, 0x0F, 0x65, 0xF4, 0xE4, 0xDC, 0xC3, 0x1F, 0x00, 0xF4, 0x77, 0xB0, 0x3B, 0x08, 0xA5, 0x59, 0xFA, 0x50, 0xAF, 0x9D, 0x9D, 0x22, 0x80, 0xC6, 0x6E, 0xF8, 0xA7, + 0xB7, 0x03, 0x2A, 0x64, 0x37, 0x9C, 0xFB, 0x0D, 0x9D, 0xEF, 0xEC, 0x81, 0xDD, 0xEE, 0x17, 0xA9, 0x8D, 0xA1, 0x9D, 0x06, 0x0F, 0x51, 0x1E, 0x21, 0xF6, 0xEB, 0x10, 0x20, 0x99, 0xE6, 0x8D, 0x23, 0xDC, 0x27, 0xD5, 0xF5, 0xAF, 0x02, 0x07, 0xBE, 0x85, 0x7E, 0x11, 0x5D, 0x87, 0xEB, 0x49, 0xCA, 0xA1, 0xDB, 0x10, 0xB6, 0x18, 0x7C, 0x52, 0x07, 0x08, 0x99, 0xAF, 0x37, 0x15, 0x0E, 0x72, 0xB4, 0x0A, 0x5B, 0x88, 0x70, 0xCF, 0x24, 0xF4, 0xB3, 0x38, 0x99, 0x21, 0x2E, 0xB2, 0x98, 0x79, 0x28, 0x2E, 0x23, 0x1F, 0x9A, 0x20, 0xA7, 0x62, 0xC4, 0x31, 0x82, 0x35, 0x59, 0xFD, 0xAB, 0x7F, 0xE6, 0x6C, 0x9A, 0xE6, 0x4D, + 0x3E, 0xE3, 0xA7, 0x3E, 0xAE, 0x6F, 0xCA, 0xD2, 0x3A, 0x9B, 0x31, 0x1B, 0x96, 0xA9, 0x25, 0xB5, 0x25, 0x47, 0x57, 0xCF, 0x7C, 0x5F, 0x1E, 0x5C, 0x38, 0xB9, 0x24, 0xB2, 0xA5, 0x50, 0xB1, 0x3F, 0xAC, 0x3C, 0x77, 0x53, 0xC7, 0xC8, 0x3B, 0x95, 0xD4, 0x37, 0x30, 0x6E, 0xE6, 0x39, 0x2E, 0x53, 0x09, 0x30, 0x9B, 0x35, 0x1C, 0x74, 0x31, 0x46, 0x67, 0xC5, 0x6E, 0x4D, 0x35, 0x8F, 0x61, 0xC5, 0xA4, 0xD4, 0xBA, 0xE1, 0x47, 0xC7, 0x1D, 0x94, 0x75, 0x6B, 0xFA, 0xAE, 0x2E, 0xDC, 0xB4, 0xA7, 0x64, 0xFA, 0x14, 0x68, 0x14, 0xA0, 0x81, 0x96, 0xD9, 0xC0, 0x2A, 0xFD, 0xEE, 0x78, 0xFE, 0xB6, 0x38, 0xC9, 0x1B, 0xF7, + 0x05, 0xC1, 0x4C, 0xF1, 0x21, 0x53, 0x62, 0x17, 0xED, 0x1D, 0xF7, 0x34, 0x92, 0xD4, 0xDD, 0xD7, 0xF0, 0xA7, 0x90, 0x34, 0xBE, 0x26, 0x86, 0x26, 0x67, 0x3B, 0x40, 0xC6, 0x4C, 0x6A, 0x26, 0xD9, 0x2A, 0x4E, 0x58, 0xEF, 0x86, 0x80, 0x8B, 0x6D, 0x40, 0xCD, 0x40, 0xFD, 0x7B, 0xD9, 0x1C, 0xC4, 0x24, 0x94, 0x4A, 0xFB, 0xFC, 0xB9, 0xF8, 0xE6, 0x95, 0x82, 0x0D, 0x02, 0xE3, 0x53, 0xC9, 0x28, 0xBD, 0x60, 0x65, 0x76, 0x0F, 0xF0, 0xFE, 0x23, 0xF6, 0x8A, 0xB6, 0xB3, 0xD4, 0x51, 0xC2, 0xE5, 0xB4, 0x3A, 0x10, 0x0D, 0x25, 0x7C, 0xC9, 0xCC, 0x11, 0x45, 0x7C, 0xC0, 0x1F, 0x82, 0x52, 0xCA, 0xE8, 0x25, 0x53, 0xCE, + 0x92, 0x67, 0xEC, 0xA2, 0x04, 0xE1, 0x58, 0x7B, 0xE6, 0xF2, 0xA2, 0x5D, 0x74, 0x46, 0xD5, 0x9A, 0x6F, 0x70, 0x60, 0xC4, 0x99, 0xB2, 0x29, 0xF9, 0x60, 0x19, 0x89, 0x37, 0xB3, 0xE5, 0x97, 0xCD, 0x9E, 0xD4, 0x53, 0x0B, 0xD6, 0xB5, 0xC6, 0xFA, 0x8D, 0x0F, 0x96, 0x65, 0x78, 0xE9, 0xC0, 0x84, 0x38, 0x26, 0xD9, 0xA5, 0x27, 0x62, 0xFC, 0x2A, 0x79, 0xCF, 0x7F, 0xC9, 0xFC, 0xBC, 0x41, 0x29, 0x9C, 0xD8, 0x3B, 0x37, 0x54, 0xA0, 0x39, 0x78, 0x21, 0x3A, 0x9C, 0x51, 0xE0, 0x30, 0x18, 0xA4, 0x56, 0x61, 0x13, 0x9C, 0x1C, 0x01, 0x35, 0x96, 0x19, 0x4B, 0xAF, 0xD0, 0xFE, 0x95, 0xF1, 0xC1, 0xBB, 0x6A, 0xBC, 0x2C, + 0x39, 0x21, 0x38, 0xB4, 0xB9, 0x10, 0x27, 0xD6, 0x04, 0xC5, 0xE4, 0xC3, 0x2C, 0xB8, 0x0B, 0xEC, 0xB3, 0x28, 0x32, 0x50, 0x02, 0x4E, 0xE4, 0xE9, 0x11, 0x4C, 0x38, 0x87, 0x3D, 0x7F, 0x54, 0xA2, 0x1D, 0xFF, 0x4B, 0x07, 0x0A, 0xE7, 0x42, 0x08, 0x48, 0x54, 0x3C, 0x7B, 0xE4, 0xF4, 0x2D, 0x98, 0x16, 0x30, 0x82, 0x02, 0xF9, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0xA0, 0x82, 0x02, 0xEA, 0x04, 0x82, 0x02, 0xE6, 0x30, 0x82, 0x02, 0xE2, 0x30, 0x82, 0x02, 0xDE, 0x06, 0x0B, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x0A, 0x01, 0x02, 0xA0, 0x82, 0x02, 0xA6, 0x30, 0x82, 0x02, + 0xA2, 0x30, 0x1C, 0x06, 0x0A, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x01, 0x03, 0x30, 0x0E, 0x04, 0x08, 0x8C, 0xA8, 0xAE, 0x70, 0xEB, 0x90, 0xF9, 0xB7, 0x02, 0x02, 0x08, 0x00, 0x04, 0x82, 0x02, 0x80, 0xA7, 0x49, 0x1D, 0x10, 0xDD, 0x5C, 0xE8, 0xD5, 0x2F, 0x55, 0xAB, 0x62, 0x21, 0x13, 0x64, 0x32, 0xA8, 0xED, 0xFF, 0x8A, 0xE2, 0x5F, 0xCE, 0x74, 0x89, 0x1C, 0x9F, 0x73, 0x02, 0x99, 0x85, 0xE4, 0xF8, 0x21, 0xE1, 0xAA, 0x64, 0x72, 0x95, 0xEC, 0xA0, 0x2E, 0xA9, 0x90, 0x35, 0x51, 0x82, 0x9B, 0x28, 0xDC, 0x0C, 0x47, 0xCD, 0x5C, 0x08, 0x0C, 0x49, 0x8D, 0x06, 0x70, 0x97, 0xF5, 0x4C, 0x48, 0x43, + 0xDC, 0x84, 0xC4, 0x6C, 0x4F, 0x55, 0xD9, 0x86, 0x16, 0x39, 0x31, 0x22, 0x0C, 0x12, 0x55, 0x76, 0x0E, 0xBC, 0x57, 0x66, 0x0D, 0xB3, 0xC0, 0xAB, 0x87, 0x6B, 0x85, 0x20, 0x4D, 0x69, 0x57, 0xAF, 0x44, 0xAB, 0x76, 0x15, 0xA7, 0xAA, 0x07, 0xA9, 0xD8, 0x82, 0x4C, 0x79, 0xA5, 0x62, 0x6D, 0x2E, 0x6C, 0x99, 0xE6, 0xE8, 0x6E, 0xD0, 0x12, 0x85, 0x98, 0x63, 0xEA, 0xC7, 0x07, 0x8C, 0x4B, 0xEB, 0x46, 0x2A, 0xE0, 0x94, 0xAA, 0x0C, 0x19, 0xFA, 0xD6, 0x93, 0x80, 0x7B, 0x20, 0x74, 0x1D, 0xB8, 0xB9, 0x76, 0xEB, 0x93, 0x9A, 0x32, 0x76, 0xA4, 0x93, 0x13, 0x54, 0x71, 0x23, 0xBC, 0x93, 0x26, 0x32, 0x11, 0x4F, 0xFB, + 0x61, 0xD1, 0xD7, 0x15, 0x2F, 0x6F, 0x8C, 0xF9, 0x42, 0x0F, 0xE4, 0x24, 0x20, 0xA8, 0x22, 0x0C, 0x04, 0xFB, 0x1A, 0xB6, 0xF8, 0x89, 0xF7, 0x89, 0xF5, 0xD7, 0x46, 0xB6, 0x7C, 0xE0, 0x72, 0x22, 0x53, 0xD3, 0x23, 0x27, 0x98, 0xCC, 0x8E, 0xF8, 0xA8, 0x58, 0xC7, 0x36, 0x69, 0x0D, 0xF2, 0x20, 0x84, 0x83, 0x2D, 0x7A, 0xA9, 0xA5, 0x8D, 0x41, 0x62, 0xA6, 0x99, 0xAE, 0xBC, 0x92, 0xB0, 0x7B, 0xF6, 0x9A, 0x84, 0x37, 0x2B, 0x16, 0x9A, 0xD7, 0x46, 0x97, 0xB8, 0x72, 0x1B, 0xCC, 0x9F, 0xE7, 0xDD, 0x54, 0x83, 0x33, 0x42, 0xE5, 0x55, 0xEA, 0xC1, 0xC0, 0x00, 0xDE, 0xE8, 0x13, 0xB4, 0x7B, 0x9F, 0x0D, 0xAD, 0xF4, + 0xB9, 0xA8, 0xEA, 0x54, 0xDF, 0x44, 0xF1, 0x67, 0xB7, 0x32, 0x0F, 0x84, 0x39, 0xEF, 0x75, 0xE2, 0xBC, 0x21, 0xA3, 0x71, 0x2E, 0xC3, 0x36, 0xE9, 0x9F, 0x2C, 0x6F, 0x35, 0x94, 0x2B, 0x51, 0x9A, 0xB3, 0xA7, 0xDD, 0xA1, 0x02, 0xF9, 0x14, 0x74, 0x58, 0x36, 0x7C, 0x86, 0x5E, 0xD1, 0xAE, 0x77, 0xA7, 0x3E, 0x38, 0x93, 0xB4, 0x50, 0x5F, 0x1E, 0x35, 0xC7, 0x77, 0xA9, 0x24, 0x28, 0xD2, 0xED, 0x9F, 0x8A, 0x67, 0xB6, 0x94, 0x8C, 0xF5, 0x69, 0x19, 0x1B, 0x3C, 0xAA, 0x39, 0x5D, 0x40, 0x6A, 0x33, 0x5A, 0xDA, 0x69, 0x24, 0x59, 0x99, 0x04, 0x90, 0x3E, 0xB3, 0xDE, 0xDC, 0xCB, 0x59, 0x35, 0xEF, 0x1B, 0xC1, 0x68, + 0xCD, 0x20, 0x0E, 0x22, 0x94, 0xB7, 0xFC, 0x5B, 0xC0, 0x17, 0x38, 0x3E, 0xB5, 0x9C, 0xBA, 0x78, 0x94, 0xB2, 0x10, 0x05, 0x21, 0x30, 0x4B, 0x2F, 0x8B, 0xF1, 0x8D, 0xFC, 0x2A, 0xBF, 0x89, 0x4E, 0xE1, 0xF9, 0xBF, 0x3C, 0xCF, 0xAA, 0xB1, 0xEC, 0x39, 0x59, 0x9A, 0xE9, 0x07, 0xE1, 0xA0, 0xAA, 0x91, 0x7C, 0x09, 0xF1, 0xD5, 0xD9, 0xA3, 0xF1, 0x0E, 0xD2, 0xBD, 0xE8, 0x65, 0x83, 0xDB, 0xE4, 0x03, 0xFA, 0x19, 0x56, 0x00, 0x3F, 0x3E, 0x94, 0x03, 0xAD, 0x4D, 0x00, 0x7C, 0x47, 0x2C, 0x88, 0x88, 0x53, 0x7C, 0xF2, 0x7B, 0x2A, 0x5A, 0xCB, 0x44, 0x93, 0x4F, 0xDA, 0xE3, 0x2E, 0xC3, 0x1F, 0x4E, 0x14, 0x52, 0x1B, + 0x33, 0x5F, 0xB7, 0xCD, 0x1D, 0xB1, 0xDE, 0xFE, 0xE8, 0xCF, 0xC2, 0xEE, 0xEB, 0xA6, 0x79, 0xF5, 0x0C, 0x21, 0x71, 0x95, 0xE1, 0x52, 0xBF, 0x76, 0xD5, 0x35, 0x43, 0x0E, 0xB6, 0x9B, 0x36, 0x34, 0x4E, 0x07, 0xF9, 0x29, 0x34, 0x44, 0x52, 0x15, 0xCC, 0x71, 0x5C, 0x5F, 0x89, 0x32, 0x32, 0x5B, 0x76, 0x8E, 0x08, 0x55, 0x46, 0xD5, 0x4A, 0x78, 0xEB, 0xB2, 0x9A, 0x39, 0xF9, 0xE6, 0xD7, 0x54, 0xE8, 0x59, 0x85, 0x09, 0x2B, 0xE8, 0x2D, 0x5E, 0x7F, 0x09, 0x8F, 0xA2, 0x65, 0x82, 0x54, 0x93, 0x17, 0x56, 0x51, 0x4F, 0x93, 0x2F, 0x92, 0x47, 0x3C, 0x7A, 0x2D, 0x45, 0x45, 0x67, 0x03, 0x02, 0x0C, 0x0B, 0xA4, 0x2A, + 0x25, 0x22, 0x2F, 0x8E, 0x87, 0x04, 0x78, 0x12, 0x5C, 0x80, 0x1E, 0xF9, 0x0D, 0xC1, 0x5B, 0x06, 0x4D, 0x43, 0x1D, 0x13, 0x6C, 0xDB, 0x3D, 0xD2, 0x1C, 0x94, 0xA3, 0xBB, 0x62, 0xEB, 0x4F, 0x78, 0xC9, 0x43, 0x5E, 0x5F, 0x84, 0xCB, 0xE8, 0x31, 0x5F, 0xE9, 0xB7, 0xA9, 0xEA, 0x4A, 0xF2, 0xAB, 0x1E, 0x37, 0x7C, 0xAF, 0xE4, 0xF0, 0x4E, 0x3F, 0x6A, 0xA9, 0x04, 0xAB, 0x20, 0x44, 0xFD, 0x81, 0x47, 0x9F, 0x86, 0xF3, 0x59, 0xA5, 0x2A, 0x3D, 0x60, 0xB1, 0xF7, 0x31, 0x25, 0x30, 0x23, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x15, 0x31, 0x16, 0x04, 0x14, 0x30, 0x29, 0x69, 0x4B, 0x22, 0xB2, + 0xEE, 0x6A, 0xEC, 0x9B, 0x78, 0x44, 0x9E, 0x51, 0x0F, 0x7C, 0x34, 0x8D, 0xBA, 0x33, 0x30, 0x31, 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04, 0x14, 0xC7, 0xDD, 0xD6, 0xA5, 0xC4, 0x14, 0xB6, 0x24, 0xF9, 0x03, 0xB9, 0xB6, 0xA3, 0x5A, 0x4A, 0x09, 0x51, 0x18, 0x5A, 0x19, 0x04, 0x08, 0x35, 0xB5, 0x1D, 0xC3, 0x17, 0x45, 0x8B, 0x92, 0x02, 0x02, 0x08, 0x00 }; public const string base64_cert = @"-----BEGIN CERTIFICATE----- MIIBxTCCATKgAwIBAgIQx3WuSFObHp5EgBXKeBVHaTAJBgUrDgMCHQUAMCUxIzAh @@ -1252,6 +1269,12 @@ public void Pkcs12_5_Properties () CheckPkcs12 (new X509Certificate2 (farscape_strong_path_pfx, "farscape")); } + [Test] + public void Pkcs12_6_Properties () + { + CheckPkcs12 (new X509Certificate2 (openssl_emptypwd_pfx)); + } + private void CheckBase64 (X509Certificate2 x) { // note: the raw data is still the DER encoded ASN.1 (not the base64 string) From eed0a5d920e7c4ecf10b53260f09cfd2c83ec01f Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Sun, 15 Jun 2014 00:41:28 +0200 Subject: [PATCH 222/694] [runtime] Enable support for arm64-darwin in dolt. --- acinclude.m4 | 4 ++-- eglib/acinclude.m4 | 4 ++-- libgc/acinclude.m4 | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index 16fecf7f860..5216cd14a5e 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -22,7 +22,7 @@ if test x$GCC != xyes; then dolt_supported=no fi case $host in -i?86-*-linux*|x86_64-*-linux*|powerpc-*-linux*|powerpc64-*-linux* \ +i?86-*-linux*|i?86-apple-darwin*|x86_64-*-linux*|powerpc-*-linux*|powerpc64-*-linux* \ |amd64-*-freebsd*|i?86-*-freebsd*|ia64-*-freebsd*|arm*-*-linux*|sparc*-*-linux*|mips*-*-linux*|x86_64-apple-darwin*|aarch64*) pic_options='-fPIC' ;; @@ -158,7 +158,7 @@ modeok=false tagok=false for arg in "$[]@"; do case "$arg" in - --silent) ;; + --silent) ;; --mode=compile) modeok=true ;; --tag=CC|--tag=CXX) tagok=true ;; --quiet) ;; diff --git a/eglib/acinclude.m4 b/eglib/acinclude.m4 index 526d00c1be7..5216cd14a5e 100644 --- a/eglib/acinclude.m4 +++ b/eglib/acinclude.m4 @@ -22,8 +22,8 @@ if test x$GCC != xyes; then dolt_supported=no fi case $host in -i?86-*-linux*|x86_64-*-linux*|powerpc-*-linux*|powerpc64-*-linux* \ -|amd64-*-freebsd*|i?86-*-freebsd*|ia64-*-freebsd*|arm*-*-linux*|sparc*-*-linux*|mips*-*-linux*) +i?86-*-linux*|i?86-apple-darwin*|x86_64-*-linux*|powerpc-*-linux*|powerpc64-*-linux* \ +|amd64-*-freebsd*|i?86-*-freebsd*|ia64-*-freebsd*|arm*-*-linux*|sparc*-*-linux*|mips*-*-linux*|x86_64-apple-darwin*|aarch64*) pic_options='-fPIC' ;; ?86-pc-cygwin*|i?86-pc-cygwin*) diff --git a/libgc/acinclude.m4 b/libgc/acinclude.m4 index 526d00c1be7..5216cd14a5e 100644 --- a/libgc/acinclude.m4 +++ b/libgc/acinclude.m4 @@ -22,8 +22,8 @@ if test x$GCC != xyes; then dolt_supported=no fi case $host in -i?86-*-linux*|x86_64-*-linux*|powerpc-*-linux*|powerpc64-*-linux* \ -|amd64-*-freebsd*|i?86-*-freebsd*|ia64-*-freebsd*|arm*-*-linux*|sparc*-*-linux*|mips*-*-linux*) +i?86-*-linux*|i?86-apple-darwin*|x86_64-*-linux*|powerpc-*-linux*|powerpc64-*-linux* \ +|amd64-*-freebsd*|i?86-*-freebsd*|ia64-*-freebsd*|arm*-*-linux*|sparc*-*-linux*|mips*-*-linux*|x86_64-apple-darwin*|aarch64*) pic_options='-fPIC' ;; ?86-pc-cygwin*|i?86-pc-cygwin*) From e579555a531e2ce489dee4edc626b7df6cd767ba Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Mon, 16 Jun 2014 11:56:57 +0200 Subject: [PATCH 223/694] [mcs] Reachability analysis should ignore local variables declarations. Fixes #20603 --- mcs/mcs/statement.cs | 28 ++++++++++++++++++++++++---- mcs/tests/test-896.cs | 13 +++++++++++++ mcs/tests/ver-il-net_4_5.xml | 10 ++++++++++ 3 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 mcs/tests/test-896.cs diff --git a/mcs/mcs/statement.cs b/mcs/mcs/statement.cs index ced42136ea5..a09c4acd939 100644 --- a/mcs/mcs/statement.cs +++ b/mcs/mcs/statement.cs @@ -2186,13 +2186,13 @@ protected override void DoEmit (EmitContext ec) { li.CreateBuilder (ec); - if (Initializer != null) + if (Initializer != null && !IsUnreachable) ((ExpressionStatement) Initializer).EmitStatement (ec); if (declarators != null) { foreach (var d in declarators) { d.Variable.CreateBuilder (ec); - if (d.Initializer != null) { + if (d.Initializer != null && !IsUnreachable) { ec.Mark (d.Variable.Location); ((ExpressionStatement) d.Initializer).EmitStatement (ec); } @@ -2925,7 +2925,7 @@ bool DoFlowAnalysis (FlowAnalysisContext fc, int startIndex) end_unreachable = s.FlowAnalysis (fc); if (s.IsUnreachable) { - statements[startIndex] = new EmptyStatement (s.loc); + statements [startIndex] = RewriteUnreachableStatement (s); continue; } @@ -2952,7 +2952,7 @@ bool DoFlowAnalysis (FlowAnalysisContext fc, int startIndex) if (s.IsUnreachable) { s.FlowAnalysis (fc); - statements[startIndex] = new EmptyStatement (s.loc); + statements [startIndex] = RewriteUnreachableStatement (s); } } } @@ -2967,6 +2967,24 @@ bool DoFlowAnalysis (FlowAnalysisContext fc, int startIndex) return !Explicit.HasReachableClosingBrace; } + static Statement RewriteUnreachableStatement (Statement s) + { + // LAMESPEC: It's not clear whether declararion statement should be part of reachability + // analysis. Even csc report unreachable warning for it but it's actually used hence + // we try to emulate this behaviour + // + // Consider: + // goto L; + // int v; + // L: + // v = 1; + + if (s is BlockVariable) + return s; + + return new EmptyStatement (s.loc); + } + public void ScanGotoJump (Statement label) { int i; @@ -6938,6 +6956,7 @@ public VariableDeclaration (FullNamedExpression type, LocalVariable li) public VariableDeclaration (LocalVariable li, Location loc) : base (li) { + reachable = true; this.loc = loc; } @@ -7380,6 +7399,7 @@ class RuntimeDispose : Using.VariableDeclaration public RuntimeDispose (LocalVariable lv, Location loc) : base (lv, loc) { + reachable = true; } protected override void CheckIDiposableConversion (BlockContext bc, LocalVariable li, Expression initializer) diff --git a/mcs/tests/test-896.cs b/mcs/tests/test-896.cs new file mode 100644 index 00000000000..4336bf73141 --- /dev/null +++ b/mcs/tests/test-896.cs @@ -0,0 +1,13 @@ +using System; + +class Program +{ + public static void Main () + { + goto L1; + int z; + L1: + z = 3; + Console.WriteLine (z); + } +} \ No newline at end of file diff --git a/mcs/tests/ver-il-net_4_5.xml b/mcs/tests/ver-il-net_4_5.xml index b9acb70491d..97366458344 100644 --- a/mcs/tests/ver-il-net_4_5.xml +++ b/mcs/tests/ver-il-net_4_5.xml @@ -49977,6 +49977,16 @@ + + + + 15 + + + 7 + + + From 94f466897fa9464a9f1faa0941149c721539358c Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Mon, 16 Jun 2014 12:07:25 +0200 Subject: [PATCH 224/694] [system.data] Parse numeric expressions using invariant culture. Fixes #20582 --- .../System.Data/Mono.Data.SqlExpressions/Tokenizer.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mcs/class/System.Data/Mono.Data.SqlExpressions/Tokenizer.cs b/mcs/class/System.Data/Mono.Data.SqlExpressions/Tokenizer.cs index 3208718e7da..256da0cfa14 100644 --- a/mcs/class/System.Data/Mono.Data.SqlExpressions/Tokenizer.cs +++ b/mcs/class/System.Data/Mono.Data.SqlExpressions/Tokenizer.cs @@ -136,10 +136,10 @@ private object ReadNumber () string str = sb.ToString (); - if (str.IndexOf(".") == -1) - return Int64.Parse (str); - else - return double.Parse (str); + if (str.IndexOf ('.') < 0) + return Int64.Parse (str, CultureInfo.InvariantCulture); + + return double.Parse (str, CultureInfo.InvariantCulture); } private char ProcessEscapes(char c) @@ -327,7 +327,7 @@ private int ParseToken () case '#': string date = ReadString ('#'); - val = DateTime.Parse (date); + val = DateTime.Parse (date, CultureInfo.InvariantCulture); return Token.DateLiteral; case '\'': From 8826a3bb456169b62c0f4c3a7b649cb32ff0ec47 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Mon, 16 Jun 2014 14:12:19 +0200 Subject: [PATCH 225/694] [mcs] Run new initializer await checks only in async context. Fixes #20614 --- mcs/mcs/expression.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/mcs/expression.cs b/mcs/mcs/expression.cs index 96431ffa393..caaab3404dd 100644 --- a/mcs/mcs/expression.cs +++ b/mcs/mcs/expression.cs @@ -11066,7 +11066,7 @@ protected override Expression DoResolve (ResolveContext ec) public override void Emit (EmitContext ec) { - if (method == null && TypeSpec.IsValueType (type) && initializers.Initializers.Count > 1 && initializers.ContainsEmitWithAwait ()) { + if (method == null && TypeSpec.IsValueType (type) && initializers.Initializers.Count > 1 && ec.HasSet (BuilderContext.Options.AsyncBody) && initializers.ContainsEmitWithAwait ()) { var fe = ec.GetTemporaryField (type); if (!Emit (ec, fe)) From c4192082961d86cca4b0a2f5bff3923e89b53cdc Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Mon, 16 Jun 2014 16:03:46 +0200 Subject: [PATCH 226/694] Remove a reference to the file AvoidCDataTextReaderTests.cs so that tarballs can be built again. The file was removed in https://github.com/mono/mono/commit/d8d1b0be6baf6f8881871592b040d85be790926c --- mcs/class/monodoc/monodoc_test.dll.sources | 1 - 1 file changed, 1 deletion(-) diff --git a/mcs/class/monodoc/monodoc_test.dll.sources b/mcs/class/monodoc/monodoc_test.dll.sources index b5af3b71a04..b806b8fb6e9 100644 --- a/mcs/class/monodoc/monodoc_test.dll.sources +++ b/mcs/class/monodoc/monodoc_test.dll.sources @@ -6,4 +6,3 @@ Monodoc/SettingsTest.cs Monodoc.Generators/RawGeneratorTests.cs Monodoc/NodeTest.cs Monodoc/RootTreeTest.cs -Monodoc.Generators/AvoidCDataTextReaderTests.cs From 2feb372609b7cecc7b7e3306479d4b08b7f1fc04 Mon Sep 17 00:00:00 2001 From: Nathanael Jones Date: Mon, 16 Jun 2014 18:43:28 +0200 Subject: [PATCH 227/694] Fix AddCacheDependency signature to use params The .NET AddCacheDependency method signature is `public void AddCacheDependency(params CacheDependency[] dependencies);` Mono should mirror the signature (even if it isn't implemented) to prevent build errors. Conditional code, of course, will need to be used for an alternative mono path. --- mcs/class/System.Web/System.Web/HttpResponse.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/System.Web/System.Web/HttpResponse.cs b/mcs/class/System.Web/System.Web/HttpResponse.cs index ad18b88a3c4..2491c9035d1 100644 --- a/mcs/class/System.Web/System.Web/HttpResponse.cs +++ b/mcs/class/System.Web/System.Web/HttpResponse.cs @@ -446,7 +446,7 @@ public bool SuppressContent { } [MonoTODO ("Not implemented")] - public void AddCacheDependency (CacheDependency[] dependencies) + public void AddCacheDependency (params CacheDependency[] dependencies) { throw new NotImplementedException (); } From 8f4cb8ed33dd13052fa4714e4a154d1d6a915446 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Mon, 16 Jun 2014 19:06:41 +0200 Subject: [PATCH 228/694] [bcl] Fix the mobile build. --- mcs/class/System.Core/mobile_System.Core.dll.sources | 1 + 1 file changed, 1 insertion(+) diff --git a/mcs/class/System.Core/mobile_System.Core.dll.sources b/mcs/class/System.Core/mobile_System.Core.dll.sources index ba66db603d7..a63481f69d6 100644 --- a/mcs/class/System.Core/mobile_System.Core.dll.sources +++ b/mcs/class/System.Core/mobile_System.Core.dll.sources @@ -93,6 +93,7 @@ System.IO.MemoryMappedFiles/MemoryMappedFile.cs System.IO.MemoryMappedFiles/MemoryMappedFileAccess.cs System.IO.MemoryMappedFiles/MemoryMappedFileOptions.cs System.IO.MemoryMappedFiles/MemoryMappedFileRights.cs +System.IO.MemoryMappedFiles/MemoryMappedFileSecurity.cs System.IO.MemoryMappedFiles/MemoryMappedViewStream.cs System.IO.MemoryMappedFiles/MemoryMappedViewAccessor.cs Microsoft.Win32.SafeHandles/SafeMemoryMappedFileHandle.cs From 34321381558b2d38d562c728256d525ab05c2ee3 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Mon, 16 Jun 2014 21:11:26 +0200 Subject: [PATCH 229/694] Tarball: include System.Security.dll and System.Configuration.dll in monolite directory this is related to commit https://github.com/mono/mono/commit/993f4773638bcb36abf8b9660ee737d6445c5200 --- mcs/class/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/Makefile b/mcs/class/Makefile index 73ca2abb57a..1e604f9aae1 100644 --- a/mcs/class/Makefile +++ b/mcs/class/Makefile @@ -285,7 +285,7 @@ all-local $(STD_TARGETS:=-local): @: # Files needed to bootstrap C# compiler -basic_files = basic.exe mscorlib.dll System.dll System.Xml.dll Mono.Security.dll System.Core.dll +basic_files = basic.exe mscorlib.dll System.dll System.Xml.dll Mono.Security.dll System.Core.dll System.Security.dll System.Configuration.dll monolite_files = $(basic_files:%=lib/monolite/%) lib/monolite: From 3c2c696ad016c413927f12b86c216d044f759bfb Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Mon, 16 Jun 2014 22:25:02 +0200 Subject: [PATCH 230/694] [arm] Fix alignment problems when AOTing from osx to arm linux. --- mono/mini/mini-arm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/mini/mini-arm.c b/mono/mini/mini-arm.c index 6895e1fb3a1..b31b162bf07 100644 --- a/mono/mini/mini-arm.c +++ b/mono/mini/mini-arm.c @@ -811,7 +811,7 @@ mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code) void mono_arch_cpu_init (void) { -#if defined(__APPLE__) +#ifdef TARGET_IOS i8_align = 4; #else i8_align = __alignof__ (gint64); From 161e57021ceec6634c5e34c1667073814562b2aa Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Mon, 16 Jun 2014 22:25:54 +0200 Subject: [PATCH 231/694] [aot] Use g_print instead of printf in one place since the former works on android. --- mono/mini/aot-runtime.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mono/mini/aot-runtime.c b/mono/mini/aot-runtime.c index 7ba90850d7a..af436f531a1 100644 --- a/mono/mini/aot-runtime.c +++ b/mono/mini/aot-runtime.c @@ -3353,10 +3353,10 @@ load_method (MonoDomain *domain, MonoAotModule *amodule, MonoImage *image, MonoM method = mono_get_method (image, token, NULL); if (method) { char *name = mono_method_full_name (method, TRUE); - printf ("LAST AOT METHOD: %s.\n", name); + g_print ("LAST AOT METHOD: %s.\n", name); g_free (name); } else { - printf ("LAST AOT METHOD: %p %d\n", code, method_index); + g_print ("LAST AOT METHOD: %p %d\n", code, method_index); } } } From 62bef77ea08d098336dc959310cad985d139bc66 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Mon, 16 Jun 2014 23:10:13 +0200 Subject: [PATCH 232/694] [runtime] Add a workaround to file-mmap-posix.c to fix the android build. --- mono/metadata/file-mmap-posix.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mono/metadata/file-mmap-posix.c b/mono/metadata/file-mmap-posix.c index 6066136e65a..7e3195e0d43 100644 --- a/mono/metadata/file-mmap-posix.c +++ b/mono/metadata/file-mmap-posix.c @@ -272,10 +272,16 @@ open_file_map (MonoString *path, int input_fd, int mode, gint64 *capacity, int a } } +#ifndef PLATFORM_ANDROID if (path) //FIXME use io portability? fd = open (c_path, file_mode_to_unix (mode) | access_mode_to_unix (access), DEFFILEMODE); else fd = dup (input_fd); +#else + // FIXME: No DEFFILEMODE + fd = -1; + g_assert_not_reached (); +#endif if (fd == -1) { //XXX translate errno? *error = COULD_NOT_OPEN; From eeb5fe56f76d729347a915e7591a54e0b32c5950 Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Tue, 17 Jun 2014 13:59:01 +0900 Subject: [PATCH 233/694] Revert "[msbuild] fix some weird local result variable initialization issue." This reverts commit 76b08f12ef69c180733a0cad99ea89b2a225ec51. --- mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/MSBuild.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/MSBuild.cs b/mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/MSBuild.cs index 690b5decbbb..4200cca1daf 100644 --- a/mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/MSBuild.cs +++ b/mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/MSBuild.cs @@ -104,7 +104,6 @@ public override bool Execute () result = false; } - all_result = true; if (!result) all_result = false; From 8fb625e06d688d6997a00fe279e0ca75969f7a11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Tue, 17 Jun 2014 13:45:45 +0200 Subject: [PATCH 234/694] [Managed.Windows.Forms] Fixed System.Resources tests that relied on DummyAssembly Several System.Resources tests rely on a DummyAssembly.dll, which was removed in 016b0b5170fca72b977f952ee817fe06e32890a9 (possibly by accident?). This commit adds the assembly back. Commit licensed under MIT/X11. --- mcs/class/Managed.Windows.Forms/.gitignore | 3 + mcs/class/Managed.Windows.Forms/Makefile | 10 +- .../Test/DummyAssembly/AnotherSerializable.cs | 88 +++++++++++++ .../Test/DummyAssembly/Convertable.cs | 119 ++++++++++++++++++ .../DummyAssembly/Properties/AssemblyInfo.cs | 36 ++++++ 5 files changed, 255 insertions(+), 1 deletion(-) create mode 100644 mcs/class/Managed.Windows.Forms/.gitignore create mode 100644 mcs/class/Managed.Windows.Forms/Test/DummyAssembly/AnotherSerializable.cs create mode 100644 mcs/class/Managed.Windows.Forms/Test/DummyAssembly/Convertable.cs create mode 100644 mcs/class/Managed.Windows.Forms/Test/DummyAssembly/Properties/AssemblyInfo.cs diff --git a/mcs/class/Managed.Windows.Forms/.gitignore b/mcs/class/Managed.Windows.Forms/.gitignore new file mode 100644 index 00000000000..f6cce0c5ff3 --- /dev/null +++ b/mcs/class/Managed.Windows.Forms/.gitignore @@ -0,0 +1,3 @@ +DummyAssembly.dll +DummyAssembly.mdb +test_file diff --git a/mcs/class/Managed.Windows.Forms/Makefile b/mcs/class/Managed.Windows.Forms/Makefile index 7a7439b7441..37a323899be 100644 --- a/mcs/class/Managed.Windows.Forms/Makefile +++ b/mcs/class/Managed.Windows.Forms/Makefile @@ -93,7 +93,10 @@ TEST_DISTFILES = \ Test/resources/32x32.ico \ Test/System.Resources/compat_1_1.resx \ Test/System.Resources/compat_2_0.resx \ - Test/System.Windows.Forms/bitmaps/a.png + Test/System.Windows.Forms/bitmaps/a.png \ + Test/DummyAssembly/AnotherSerializable.cs \ + Test/DummyAssembly/Convertable.cs \ + Test/DummyAssembly/Properties/AssemblyInfo.cs \ EXTRA_DISTFILES = \ README System.Windows.Forms.dll.resources \ @@ -106,6 +109,11 @@ TEST_MCS_FLAGS = /r:System.Data.dll /r:System.Drawing.dll /r:Accessibility.dll - -resource:Test/resources/32x32.ico,32x32.ico \ -nowarn:618,612 +DummyAssembly.dll: + $(CSCOMPILE) /target:library /out:$@ Test/DummyAssembly/AnotherSerializable.cs Test/DummyAssembly/Convertable.cs Test/DummyAssembly/Properties/AssemblyInfo.cs + +test-local: DummyAssembly.dll + include ../../build/library.make TEST_HARNESS_EXCLUDES = -exclude=Interactive,NotWorking,ValueAdd,CAS,InetAccess diff --git a/mcs/class/Managed.Windows.Forms/Test/DummyAssembly/AnotherSerializable.cs b/mcs/class/Managed.Windows.Forms/Test/DummyAssembly/AnotherSerializable.cs new file mode 100644 index 00000000000..a6336ce2753 --- /dev/null +++ b/mcs/class/Managed.Windows.Forms/Test/DummyAssembly/AnotherSerializable.cs @@ -0,0 +1,88 @@ +// +// AnotherSerializable.cs : Serializable Class used to test types from other +// assemblies for resources tests +// +// Author: +// Gary Barnett (gary.barnett.mono@gmail.com) +// +// Copyright (C) Gary Barnett (2012) +// +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Runtime.Serialization; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; + +namespace DummyAssembly { + [SerializableAttribute] + public class AnotherSerializable : ISerializable { + public string name; + public string value; + + public AnotherSerializable () + { + } + + public AnotherSerializable (string name, string value) + { + this.name = name; + this.value = value; + } + + public AnotherSerializable (SerializationInfo info, StreamingContext ctxt) + { + name = (string) info.GetValue ("sername", typeof (string)); + value = (String) info.GetValue ("servalue", typeof (string)); + } + + public AnotherSerializable (Stream stream) + { + BinaryFormatter bFormatter = new BinaryFormatter (); + AnotherSerializable deser = (AnotherSerializable) bFormatter.Deserialize (stream); + stream.Close (); + + name = deser.name; + value = deser.value; + } + + public void GetObjectData (SerializationInfo info, StreamingContext ctxt) + { + info.AddValue ("sername", name); + info.AddValue ("servalue", value); + } + + public override string ToString () + { + return String.Format ("name={0};value={1}", this.name, this.value); + } + + public override bool Equals (object obj) + { + AnotherSerializable o = obj as AnotherSerializable; + if (o == null) + return false; + return this.name.Equals (o.name) && this.value.Equals (o.value); + } + } +} + diff --git a/mcs/class/Managed.Windows.Forms/Test/DummyAssembly/Convertable.cs b/mcs/class/Managed.Windows.Forms/Test/DummyAssembly/Convertable.cs new file mode 100644 index 00000000000..7f1ea031380 --- /dev/null +++ b/mcs/class/Managed.Windows.Forms/Test/DummyAssembly/Convertable.cs @@ -0,0 +1,119 @@ +// +// Convertable.cs : Class with type converter used to test types from other +// assemblies for resources tests +// +// Author: +// Gary Barnett (gary.barnett.mono@gmail.com) +// +// Copyright (C) Gary Barnett (2012) +// +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.Serialization.Formatters.Binary; +using System.IO; +using System.Runtime.Serialization; +using System.ComponentModel; + +namespace DummyAssembly { + + [SerializableAttribute] + [TypeConverter (typeof (ConvertableConverter))] + public class Convertable { + protected string name; + protected string value; + + public Convertable () + { + } + + public Convertable (string name, string value) + { + this.name = name; + this.value = value; + } + + public void GetObjectData (SerializationInfo info, StreamingContext ctxt) + { + info.AddValue ("sername", name); + info.AddValue ("servalue", value); + } + + public override string ToString () + { + return String.Format ("{0}\t{1}",name, value); + } + + public override bool Equals (object obj) + { + Convertable o = obj as Convertable; + if (o == null) + return false; + return this.name.Equals (o.name) && this.value.Equals (o.value); + } + } + + class ConvertableConverter : TypeConverter { + public ConvertableConverter () + { + } + + public override bool CanConvertFrom (ITypeDescriptorContext context, Type sourceType) + { + return sourceType == typeof (string); + } + + public override bool CanConvertTo (ITypeDescriptorContext context, Type destinationType) + { + return destinationType == typeof (string); + } + + public override object ConvertFrom (ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) + { + if (value.GetType() != typeof (string)) + throw new Exception ("value not string"); + + string serialised = (string) value; + + string [] parts = serialised.Split ('\t'); + + if (parts.Length != 2) + throw new Exception ("string in incorrect format"); + + Convertable convertable = new Convertable (parts [0], parts [1]); + return convertable; + } + + public override object ConvertTo (ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) + { + if (destinationType != typeof (String)) { + return base.ConvertTo (context, culture, value, destinationType); + } + + return ((Convertable) value).ToString (); + } + } + +} + diff --git a/mcs/class/Managed.Windows.Forms/Test/DummyAssembly/Properties/AssemblyInfo.cs b/mcs/class/Managed.Windows.Forms/Test/DummyAssembly/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..73e9fef7f11 --- /dev/null +++ b/mcs/class/Managed.Windows.Forms/Test/DummyAssembly/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle ("DummyAssembly")] +[assembly: AssemblyDescription ("")] +[assembly: AssemblyConfiguration ("")] +[assembly: AssemblyCompany ("")] +[assembly: AssemblyProduct ("DummyAssembly")] +[assembly: AssemblyCopyright ("")] +[assembly: AssemblyTrademark ("")] +[assembly: AssemblyCulture ("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible (false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid ("c80e062b-a918-4aa5-b62c-7455ca2c56d5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion ("1.0.0.0")] +[assembly: AssemblyFileVersion ("1.0.0.0")] From d14176dd3fca8d48d548ac747d05c0017f2452a4 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Tue, 17 Jun 2014 16:43:29 +0200 Subject: [PATCH 235/694] [mcs] Implements finally execution for await with try block exit. --- mcs/mcs/async.cs | 66 ++++++++++++--- mcs/mcs/context.cs | 4 +- mcs/mcs/iterators.cs | 15 ++-- mcs/mcs/statement.cs | 151 +++++++++++++++++++++++++---------- mcs/tests/test-async-69.cs | 151 +++++++++++++++++++++++++++++++++++ mcs/tests/ver-il-net_4_5.xml | 67 +++++++++++++++- 6 files changed, 389 insertions(+), 65 deletions(-) create mode 100644 mcs/tests/test-async-69.cs diff --git a/mcs/mcs/async.cs b/mcs/mcs/async.cs index 5d8f65053bf..6cd75bc9af5 100644 --- a/mcs/mcs/async.cs +++ b/mcs/mcs/async.cs @@ -421,6 +421,8 @@ public override Reachability MarkReachable (Reachability rc) public class AsyncInitializer : StateMachineInitializer { TypeInferenceContext return_inference; + List - 298 + 295 10 @@ -62932,6 +62932,71 @@ + + + + 41 + + + 41 + + + 41 + + + 41 + + + 41 + + + 390 + + + 7 + + + + + 172 + + + 13 + + + + + 381 + + + 13 + + + + + 321 + + + 13 + + + + + 362 + + + 13 + + + + + 411 + + + 13 + + + From b66e06d51c96aef0c6e91f4f1d21503b83c4fdb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Tue, 17 Jun 2014 17:35:46 +0200 Subject: [PATCH 236/694] [Managed.Windows.Forms] Fix 'minimum' default value of NumericUpDown The 'minimum' default value of NumericUpDown was set to 0.0M, which caused the ToString() to format it as "0.0" instead of "0" as it does on .NET. A similar change was done for the 'maximum' default value already in f6c8d48a3aed377b8a11e38c96c0d4c774664279. Commit licensed under MIT/X11. --- .../Managed.Windows.Forms/System.Windows.Forms/NumericUpDown.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/NumericUpDown.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/NumericUpDown.cs index 5ffc23eb615..856137cb17e 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/NumericUpDown.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/NumericUpDown.cs @@ -109,7 +109,7 @@ public NumericUpDown() { hexadecimal = false; increment = 1M; maximum = 100M; - minimum = 0.0M; + minimum = 0M; thousands_separator = false; Text = "0"; From 9f3e361cfb93e83a27ccd01a6605f104d5291d6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Tue, 17 Jun 2014 17:55:29 +0200 Subject: [PATCH 237/694] Disable generic-xdomain.2.exe on CI as it occasionally hangs. --- mono/tests/Makefile.am | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mono/tests/Makefile.am b/mono/tests/Makefile.am index 097788b7100..4799766422d 100644 --- a/mono/tests/Makefile.am +++ b/mono/tests/Makefile.am @@ -563,7 +563,8 @@ DISABLED_TESTS_WRENCH= \ assemblyresolve_event3.exe \ delegate2.exe \ finally_guard.exe \ - gc-altstack.exe + gc-altstack.exe \ + generic-xdomain.2.exe AOT_DISABLED_TESTS=constraints-load.exe From cc0a7a9516a86b26b3cbeac5388f34ef81533831 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Tue, 17 Jun 2014 20:43:44 +0200 Subject: [PATCH 238/694] [aot] Add support for overriding the alignment calculations done by the runtime during AOT. This is needed because the alignment of some types, notable i8/double can be different between the host and the target platform. --- mono/metadata/metadata-internals.h | 2 ++ mono/metadata/metadata.c | 33 ++++++++++++++++++++++++++++-- mono/mini/mini-arm.c | 8 ++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/mono/metadata/metadata-internals.h b/mono/metadata/metadata-internals.h index 68b4d71dd3d..12eb5c15e85 100644 --- a/mono/metadata/metadata-internals.h +++ b/mono/metadata/metadata-internals.h @@ -762,5 +762,7 @@ MonoMethod* method_from_method_def_or_ref (MonoImage *m, guint32 tok, MonoGeneri MonoMethod *mono_get_method_constrained_with_method (MonoImage *image, MonoMethod *method, MonoClass *constrained_class, MonoGenericContext *context) MONO_INTERNAL; +void mono_type_set_alignment (MonoTypeEnum type, int align) MONO_INTERNAL; + #endif /* __MONO_METADATA_INTERNALS_H__ */ diff --git a/mono/metadata/metadata.c b/mono/metadata/metadata.c index c2c69706081..5a3a09bc7a8 100644 --- a/mono/metadata/metadata.c +++ b/mono/metadata/metadata.c @@ -4284,6 +4284,29 @@ mono_backtrace (int limit) #define abi__alignof__(type) G_STRUCT_OFFSET(struct { char c; type x; }, x) +static int i8_align; + +/* + * mono_type_set_alignment: + * + * Set the alignment used by runtime to layout fields etc. of type TYPE to ALIGN. + * This should only be used in AOT mode since the resulting layout will not match the + * host abi layout. + */ +void +mono_type_set_alignment (MonoTypeEnum type, int align) +{ + /* Support only a few types whose alignment is abi dependent */ + switch (type) { + case MONO_TYPE_I8: + i8_align = align; + break; + default: + g_assert_not_reached (); + break; + } +} + /* * mono_type_size: * @t: the type to return the size of @@ -4328,7 +4351,10 @@ mono_type_size (MonoType *t, int *align) return 4; case MONO_TYPE_I8: case MONO_TYPE_U8: - *align = abi__alignof__(gint64); + if (i8_align) + *align = i8_align; + else + *align = abi__alignof__(gint64); return 8; case MONO_TYPE_R8: *align = abi__alignof__(double); @@ -4453,7 +4479,10 @@ mono_type_stack_size_internal (MonoType *t, int *align, gboolean allow_open) return sizeof (float); case MONO_TYPE_I8: case MONO_TYPE_U8: - *align = abi__alignof__(gint64); + if (i8_align) + *align = i8_align; + else + *align = abi__alignof__(gint64); return sizeof (gint64); case MONO_TYPE_R8: *align = abi__alignof__(double); diff --git a/mono/mini/mini-arm.c b/mono/mini/mini-arm.c index b31b162bf07..71ed6a53d2e 100644 --- a/mono/mini/mini-arm.c +++ b/mono/mini/mini-arm.c @@ -816,6 +816,14 @@ mono_arch_cpu_init (void) #else i8_align = __alignof__ (gint64); #endif + +#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); +#endif +#endif } static gpointer From f396d37c5493455f0b7fe726b408d74ba1c8fb5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Tue, 17 Jun 2014 23:00:42 +0200 Subject: [PATCH 239/694] [System.ServiceModel] Changed test port from 8080 to 30158 Port 8080 is widely used and resulted in address conflicts on monojenkins, so we use a different port instead. Commit licensed under MIT/X11. --- .../WebServiceHostTest.cs | 10 +++---- .../MetadataExchangeBindingsTest.cs | 4 +-- .../ServiceMetadataBehaviorTest.cs | 28 +++++++++---------- .../DispatchRuntimeTest.cs | 6 ++-- .../ChannelFactory_1Test.cs | 4 +-- .../ServiceHostBaseTest.cs | 20 ++++++------- .../Test/System.Net/HttpListener2Test.cs | 4 +-- 7 files changed, 38 insertions(+), 38 deletions(-) diff --git a/mcs/class/System.ServiceModel.Web/Test/System.ServiceModel.Web/WebServiceHostTest.cs b/mcs/class/System.ServiceModel.Web/Test/System.ServiceModel.Web/WebServiceHostTest.cs index cf1038dac22..99376fbcd64 100644 --- a/mcs/class/System.ServiceModel.Web/Test/System.ServiceModel.Web/WebServiceHostTest.cs +++ b/mcs/class/System.ServiceModel.Web/Test/System.ServiceModel.Web/WebServiceHostTest.cs @@ -45,7 +45,7 @@ public class WebServiceHostTest [Category("NotWorking")] public void ServiceDebugBehaviorTest () { - var host = new WebServiceHost (typeof (MyService), new Uri ("http://localhost:8080/")); + var host = new WebServiceHost (typeof (MyService), new Uri ("http://localhost:30158/")); ServiceEndpoint webHttp = host.AddServiceEndpoint ("MonoTests.System.ServiceModel.Web.WebServiceHostTest+MyService", new WebHttpBinding (), "WebHttpBinding"); Assert.AreEqual (true, host.Description.Behaviors.Find ().HttpHelpPageEnabled, "HttpHelpPageEnabled #1"); @@ -63,7 +63,7 @@ public void ServiceDebugBehaviorTest () { [Category ("NotWorking")] public void WebHttpBehaviorTest1 () { - var host = new WebServiceHost (typeof (MyService), new Uri ("http://localhost:8080/")); + var host = new WebServiceHost (typeof (MyService), new Uri ("http://localhost:30158/")); ServiceEndpoint webHttp = host.AddServiceEndpoint ("MonoTests.System.ServiceModel.Web.WebServiceHostTest+MyService", new WebHttpBinding (), "WebHttpBinding"); ServiceEndpoint basicHttp = host.AddServiceEndpoint ("MonoTests.System.ServiceModel.Web.WebServiceHostTest+MyService", new BasicHttpBinding (), "BasicHttpBinding"); @@ -83,7 +83,7 @@ public void WebHttpBehaviorTest1 () { [Category("NotWorking")] public void WebHttpBehaviorTest2 () { - var host = new WebServiceHost (typeof (MyService), new Uri ("http://localhost:8080/")); + var host = new WebServiceHost (typeof (MyService), new Uri ("http://localhost:30158/")); ServiceEndpoint webHttp = host.AddServiceEndpoint ("MonoTests.System.ServiceModel.Web.WebServiceHostTest+MyService", new WebHttpBinding (), "WebHttpBinding"); MyWebHttpBehavior behavior = new MyWebHttpBehavior (); behavior.ApplyDispatchBehaviorBegin += delegate { @@ -103,7 +103,7 @@ public void WebHttpBehaviorTest2 () { [Test] public void ServiceBaseUriTest () { - var host = new WebServiceHost (typeof (MyService), new Uri ("http://localhost:8080/")); + var host = new WebServiceHost (typeof (MyService), new Uri ("http://localhost:30158/")); Assert.AreEqual (0, host.Description.Endpoints.Count, "no endpoints yet"); host.Open (); Assert.AreEqual (1, host.Description.Endpoints.Count, "default endpoint after open"); @@ -136,4 +136,4 @@ public string Greet (string input) { } } -#endif \ No newline at end of file +#endif diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/MetadataExchangeBindingsTest.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/MetadataExchangeBindingsTest.cs index 8f0be289fda..35cd408af1a 100644 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/MetadataExchangeBindingsTest.cs +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/MetadataExchangeBindingsTest.cs @@ -69,7 +69,7 @@ public void CreateMexHttpBinding () Assert.AreEqual (MessageVersion.Soap12WSAddressing10, b.GetProperty (new BindingParameterCollection ()), "#6"); var host = new ServiceHost (typeof (MetadataExchange)); - host.AddServiceEndpoint (typeof (IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding (), CreateUri ("http://localhost:8080")); + host.AddServiceEndpoint (typeof (IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding (), CreateUri ("http://localhost:30158")); host.Open (); try { // it still does not rewrite MessageVersion.None. It's rather likely ServiceMetadataExtension which does overwriting. @@ -96,7 +96,7 @@ public void CreateMexHttpsBinding() Assert.AreEqual(Uri.UriSchemeHttps, b.Scheme, "#8"); var host = new ServiceHost(typeof(MetadataExchange)); - host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpsBinding(), CreateUri("https://localhost:8080")); + host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpsBinding(), CreateUri("https://localhost:30158")); host.Open(); try { diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/ServiceMetadataBehaviorTest.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/ServiceMetadataBehaviorTest.cs index 38bece2f990..a4a22cb18d2 100644 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/ServiceMetadataBehaviorTest.cs +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/ServiceMetadataBehaviorTest.cs @@ -56,7 +56,7 @@ public string GetData () { [Test] public void InitializeRuntime1 () { - using (ServiceHost host = new ServiceHost (typeof (MyService), new Uri ("http://localhost:8080"))) { + using (ServiceHost host = new ServiceHost (typeof (MyService), new Uri ("http://localhost:30158"))) { host.AddServiceEndpoint (typeof (IMyContract), new BasicHttpBinding (), "e1"); host.Description.Behaviors.Add (new ServiceMetadataBehavior () { HttpGetEnabled = true }); @@ -93,10 +93,10 @@ public void InitializeRuntime1 () { [Test] public void InitializeRuntime2 () { - using (ServiceHost host = new ServiceHost (typeof (MyService), new Uri ("http://localhost:8080"))) { + using (ServiceHost host = new ServiceHost (typeof (MyService), new Uri ("http://localhost:30158"))) { host.AddServiceEndpoint (typeof (IMyContract), new BasicHttpBinding (), ""); - host.Description.Behaviors.Add (new ServiceMetadataBehavior () { HttpGetEnabled = true, HttpGetUrl = new Uri ("http://localhost:8080/mex_and_help") }); - host.Description.Behaviors.Find ().HttpHelpPageUrl = new Uri ("http://localhost:8080/mex_and_help"); + host.Description.Behaviors.Add (new ServiceMetadataBehavior () { HttpGetEnabled = true, HttpGetUrl = new Uri ("http://localhost:30158/mex_and_help") }); + host.Description.Behaviors.Find ().HttpHelpPageUrl = new Uri ("http://localhost:30158/mex_and_help"); Assert.AreEqual (0, host.ChannelDispatchers.Count, "ChannelDispatchers.Count #1"); @@ -125,10 +125,10 @@ public void InitializeRuntime2 () { [Test] public void InitializeRuntime3 () { - using (ServiceHost host = new ServiceHost (typeof (MyService), new Uri ("http://localhost:8080"))) { + using (ServiceHost host = new ServiceHost (typeof (MyService), new Uri ("http://localhost:30158"))) { host.AddServiceEndpoint (typeof (IMyContract), new BasicHttpBinding (), ""); - host.Description.Behaviors.Add (new ServiceMetadataBehavior () { HttpGetEnabled = true, HttpGetUrl = new Uri ("http://localhost:8080/mex") }); - host.Description.Behaviors.Find ().HttpHelpPageUrl = new Uri ("http://localhost:8080/help"); + host.Description.Behaviors.Add (new ServiceMetadataBehavior () { HttpGetEnabled = true, HttpGetUrl = new Uri ("http://localhost:30158/mex") }); + host.Description.Behaviors.Find ().HttpHelpPageUrl = new Uri ("http://localhost:30158/help"); Assert.AreEqual (0, host.ChannelDispatchers.Count, "ChannelDispatchers.Count #1"); @@ -176,9 +176,9 @@ public void InitializeRuntime3 () { [Test] public void InitializeRuntime4 () { - using (ServiceHost host = new ServiceHost (typeof (MyService), new Uri ("http://localhost:8080"))) { + using (ServiceHost host = new ServiceHost (typeof (MyService), new Uri ("http://localhost:30158"))) { host.AddServiceEndpoint (typeof (IMyContract), new BasicHttpBinding (), ""); - host.Description.Behaviors.Add (new ServiceMetadataBehavior () { HttpGetEnabled = true, HttpGetUrl = new Uri ("http://localhost:8080/mex") }); + host.Description.Behaviors.Add (new ServiceMetadataBehavior () { HttpGetEnabled = true, HttpGetUrl = new Uri ("http://localhost:30158/mex") }); host.Description.Behaviors.Remove (); Assert.AreEqual (0, host.ChannelDispatchers.Count, "ChannelDispatchers.Count #1"); @@ -204,7 +204,7 @@ public void InitializeRuntime4 () { Assert.AreEqual (0, ed.FilterPriority, "FilterPriority"); EndpointAddress ea = ed.EndpointAddress; - Assert.AreEqual (new Uri ("http://localhost:8080/mex"), ea.Uri, "Uri"); + Assert.AreEqual (new Uri ("http://localhost:30158/mex"), ea.Uri, "Uri"); DispatchRuntime dr = ed.DispatchRuntime; Assert.AreEqual (1, dr.Operations.Count, "Operations.Count"); @@ -221,9 +221,9 @@ public void InitializeRuntime4 () { [Test] public void ServiceMetadataExtension1 () { - using (ServiceHost host = new ServiceHost (typeof (MyService), new Uri ("http://localhost:8080"))) { + using (ServiceHost host = new ServiceHost (typeof (MyService), new Uri ("http://localhost:30158"))) { host.AddServiceEndpoint (typeof (IMyContract), new BasicHttpBinding (), ""); - host.Description.Behaviors.Add (new ServiceMetadataBehavior () { HttpGetEnabled = true, HttpGetUrl = new Uri ("http://localhost:8080/mex") }); + host.Description.Behaviors.Add (new ServiceMetadataBehavior () { HttpGetEnabled = true, HttpGetUrl = new Uri ("http://localhost:30158/mex") }); host.Description.Behaviors.Remove (); host.Open (); @@ -237,9 +237,9 @@ public void ServiceMetadataExtension1 () { [Test] public void ServiceMetadataExtension2 () { - using (ServiceHost host = new ServiceHost (typeof (MyService), new Uri ("http://localhost:8080"))) { + using (ServiceHost host = new ServiceHost (typeof (MyService), new Uri ("http://localhost:30158"))) { host.AddServiceEndpoint (typeof (IMyContract), new BasicHttpBinding (), ""); - host.Description.Behaviors.Add (new ServiceMetadataBehavior () { HttpGetEnabled = true, HttpGetUrl = new Uri ("http://localhost:8080/mex") }); + host.Description.Behaviors.Add (new ServiceMetadataBehavior () { HttpGetEnabled = true, HttpGetUrl = new Uri ("http://localhost:30158/mex") }); host.Description.Behaviors.Remove (); ServiceMetadataExtension extension = new ServiceMetadataExtension (); diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/DispatchRuntimeTest.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/DispatchRuntimeTest.cs index adff5706c8d..3607b4f2a02 100644 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/DispatchRuntimeTest.cs +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/DispatchRuntimeTest.cs @@ -53,7 +53,7 @@ public void TestConstructor () // free to change if MS implementation does not make // sense. DispatchRuntime r = new EndpointDispatcher ( - new EndpointAddress ("http://localhost:8080"), "IFoo", "urn:foo").DispatchRuntime; + new EndpointAddress ("http://localhost:30158"), "IFoo", "urn:foo").DispatchRuntime; Assert.AreEqual (AuditLogLocation.Default, r.SecurityAuditLogLocation, "#1"); @@ -153,7 +153,7 @@ public void TestInstanceBehavior4 () void TestInstanceBehavior (MessageInspectBehavior b, string expected, Result actual, int invocations) { - ServiceHost h = new ServiceHost (typeof (AllActions), new Uri ("http://localhost:8080")); + ServiceHost h = new ServiceHost (typeof (AllActions), new Uri ("http://localhost:30158")); try { h.AddServiceEndpoint (typeof (IAllActions).FullName, new BasicHttpBinding (), "AllActions"); h.Description.Behaviors.Add (b); @@ -167,7 +167,7 @@ void TestInstanceBehavior (MessageInspectBehavior b, string expected, Result act Assert.AreEqual (typeof (AllActions), ed.DispatchRuntime.Type, "Type property: " + ed.ContractName); } } - AllActionsProxy p = new AllActionsProxy (new BasicHttpBinding () { SendTimeout = TimeSpan.FromSeconds (5), ReceiveTimeout = TimeSpan.FromSeconds (5) }, new EndpointAddress ("http://localhost:8080/AllActions")); + AllActionsProxy p = new AllActionsProxy (new BasicHttpBinding () { SendTimeout = TimeSpan.FromSeconds (5), ReceiveTimeout = TimeSpan.FromSeconds (5) }, new EndpointAddress ("http://localhost:30158/AllActions")); for (int i = 0; i < invocations; ++i) p.Get (10); diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel/ChannelFactory_1Test.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel/ChannelFactory_1Test.cs index 427127e9468..70efef2761c 100644 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel/ChannelFactory_1Test.cs +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel/ChannelFactory_1Test.cs @@ -483,12 +483,12 @@ public void OneWayOperationWithRequestReplyChannel () var host = new ServiceHost (typeof (OneWayService)); host.AddServiceEndpoint (typeof (IOneWayService), new BasicHttpBinding (), - new Uri ("http://localhost:8080")); + new Uri ("http://localhost:30158")); host.Open (); try { var cf = new ChannelFactory ( new BasicHttpBinding (), - new EndpointAddress ("http://localhost:8080")); + new EndpointAddress ("http://localhost:30158")); var ch = cf.CreateChannel (); ch.GiveMessage ("test"); diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel/ServiceHostBaseTest.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel/ServiceHostBaseTest.cs index a5684e24b5f..a1ef13de3a0 100644 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel/ServiceHostBaseTest.cs +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel/ServiceHostBaseTest.cs @@ -159,7 +159,7 @@ public string GetData () { [Test] public void ChannelDispatchers_NoDebug () { - ServiceHost h = new ServiceHost (typeof (AllActions), new Uri ("http://localhost:8080")); + ServiceHost h = new ServiceHost (typeof (AllActions), new Uri ("http://localhost:30158")); h.AddServiceEndpoint (typeof (AllActions).FullName, new BasicHttpBinding (), "address"); ServiceDebugBehavior b = h.Description.Behaviors.Find (); @@ -183,11 +183,11 @@ public void ChannelDispatchers_NoDebug () { [Test] public void ChannelDispatchers_WithDebug () { - ServiceHost h = new ServiceHost (typeof (AllActions), new Uri ("http://localhost:8080")); + ServiceHost h = new ServiceHost (typeof (AllActions), new Uri ("http://localhost:30158")); h.AddServiceEndpoint (typeof (AllActions).FullName, new BasicHttpBinding (), "address"); ServiceMetadataBehavior b = new ServiceMetadataBehavior (); b.HttpGetEnabled = true; - b.HttpGetUrl = new Uri( "http://localhost:8080" ); + b.HttpGetUrl = new Uri( "http://localhost:30158" ); h.Description.Behaviors.Add (b); h.Open (); @@ -197,7 +197,7 @@ public void ChannelDispatchers_WithDebug () { Assert.IsTrue (channelDispatcher.Endpoints.Count == 1, "#3"); EndpointAddressMessageFilter filter = channelDispatcher.Endpoints [0].AddressFilter as EndpointAddressMessageFilter; Assert.IsNotNull (filter, "#4"); - Assert.IsTrue (filter.Address.Equals (new EndpointAddress ("http://localhost:8080")), "#5"); + Assert.IsTrue (filter.Address.Equals (new EndpointAddress ("http://localhost:30158")), "#5"); Assert.IsFalse (filter.IncludeHostNameInComparison, "#6"); Assert.IsTrue (channelDispatcher.Endpoints [0].ContractFilter is MatchAllMessageFilter, "#7"); h.Close (); @@ -207,7 +207,7 @@ public void ChannelDispatchers_WithDebug () { public void SpecificActionTest () { //EndpointDispatcher d = new EndpointDispatcher( - ServiceHost h = new ServiceHost (typeof (SpecificAction), new Uri ("http://localhost:8080")); + ServiceHost h = new ServiceHost (typeof (SpecificAction), new Uri ("http://localhost:30158")); h.AddServiceEndpoint (typeof (Action1Interface), new BasicHttpBinding (), "address"); h.Open (); @@ -222,7 +222,7 @@ public void SpecificActionTest () [Test] public void InitializeRuntimeBehaviors1 () { HostState st = new HostState (); - ServiceHost h = new ServiceHost (typeof (SpecificAction2), new Uri ("http://localhost:8080")); + ServiceHost h = new ServiceHost (typeof (SpecificAction2), new Uri ("http://localhost:30158")); h.AddServiceEndpoint (typeof (SpecificAction2), new BasicHttpBinding (), "temp"); h.Description.Behaviors.Add (new MyServiceBehavior (st, h)); @@ -241,7 +241,7 @@ public void InitializeRuntimeBehaviors1 () { [Test] public void InitializeRuntimeBehaviors2 () { HostState st = new HostState (); - ServiceHost h = new ServiceHost (typeof (SpecificAction), new Uri ("http://localhost:8080")); + ServiceHost h = new ServiceHost (typeof (SpecificAction), new Uri ("http://localhost:30158")); h.AddServiceEndpoint (typeof (Action1Interface), new BasicHttpBinding (), "temp"); h.AddServiceEndpoint (typeof (Action2Interface), new BasicHttpBinding (), "temp2"); @@ -368,7 +368,7 @@ ServiceHost OpenHost (string address, Binding binding) public void AddServiceEndpoint_Directly () { var host = new ServiceHost (typeof (DummyService)); - var address = new EndpointAddress ("http://localhost:8080"); + var address = new EndpointAddress ("http://localhost:30158"); var binding = new BasicHttpBinding (); var contract = ContractDescription.GetContract (typeof (IDummyService)); host.AddServiceEndpoint (new ServiceEndpoint (contract, binding, address)); @@ -389,7 +389,7 @@ public void AddServiceEndpoint_Directly_NullAddress () public void AddServiceEndpoint_Directly_NullBinding () { var host = new ServiceHost (typeof (DummyService)); - var address = new EndpointAddress ("http://localhost:8080"); + var address = new EndpointAddress ("http://localhost:30158"); var contract = ContractDescription.GetContract (typeof (IDummyService)); host.AddServiceEndpoint (new ServiceEndpoint (contract, null, address)); } @@ -407,7 +407,7 @@ public void AddServiceMetadataEndpoint () public void AddServiceEndpoint_Directly_ContractMismatch () { var host = new ServiceHost (typeof (DummyService)); - var address = new EndpointAddress ("http://localhost:8080"); + var address = new EndpointAddress ("http://localhost:30158"); var binding = new BasicHttpBinding (); var contract = ContractDescription.GetContract (typeof (INotImplementedService)); host.AddServiceEndpoint (new ServiceEndpoint (contract, binding, address)); diff --git a/mcs/class/System/Test/System.Net/HttpListener2Test.cs b/mcs/class/System/Test/System.Net/HttpListener2Test.cs index abff4e15a9a..029d3eb6ad5 100644 --- a/mcs/class/System/Test/System.Net/HttpListener2Test.cs +++ b/mcs/class/System/Test/System.Net/HttpListener2Test.cs @@ -723,11 +723,11 @@ public void Test_HostInUri () public void ClosePort () { var h = new HttpListener (); - h.Prefixes.Add ("http://127.0.0.1:8080/"); + h.Prefixes.Add ("http://127.0.0.1:30158/"); h.Start (); h.BeginGetContext (null, null); h.Stop (); - TcpListener t = new TcpListener (IPAddress.Parse ("127.0.0.1"), 8080); + TcpListener t = new TcpListener (IPAddress.Parse ("127.0.0.1"), 30158); t.Start (); t.Stop (); } From e761d7d52130a7644561290c5fc507b49819481c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Wed, 18 Jun 2014 02:38:52 +0200 Subject: [PATCH 240/694] Silence a warning in file-mmap-posix.c. --- mono/metadata/file-mmap-posix.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mono/metadata/file-mmap-posix.c b/mono/metadata/file-mmap-posix.c index 7e3195e0d43..6f8b7f2d9bf 100644 --- a/mono/metadata/file-mmap-posix.c +++ b/mono/metadata/file-mmap-posix.c @@ -290,8 +290,9 @@ open_file_map (MonoString *path, int input_fd, int mode, gint64 *capacity, int a *capacity = align_up_to_page_size ((size_t)*capacity); - if (*capacity > buf.st_size) - ftruncate (fd, (off_t)*capacity); + if (*capacity > buf.st_size) { + int unused G_GNUC_UNUSED = ftruncate (fd, (off_t)*capacity); + } handle = g_new0 (FileHandle, 1); handle->handle.kind = MMAP_KIND_FILE; From db9f761a7879b3e149935f3b9f9e1c6ae354f469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Wed, 18 Jun 2014 10:01:36 +0200 Subject: [PATCH 241/694] Fixed another 8080 test port I missed that one in f396d37c5493455f0b7fe726b408d74ba1c8fb5f. --- .../Test/System.ServiceModel/ServiceHostBaseTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel/ServiceHostBaseTest.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel/ServiceHostBaseTest.cs index a1ef13de3a0..d73d516cbbb 100644 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel/ServiceHostBaseTest.cs +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel/ServiceHostBaseTest.cs @@ -173,7 +173,7 @@ public void ChannelDispatchers_NoDebug () { Assert.IsTrue (channelDispatcher.Endpoints.Count == 1, "#2"); EndpointAddressMessageFilter filter = channelDispatcher.Endpoints [0].AddressFilter as EndpointAddressMessageFilter; Assert.IsNotNull (filter, "#3"); - Assert.IsTrue (filter.Address.Equals (new EndpointAddress ("http://localhost:8080/address")), "#4"); + Assert.IsTrue (filter.Address.Equals (new EndpointAddress ("http://localhost:30158/address")), "#4"); Assert.IsFalse (filter.IncludeHostNameInComparison, "#5"); Assert.IsTrue (channelDispatcher.Endpoints [0].ContractFilter is MatchAllMessageFilter, "#6"); } finally { From 51c454f6b03b468273bb93db2aa9b76e330a7e57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Wed, 18 Jun 2014 16:06:34 +0200 Subject: [PATCH 242/694] [ppc] Add missing `sync` instructions to atomic opcodes. Note that lwarx and stwcx don't produce the necessary load/store barrier that's needed to conform to the `Interlocked` API. --- mono/mini/mini-ppc.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mono/mini/mini-ppc.c b/mono/mini/mini-ppc.c index 69a1d3d78aa..d2a7aec7cd7 100644 --- a/mono/mini/mini-ppc.c +++ b/mono/mini/mini-ppc.c @@ -4388,6 +4388,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_ATOMIC_ADD_NEW_I8: { guint8 *loop = code, *branch; g_assert (ins->inst_offset == 0); + ppc_sync (code); if (ins->opcode == OP_ATOMIC_ADD_NEW_I4) ppc_lwarx (code, ppc_r0, 0, ins->inst_basereg); else @@ -4400,6 +4401,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) 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; } @@ -4426,6 +4428,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) guint8 *start, *not_equal, *lost_reservation; start = code; + ppc_sync (code); if (ins->opcode == OP_ATOMIC_CAS_I4) ppc_lwarx (code, ppc_r0, 0, location); #ifdef __mono_ppc64__ @@ -4448,6 +4451,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ppc_patch (lost_reservation, start); ppc_patch (not_equal, code); + ppc_sync (code); ppc_mr (code, ins->dreg, ppc_r0); break; } From cfa3d9898a6be40d90a007157b9d3aa8781c4454 Mon Sep 17 00:00:00 2001 From: Timotheus Pokorra Date: Wed, 18 Jun 2014 16:08:04 +0200 Subject: [PATCH 243/694] ImageListStreamer generates winform resource files that work on Mono but fail on Microsoft.net with exception System.InvalidOperationException: Loading of the ImageList did not succeed. see bug https://bugzilla.xamarin.com/show_bug.cgi?id=3841 for detailed analysis --- .../System.Windows.Forms/ImageListStreamer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ImageListStreamer.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ImageListStreamer.cs index a930aa9301f..5fa129b4c06 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ImageListStreamer.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ImageListStreamer.cs @@ -150,7 +150,7 @@ static void WriteToFile (MemoryStream st) } */ - static byte [] header = new byte []{ 77, 83, 70, 116, 73, 76, 3, 0 }; + static byte [] header = new byte []{ 77, 83, 70, 116, 73, 76, 1, 1 }; public void GetObjectData (SerializationInfo si, StreamingContext context) { MemoryStream stream = new MemoryStream (); @@ -169,7 +169,7 @@ public void GetObjectData (SerializationInfo si, StreamingContext context) writer.Write ((ushort) (images [0].Width)); writer.Write ((ushort) (images [0].Height)); writer.Write (0xFFFFFFFF); //BackColor.ToArgb ()); //FIXME: should set the right one here. - writer.Write ((ushort) 0x1009); + writer.Write ((ushort) 0x21); for (int i = 0; i < 4; i++) writer.Write ((short) -1); From b8d5a800f8fe18928d6c8e4f2055bb676b86bb1e Mon Sep 17 00:00:00 2001 From: Andrius Bentkus Date: Fri, 2 May 2014 16:18:45 +0200 Subject: [PATCH 244/694] Expose full epoll_ctl functionality. Now the user has access to all struct elements in EpollEvent when using epoll_ctl. This is in particular very intersting when the user wants to access the ptr field. The user can use GCHandle.ToIntPtr to give the struct a GCHandle and then handle the pointer later on when using epoll_wait. --- mcs/class/Mono.Posix/Mono.Unix.Native/Syscall.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mcs/class/Mono.Posix/Mono.Unix.Native/Syscall.cs b/mcs/class/Mono.Posix/Mono.Unix.Native/Syscall.cs index 7ba53e922bf..0b8f1e6fa02 100644 --- a/mcs/class/Mono.Posix/Mono.Unix.Native/Syscall.cs +++ b/mcs/class/Mono.Posix/Mono.Unix.Native/Syscall.cs @@ -2842,7 +2842,7 @@ public static int epoll_ctl (int epfd, EpollOp op, int fd, EpollEvents events) ee.events = events; ee.fd = fd; - return sys_epoll_ctl (epfd, op, fd, ref ee); + return epoll_ctl (epfd, op, fd, ref ee); } public static int epoll_wait (int epfd, EpollEvent [] events, int max_events, int timeout) @@ -2860,7 +2860,7 @@ public static int epoll_wait (int epfd, EpollEvent [] events, int max_events, in private static extern int sys_epoll_create1 (EpollFlags flags); [DllImport (LIBC, SetLastError=true, EntryPoint="epoll_ctl")] - private static extern int sys_epoll_ctl (int epfd, EpollOp op, int fd, ref EpollEvent ee); + public static extern int epoll_ctl (int epfd, EpollOp op, int fd, ref EpollEvent ee); [DllImport (LIBC, SetLastError=true, EntryPoint="epoll_wait")] private static extern int sys_epoll_wait (int epfd, EpollEvent [] ee, int maxevents, int timeout); From df49c2d640ee98a58a1bb1a557e871ae619ba743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Wed, 18 Jun 2014 17:02:32 +0200 Subject: [PATCH 245/694] Added dllmap for libgtk-x11 and libgdk-x11 Commit licensed under MIT/X11. --- configure.ac | 6 ++++++ data/config.in | 2 ++ 2 files changed, 8 insertions(+) diff --git a/configure.ac b/configure.ac index 6d06c9227ec..0551bfe429b 100644 --- a/configure.ac +++ b/configure.ac @@ -2519,6 +2519,8 @@ INTL="libc.so.6" SQLITE="libsqlite.so.0" SQLITE3="libsqlite3.so.0" X11="libX11.so" +GDKX11="libgdk-x11-2.0.so.0" +GTKX11="libgtk-x11-2.0.so.0" XINERAMA="libXinerama.so" sizeof_register="SIZEOF_VOID_P" @@ -2974,6 +2976,8 @@ case "$host" in SQLITE="libsqlite.0.dylib" SQLITE3="libsqlite3.0.dylib" X11="libX11.dylib" + GDKX11="libgdk-x11-2.0.dylib" + GTKX11="libgtk-x11-2.0.dylib" ;; *-*-*netbsd*) LIBC="libc.so.12" @@ -3369,6 +3373,8 @@ AC_SUBST(INTL) AC_SUBST(SQLITE) AC_SUBST(SQLITE3) AC_SUBST(X11) +AC_SUBST(GDKX11) +AC_SUBST(GTKX11) AC_SUBST(XINERAMA) AC_DEFINE_UNQUOTED(ARCHITECTURE,"$arch_target",[The architecture this is running on]) AC_SUBST(arch_target) diff --git a/data/config.in b/data/config.in index 44fefc08027..3cc39732e1c 100644 --- a/data/config.in +++ b/data/config.in @@ -16,6 +16,8 @@ + + From 2f3d0439a2d0f8d5bd9eec2a6fc74b0d8b140e6d Mon Sep 17 00:00:00 2001 From: Iain Lane Date: Mon, 2 Jul 2012 14:59:51 +0200 Subject: [PATCH 246/694] Override registry storage with MONO_CURRENTUSER_REGISTRY_PATH https://bugzilla.xamarin.com/show_bug.cgi?id=358 --- mcs/class/corlib/Microsoft.Win32/UnixRegistryApi.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/mcs/class/corlib/Microsoft.Win32/UnixRegistryApi.cs b/mcs/class/corlib/Microsoft.Win32/UnixRegistryApi.cs index 78d51927ed3..41e7bf5a4a7 100644 --- a/mcs/class/corlib/Microsoft.Win32/UnixRegistryApi.cs +++ b/mcs/class/corlib/Microsoft.Win32/UnixRegistryApi.cs @@ -770,9 +770,13 @@ private void AssertNotMarkedForDeletion () private static string UserStore { get { - if (user_store == null) - user_store = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.Personal), - ".mono/registry"); + if (user_store == null) { + user_store = Environment.GetEnvironmentVariable ("MONO_CURRENTUSER_REGISTRY_PATH"); + if (string.IsNullOrEmpty(user_store)) { + user_store = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.Personal), + ".mono/registry"); + } + } return user_store; } From 83a34c40c6a0911a0c27afce63f5ea7ec2bb4b26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Wed, 18 Jun 2014 21:30:07 +0200 Subject: [PATCH 247/694] [ppc] Bump instruction sizes after 51c454f6b03b468273bb93db2aa9b76e330a7e57. --- mono/mini/cpu-ppc.md | 2 +- mono/mini/cpu-ppc64.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mono/mini/cpu-ppc.md b/mono/mini/cpu-ppc.md index f21320cabde..e8f83655fc8 100644 --- a/mono/mini/cpu-ppc.md +++ b/mono/mini/cpu-ppc.md @@ -313,4 +313,4 @@ vcall2_membase: src1:b len:16 clob:c jump_table: dest:i len:8 -atomic_cas_i4: src1:b src2:i src3:i dest:i len:30 +atomic_cas_i4: src1:b src2:i src3:i dest:i len:38 diff --git a/mono/mini/cpu-ppc64.md b/mono/mini/cpu-ppc64.md index 4bf27a306ee..889af55b4a2 100644 --- a/mono/mini/cpu-ppc64.md +++ b/mono/mini/cpu-ppc64.md @@ -383,5 +383,5 @@ 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_cas_i4: src1:b src2:i src3:i dest:i len:30 -atomic_cas_i8: src1:b src2:i src3:i dest:i len:30 +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 From aeab5b59021f4a712d54357c8bbeaa6fac12dc37 Mon Sep 17 00:00:00 2001 From: Alexis Christoforides Date: Wed, 18 Jun 2014 22:11:43 -0400 Subject: [PATCH 248/694] [System.ComponentModel] BindingList.ListChanged now attempts to provide a PropertyDescriptor when possible. BindingList subscribes to PropertyChanged events of eligible contained objects. Iff the PropertyName provided is valid, the list event's ListChangedEventArgs will also contain a PropertyDescriptor. This is to match MS behavior. --- mcs/class/System/System.ComponentModel/BindingList.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mcs/class/System/System.ComponentModel/BindingList.cs b/mcs/class/System/System.ComponentModel/BindingList.cs index b4c0ce8b69b..181b91dbbc9 100644 --- a/mcs/class/System/System.ComponentModel/BindingList.cs +++ b/mcs/class/System/System.ComponentModel/BindingList.cs @@ -248,7 +248,14 @@ protected override void InsertItem (int index, T item) void Item_PropertyChanged (object item, PropertyChangedEventArgs args) { - OnListChanged (new ListChangedEventArgs (ListChangedType.ItemChanged, base.IndexOf ((T) item)) ); + var property_info = item.GetType ().GetProperty (args.PropertyName); + + if (property_info != null) { + OnListChanged (new ListChangedEventArgs (ListChangedType.ItemChanged, base.IndexOf ((T) item), + new ReflectionPropertyDescriptor (property_info)) ); + } else { + OnListChanged (new ListChangedEventArgs (ListChangedType.ItemChanged, base.IndexOf ((T) item)) ); + } } protected virtual void OnAddingNew (AddingNewEventArgs e) From 357e5fe0ee9c2ef9462ce4669fc092d1aecf3d3c Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Thu, 19 Jun 2014 14:58:22 +0200 Subject: [PATCH 249/694] [xbuild] Implements property functions using constructor syntax. Fixes #12999 --- .../Microsoft.Build.BuildEngine/Expression.cs | 127 ++++++++++-------- .../MemberInvocationReference.cs | 18 ++- .../Test/various/Properties.cs | 35 ++++- 3 files changed, 119 insertions(+), 61 deletions(-) diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Expression.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Expression.cs index 655224f89a8..ccfc0fa3a0e 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Expression.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Expression.cs @@ -55,6 +55,14 @@ namespace Microsoft.Build.BuildEngine { internal class Expression { + enum TokenKind + { + OpenParens, + CloseParens, + Dot, + End + } + ExpressionCollection expressionCollection; static Regex item_regex; @@ -232,6 +240,7 @@ static List ExtractProperties (string text) pos += 2; int start = pos; int end = 0; + bool requires_closing_parens = true; var ch = text [pos]; if ((ch == 'r' || ch == 'R') && text.Substring (pos + 1).StartsWith ("egistry:", StringComparison.OrdinalIgnoreCase)) { @@ -273,6 +282,7 @@ static List ExtractProperties (string text) // Simple property reference $(Foo) // phase.Add (new PropertyReference (name)); + requires_closing_parens = false; } else { end = 0; } @@ -287,6 +297,14 @@ static List ExtractProperties (string text) pos = end; } + + if (requires_closing_parens) { + end = text.IndexOf (')', pos); + if (end < 0) + end = 0; + else + pos = end + 1; + } } end = text.IndexOf ("$(", pos, StringComparison.Ordinal); @@ -493,70 +511,71 @@ static List ParseArguments (string text, ref int pos) static MemberInvocationReference ParseInvocation (string text, ref int p, Type type, IReference instance) { - var open_parens = text.IndexOf ('(', p); - string name; - int end; - List args; + TokenKind token; + MemberInvocationReference mir = null; + + while (true) { + int prev = p; + token = ScanName (text, ref p); + var name = text.Substring (prev, p - prev).TrimEnd (); + + switch (token) { + case TokenKind.Dot: + case TokenKind.OpenParens: + break; + case TokenKind.CloseParens: + return new MemberInvocationReference (type, name) { + Instance = instance + }; + + case TokenKind.End: + if (mir == null || name.Length != 0) + throw new InvalidProjectFileException (string.Format ("Invalid static method invocation syntax '{0}'", text.Substring (p))); + + return mir; + default: + throw new NotImplementedException (); + } - // - // Is it method or property - // - if (open_parens > 0) { - name = text.Substring (p, open_parens - p); - - // - // It can be instance method on static property - // - if (name.IndexOf ('.') > 0) { - var names = name.Split ('.'); - int i; - for (i = 0; i < names.Length - 1; ++i) { - instance = new MemberInvocationReference (type, names [i]) { - Instance = instance - }; - } + instance = mir = new MemberInvocationReference (type, name) { + Instance = instance + }; + + if (type != null) { + if (!IsMethodAllowed (type, name)) + throw new InvalidProjectFileException (string.Format ("The function '{0}' on type '{1}' has not been enabled for execution", name, type.FullName)); type = null; - name = names [i]; } - ++open_parens; - args = ParseArguments (text, ref open_parens); - end = text.IndexOf (')', open_parens); - } else { - end = text.IndexOf (')', p); - if (end < 0) - throw new InvalidProjectFileException (string.Format ("Invalid static method invocation syntax '{0}'", text.Substring (p))); - - name = text.Substring (p, end - p); - - // - // It can be instance member on static property - // - if (name.IndexOf ('.') > 0) { - var names = name.Split ('.'); - int i; - for (i = 0; i < names.Length - 1; ++i) { - instance = new MemberInvocationReference (type, names [i]) { - Instance = instance - }; - } - type = null; - name = names [i]; + if (token == TokenKind.OpenParens) { + ++p; + mir.Arguments = ParseArguments (text, ref p); + } + + if (p < text.Length && text [p] == '.') { + ++p; + continue; } - args = null; + return mir; } + } - name = name.TrimEnd (); - if (!IsMethodAllowed (type, name)) - throw new InvalidProjectFileException (string.Format ("The function '{0}' on type '{1}' has not been enabled for execution", name, type.FullName)); + static TokenKind ScanName (string text, ref int p) + { + for (; p < text.Length; ++p) { + switch (text [p]) { + case '(': + return TokenKind.OpenParens; + case '.': + return TokenKind.Dot; + case ')': + return TokenKind.CloseParens; + } + } - p = end + 1; - return new MemberInvocationReference (type, name) { - Arguments = args, - Instance = instance - }; + return TokenKind.End; } ArrayList SplitMetadata (string text) diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/MemberInvocationReference.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/MemberInvocationReference.cs index ada57788f2a..6430992fba9 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/MemberInvocationReference.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/MemberInvocationReference.cs @@ -63,10 +63,16 @@ object Invoke (Project project, ExpressionOptions options) { var flags = BindingFlags.IgnoreCase | BindingFlags.Public; object target; + string member_name = name; if (Instance == null) { target = null; - flags |= BindingFlags.Static; + if (string.Equals (member_name, "new", StringComparison.OrdinalIgnoreCase)) { + member_name = ConstructorInfo.ConstructorName; + flags |= BindingFlags.CreateInstance | BindingFlags.Instance; + } else { + flags |= BindingFlags.Static; + } } else { var mir = Instance as MemberInvocationReference; if (mir != null) { @@ -91,14 +97,14 @@ object Invoke (Project project, ExpressionOptions options) } else { flags |= BindingFlags.InvokeMethod; ExpandArguments (project, options); - args = PrepareMethodArguments (flags); + args = PrepareMethodArguments (member_name, flags); if (args == null) throw new InvalidProjectFileException (string.Format ("Method '{0}({1})' arguments cannot be evaluated'", name, string.Join (", ", Arguments.ToArray ()))); } object value; try { - value = type.InvokeMember (name, flags, null, target, args, CultureInfo.InvariantCulture); + value = type.InvokeMember (member_name, flags, null, target, args, CultureInfo.InvariantCulture); } catch (MissingFieldException) { // // It can be field/constant instead of a property @@ -106,7 +112,7 @@ object Invoke (Project project, ExpressionOptions options) if (args == null && Instance == null) { flags &= ~BindingFlags.GetProperty; flags |= BindingFlags.GetField; - value = type.InvokeMember (name, flags, null, null, null, CultureInfo.InvariantCulture); + value = type.InvokeMember (member_name, flags, null, null, null, CultureInfo.InvariantCulture); } else { throw; } @@ -132,9 +138,9 @@ void ExpandArguments (Project project, ExpressionOptions options) } } - object[] PrepareMethodArguments (BindingFlags flags) + object[] PrepareMethodArguments (string name, BindingFlags flags) { - var candidates = type.GetMember (name, MemberTypes.Method, flags); + var candidates = type.GetMember (name, MemberTypes.Method | MemberTypes.Constructor, flags); object[] args = null; ParameterInfo[] best = null; foreach (MethodBase candidate in candidates) { diff --git a/mcs/class/Microsoft.Build.Engine/Test/various/Properties.cs b/mcs/class/Microsoft.Build.Engine/Test/various/Properties.cs index b45bc39228b..795a7123066 100644 --- a/mcs/class/Microsoft.Build.Engine/Test/various/Properties.cs +++ b/mcs/class/Microsoft.Build.Engine/Test/various/Properties.cs @@ -175,6 +175,22 @@ public void InstanceMemberOnStaticProperty () Assert.AreEqual (DateTime.Now.Year.ToString (), proj.GetEvaluatedProperty ("Prop1"), "#1"); } + [Test] + public void InstanceMembersOnStaticMethod () + { + string documentString = @" + + + $([System.String]::Concat('a', 'bb', 'c').Length.GetHashCode ()) + + + + "; + + proj.LoadXml (documentString); + Assert.AreEqual (4.GetHashCode ().ToString (), proj.GetEvaluatedProperty ("Prop1"), "#1"); + } + [Test] public void MSBuildPropertyFunctions () { @@ -190,6 +206,23 @@ public void MSBuildPropertyFunctions () proj.LoadXml (documentString); Assert.AreEqual ("6.6", proj.GetEvaluatedProperty ("Prop1"), "#1"); - } + } + + [Test] + public void Constructor () + { + string documentString = @" + + + 0.6 + 6 + $([System.String]::new('value').EndsWith ('ue')) + + + "; + + proj.LoadXml (documentString); + Assert.AreEqual ("True", proj.GetEvaluatedProperty ("Prop1"), "#1"); + } } } From 3ee57747e496d93cf4b2732db40f529bf824cf1b Mon Sep 17 00:00:00 2001 From: Miguel de Icaza Date: Thu, 19 Jun 2014 09:34:59 -0400 Subject: [PATCH 250/694] Revert change that introduces a new undocumented environment variable --- mcs/class/corlib/Microsoft.Win32/UnixRegistryApi.cs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/mcs/class/corlib/Microsoft.Win32/UnixRegistryApi.cs b/mcs/class/corlib/Microsoft.Win32/UnixRegistryApi.cs index 4d4847a9713..1cb4c39eacd 100644 --- a/mcs/class/corlib/Microsoft.Win32/UnixRegistryApi.cs +++ b/mcs/class/corlib/Microsoft.Win32/UnixRegistryApi.cs @@ -771,13 +771,9 @@ private void AssertNotMarkedForDeletion () private static string UserStore { get { - if (user_store == null) { - user_store = Environment.GetEnvironmentVariable ("MONO_CURRENTUSER_REGISTRY_PATH"); - if (string.IsNullOrEmpty(user_store)) { - user_store = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.Personal), - ".mono/registry"); - } - } + if (user_store == null) + user_store = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.Personal), + ".mono/registry"); return user_store; } From feec6280267e8bdcced861653e5eed0a75f9ea95 Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Thu, 19 Jun 2014 17:27:27 +0200 Subject: [PATCH 251/694] [xbuild] Parsing conditions with property references. Fixes #20634 --- .../ConditionParser.cs | 30 ++++++++++++------- .../ConditionTokenizer.cs | 23 ++++++++++++++ .../Test/various/Conditions.cs | 18 +++++++++++ 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConditionParser.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConditionParser.cs index ec538abc29f..b5e2e809ae4 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConditionParser.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConditionParser.cs @@ -182,7 +182,7 @@ ConditionExpression ParseFactorExpression () e = new ConditionFactorExpression (token); } else if (token.Type == TokenType.Item || token.Type == TokenType.Property || token.Type == TokenType.Metadata) { - e = ParseReferenceExpression (token.Value); + e = ParseReferenceExpression (token.Value [0]); } else if (token.Type == TokenType.Not) { e = ParseNotExpression (); } else @@ -224,21 +224,33 @@ ConditionExpression ParseFunctionExpression (string function_name) } //@prefix: @ or $ - ConditionExpression ParseReferenceExpression (string prefix) + ConditionExpression ParseReferenceExpression (char prefix) { - StringBuilder sb = new StringBuilder (); - - string ref_type = prefix [0] == '$' ? "a property" : "an item list"; int token_pos = tokenizer.Token.Position; + string ref_type = prefix == '$' ? "a property" : "an item list"; IsAtToken (TokenType.LeftParen, String.Format ( "Expected {0} at position {1} in condition \"{2}\". Missing opening parantheses after the '{3}'.", ref_type, token_pos, conditionStr, prefix)); - tokenizer.GetNextToken (); + + if (prefix == '$') { + // + // Tjhe scan should consider quoted parenthesis but it breaks on .net as well + // we are bug compatible + // + tokenizer.ScanForClosingParens (); + } else { + tokenizer.GetNextToken (); + } + + if (tokenizer.IsEOF ()) + throw new ExpressionParseException ("Missing closing parenthesis in condition " + conditionStr); + + StringBuilder sb = new StringBuilder (); sb.AppendFormat ("{0}({1}", prefix, tokenizer.Token.Value); tokenizer.GetNextToken (); - if (prefix == "@" && tokenizer.Token.Type == TokenType.Transform) { + if (prefix == '@' && tokenizer.Token.Type == TokenType.Transform) { tokenizer.GetNextToken (); sb.AppendFormat ("->'{0}'", tokenizer.Token.Value); @@ -250,9 +262,7 @@ ConditionExpression ParseReferenceExpression (string prefix) } } - IsAtToken (TokenType.RightParen, String.Format ( - "Expected {0} at position {1} in condition \"{2}\". Missing closing parantheses'.", - ref_type, token_pos, conditionStr, prefix)); + IsAtToken (TokenType.RightParen, "Missing closing parenthesis in condition " + conditionStr); tokenizer.GetNextToken (); sb.Append (")"); diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConditionTokenizer.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConditionTokenizer.cs index 29a4aba628a..d9ee74475d6 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConditionTokenizer.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConditionTokenizer.cs @@ -257,6 +257,29 @@ public void GetNextToken () } else throw new ExpressionParseException (String.Format ("Invalid token: {0}", ch)); } + + public void ScanForClosingParens (int parensCounter = 1) + { + tokenPosition = position; + int start = position; + int ch; + while ((ch = ReadChar ()) >= 0) { + switch (ch) { + case ')': + if (--parensCounter == 0) { + --position; + token = new Token (inputString.Substring (start, position - start), TokenType.String, tokenPosition); + return; + } + break; + case '(': + ++parensCounter; + break; + } + } + + token = new Token (null, TokenType.EOF, tokenPosition); + } public int TokenPosition { get { return tokenPosition; } diff --git a/mcs/class/Microsoft.Build.Engine/Test/various/Conditions.cs b/mcs/class/Microsoft.Build.Engine/Test/various/Conditions.cs index 51c3da6cfbf..c3c8dacabc5 100644 --- a/mcs/class/Microsoft.Build.Engine/Test/various/Conditions.cs +++ b/mcs/class/Microsoft.Build.Engine/Test/various/Conditions.cs @@ -357,6 +357,24 @@ public void TestCondition12 () Assert.IsNull (proj.EvaluatedProperties ["A"], "A1"); } + [Test] + public void TestCondition_References () + { + Engine engine = new Engine (Consts.BinPath); + Project proj = engine.CreateNewProject (); + + string documentString = @" + + + valid + + + "; + + proj.LoadXml (documentString); + + Assert.AreEqual ("valid", proj.GetEvaluatedProperty ("A"), "#1"); + } [Test] public void TestHasTrailingSlash1 () From c5771113c2d16b8257ee8e1961cfdc9057afe745 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Thu, 19 Jun 2014 14:31:26 -0400 Subject: [PATCH 252/694] [runtime] Don't perform double accounting of offset for named memory segments. Fixes #20591 --- .../MemoryMappedFileTest.cs | 11 +++++++++++ mono/metadata/file-mmap-posix.c | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/mcs/class/System.Core/Test/System.IO.MemoryMappedFiles/MemoryMappedFileTest.cs b/mcs/class/System.Core/Test/System.IO.MemoryMappedFiles/MemoryMappedFileTest.cs index 8e47c0a8fff..21aba946c55 100644 --- a/mcs/class/System.Core/Test/System.IO.MemoryMappedFiles/MemoryMappedFileTest.cs +++ b/mcs/class/System.Core/Test/System.IO.MemoryMappedFiles/MemoryMappedFileTest.cs @@ -305,6 +305,17 @@ public void MapAtEdgeOfPage () Assert.AreEqual (0xFF, v1.ReadByte (i + 500)); } } + + [Test] + public void DoubleAccountingInOffsetCalculation () + { + var memoryMappedFile90 = MemoryMappedFile.CreateNew (MkNamedMapping (), 4194304, MemoryMappedFileAccess.ReadWrite); + var stream = memoryMappedFile90.CreateViewStream (4186112, 3222, MemoryMappedFileAccess.Write); + using (var tw = new StreamWriter(stream)) + { + tw.WriteLine ("Hello World!"); + } + } } } diff --git a/mono/metadata/file-mmap-posix.c b/mono/metadata/file-mmap-posix.c index 6f8b7f2d9bf..c862a395109 100644 --- a/mono/metadata/file-mmap-posix.c +++ b/mono/metadata/file-mmap-posix.c @@ -488,9 +488,9 @@ mono_mmap_map (void *handle, gint64 offset, gint64 *size, int access, void **mma if (!eff_size) eff_size = *size = mh->length; - mmap_offset = (size_t)mmap_offset; + mmap_offset = (size_t)offset; res.address = (char*)mh->address + offset; - res.length = (size_t)size; + res.length = (size_t)*size; res.kind = MMAP_KIND_MEMORY; } From 15c725c674d915c9463e891957e5149dcb23c844 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Thu, 19 Jun 2014 20:58:12 +0200 Subject: [PATCH 253/694] [runtime] Free static bound delegate wrappers of dynamic methods. Fixes #19058. --- mono/metadata/marshal.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c index 19aaa1a6b09..d274305e559 100644 --- a/mono/metadata/marshal.c +++ b/mono/metadata/marshal.c @@ -12981,6 +12981,9 @@ mono_marshal_free_dynamic_wrappers (MonoMethod *method) g_hash_table_remove (image->runtime_invoke_direct_cache, method); if (image->delegate_abstract_invoke_cache) g_hash_table_foreach_remove (image->delegate_abstract_invoke_cache, signature_method_pair_matches_method, method); + // FIXME: Need to clear the caches in other images as well + if (image->delegate_bound_static_invoke_cache) + g_hash_table_remove (image->delegate_bound_static_invoke_cache, mono_method_signature (method)); if (marshal_mutex_initialized) mono_marshal_unlock (); From 3e1d41ab5ddb6a83f92f71671430f19b02d1ae57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Thu, 19 Jun 2014 21:51:29 +0200 Subject: [PATCH 254/694] Also disable generic-xdomain.2.exe in gsharing tests. --- mono/tests/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/tests/Makefile.am b/mono/tests/Makefile.am index 4799766422d..a358ecd27ff 100644 --- a/mono/tests/Makefile.am +++ b/mono/tests/Makefile.am @@ -1248,7 +1248,7 @@ GSHARED_TESTS = \ generic-sealed-virtual.2.exe generic-system-arrays.2.exe \ generic-stack-traces.2.exe generic-stack-traces2.2.exe \ bug-472600.2.exe bug-473482.2.exe bug-473999.2.exe \ - bug-479763.2.exe generic-xdomain.2.exe \ + bug-479763.2.exe \ generic-type-load-exception.2.exe bug-616463.exe \ bug-1147.exe From 98513c62ecdb845676a4855d42c476ccd4de57db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Thu, 19 Jun 2014 17:51:16 +0200 Subject: [PATCH 255/694] [System.Runtime.Caching] Fixed test that failed intermittently on slow systems Apparently on slow systems the items with 1sec expiration time are already removed from the cache by the time the #CS3 Assert() is hit, which caused the test to fail. Increasing the expiration time by +2sec should hopefully fix this. Commit licensed under MIT/X11. --- .../Test/System.Runtime.Caching/MemoryCacheTest.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mcs/class/System.Runtime.Caching/Test/System.Runtime.Caching/MemoryCacheTest.cs b/mcs/class/System.Runtime.Caching/Test/System.Runtime.Caching/MemoryCacheTest.cs index 2c9cafb0f6a..39b66d9ca19 100644 --- a/mcs/class/System.Runtime.Caching/Test/System.Runtime.Caching/MemoryCacheTest.cs +++ b/mcs/class/System.Runtime.Caching/Test/System.Runtime.Caching/MemoryCacheTest.cs @@ -1254,7 +1254,7 @@ public void TestCacheShrink () // add some short duration entries for (int i = 0; i < HEAP_RESIZE_SHORT_ENTRIES; i++) { - var expireAt = DateTimeOffset.Now.AddSeconds (1); + var expireAt = DateTimeOffset.Now.AddSeconds (3); mc.Add ("short-" + i, i.ToString (), expireAt); } @@ -1262,20 +1262,20 @@ public void TestCacheShrink () // add some long duration entries for (int i = 0; i < HEAP_RESIZE_LONG_ENTRIES; i++) { - var expireAt = DateTimeOffset.Now.AddSeconds (10); + var expireAt = DateTimeOffset.Now.AddSeconds (12); mc.Add ("long-" + i, i.ToString (), expireAt); } Assert.AreEqual (HEAP_RESIZE_LONG_ENTRIES + HEAP_RESIZE_SHORT_ENTRIES, mc.GetCount(), "#CS3"); // wait for the cache thread to expire the short duration items, this will also shrink the size of the cache - global::System.Threading.Thread.Sleep (3 * 1000); + global::System.Threading.Thread.Sleep (5 * 1000); Assert.AreEqual (HEAP_RESIZE_LONG_ENTRIES, mc.GetCount (), "#CS4"); // add some new items into the cache, this will grow the cache again for (int i = 0; i < HEAP_RESIZE_LONG_ENTRIES; i++) { - mc.Add("final-" + i, i.ToString (), DateTimeOffset.Now.AddSeconds (2)); + mc.Add("final-" + i, i.ToString (), DateTimeOffset.Now.AddSeconds (4)); } Assert.AreEqual (HEAP_RESIZE_LONG_ENTRIES + HEAP_RESIZE_LONG_ENTRIES, mc.GetCount (), "#CS5"); From 8d15c210235903f9ebc4279c0f74ab1fc0099f4d Mon Sep 17 00:00:00 2001 From: Miguel de Icaza Date: Thu, 19 Jun 2014 17:45:05 -0400 Subject: [PATCH 256/694] [WCF] Make BasicHttpBinding.AllowCookies work This patch is from Brendan Zagaeski and fixes bug 11307 The description of the problem was: In Mono 2.10.12, the BasicHttpBinding property no longer supports EnableHttpCookieContainer because it is Depreciated. The replacement is AllowCookies, but this property does not work. Upon inspection of the source source, we find that the HttpCookieContainerBindingElement is added in accordance with EnableHttpCookieContainer, but not AllowCookies. The conditional compile logic at [1] is no longer needed for Xamarin.iOS or Xamarin.Android. --- .../System.ServiceModel.Channels/HttpChannelFactory.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpChannelFactory.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpChannelFactory.cs index 50ae808fcbd..d145ed18e4f 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpChannelFactory.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpChannelFactory.cs @@ -52,11 +52,7 @@ public HttpChannelFactory (HttpTransportBindingElement source, BindingContext ct MessageEncoder = CreateEncoder (mbe); continue; } -#if NET_2_1 - var cbe = be as HttpCookieContainerBindingElement; - if (cbe != null) - cookie_manager = cbe.GetProperty (ctx); -#elif NET_4_0 +#if NET_2_1 || NET_4_0 var tbe = be as HttpTransportBindingElement; if (tbe != null) cookie_manager = tbe.GetProperty (ctx); From 17d6f1cbb87187c40fc5860b1ab7ccd463daf609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Thu, 19 Jun 2014 23:58:05 +0200 Subject: [PATCH 257/694] [MWF] Disable DataRemainsOnClipboard_Xamarin4959 test. It works fine on a regular system but breaks under Xvfb. http://monojenkins.cloudapp.net/job/Mono/230/testReport/MonoTests.System.Windows.Forms/ClipboardTest/DataRemainsOnClipboard_Xamarin4959/ --- .../Test/System.Windows.Forms/ClipboardTest.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ClipboardTest.cs b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ClipboardTest.cs index f90a1b98c12..198dcda4270 100644 --- a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ClipboardTest.cs +++ b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ClipboardTest.cs @@ -104,6 +104,7 @@ private class CustomSerializableClass } [Test] + [Category ("NotWorking")] // Doesn't work under Xvfb. public void DataRemainsOnClipboard_Xamarin4959 () { // Compile an app that puts something on the clipboard From c92dfa27317d8f0f4871fdf2ea4e1d75aaa5c57a Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Thu, 19 Jun 2014 17:03:44 -0400 Subject: [PATCH 258/694] [runtime] Define DEFFILEMODE to 0666 if not defined. --- mono/metadata/file-mmap-posix.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/mono/metadata/file-mmap-posix.c b/mono/metadata/file-mmap-posix.c index c862a395109..ce7643f2e82 100644 --- a/mono/metadata/file-mmap-posix.c +++ b/mono/metadata/file-mmap-posix.c @@ -97,6 +97,9 @@ enum { MMAP_FILE_ACCESS_READ_WRITE_EXECUTE = 5, }; +#ifndef DEFFILEMODE +#define DEFFILEMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) +#endif static int mmap_init_state; static mono_mutex_t named_regions_mutex; @@ -272,16 +275,10 @@ open_file_map (MonoString *path, int input_fd, int mode, gint64 *capacity, int a } } -#ifndef PLATFORM_ANDROID if (path) //FIXME use io portability? fd = open (c_path, file_mode_to_unix (mode) | access_mode_to_unix (access), DEFFILEMODE); else fd = dup (input_fd); -#else - // FIXME: No DEFFILEMODE - fd = -1; - g_assert_not_reached (); -#endif if (fd == -1) { //XXX translate errno? *error = COULD_NOT_OPEN; From 8cd47821b928ec1449c0a02d38a534d068b31d10 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Thu, 19 Jun 2014 17:57:02 -0400 Subject: [PATCH 259/694] [runtime] Make it possible to create views to magic zero size files such as /dev/zero. Fixes #19460 --- mono/metadata/file-mmap-posix.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/mono/metadata/file-mmap-posix.c b/mono/metadata/file-mmap-posix.c index ce7643f2e82..eb69f5aa334 100644 --- a/mono/metadata/file-mmap-posix.c +++ b/mono/metadata/file-mmap-posix.c @@ -225,6 +225,15 @@ acess_to_mmap_flags (int access) } } +/* +This allow us to special case zero size files that can be arbitrarily mapped. +*/ +static gboolean +is_special_zero_size_file (struct stat *buf) +{ + return buf->st_size == 0 && (buf->st_mode & (S_IFCHR | S_IFBLK | S_IFIFO | S_IFSOCK)) != 0; +} + /* XXX implement options */ @@ -259,7 +268,7 @@ open_file_map (MonoString *path, int input_fd, int mode, gint64 *capacity, int a * Special files such as FIFOs, sockets, and devices can have a size of 0. Specifying a capacity for these * also makes little sense, so don't do the check if th file is one of these. */ - if (buf.st_size == 0 && (buf.st_mode & (S_IFCHR | S_IFBLK | S_IFIFO | S_IFSOCK)) == 0) { + if (buf.st_size == 0 && !is_special_zero_size_file (&buf)) { *error = CAPACITY_SMALLER_THAN_FILE_SIZE; goto done; } @@ -468,7 +477,12 @@ mono_mmap_map (void *handle, gint64 offset, gint64 *size, int access, void **mma struct stat buf = { 0 }; fstat (fh->fd, &buf); //FIXME error handling - if (eff_size == 0 || eff_size > buf.st_size) + /** + * We use the file size if one of the following conditions is true: + * -input size is zero + * -input size is bigger than the file and the file is not a magical zero size file such as /dev/mem. + */ + if (eff_size == 0 || (eff_size > buf.st_size && !is_special_zero_size_file (&buf))) eff_size = buf.st_size; *size = eff_size; From 1d2e26c1eedd0bae67b0dabad8c146e1d33f487f Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Thu, 19 Jun 2014 18:17:20 -0400 Subject: [PATCH 260/694] [runtime] Fix error handling with named memory regions. --- mono/metadata/file-mmap-posix.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/mono/metadata/file-mmap-posix.c b/mono/metadata/file-mmap-posix.c index eb69f5aa334..f94dd30fcc0 100644 --- a/mono/metadata/file-mmap-posix.c +++ b/mono/metadata/file-mmap-posix.c @@ -333,25 +333,26 @@ open_memory_map (MonoString *mapName, int mode, gint64 *capacity, int access, in if (handle) { if (mode == FILE_MODE_CREATE_NEW) *error = FILE_ALREADY_EXISTS; - - handle->handle.ref_count++; + else + handle->handle.ref_count++; //XXX should we ftruncate if the file is smaller than capacity? } else { - if (mode == FILE_MODE_OPEN) + if (mode == FILE_MODE_OPEN) { *error = FILE_NOT_FOUND; - - *capacity = align_up_to_page_size (*capacity); - - handle = g_new0 (MemoryHandle, 1); - handle->handle.kind = MMAP_KIND_MEMORY; - handle->handle.ref_count = 1; - handle->handle.capacity = *capacity; - handle->handle.name = g_strdup (c_mapName); - - //FIXME compute RWX from access - handle->address = mono_valloc (NULL, (size_t)*capacity, MONO_MMAP_READ | MONO_MMAP_WRITE | MONO_MMAP_PRIVATE | MONO_MMAP_ANON); - handle->length = (size_t)*capacity; - g_hash_table_insert (named_regions, handle->handle.name, handle); + } else { + *capacity = align_up_to_page_size (*capacity); + + handle = g_new0 (MemoryHandle, 1); + handle->handle.kind = MMAP_KIND_MEMORY; + handle->handle.ref_count = 1; + handle->handle.capacity = *capacity; + handle->handle.name = g_strdup (c_mapName); + + //FIXME compute RWX from access + handle->address = mono_valloc (NULL, (size_t)*capacity, MONO_MMAP_READ | MONO_MMAP_WRITE | MONO_MMAP_PRIVATE | MONO_MMAP_ANON); + handle->length = (size_t)*capacity; + g_hash_table_insert (named_regions, handle->handle.name, handle); + } } named_regions_unlock (); From 2bf354ca8468536c3a787b3d76193cc7a25736e8 Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Thu, 19 Jun 2014 19:08:40 -0400 Subject: [PATCH 261/694] [runtime] Rework named mapping to use an unlinked file to provide correct mapping semantics. Instead of using mono_valloc we create a temp file and unlink it. With this we can have the right mmap semantics regarding CoW and access rights. This does simplify the code too by completely removing the mapping kind. --- mono/metadata/file-mmap-posix.c | 196 ++++++++++++++------------------ 1 file changed, 86 insertions(+), 110 deletions(-) diff --git a/mono/metadata/file-mmap-posix.c b/mono/metadata/file-mmap-posix.c index f94dd30fcc0..4b7fa7a8bfe 100644 --- a/mono/metadata/file-mmap-posix.c +++ b/mono/metadata/file-mmap-posix.c @@ -37,35 +37,19 @@ #include #include -enum { - MMAP_KIND_FILE = 1, - MMAP_KIND_MEMORY = 2 -}; - typedef struct { int kind; int ref_count; - gint64 capacity; + size_t capacity; char *name; -} Handle; - -typedef struct { - Handle handle; int fd; -} FileHandle; - -typedef struct { - Handle handle; - void *address; - size_t length; -} MemoryHandle; +} MmapHandle; typedef struct { void *address; void *free_handle; - int kind; size_t length; -} MmapHandle; +} MmapInstance; enum { BAD_CAPACITY_FOR_FILE_BACKED = 1, @@ -242,7 +226,7 @@ open_file_map (MonoString *path, int input_fd, int mode, gint64 *capacity, int a { struct stat buf; char *c_path = path ? mono_string_to_utf8 (path) : NULL; - FileHandle *handle = NULL; + MmapHandle *handle = NULL; int result, fd; if (path) @@ -300,10 +284,9 @@ open_file_map (MonoString *path, int input_fd, int mode, gint64 *capacity, int a int unused G_GNUC_UNUSED = ftruncate (fd, (off_t)*capacity); } - handle = g_new0 (FileHandle, 1); - handle->handle.kind = MMAP_KIND_FILE; - handle->handle.ref_count = 1; - handle->handle.capacity = *capacity; + handle = g_new0 (MmapHandle, 1); + handle->ref_count = 1; + handle->capacity = *capacity; handle->fd = fd; done: @@ -311,11 +294,12 @@ open_file_map (MonoString *path, int input_fd, int mode, gint64 *capacity, int a return (void*)handle; } +#define MONO_ANON_FILE_TEMPLATE "/tmp/mono.anonmap.XXXXXXXXX" static void* open_memory_map (MonoString *mapName, int mode, gint64 *capacity, int access, int options, int *error) { char *c_mapName; - MemoryHandle *handle; + MmapHandle *handle; if (*capacity <= 1) { *error = CAPACITY_MUST_BE_POSITIVE; return NULL; @@ -329,32 +313,46 @@ open_memory_map (MonoString *mapName, int mode, gint64 *capacity, int access, in c_mapName = mono_string_to_utf8 (mapName); named_regions_lock (); - handle = (MemoryHandle*)g_hash_table_lookup (named_regions, c_mapName); + handle = (MmapHandle*)g_hash_table_lookup (named_regions, c_mapName); if (handle) { - if (mode == FILE_MODE_CREATE_NEW) + if (mode == FILE_MODE_CREATE_NEW) { *error = FILE_ALREADY_EXISTS; - else - handle->handle.ref_count++; + goto done; + } + + handle->ref_count++; //XXX should we ftruncate if the file is smaller than capacity? } else { + int fd; + char file_name [sizeof (MONO_ANON_FILE_TEMPLATE) + 1]; + if (mode == FILE_MODE_OPEN) { *error = FILE_NOT_FOUND; - } else { - *capacity = align_up_to_page_size (*capacity); - - handle = g_new0 (MemoryHandle, 1); - handle->handle.kind = MMAP_KIND_MEMORY; - handle->handle.ref_count = 1; - handle->handle.capacity = *capacity; - handle->handle.name = g_strdup (c_mapName); - - //FIXME compute RWX from access - handle->address = mono_valloc (NULL, (size_t)*capacity, MONO_MMAP_READ | MONO_MMAP_WRITE | MONO_MMAP_PRIVATE | MONO_MMAP_ANON); - handle->length = (size_t)*capacity; - g_hash_table_insert (named_regions, handle->handle.name, handle); + goto done; } + *capacity = align_up_to_page_size (*capacity); + + strcpy (file_name, MONO_ANON_FILE_TEMPLATE); + fd = mkstemp (file_name); + if (fd == -1) { + *error = COULD_NOT_MAP_MEMORY; + goto done; + } + + unlink (file_name); + ftruncate (fd, (off_t)*capacity); + + handle = g_new0 (MmapHandle, 1); + handle->ref_count = 1; + handle->capacity = *capacity; + handle->fd = fd; + handle->name = g_strdup (c_mapName); + + g_hash_table_insert (named_regions, handle->name, handle); + } +done: named_regions_unlock (); g_free (c_mapName); @@ -371,69 +369,66 @@ mono_mmap_open_file (MonoString *path, int mode, MonoString *mapName, gint64 *ca return open_file_map (path, -1, mode, capacity, access, options, error); if (path) { - FileHandle *file_handle; + MmapHandle *handle; char *c_mapName = mono_string_to_utf8 (mapName); named_regions_lock (); - file_handle = (FileHandle*)g_hash_table_lookup (named_regions, c_mapName); - if (file_handle) { + handle = (MmapHandle*)g_hash_table_lookup (named_regions, c_mapName); + if (handle) { *error = FILE_ALREADY_EXISTS; - file_handle = NULL; + handle = NULL; } else { - file_handle = open_file_map (path, -1, mode, capacity, access, options, error); - if (file_handle) { - file_handle->handle.name = g_strdup (c_mapName); - g_hash_table_insert (named_regions, file_handle->handle.name, file_handle); + handle = open_file_map (path, -1, mode, capacity, access, options, error); + if (handle) { + handle->name = g_strdup (c_mapName); + g_hash_table_insert (named_regions, handle->name, handle); } } named_regions_unlock (); g_free (c_mapName); - return file_handle; + return handle; } return open_memory_map (mapName, mode, capacity, access, options, error); } void * -mono_mmap_open_handle (void *handle, MonoString *mapName, gint64 *capacity, int access, int options, int *error) +mono_mmap_open_handle (void *input_fd, MonoString *mapName, gint64 *capacity, int access, int options, int *error) { - FileHandle *file_handle; + MmapHandle *handle; char *c_mapName = mono_string_to_utf8 (mapName); named_regions_lock (); - file_handle = (FileHandle*)g_hash_table_lookup (named_regions, c_mapName); - if (file_handle) { + handle = (MmapHandle*)g_hash_table_lookup (named_regions, c_mapName); + if (handle) { *error = FILE_ALREADY_EXISTS; - file_handle = NULL; + handle = NULL; } else { //XXX we're exploiting wapi HANDLE == FD equivalence. THIS IS FRAGILE, create a _wapi_handle_to_fd call - file_handle = open_file_map (NULL, GPOINTER_TO_INT (handle), FILE_MODE_OPEN, capacity, access, options, error); - file_handle->handle.name = g_strdup (c_mapName); - g_hash_table_insert (named_regions, file_handle->handle.name, file_handle); + handle = open_file_map (NULL, GPOINTER_TO_INT (input_fd), FILE_MODE_OPEN, capacity, access, options, error); + handle->name = g_strdup (c_mapName); + g_hash_table_insert (named_regions, handle->name, handle); } named_regions_unlock (); g_free (c_mapName); - return file_handle; + return handle; } void mono_mmap_close (void *mmap_handle) { - Handle *handle = mmap_handle; + MmapHandle *handle = mmap_handle; named_regions_lock (); --handle->ref_count; if (handle->ref_count == 0) { if (handle->name) g_hash_table_remove (named_regions, handle->name); - + g_free (handle->name); - if (handle->kind == MMAP_KIND_MEMORY) - mono_vfree (((MemoryHandle*)handle)->address, ((MemoryHandle*)handle)->length); - else - close (((FileHandle*)handle)->fd); + close (handle->fd); g_free (handle); } named_regions_unlock (); @@ -442,12 +437,9 @@ mono_mmap_close (void *mmap_handle) void mono_mmap_configure_inheritability (void *mmap_handle, gboolean inheritability) { - FileHandle *h = mmap_handle; + MmapHandle *h = mmap_handle; int fd, flags; - if (h->handle.kind != MMAP_KIND_FILE) - return; - fd = h->fd; flags = fcntl (fd, F_GETFD, 0); if (inheritability) @@ -460,7 +452,7 @@ mono_mmap_configure_inheritability (void *mmap_handle, gboolean inheritability) void mono_mmap_flush (void *mmap_handle) { - MmapHandle *h = mmap_handle; + MmapInstance *h = mmap_handle; if (h) msync (h->address, h->length, MS_SYNC); @@ -470,44 +462,29 @@ int mono_mmap_map (void *handle, gint64 offset, gint64 *size, int access, void **mmap_handle, void **base_address) { gint64 mmap_offset = 0; - Handle *h = handle; - MmapHandle res = { 0 }; - if (h->kind == MMAP_KIND_FILE) { - FileHandle *fh = (FileHandle*)h; - size_t eff_size = *size; - struct stat buf = { 0 }; - fstat (fh->fd, &buf); //FIXME error handling - - /** - * We use the file size if one of the following conditions is true: - * -input size is zero - * -input size is bigger than the file and the file is not a magical zero size file such as /dev/mem. - */ - if (eff_size == 0 || (eff_size > buf.st_size && !is_special_zero_size_file (&buf))) - eff_size = buf.st_size; - *size = eff_size; - - mmap_offset = align_down_to_page_size (offset); - eff_size += (offset - mmap_offset); - //FIXME translate some interesting errno values - res.address = mono_file_map ((size_t)eff_size, acess_to_mmap_flags (access), fh->fd, mmap_offset, &res.free_handle); - res.length = eff_size; - res.kind = MMAP_KIND_FILE; - - } else { - MemoryHandle *mh = (MemoryHandle*)h; - size_t eff_size = *size; - - if (!eff_size) - eff_size = *size = mh->length; - mmap_offset = (size_t)offset; - res.address = (char*)mh->address + offset; - res.length = (size_t)*size; - res.kind = MMAP_KIND_MEMORY; - } + MmapHandle *fh = handle; + MmapInstance res = { 0 }; + size_t eff_size = *size; + struct stat buf = { 0 }; + fstat (fh->fd, &buf); //FIXME error handling + + /** + * We use the file size if one of the following conditions is true: + * -input size is zero + * -input size is bigger than the file and the file is not a magical zero size file such as /dev/mem. + */ + if (eff_size == 0 || (eff_size > buf.st_size && !is_special_zero_size_file (&buf))) + eff_size = buf.st_size; + *size = eff_size; + + mmap_offset = align_down_to_page_size (offset); + eff_size += (offset - mmap_offset); + //FIXME translate some interesting errno values + res.address = mono_file_map ((size_t)eff_size, acess_to_mmap_flags (access), fh->fd, mmap_offset, &res.free_handle); + res.length = eff_size; if (res.address) { - *mmap_handle = g_memdup (&res, sizeof (MmapHandle)); + *mmap_handle = g_memdup (&res, sizeof (MmapInstance)); *base_address = (char*)res.address + (offset - mmap_offset); return 0; } @@ -521,10 +498,9 @@ gboolean mono_mmap_unmap (void *mmap_handle) { int res = 0; - MmapHandle *h = mmap_handle; + MmapInstance *h = mmap_handle; - if (h->kind == MMAP_KIND_FILE) - res = mono_file_unmap (h->address, h->free_handle); + res = mono_file_unmap (h->address, h->free_handle); g_free (h); return res == 0; From 5bdff7c7e99511d42445bd15d570789100c263af Mon Sep 17 00:00:00 2001 From: Alexis Christoforides Date: Thu, 19 Jun 2014 19:47:01 -0400 Subject: [PATCH 262/694] Added test for bug #20672 (fixed in aeab5b59021f4a712d54357c8bbeaa6fac12dc37) --- .../System.ComponentModel/BindingListTest.cs | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/mcs/class/System/Test/System.ComponentModel/BindingListTest.cs b/mcs/class/System/Test/System.ComponentModel/BindingListTest.cs index 92a6253db91..43faa5cc107 100644 --- a/mcs/class/System/Test/System.ComponentModel/BindingListTest.cs +++ b/mcs/class/System/Test/System.ComponentModel/BindingListTest.cs @@ -639,6 +639,62 @@ public void Bug16902 () Assert.AreEqual (1, count, "1"); } + + private class Person : INotifyPropertyChanged + { + private string _lastName; + private string _firstName; + + public string FirstName { + get { return _firstName; } + set { + _firstName = value; + OnPropertyChanged ("FirstName"); // string matches property name + } + } + + public string LastName { + get { return _lastName; } + set { + _lastName = value; + OnPropertyChanged ("Apepe"); // string doesn't match property name + } + } + + public event PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged (string propertyName = null) + { + PropertyChangedEventHandler handler = PropertyChanged; + if (handler != null) + handler (this, new PropertyChangedEventArgs (propertyName)); + } + } + + [Test] // https://bugzilla.xamarin.com/show_bug.cgi?id=20672 + public void Bug20672 () + { + string changedPropertyName = string.Empty; + bool isEventRaised = false; + bool? hasPropertyDescriptor = false; + + var persons = new BindingList(); + persons.Add (new Person() { FirstName = "Stefaan", LastName = "de Vogelaere" }); + persons.Add (new Person() { FirstName = "Christophe", LastName = "De Langhe" }); + persons.ListChanged += (object sender, ListChangedEventArgs e) => { + isEventRaised = true; + hasPropertyDescriptor = e.PropertyDescriptor != null; + }; + + //if the OnPropertyChanged string matches a valid property name, PropertyDescriptor should be generated + persons[0].FirstName = "Stefan"; + Assert.IsTrue (isEventRaised); + Assert.IsTrue ((bool) hasPropertyDescriptor, "#1"); + + //if the OnPropertyChanged string doesn't match a valid property name, no PropertyDescriptor should be generated + persons[0].LastName = "de le Vulu"; + Assert.IsFalse ((bool) hasPropertyDescriptor, "#2"); + } } } From 6d69a0674bfefdfba53b2e9c8f596db7b1973c08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 20 Jun 2014 03:24:21 +0200 Subject: [PATCH 263/694] [MWF] Disable OneIdlePerThread test. The code that made this test work was reverted, so this test is bound to fail randomly. --- .../Test/System.Windows.Forms/FormEventTest.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/FormEventTest.cs b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/FormEventTest.cs index 9a7e9bcfb40..4baf7584c11 100644 --- a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/FormEventTest.cs +++ b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/FormEventTest.cs @@ -642,6 +642,7 @@ public void MinimumSizeChangedTest () private static int oipt_t1 = 0; private static int oipt_t2 = 0; [Test] + [Category ("NotWorking")] public void OneIdlePerThread () { Thread t = Thread.CurrentThread; oipt_t1 = t.ManagedThreadId; From 7461128a7d105f092e60873b25aa95cb6b1c32f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 20 Jun 2014 04:11:48 +0200 Subject: [PATCH 264/694] Silence a warning in file-mmap-posix.c. --- mono/metadata/file-mmap-posix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mono/metadata/file-mmap-posix.c b/mono/metadata/file-mmap-posix.c index 4b7fa7a8bfe..2fc7fb5ed39 100644 --- a/mono/metadata/file-mmap-posix.c +++ b/mono/metadata/file-mmap-posix.c @@ -340,7 +340,7 @@ open_memory_map (MonoString *mapName, int mode, gint64 *capacity, int access, in } unlink (file_name); - ftruncate (fd, (off_t)*capacity); + int unused G_GNUC_UNUSED = ftruncate (fd, (off_t)*capacity); handle = g_new0 (MmapHandle, 1); handle->ref_count = 1; From e385d1f039f6cf203c3d895c805631605862022c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 20 Jun 2014 04:17:30 +0200 Subject: [PATCH 265/694] Fix the build. --- .../Test/System.Windows.Forms/FormEventTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/FormEventTest.cs b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/FormEventTest.cs index 4baf7584c11..9712812c294 100644 --- a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/FormEventTest.cs +++ b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/FormEventTest.cs @@ -642,7 +642,7 @@ public void MinimumSizeChangedTest () private static int oipt_t1 = 0; private static int oipt_t2 = 0; [Test] - [Category ("NotWorking")] + [NUnit.Framework.Category ("NotWorking")] public void OneIdlePerThread () { Thread t = Thread.CurrentThread; oipt_t1 = t.ManagedThreadId; From bbbe1e52d3f6c6379c9705197fbc03642a13867a Mon Sep 17 00:00:00 2001 From: Reuben Bond Date: Fri, 20 Jun 2014 16:48:36 +1000 Subject: [PATCH 266/694] ClientWebSocket: SendAsync endOfMessage inverted. endOfMessage should indicate whether or not additional message parts will follow the current one. Currently, the meaning in ClientWebSocket.cs is inverted: !endOfMessage indicates that no more parts will follow the current one. See the WebSockets RFC, 'frame-fin' at the top of http://tools.ietf.org/html/rfc6455#page-31. Also see the MSDN docs for SendAsync: http://msdn.microsoft.com/en-us/library/system.net.websockets.websocket.sendasync(v=vs.110).aspx --- mcs/class/System/System.Net.WebSockets/ClientWebSocket.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/System/System.Net.WebSockets/ClientWebSocket.cs b/mcs/class/System/System.Net.WebSockets/ClientWebSocket.cs index 3778c740538..c903720f24d 100644 --- a/mcs/class/System/System.Net.WebSockets/ClientWebSocket.cs +++ b/mcs/class/System/System.Net.WebSockets/ClientWebSocket.cs @@ -282,7 +282,7 @@ int WriteHeader (WebSocketMessageType type, ArraySegment buffer, bool endO var opCode = (byte)type; var length = buffer.Count; - headerBuffer[0] = (byte)(opCode | (endOfMessage ? 0 : 0x80)); + headerBuffer[0] = (byte)(opCode | (endOfMessage ? 0x80 : 0)); if (length < 126) { headerBuffer[1] = (byte)length; } else if (length <= ushort.MaxValue) { From f71a3c2683d88d358139d95f9d9ab298ac002bcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Fri, 20 Jun 2014 16:35:47 +0200 Subject: [PATCH 267/694] [Managed.Windows.Forms] Verify that DataMember is valid when setting DataSource When DataMember is already set before DataSource we need to verify that it refers to a valid property in the DataSource setter, otherwise we'd get an exception in ResetList (). This fixes the following failing tests: BindingSourceTest.DataMemberBeforeDataSource and BindingSourceTest.DataSourceAssignToDefaultType. Commit licensed under MIT/X11. --- .../System.Windows.Forms/BindingSource.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/BindingSource.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/BindingSource.cs index 3e928459ba0..a16a996355d 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/BindingSource.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/BindingSource.cs @@ -207,6 +207,7 @@ private void ConnectDataSourceEvents (object dataSource) private void OnParentCurrencyManagerChanged (object sender, EventArgs args) { // Essentially handles chained data sources (e.g. chained BindingSource) + ResetDataMemberIfInvalid (); ResetList (); } @@ -349,6 +350,7 @@ public object DataSource { DisconnectDataSourceEvents (datasource); datasource = value; + ResetDataMemberIfInvalid (); ConnectDataSourceEvents (datasource); ResetList (); @@ -454,6 +456,19 @@ public string Sort { } } + void ResetDataMemberIfInvalid () + { + if (datamember == String.Empty) + return; + + // if dataMember doesn't refer to a valid property of dataSource, we need to reset it + var property = ListBindingHelper.GetListItemProperties (datasource).Find (datamember, true); + if (property == null) { + datamember = String.Empty; + OnDataMemberChanged (EventArgs.Empty); + } + } + // NOTE: Probably the parsing can be improved void ProcessSortString (string sort) { From 3d21e9cd2f557c693f042daf6c7f0783f9221b06 Mon Sep 17 00:00:00 2001 From: Damien Diederen Date: Fri, 20 Jun 2014 18:45:35 +0200 Subject: [PATCH 268/694] [System.Net] Do not assume IPv6 is enabled in UdpClientTest Without this, three of the tests fail on Linux kernels without IPv6 support. This is a minimal fix, copy'n'pasting a conditional which was used in other tests. It might be nicer to factor out the SupportsIPv6 to its own utility function. --- .../Test/System.Net.Sockets/UdpClientTest.cs | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/mcs/class/System/Test/System.Net.Sockets/UdpClientTest.cs b/mcs/class/System/Test/System.Net.Sockets/UdpClientTest.cs index c9193919223..488518c38bd 100644 --- a/mcs/class/System/Test/System.Net.Sockets/UdpClientTest.cs +++ b/mcs/class/System/Test/System.Net.Sockets/UdpClientTest.cs @@ -74,6 +74,13 @@ public void Constructor2 () //Assert.AreEqual (32, client.Ttl, "#A:Ttl"); #endif +#if NET_2_0 + if (!Socket.OSSupportsIPv6) +#else + if (!Socket.SupportsIPv6) +#endif + Assert.Ignore ("IPv6 not enabled."); + client = new MyUdpClient (AddressFamily.InterNetworkV6); s = client.Client; Assert.IsNotNull (s, "#B:Client"); @@ -297,6 +304,13 @@ public void Constructor5 () Assert.AreEqual (AddressFamily.InterNetwork, localEP.AddressFamily, "#A:Client:LocalEndPoint/AddressFamily"); } +#if NET_2_0 + if (!Socket.OSSupportsIPv6) +#else + if (!Socket.SupportsIPv6) +#endif + Assert.Ignore ("IPv6 not enabled."); + using (MyUdpClient client = new MyUdpClient (IPEndPoint.MaxPort, AddressFamily.InterNetworkV6)) { s = client.Client; @@ -656,6 +670,13 @@ public void JoinMulticastGroup2_MulticastAddr_Null () [Test] // JoinMulticastGroup (Int32, IPAddress) public void JoinMulticastGroup2_Socket_Closed () { +#if NET_2_0 + if (!Socket.OSSupportsIPv6) +#else + if (!Socket.SupportsIPv6) +#endif + Assert.Ignore ("IPv6 not enabled."); + IPAddress mcast_addr = null; UdpClient client = new UdpClient (new IPEndPoint (IPAddress.IPv6Any, 1234)); From eeac252404431113091a1e710889e79e99dcb90e Mon Sep 17 00:00:00 2001 From: Reuben Bond Date: Sat, 21 Jun 2014 14:57:56 +1000 Subject: [PATCH 269/694] Test ClientWebSocket.SendAsync EndOfMessage --- .../ClientWebSocketTest.cs | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/mcs/class/System/Test/System.Net.WebSockets/ClientWebSocketTest.cs b/mcs/class/System/Test/System.Net.WebSockets/ClientWebSocketTest.cs index e193a5f5307..7c89da6ef71 100644 --- a/mcs/class/System/Test/System.Net.WebSockets/ClientWebSocketTest.cs +++ b/mcs/class/System/Test/System.Net.WebSockets/ClientWebSocketTest.cs @@ -210,6 +210,41 @@ public void SendAsyncWrongState_CloseSent () } Assert.Fail ("Should have thrown"); } + + [Test] + public async Task SendAsyncEndOfMessageTest() { + var cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(30)).Token; + await SendAsyncEndOfMessageTest(false, WebSocketMessageType.Text, cancellationToken); + await SendAsyncEndOfMessageTest(true, WebSocketMessageType.Text, cancellationToken); + await SendAsyncEndOfMessageTest(false, WebSocketMessageType.Binary, cancellationToken); + await SendAsyncEndOfMessageTest(true, WebSocketMessageType.Binary, cancellationToken); + } + + public async Task SendAsyncEndOfMessageTest(bool expectedEndOfMessage, WebSocketMessageType webSocketMessageType, CancellationToken cancellationToken){ + using (var client = new ClientWebSocket()) { + // Configure the listener. + var serverReceive = HandleHttpWebSocketRequestAsync(async socket => await socket.ReceiveAsync(new ArraySegment(new byte[32]), cancellationToken), cancellationToken); + + // Connect to the listener and make the request. + await client.ConnectAsync (new Uri ("ws://localhost:" + Port + "/"), cancellationToken); + await client.SendAsync(new ArraySegment(Encoding.UTF8.GetBytes("test")), webSocketMessageType, expectedEndOfMessage, cancellationToken); + + // Wait for the listener to handle the request and return its result. + var result = await serverReceive; + + // Cleanup and check results. + await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "Finished", cancellationToken); + Assert.AreEqual(expectedEndOfMessage, result.EndOfMessage, "EndOfMessage should be " + expectedEndOfMessage); + } + } + + async Task HandleHttpWebSocketRequestAsync(Func> action, CancellationToken cancellationToken) { + var ctx = await this.listener.GetContextAsync(); + var wsContext = await ctx.AcceptWebSocketAsync(null); + var result = await action(wsContext.WebSocket); + await wsContext.WebSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "Finished", cancellationToken); + return result; + } async Task HandleHttpRequestAsync (Action handler) { From 9daad272b1afa7fda19248dbe19886aa64e43660 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Sat, 21 Jun 2014 15:42:11 +0200 Subject: [PATCH 270/694] [llvm] Remove a small source workaround which is no longer needed. --- mono/mini/mini-llvm-cpp.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/mono/mini/mini-llvm-cpp.cpp b/mono/mini/mini-llvm-cpp.cpp index 1f4775368c9..032059d9314 100644 --- a/mono/mini/mini-llvm-cpp.cpp +++ b/mono/mini/mini-llvm-cpp.cpp @@ -21,12 +21,6 @@ // #include "config.h" -//undef those as llvm defines them on its own config.h as well. -#undef PACKAGE_BUGREPORT -#undef PACKAGE_NAME -#undef PACKAGE_STRING -#undef PACKAGE_TARNAME -#undef PACKAGE_VERSION #include From 4b50211fb7f1dd2621673edd100f30eb39098d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Sat, 21 Jun 2014 12:50:28 +0200 Subject: [PATCH 271/694] [Managed.Windows.Forms] Revert a revert commit that accidentally changed the wrong code When the commit 8334fe3a56c978ffe7f8cb199536f9b3234afdbe was reverted in a791cfc1640bec442757f78fe71e428d643e90ed, accidentally the wrong chunk of code was changed. This commit reverts the changes correctly. --- .../System.Windows.Forms/CurrencyManager.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/CurrencyManager.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/CurrencyManager.cs index 277e71c9c6b..e69308f62f3 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/CurrencyManager.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/CurrencyManager.cs @@ -390,7 +390,8 @@ private void ListChangedHandler (object sender, ListChangedEventArgs e) else if (e.NewIndex <= listposition) { /* the deleted row was either the current one, or one earlier in the list. Update the index and emit PositionChanged, CurrentChanged, and ItemChanged. */ - ChangeRecordState (listposition+1, + // FIXME: this looks wrong, shouldn't it be (listposition - 1) instead of e.NewIndex ? + ChangeRecordState (e.NewIndex, false, false, e.NewIndex != listposition, false); } else { @@ -412,7 +413,7 @@ private void ListChangedHandler (object sender, ListChangedEventArgs e) } else { if (e.NewIndex <= listposition) { - ChangeRecordState (e.NewIndex, + ChangeRecordState (listposition + 1, false, false, false, false); OnItemChanged (new ItemChangedEventArgs (-1)); OnListChanged (e); From 1d9a3dc83ca7522786b9247c61d7d31755cd90df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Sat, 21 Jun 2014 16:39:27 +0200 Subject: [PATCH 272/694] [Managed.Windows.Forms] Added more asserts to the CurrencyManagerTest2 test These were useful while investigating 4b50211fb7f1dd2621673edd100f30eb39098d7d --- .../System.Windows.Forms/DataBindingTests.cs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/DataBindingTests.cs b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/DataBindingTests.cs index e0261dc21bb..aef76e0777a 100644 --- a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/DataBindingTests.cs +++ b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/DataBindingTests.cs @@ -172,6 +172,8 @@ public void TestDeleteOnlyRow () row.Delete (); + Assert.AreEqual (-1, cm.Position); + // Console.WriteLine (event_log); Assert.AreEqual ( @@ -221,6 +223,8 @@ public void TestDeleteRowBeforeCurrent () row.Delete (); + Assert.AreEqual (0, cm.Position); + Console.WriteLine (event_log); Assert.AreEqual ( @@ -273,6 +277,8 @@ public void TestDeleteRowAfterCurrent () row.Delete (); + Assert.AreEqual (0, cm.Position); + Console.WriteLine (event_log); #if WITH_BINDINGS @@ -323,6 +329,8 @@ public void TestDeleteCurrentRowWithOthers () row.Delete (); + Assert.AreEqual (0, cm.Position); + Console.WriteLine (event_log); Assert.AreEqual ( @@ -379,6 +387,8 @@ public void TestAddFirstRow () DataRow newrow = dataSet1.Tables[0].NewRow (); dataSet1.Tables[0].Rows.Add(newrow); + Assert.AreEqual (0, cm.Position); + Console.WriteLine (event_log); Assert.AreEqual ( @@ -434,6 +444,8 @@ public void TestAppendRowAfterCurrent () newrow = dataSet1.Tables[0].NewRow (); dataSet1.Tables[0].Rows.Add(newrow); + Assert.AreEqual (0, cm.Position); + Console.WriteLine (event_log); #if WITH_BINDINGS @@ -489,6 +501,8 @@ public void TestInsertRowBeforeCurrent () newrow = dataSet1.Tables[0].NewRow (); dataSet1.Tables[0].Rows.InsertAt(newrow, 0); + Assert.AreEqual (2, cm.Position); + Console.WriteLine (event_log); Assert.AreEqual ( @@ -547,6 +561,8 @@ public void TestInsertRowAtCurrent () newrow = dataSet1.Tables[0].NewRow (); dataSet1.Tables[0].Rows.InsertAt(newrow, 1); + Assert.AreEqual (2, cm.Position); + Console.WriteLine (event_log); Assert.AreEqual ( @@ -596,6 +612,8 @@ public void TestColumnAdd () dataSet1.Tables[0].Columns.Add(); + Assert.AreEqual (-1, cm.Position); + Console.WriteLine (event_log); #if NET_2_0 @@ -635,6 +653,8 @@ public void TestColumnRemove () dataSet1.Tables[0].Columns.Remove(dataSet1.Tables[0].Columns[1]); + Assert.AreEqual (-1, cm.Position); + Console.WriteLine (event_log); Assert.AreEqual ("0: MetaDataChanged\n", event_log, "2"); @@ -672,6 +692,8 @@ public void TestColumnRemoveBound () dataSet1.Tables[0].Columns.Remove(dataSet1.Tables[0].Columns[0]); + Assert.AreEqual (-1, cm.Position); + Console.WriteLine (event_log); Assert.AreEqual ("0: MetaDataChanged\n", event_log, "3"); @@ -717,6 +739,8 @@ public void TestColumnChangeName () dataSet1.Tables[0].Columns[0].ColumnName = "new name"; + Assert.AreEqual (-1, cm.Position); + Console.WriteLine (event_log); Assert.AreEqual ("0: MetaDataChanged\n", event_log, "3"); @@ -775,6 +799,8 @@ public void TestRowModify () row[column_name] = "hi"; row.EndEdit (); + Assert.AreEqual (0, cm.Position); + Console.WriteLine (event_log); Assert.AreEqual ( @@ -834,6 +860,8 @@ public void TestRowCancelModify () row[column_name] = "hi"; cm.CancelCurrentEdit (); + Assert.AreEqual (0, cm.Position); + Console.WriteLine (event_log); Assert.AreEqual ("0: ItemChanged (index = 0)\n", event_log, "2"); @@ -875,6 +903,8 @@ public void TestDeleteInEdit () DataRowView row = (DataRowView)cm.Current; row.Delete (); + Assert.AreEqual (-1, cm.Position); + Console.WriteLine (event_log); Assert.AreEqual ( From 50426fe3fd969b519a610d58c154f217f969e7c3 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Sat, 21 Jun 2014 18:40:05 +0200 Subject: [PATCH 273/694] [llvm] Update the LLVM backend to llvm ca4e226df2e13a9e87376a880035efa376639c98. --- mono/mini/mini-llvm.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mono/mini/mini-llvm.c b/mono/mini/mini-llvm.c index f0dcc73e9b1..c6f04b8073a 100644 --- a/mono/mini/mini-llvm.c +++ b/mono/mini/mini-llvm.c @@ -3347,7 +3347,7 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) } case OP_ATOMIC_CAS_I4: case OP_ATOMIC_CAS_I8: { - LLVMValueRef args [3]; + LLVMValueRef args [3], val; LLVMTypeRef t; if (ins->opcode == OP_ATOMIC_CAS_I4) @@ -3360,7 +3360,13 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb) args [1] = convert (ctx, values [ins->sreg3], t); /* new value */ args [2] = convert (ctx, values [ins->sreg2], t); - values [ins->dreg] = mono_llvm_build_cmpxchg (builder, args [0], args [1], args [2]); + val = mono_llvm_build_cmpxchg (builder, args [0], args [1], args [2]); +#if LLVM_API_VERSION >= 1 + /* cmpxchg returns a pair */ + values [ins->dreg] = LLVMBuildExtractValue (builder, val, 0, ""); +#else + values [ins->dreg] = val; +#endif break; } case OP_MEMORY_BARRIER: { From daa5a50f41401911fb85e4c5f2d150a450187fc2 Mon Sep 17 00:00:00 2001 From: i59 Date: Sun, 22 Jun 2014 16:19:52 +0200 Subject: [PATCH 274/694] libmonoutils: Removed need for X64 MASM definition Check for availability of the RAX register, checking if we're running x64 --- mono/utils/win64.asm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mono/utils/win64.asm b/mono/utils/win64.asm index ba9f979b164..15984b6c059 100644 --- a/mono/utils/win64.asm +++ b/mono/utils/win64.asm @@ -1,4 +1,5 @@ -ifndef X64 +ifdef RAX +else .386 .model flat, c @@ -7,7 +8,7 @@ endif .code -ifdef X64 +ifdef RAX PUBLIC mono_context_get_current From d0feb531964bbb6dfcc3afbd578bfe3e6a6f06e1 Mon Sep 17 00:00:00 2001 From: i59 Date: Sun, 22 Jun 2014 16:21:29 +0200 Subject: [PATCH 275/694] Moved _WIN32_WINNT to winconfig.h; dropped support for WinXP SP1 and below Win32 compilation was broken due to attempting to use Interlocked* functions introduced with XP SP2. --- mono/metadata/coree.c | 6 ------ mono/mini/exceptions-amd64.c | 6 ------ mono/mini/exceptions-x86.c | 6 ------ winconfig.h | 8 ++++++++ 4 files changed, 8 insertions(+), 18 deletions(-) diff --git a/mono/metadata/coree.c b/mono/metadata/coree.c index 5b7badcf66c..6c7ff4a1f27 100644 --- a/mono/metadata/coree.c +++ b/mono/metadata/coree.c @@ -11,12 +11,6 @@ #ifdef HOST_WIN32 -#if _WIN32_WINNT < 0x0501 -/* Required for ACTCTX. */ -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0501 -#endif /* _WIN32_WINNT < 0x0501 */ - #include #include #include diff --git a/mono/mini/exceptions-amd64.c b/mono/mini/exceptions-amd64.c index a5cf1105680..2bce8aa2c27 100644 --- a/mono/mini/exceptions-amd64.c +++ b/mono/mini/exceptions-amd64.c @@ -10,12 +10,6 @@ #include -#if _WIN32_WINNT < 0x0501 -/* Required for Vectored Exception Handling. */ -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0501 -#endif /* _WIN32_WINNT < 0x0501 */ - #include #include #include diff --git a/mono/mini/exceptions-x86.c b/mono/mini/exceptions-x86.c index 6b5c061a780..d13867b4683 100644 --- a/mono/mini/exceptions-x86.c +++ b/mono/mini/exceptions-x86.c @@ -9,12 +9,6 @@ #include -#if _WIN32_WINNT < 0x0501 -/* Required for Vectored Exception Handling. */ -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0501 -#endif /* _WIN32_WINNT < 0x0501 */ - #include #include #include diff --git a/winconfig.h b/winconfig.h index 427e21f35a8..a4851db6db4 100644 --- a/winconfig.h +++ b/winconfig.h @@ -12,6 +12,14 @@ #error Unknown architecture #endif +#if _WIN32_WINNT < 0x0502 +/* Required for Vectored Exception Handling. + Interlocked* functions are also not available in XP SP1 and below +*/ +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0502 +#endif /* _WIN32_WINNT < 0x0502 */ + /* * Features that are not required in the Windows port */ From 2bb991cc21f1a4c5c1a289b24234f584dcfef6e4 Mon Sep 17 00:00:00 2001 From: i59 Date: Sun, 22 Jun 2014 16:23:16 +0200 Subject: [PATCH 276/694] Added file-mmap-windows.c to libmonoruntime.vcxproj --- msvc/libmonoruntime.vcxproj | 1 + 1 file changed, 1 insertion(+) diff --git a/msvc/libmonoruntime.vcxproj b/msvc/libmonoruntime.vcxproj index cb098592678..4520e2a0927 100644 --- a/msvc/libmonoruntime.vcxproj +++ b/msvc/libmonoruntime.vcxproj @@ -51,6 +51,7 @@ + From 1dba47fa44593713902176bdec34f1401ac347d5 Mon Sep 17 00:00:00 2001 From: i59 Date: Sun, 22 Jun 2014 16:24:46 +0200 Subject: [PATCH 277/694] libmono.vcxproj: Link to libmonoruntimesgen.lib in the Release_SGen mode Previously attempted to link to the libmonoruntime library outputted by the boehm configuration --- msvc/libmono.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msvc/libmono.vcxproj b/msvc/libmono.vcxproj index 9cf8db7acee..26b243f2b6a 100644 --- a/msvc/libmono.vcxproj +++ b/msvc/libmono.vcxproj @@ -565,7 +565,7 @@ false - libgc.lib;libmonoruntime.lib;libmonoutils.lib;eglib.lib;%(AdditionalDependencies) + libgc.lib;libmonoruntimesgen.lib;libmonoutils.lib;eglib.lib;%(AdditionalDependencies) $(Platform)\lib;%(AdditionalLibraryDirectories) monosgen64.def $(Platform)\lib\$(TargetName).lib From 7b5f4a511f35992bb3a64ba3acbfcc18dd4fcb57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Sun, 22 Jun 2014 20:10:17 +0200 Subject: [PATCH 278/694] [System] Use the same port number instead of a random port in HttpWebRequestTest A random port doesn't add any value and resulted in at least one port conflict on monojenkins: http://monojenkins.cloudapp.net/job/Mono/243/testReport/MonoTests.System.Net/HttpWebRequestTest/BeginGetRequestStreamCancelIfNotAllBytesWritten/ --- mcs/class/System/Test/System.Net/HttpWebRequestTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mcs/class/System/Test/System.Net/HttpWebRequestTest.cs b/mcs/class/System/Test/System.Net/HttpWebRequestTest.cs index f0826d1c990..37a49de7333 100644 --- a/mcs/class/System/Test/System.Net/HttpWebRequestTest.cs +++ b/mcs/class/System/Test/System.Net/HttpWebRequestTest.cs @@ -2319,7 +2319,7 @@ public void BeginGetResponseAborts () void DoRequest (Action request) { - int port = rand.Next (20000, 65535); + int port = 30158; ManualResetEvent completed = new ManualResetEvent (false); Uri address = new Uri (string.Format ("http://localhost:{0}", port)); @@ -2333,7 +2333,7 @@ void DoRequest (Action request) void DoRequest (Action request, Action processor) { - int port = rand.Next (20000, 65535); + int port = 30158; ManualResetEvent [] completed = new ManualResetEvent [2]; completed [0] = new ManualResetEvent (false); From 6a197bad93db8bbe676d6c79ea4929f989776008 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Sun, 22 Jun 2014 21:38:11 +0200 Subject: [PATCH 279/694] Fix a warning. --- support/nl.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/support/nl.c b/support/nl.c index 60ad23d594e..88babdae391 100644 --- a/support/nl.c +++ b/support/nl.c @@ -221,8 +221,10 @@ ReadEvents (gpointer sock, gpointer buffer, gint32 count, gint32 size) int addr_length; int msg_type; int table; +#ifdef NL_DEBUG int protocol; int scope; +#endif int rtm_type; gboolean have_dst; gboolean have_src; @@ -250,8 +252,10 @@ ReadEvents (gpointer sock, gpointer buffer, gint32 count, gint32 size) addr_length = (family == AF_INET) ? 4 : 16; table = rtp->rtm_table; +#ifdef NL_DEBUG protocol = rtp->rtm_protocol; scope = rtp->rtm_scope; +#endif rtm_type = rtp->rtm_type; NL_DEBUG_PRINT ("\tRTMSG table: %d %s", table, FIND_RT_TABLE_NAME (table)); if (table != RT_TABLE_MAIN && table != RT_TABLE_LOCAL) From 1633666e826f9888784078798cb82a9c8d4a2a3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Mon, 23 Jun 2014 14:10:58 +0200 Subject: [PATCH 280/694] [corlib] Disable TaskContinuationChainLeak test on non-mobile too. --- mcs/class/corlib/Test/System.Threading.Tasks/TaskTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcs/class/corlib/Test/System.Threading.Tasks/TaskTest.cs b/mcs/class/corlib/Test/System.Threading.Tasks/TaskTest.cs index 9aa0d46510b..3f0607bcd60 100644 --- a/mcs/class/corlib/Test/System.Threading.Tasks/TaskTest.cs +++ b/mcs/class/corlib/Test/System.Threading.Tasks/TaskTest.cs @@ -1928,7 +1928,7 @@ public void LazyCancelationTest () } [Test] - [Category("MobileNotWorking")] + [Category("NotWorking")] public void TaskContinuationChainLeak() { // Start cranking out tasks, starting each new task upon completion of and from inside the prior task. From 41a903da83e1c11a66a1498c6e8ffec31b02273e Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Mon, 23 Jun 2014 14:16:10 +0200 Subject: [PATCH 281/694] [mcs] Handle try await nested in multiple finally blocks. --- mcs/mcs/async.cs | 57 ++------------- mcs/mcs/codegen.cs | 2 + mcs/mcs/context.cs | 2 - mcs/mcs/statement.cs | 133 +++++++++++++++++++++++++++-------- mcs/tests/test-async-70.cs | 97 +++++++++++++++++++++++++ mcs/tests/ver-il-net_4_5.xml | 51 ++++++++++++-- 6 files changed, 252 insertions(+), 90 deletions(-) create mode 100644 mcs/tests/test-async-70.cs diff --git a/mcs/mcs/async.cs b/mcs/mcs/async.cs index 6cd75bc9af5..516c9666b16 100644 --- a/mcs/mcs/async.cs +++ b/mcs/mcs/async.cs @@ -421,8 +421,6 @@ public override Reachability MarkReachable (Reachability rc) public class AsyncInitializer : StateMachineInitializer { TypeInferenceContext return_inference; - List