1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
5 using System
.Runtime
.CompilerServices
;
6 using Internal
.Runtime
.CompilerServices
;
18 public static readonly String Empty
;
20 public int Length
=> _stringLength
;
22 [IndexerName ("Chars")]
23 public char this [int index
] {
26 if ((uint)index
>= _stringLength
)
27 ThrowHelper
.ThrowIndexOutOfRangeException ();
29 return Unsafe
.Add (ref _firstChar
, index
);
33 public static String
Intern (String str
)
36 throw new ArgumentNullException(nameof(str
));
38 return InternalIntern (str
);
41 public static String
IsInterned (String str
)
44 throw new ArgumentNullException(nameof(str
));
46 return InternalIsInterned (str
);
49 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
50 internal extern static String
FastAllocateString (int length
);
52 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
53 extern static String
InternalIsInterned (String str
);
55 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
56 extern static String
InternalIntern (String str
);
58 // TODO: Should be pointing to Buffer instead
59 #region Runtime method-to-ir dependencies
61 static unsafe void memset (byte *dest
, int val
, int len
)
72 val
= val
| (val
<< 8);
73 val
= val
| (val
<< 16);
76 int rest
= (int)dest
& 3;
87 ((int*)dest
) [0] = val
;
88 ((int*)dest
) [1] = val
;
89 ((int*)dest
) [2] = val
;
90 ((int*)dest
) [3] = val
;
95 ((int*)dest
) [0] = val
;
107 static unsafe void memcpy (byte *dest
, byte *src
, int size
)
109 Buffer
.Memcpy (dest
, src
, size
);
112 /* Used by the runtime */
113 internal static unsafe void bzero (byte *dest
, int len
) {
114 memset (dest
, 0, len
);
117 internal static unsafe void bzero_aligned_1 (byte *dest
, int len
) {
118 ((byte*)dest
) [0] = 0;
121 internal static unsafe void bzero_aligned_2 (byte *dest
, int len
) {
122 ((short*)dest
) [0] = 0;
125 internal static unsafe void bzero_aligned_4 (byte *dest
, int len
) {
126 ((int*)dest
) [0] = 0;
129 internal static unsafe void bzero_aligned_8 (byte *dest
, int len
) {
130 ((long*)dest
) [0] = 0;
133 internal static unsafe void memcpy_aligned_1 (byte *dest
, byte *src
, int size
) {
134 ((byte*)dest
) [0] = ((byte*)src
) [0];
137 internal static unsafe void memcpy_aligned_2 (byte *dest
, byte *src
, int size
) {
138 ((short*)dest
) [0] = ((short*)src
) [0];
141 internal static unsafe void memcpy_aligned_4 (byte *dest
, byte *src
, int size
) {
142 ((int*)dest
) [0] = ((int*)src
) [0];
145 internal static unsafe void memcpy_aligned_8 (byte *dest
, byte *src
, int size
) {
146 ((long*)dest
) [0] = ((long*)src
) [0];
151 // Certain constructors are redirected to CreateString methods with
152 // matching argument list. The this pointer should not be used.
154 // TODO: Update runtime to call Ctor directly
156 unsafe String
CreateString (sbyte* value)
161 unsafe String
CreateString (sbyte* value, int startIndex
, int length
)
163 return Ctor (value, startIndex
, length
);
166 unsafe String
CreateString (char* value)
171 unsafe String
CreateString (char* value, int startIndex
, int length
)
173 return Ctor (value, startIndex
, length
);
176 String
CreateString (char[] val
, int startIndex
, int length
)
178 return Ctor (val
, startIndex
, length
);
181 String
CreateString (char [] val
)
186 String
CreateString (char c
, int count
)
188 return Ctor (c
, count
);
191 unsafe String
CreateString (sbyte* value, int startIndex
, int length
, System
.Text
.Encoding enc
)
193 return Ctor (value, startIndex
, length
, enc
);
196 String
CreateString (ReadOnlySpan
<char> value)