Fix SpanHelpers.ClearWithoutReferences alignment detection (#18222)
authorPent Ploompuu <kaalikas@gmail.com>
Fri, 1 Jun 2018 03:02:45 +0000 (06:02 +0300)
committerJan Kotas <jkotas@microsoft.com>
Fri, 1 Jun 2018 03:02:45 +0000 (20:02 -0700)
src/System.Private.CoreLib/shared/System/SpanHelpers.cs

index 99e0bf9e964c38f453c378f10b8f8cfe6c9c4f30..0d5c57c5db90112b15111dfa495f4edcbf81107c 100644 (file)
@@ -233,13 +233,13 @@ namespace System
 
             nuint i = 0; // byte offset at which we're copying
 
-            if ((Unsafe.As<byte, int>(ref b) & 3) != 0)
+            if (((nuint)Unsafe.AsPointer(ref b) & 3) != 0)
             {
-                if ((Unsafe.As<byte, int>(ref b) & 1) != 0)
+                if (((nuint)Unsafe.AsPointer(ref b) & 1) != 0)
                 {
-                    Unsafe.AddByteOffset<byte>(ref b, i) = 0;
+                    b = 0;
                     i += 1;
-                    if ((Unsafe.As<byte, int>(ref b) & 2) != 0)
+                    if (((nuint)Unsafe.AsPointer(ref b) & 2) != 0)
                         goto IntAligned;
                 }
                 Unsafe.As<byte, short>(ref Unsafe.AddByteOffset<byte>(ref b, i)) = 0;
@@ -256,7 +256,7 @@ namespace System
             // The thing 1, 2, 3, and 4 have in common that the others don't is that if you
             // subtract one from them, their 3rd lsb will not be set. Hence, the below check.
 
-            if (((Unsafe.As<byte, int>(ref b) - 1) & 4) == 0)
+            if ((((nuint)Unsafe.AsPointer(ref b) - 1) & 4) == 0)
             {
                 Unsafe.As<byte, int>(ref Unsafe.AddByteOffset<byte>(ref b, i)) = 0;
                 i += 4;