From 22fbf8edabe1daf260d5cfe8de8628650f882d02 Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Wed, 7 Dec 2016 12:32:03 -0800 Subject: Make System.Memory and Unsafe target 1.1 packages (#14271) This lets folks use System.Memory and Unsafe without upgrading all of their packages to latest pre-release. --- .../pkg/System.Runtime.CompilerServices.Unsafe.pkgproj | 1 + 1 file changed, 1 insertion(+) (limited to 'src/System.Runtime.CompilerServices.Unsafe') diff --git a/src/System.Runtime.CompilerServices.Unsafe/pkg/System.Runtime.CompilerServices.Unsafe.pkgproj b/src/System.Runtime.CompilerServices.Unsafe/pkg/System.Runtime.CompilerServices.Unsafe.pkgproj index 66269ad81e..b6659d64b0 100644 --- a/src/System.Runtime.CompilerServices.Unsafe/pkg/System.Runtime.CompilerServices.Unsafe.pkgproj +++ b/src/System.Runtime.CompilerServices.Unsafe/pkg/System.Runtime.CompilerServices.Unsafe.pkgproj @@ -2,6 +2,7 @@ + net45;netcore45;wp8;wpa81;netcoreapp1.0;$(AllXamarinFrameworks) -- cgit v1.2.3 From 9c06da6a34fcefa6fb37776ac57b80730e37387c Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Fri, 9 Dec 2016 10:21:32 -0500 Subject: More ordering consistency - "static unsafe" instead of "unsafe static" - "extern unsafe" instead of "unsafe extern" - "protected internal" instead of "internal protected" --- src/System.Runtime.CompilerServices.Unsafe/tests/UnsafeTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/System.Runtime.CompilerServices.Unsafe') diff --git a/src/System.Runtime.CompilerServices.Unsafe/tests/UnsafeTests.cs b/src/System.Runtime.CompilerServices.Unsafe/tests/UnsafeTests.cs index ba6ecb1737..84455780e9 100644 --- a/src/System.Runtime.CompilerServices.Unsafe/tests/UnsafeTests.cs +++ b/src/System.Runtime.CompilerServices.Unsafe/tests/UnsafeTests.cs @@ -419,7 +419,7 @@ namespace System.Runtime.CompilerServices } [Fact] - public unsafe static void AsRef() + public static unsafe void AsRef() { byte[] b = new byte[4] { 0x42, 0x42, 0x42, 0x42 }; fixed (byte * p = b) -- cgit v1.2.3 From 60084eb386db5e894348ac2ec0b890230ee238ab Mon Sep 17 00:00:00 2001 From: nietras Date: Thu, 15 Dec 2016 15:22:32 +0100 Subject: S.R.CS.Unsafe: Add CopyBlock/CopyBlockUnaligned and InitBlock/InitBlockUnaligned for ref byte (#13848) * S.R.CS.Unsafe: Add CopyBlock/CopyBlockUnaligned for (ref T destination, ref T source, int elementCount) * S.R.CS.Unsafe: Remove new and existing InitBlock/CopyBlock* overloads taking UIntPtr as byteCount. --- .../src/System.Runtime.CompilerServices.Unsafe.il | 8 +++---- .../src/System.Runtime.CompilerServices.Unsafe.xml | 8 +++---- .../tests/UnsafeTests.cs | 25 +++++++++++----------- 3 files changed, 20 insertions(+), 21 deletions(-) (limited to 'src/System.Runtime.CompilerServices.Unsafe') diff --git a/src/System.Runtime.CompilerServices.Unsafe/src/System.Runtime.CompilerServices.Unsafe.il b/src/System.Runtime.CompilerServices.Unsafe/src/System.Runtime.CompilerServices.Unsafe.il index 3251744263..8695372258 100644 --- a/src/System.Runtime.CompilerServices.Unsafe/src/System.Runtime.CompilerServices.Unsafe.il +++ b/src/System.Runtime.CompilerServices.Unsafe/src/System.Runtime.CompilerServices.Unsafe.il @@ -130,7 +130,7 @@ ret } // end of method Unsafe::CopyBlock - .method public hidebysig static void CopyBlock(void* destination, void* source, native unsigned int byteCount) cil managed aggressiveinlining + .method public hidebysig static void CopyBlock(uint8& destination, uint8& source, uint32 byteCount) cil managed aggressiveinlining { .custom instance void System.Runtime.Versioning.NonVersionableAttribute::.ctor() = ( 01 00 00 00 ) .maxstack 3 @@ -153,7 +153,7 @@ ret } // end of method Unsafe::CopyBlockUnaligned - .method public hidebysig static void CopyBlockUnaligned(void* destination, void* source, native unsigned int byteCount) cil managed aggressiveinlining + .method public hidebysig static void CopyBlockUnaligned(uint8& destination, uint8& source, uint32 byteCount) cil managed aggressiveinlining { .custom instance void System.Runtime.Versioning.NonVersionableAttribute::.ctor() = ( 01 00 00 00 ) .maxstack 3 @@ -176,7 +176,7 @@ ret } // end of method Unsafe::InitBlock - .method public hidebysig static void InitBlock(void* startAddress, uint8 'value', native unsigned int byteCount) cil managed aggressiveinlining + .method public hidebysig static void InitBlock(uint8& startAddress, uint8 'value', uint32 byteCount) cil managed aggressiveinlining { .custom instance void System.Runtime.Versioning.NonVersionableAttribute::.ctor() = ( 01 00 00 00 ) .maxstack 3 @@ -199,7 +199,7 @@ ret } // end of method Unsafe::InitBlockUnaligned - .method public hidebysig static void InitBlockUnaligned(void* startAddress, uint8 'value', native unsigned int byteCount) cil managed aggressiveinlining + .method public hidebysig static void InitBlockUnaligned(uint8& startAddress, uint8 'value', uint32 byteCount) cil managed aggressiveinlining { .custom instance void System.Runtime.Versioning.NonVersionableAttribute::.ctor() = ( 01 00 00 00 ) .maxstack 3 diff --git a/src/System.Runtime.CompilerServices.Unsafe/src/System.Runtime.CompilerServices.Unsafe.xml b/src/System.Runtime.CompilerServices.Unsafe/src/System.Runtime.CompilerServices.Unsafe.xml index bd8f42271a..4a7ea0d948 100644 --- a/src/System.Runtime.CompilerServices.Unsafe/src/System.Runtime.CompilerServices.Unsafe.xml +++ b/src/System.Runtime.CompilerServices.Unsafe/src/System.Runtime.CompilerServices.Unsafe.xml @@ -160,7 +160,7 @@ The source address to copy from. The number of bytes to copy. - + Copies bytes from the source address to the destination address. @@ -177,7 +177,7 @@ The source address to copy from. The number of bytes to copy. - + Copies bytes from the source address to the destination address without assuming architecture dependent alignment of the addresses. @@ -194,7 +194,7 @@ The value to initialize the block to. The number of bytes to initialize. - + Initializes a block of memory at the given location with a given initial value. @@ -211,7 +211,7 @@ The value to initialize the block to. The number of bytes to initialize. - + Initializes a block of memory at the given location with a given initial value without assuming architecture dependent alignment of the address. diff --git a/src/System.Runtime.CompilerServices.Unsafe/tests/UnsafeTests.cs b/src/System.Runtime.CompilerServices.Unsafe/tests/UnsafeTests.cs index 84455780e9..7511966b99 100644 --- a/src/System.Runtime.CompilerServices.Unsafe/tests/UnsafeTests.cs +++ b/src/System.Runtime.CompilerServices.Unsafe/tests/UnsafeTests.cs @@ -181,10 +181,10 @@ namespace System.Runtime.CompilerServices [Theory] [MemberData(nameof(InitBlockData))] - public static unsafe void InitBlockUIntPtrStack(int numBytes, byte value) + public static unsafe void InitBlockRefStack(int numBytes, byte value) { byte* stackPtr = stackalloc byte[numBytes]; - Unsafe.InitBlock(stackPtr, value, (UIntPtr)numBytes); + Unsafe.InitBlock(ref *stackPtr, value, (uint)numBytes); for (int i = 0; i < numBytes; i++) { Assert.Equal(stackPtr[i], value); @@ -193,11 +193,11 @@ namespace System.Runtime.CompilerServices [Theory] [MemberData(nameof(InitBlockData))] - public static unsafe void InitBlockUIntPtrUnmanaged(int numBytes, byte value) + public static unsafe void InitBlockRefUnmanaged(int numBytes, byte value) { IntPtr allocatedMemory = Marshal.AllocCoTaskMem(numBytes); byte* bytePtr = (byte*)allocatedMemory.ToPointer(); - Unsafe.InitBlock(bytePtr, value, (UIntPtr)numBytes); + Unsafe.InitBlock(ref *bytePtr, value, (uint)numBytes); for (int i = 0; i < numBytes; i++) { Assert.Equal(bytePtr[i], value); @@ -232,11 +232,11 @@ namespace System.Runtime.CompilerServices [Theory] [MemberData(nameof(InitBlockData))] - public static unsafe void InitBlockUnalignedUIntPtrStack(int numBytes, byte value) + public static unsafe void InitBlockUnalignedRefStack(int numBytes, byte value) { byte* stackPtr = stackalloc byte[numBytes + 1]; stackPtr += 1; // +1 = make unaligned - Unsafe.InitBlockUnaligned(stackPtr, value, (UIntPtr)numBytes); + Unsafe.InitBlockUnaligned(ref *stackPtr, value, (uint)numBytes); for (int i = 0; i < numBytes; i++) { Assert.Equal(stackPtr[i], value); @@ -245,11 +245,11 @@ namespace System.Runtime.CompilerServices [Theory] [MemberData(nameof(InitBlockData))] - public static unsafe void InitBlockUnalignedUIntPtrUnmanaged(int numBytes, byte value) + public static unsafe void InitBlockUnalignedRefUnmanaged(int numBytes, byte value) { IntPtr allocatedMemory = Marshal.AllocCoTaskMem(numBytes + 1); byte* bytePtr = (byte*)allocatedMemory.ToPointer() + 1; // +1 = make unaligned - Unsafe.InitBlockUnaligned(bytePtr, value, (UIntPtr)numBytes); + Unsafe.InitBlockUnaligned(ref *bytePtr, value, (uint)numBytes); for (int i = 0; i < numBytes; i++) { Assert.Equal(bytePtr[i], value); @@ -291,7 +291,7 @@ namespace System.Runtime.CompilerServices [Theory] [MemberData(nameof(CopyBlockData))] - public static unsafe void CopyBlockUIntPtr(int numBytes) + public static unsafe void CopyBlockRef(int numBytes) { byte* source = stackalloc byte[numBytes]; byte* destination = stackalloc byte[numBytes]; @@ -302,7 +302,7 @@ namespace System.Runtime.CompilerServices source[i] = value; } - Unsafe.CopyBlock(destination, source, (UIntPtr)numBytes); + Unsafe.CopyBlock(ref destination[0], ref source[0], (uint)numBytes); for (int i = 0; i < numBytes; i++) { @@ -337,10 +337,9 @@ namespace System.Runtime.CompilerServices } } - [Theory] [MemberData(nameof(CopyBlockData))] - public static unsafe void CopyBlockUnalignedUIntPtr(int numBytes) + public static unsafe void CopyBlockUnalignedRef(int numBytes) { byte* source = stackalloc byte[numBytes + 1]; byte* destination = stackalloc byte[numBytes + 1]; @@ -353,7 +352,7 @@ namespace System.Runtime.CompilerServices source[i] = value; } - Unsafe.CopyBlockUnaligned(destination, source, (UIntPtr)numBytes); + Unsafe.CopyBlockUnaligned(ref destination[0], ref source[0], (uint)numBytes); for (int i = 0; i < numBytes; i++) { -- cgit v1.2.3 From a0e1d73752403d20a4cf756dd693ddbb7c1a163c Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Thu, 15 Dec 2016 16:00:39 -0800 Subject: Make Unsafe.AsRef inlineable (#14547) The JIT inliner chokes on type mismatch on return. Make the method inlineable by round-tripping the value via local that avoids the type mismatch on return. --- .../src/System.Runtime.CompilerServices.Unsafe.il | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/System.Runtime.CompilerServices.Unsafe') diff --git a/src/System.Runtime.CompilerServices.Unsafe/src/System.Runtime.CompilerServices.Unsafe.il b/src/System.Runtime.CompilerServices.Unsafe/src/System.Runtime.CompilerServices.Unsafe.il index 8695372258..0eb1aa4091 100644 --- a/src/System.Runtime.CompilerServices.Unsafe/src/System.Runtime.CompilerServices.Unsafe.il +++ b/src/System.Runtime.CompilerServices.Unsafe/src/System.Runtime.CompilerServices.Unsafe.il @@ -222,8 +222,12 @@ .method public hidebysig static !!T& AsRef(void* source) cil managed aggressiveinlining { .custom instance void System.Runtime.Versioning.NonVersionableAttribute::.ctor() = ( 01 00 00 00 ) + .locals (int32&) .maxstack 1 ldarg.0 + // Roundtrip via a local to avoid type mismatch on return that the JIT inliner chokes on. + stloc.0 + ldloc.0 ret } // end of method Unsafe::AsRef -- cgit v1.2.3