Mark Span.Length as non-versionable
authorJan Kotas <jkotas@microsoft.com>
Wed, 13 Sep 2017 03:30:30 +0000 (20:30 -0700)
committerJan Kotas <jkotas@microsoft.com>
Wed, 13 Sep 2017 17:08:32 +0000 (10:08 -0700)
This allows inlining Span.Length accross versioning boundaries in R2R images. We are leaking the Span implementation details already because the Span indexer is treated as intrinsic. Marking a few more trivial methods as non-versionable should not do any future harm.

src/mscorlib/shared/System/ReadOnlySpan.cs
src/mscorlib/shared/System/Span.cs
src/mscorlib/src/System/ByReference.cs

index b27e0f93bd2835188712bb1888a948ef2f3c89bb..bcf1697e88a94f8a0e19c9855108a72aa4824921 100644 (file)
@@ -2,10 +2,10 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
+using System.ComponentModel;
 using System.Diagnostics;
 using System.Runtime.CompilerServices;
-using EditorBrowsableState = System.ComponentModel.EditorBrowsableState;
-using EditorBrowsableAttribute = System.ComponentModel.EditorBrowsableAttribute;
+using System.Runtime.Versioning;
 
 #pragma warning disable 0809  //warning CS0809: Obsolete member 'Span<T>.Equals(object)' overrides non-obsolete member 'object.Equals(object)'
 
@@ -17,6 +17,7 @@ namespace System
     /// </summary>
     [IsReadOnly]
     [IsByRefLike]
+    [NonVersionable]
     public struct ReadOnlySpan<T>
     {
         /// <summary>A byref or a native ptr.</summary>
@@ -131,12 +132,26 @@ namespace System
         /// <summary>
         /// The number of items in the read-only span.
         /// </summary>
-        public int Length => _length;
+        public int Length
+        {
+            [NonVersionable]
+            get
+            {
+                return _length;
+            }
+        }
 
         /// <summary>
         /// Returns true if Length is 0.
         /// </summary>
-        public bool IsEmpty => _length == 0;
+        public bool IsEmpty
+        {
+            [NonVersionable]
+            get
+            {
+                return _length == 0;
+            }
+        }
 
         /// <summary>
         /// Returns the specified element of the read-only span.
@@ -159,6 +174,7 @@ namespace System
             [Intrinsic]
 #endif
             [MethodImpl(MethodImplOptions.AggressiveInlining)]
+            [NonVersionable]
             get
             {
                 if ((uint)index >= (uint)_length)
index d3de785b7d7b5f1ab35a025a9048561d4d882fa2..de6787d09d4ed45f19fd83158e76b314baf7ddfa 100644 (file)
@@ -2,11 +2,10 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
+using System.ComponentModel;
 using System.Diagnostics;
-using System.Runtime;
 using System.Runtime.CompilerServices;
-using EditorBrowsableState = System.ComponentModel.EditorBrowsableState;
-using EditorBrowsableAttribute = System.ComponentModel.EditorBrowsableAttribute;
+using System.Runtime.Versioning;
 
 #pragma warning disable 0809  //warning CS0809: Obsolete member 'Span<T>.Equals(object)' overrides non-obsolete member 'object.Equals(object)'
 
@@ -24,6 +23,7 @@ namespace System
     /// </summary>
     [IsReadOnly]
     [IsByRefLike]
+    [NonVersionable]
     public struct Span<T>
     {
         /// <summary>A byref or a native ptr.</summary>
@@ -144,12 +144,26 @@ namespace System
         /// <summary>
         /// The number of items in the span.
         /// </summary>
-        public int Length => _length;
+        public int Length
+        {
+            [NonVersionable]
+            get
+            {
+                return _length;
+            }
+        }
 
         /// <summary>
         /// Returns true if Length is 0.
         /// </summary>
-        public bool IsEmpty => _length == 0;
+        public bool IsEmpty
+        {
+            [NonVersionable]
+            get
+            {
+                return _length == 0;
+            }
+        }
 
         /// <summary>
         /// Returns a reference to specified element of the Span.
@@ -172,6 +186,7 @@ namespace System
             [Intrinsic]
 #endif
             [MethodImpl(MethodImplOptions.AggressiveInlining)]
+            [NonVersionable]
             get
             {
                 if ((uint)index >= (uint)_length)
index 833dab0d5541418940c77f11d6f632a7b27e57df..8079605bfb2bd8c0c4ed377a4d777d913266e27c 100644 (file)
@@ -3,12 +3,14 @@
 // See the LICENSE file in the project root for more information.
 
 using System.Runtime.CompilerServices;
+using System.Runtime.Versioning;
 
 namespace System
 {
     // ByReference<T> is meant to be used to represent "ref T" fields. It is working
     // around lack of first class support for byref fields in C# and IL. The JIT and 
     // type loader has special handling for it that turns it into a thin wrapper around ref T.
+    [NonVersionable]
     internal struct ByReference<T>
     {
         private IntPtr _value;