Skip to content

Commit 84fbc82

Browse files
committed
Remove 'FastUnbox', use 'Unsafe.As' directly
1 parent 2c02de7 commit 84fbc82

File tree

2 files changed

+57
-60
lines changed

2 files changed

+57
-60
lines changed

src/coreclr/nativeaot/System.Private.CoreLib/src/System/InvokeUtils.cs

Lines changed: 57 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@ private static Exception ConvertOrWidenPrimitivesEnumsAndPointersIfPossible(obje
146146

147147
Unsafe.SkipInit(out dstObject);
148148

149+
ref byte rawSrcValue = ref RuntimeHelpers.GetRawData(srcObject);
150+
149151
// This is the table of all supported widening conversions:
150152
//
151153
// Boolean (W = BOOL)
@@ -176,13 +178,13 @@ private static Exception ConvertOrWidenPrimitivesEnumsAndPointersIfPossible(obje
176178
switch (srcElementType)
177179
{
178180
case EETypeElementType.Char:
179-
charValue = RuntimeHelpers.FastUnbox<char>(srcObject);
181+
charValue = Unsafe.As<byte, char>(ref rawScrValue);
180182
break;
181183
case EETypeElementType.Byte:
182-
charValue = (char)RuntimeHelpers.FastUnbox<byte>(srcObject);
184+
charValue = (char)rawScrValue;
183185
break;
184186
case EETypeElementType.UInt16:
185-
charValue = (char)RuntimeHelpers.FastUnbox<ushort>(srcObject);
187+
charValue = (char)Unsafe.As<byte, ushort>(ref rawScrValue);
186188
break;
187189
default:
188190
goto Failure;
@@ -194,7 +196,7 @@ private static Exception ConvertOrWidenPrimitivesEnumsAndPointersIfPossible(obje
194196
switch (srcElementType)
195197
{
196198
case EETypeElementType.SByte:
197-
sbyteValue = RuntimeHelpers.FastUnbox<sbyte>(srcObject);
199+
sbyteValue = Unsafe.As<byte, sbyte>(ref rawScrValue);
198200
break;
199201
default:
200202
goto Failure;
@@ -206,7 +208,7 @@ private static Exception ConvertOrWidenPrimitivesEnumsAndPointersIfPossible(obje
206208
switch (srcElementType)
207209
{
208210
case EETypeElementType.Byte:
209-
byteValue = RuntimeHelpers.FastUnbox<byte>(srcObject);
211+
byteValue = rawScrValue;
210212
break;
211213
default:
212214
goto Failure;
@@ -218,13 +220,13 @@ private static Exception ConvertOrWidenPrimitivesEnumsAndPointersIfPossible(obje
218220
switch (srcElementType)
219221
{
220222
case EETypeElementType.SByte:
221-
shortValue = (short)RuntimeHelpers.FastUnbox<sbyte>(srcObject);
223+
shortValue = (short)Unsafe.As<byte, sbyte>(ref rawScrValue);
222224
break;
223225
case EETypeElementType.Byte:
224-
shortValue = (short)RuntimeHelpers.FastUnbox<byte>(srcObject);
226+
shortValue = (short)rawScrValue;
225227
break;
226228
case EETypeElementType.Int16:
227-
shortValue = RuntimeHelpers.FastUnbox<short>(srcObject);
229+
shortValue = Unsafe.As<byte, short>(ref rawScrValue);
228230
break;
229231
default:
230232
goto Failure;
@@ -236,13 +238,13 @@ private static Exception ConvertOrWidenPrimitivesEnumsAndPointersIfPossible(obje
236238
switch (srcElementType)
237239
{
238240
case EETypeElementType.Char:
239-
ushortValue = (ushort)RuntimeHelpers.FastUnbox<char>(srcObject);
241+
ushortValue = (ushort)Unsafe.As<byte, char>(ref rawScrValue);
240242
break;
241243
case EETypeElementType.Byte:
242-
ushortValue = (ushort)RuntimeHelpers.FastUnbox<byte>(srcObject);
244+
ushortValue = (ushort)rawScrValue;
243245
break;
244246
case EETypeElementType.UInt16:
245-
ushortValue = RuntimeHelpers.FastUnbox<ushort>(srcObject);
247+
ushortValue = Unsafe.As<byte, ushort>(ref rawScrValue);
246248
break;
247249
default:
248250
goto Failure;
@@ -254,22 +256,22 @@ private static Exception ConvertOrWidenPrimitivesEnumsAndPointersIfPossible(obje
254256
switch (srcElementType)
255257
{
256258
case EETypeElementType.Char:
257-
intValue = (int)RuntimeHelpers.FastUnbox<char>(srcObject);
259+
intValue = (int)Unsafe.As<byte, char>(ref rawScrValue);
258260
break;
259261
case EETypeElementType.SByte:
260-
intValue = (int)RuntimeHelpers.FastUnbox<sbyte>(srcObject);
262+
intValue = (int)Unsafe.As<byte, sbyte>(ref rawScrValue);
261263
break;
262264
case EETypeElementType.Byte:
263-
intValue = (int)RuntimeHelpers.FastUnbox<byte>(srcObject);
265+
intValue = (int)rawScrValue;
264266
break;
265267
case EETypeElementType.Int16:
266-
intValue = (int)RuntimeHelpers.FastUnbox<short>(srcObject);
268+
intValue = (int)Unsafe.As<byte, short>(ref rawScrValue);
267269
break;
268270
case EETypeElementType.UInt16:
269-
intValue = (int)RuntimeHelpers.FastUnbox<ushort>(srcObject);
271+
intValue = (int)Unsafe.As<byte, ushort>(ref rawScrValue);
270272
break;
271273
case EETypeElementType.Int32:
272-
intValue = RuntimeHelpers.FastUnbox<int>(srcObject);
274+
intValue = Unsafe.As<byte, int>(ref rawScrValue);
273275
break;
274276
default:
275277
goto Failure;
@@ -281,16 +283,16 @@ private static Exception ConvertOrWidenPrimitivesEnumsAndPointersIfPossible(obje
281283
switch (srcElementType)
282284
{
283285
case EETypeElementType.Char:
284-
uintValue = (uint)RuntimeHelpers.FastUnbox<char>(srcObject);
286+
uintValue = (uint)Unsafe.As<byte, char>(ref rawScrValue);
285287
break;
286288
case EETypeElementType.Byte:
287-
uintValue = (uint)RuntimeHelpers.FastUnbox<byte>(srcObject);
289+
uintValue = (uint)rawScrValue;
288290
break;
289291
case EETypeElementType.UInt16:
290-
uintValue = (uint)RuntimeHelpers.FastUnbox<ushort>(srcObject);
292+
uintValue = (uint)Unsafe.As<byte, ushort>(ref rawScrValue);
291293
break;
292294
case EETypeElementType.UInt32:
293-
uintValue = RuntimeHelpers.FastUnbox<uint>(srcObject);
295+
uintValue = Unsafe.As<byte, uint>(ref rawScrValue);
294296
break;
295297
default:
296298
goto Failure;
@@ -302,28 +304,28 @@ private static Exception ConvertOrWidenPrimitivesEnumsAndPointersIfPossible(obje
302304
switch (srcElementType)
303305
{
304306
case EETypeElementType.Char:
305-
longValue = (long)RuntimeHelpers.FastUnbox<char>(srcObject);
307+
longValue = (long)Unsafe.As<byte, char>(ref rawScrValue);
306308
break;
307309
case EETypeElementType.SByte:
308-
longValue = (long)RuntimeHelpers.FastUnbox<sbyte>(srcObject);
310+
longValue = (long)Unsafe.As<byte, sbyte>(ref rawScrValue);
309311
break;
310312
case EETypeElementType.Byte:
311-
longValue = (long)RuntimeHelpers.FastUnbox<byte>(srcObject);
313+
longValue = (long)rawScrValue;
312314
break;
313315
case EETypeElementType.Int16:
314-
longValue = (long)RuntimeHelpers.FastUnbox<short>(srcObject);
316+
longValue = (long)Unsafe.As<byte, short>(ref rawScrValue);
315317
break;
316318
case EETypeElementType.UInt16:
317-
longValue = (long)RuntimeHelpers.FastUnbox<ushort>(srcObject);
319+
longValue = (long)Unsafe.As<byte, ushort>(ref rawScrValue);
318320
break;
319321
case EETypeElementType.Int32:
320-
longValue = (long)RuntimeHelpers.FastUnbox<int>(srcObject);
322+
longValue = (long)Unsafe.As<byte, int>(ref rawScrValue);
321323
break;
322324
case EETypeElementType.UInt32:
323-
longValue = (long)RuntimeHelpers.FastUnbox<uint>(srcObject);
325+
longValue = (long)Unsafe.As<byte, uint>(ref rawScrValue);
324326
break;
325327
case EETypeElementType.Int64:
326-
longValue = RuntimeHelpers.FastUnbox<long>(srcObject);
328+
longValue = Unsafe.As<byte, long>(ref rawScrValue);
327329
break;
328330
default:
329331
goto Failure;
@@ -335,19 +337,19 @@ private static Exception ConvertOrWidenPrimitivesEnumsAndPointersIfPossible(obje
335337
switch (srcElementType)
336338
{
337339
case EETypeElementType.Char:
338-
ulongValue = (ulong)RuntimeHelpers.FastUnbox<char>(srcObject);
340+
ulongValue = (ulong)Unsafe.As<byte, char>(ref rawScrValue);
339341
break;
340342
case EETypeElementType.Byte:
341-
ulongValue = (ulong)RuntimeHelpers.FastUnbox<byte>(srcObject);
343+
ulongValue = (ulong)rawScrValue;
342344
break;
343345
case EETypeElementType.UInt16:
344-
ulongValue = (ulong)RuntimeHelpers.FastUnbox<ushort>(srcObject);
346+
ulongValue = (ulong)Unsafe.As<byte, ushort>(ref rawScrValue);
345347
break;
346348
case EETypeElementType.UInt32:
347-
ulongValue = (ulong)RuntimeHelpers.FastUnbox<uint>(srcObject);
349+
ulongValue = (ulong)Unsafe.As<byte, uint>(ref rawScrValue);
348350
break;
349351
case EETypeElementType.UInt64:
350-
ulongValue = RuntimeHelpers.FastUnbox<ulong>(srcObject);
352+
ulongValue = Unsafe.As<byte, ulong>(ref rawScrValue);
351353
break;
352354
default:
353355
goto Failure;
@@ -359,34 +361,34 @@ private static Exception ConvertOrWidenPrimitivesEnumsAndPointersIfPossible(obje
359361
switch (srcElementType)
360362
{
361363
case EETypeElementType.Char:
362-
floatValue = (float)RuntimeHelpers.FastUnbox<char>(srcObject);
364+
floatValue = (float)Unsafe.As<byte, char>(ref rawScrValue);
363365
break;
364366
case EETypeElementType.SByte:
365-
floatValue = (float)RuntimeHelpers.FastUnbox<sbyte>(srcObject);
367+
floatValue = (float)Unsafe.As<byte, sbyte>(ref rawScrValue);
366368
break;
367369
case EETypeElementType.Byte:
368-
floatValue = (float)RuntimeHelpers.FastUnbox<byte>(srcObject);
370+
floatValue = (float)rawScrValue;
369371
break;
370372
case EETypeElementType.Int16:
371-
floatValue = (float)RuntimeHelpers.FastUnbox<short>(srcObject);
373+
floatValue = (float)Unsafe.As<byte, short>(ref rawScrValue);
372374
break;
373375
case EETypeElementType.UInt16:
374-
floatValue = (float)RuntimeHelpers.FastUnbox<ushort>(srcObject);
376+
floatValue = (float)Unsafe.As<byte, ushort>(ref rawScrValue);
375377
break;
376378
case EETypeElementType.Int32:
377-
floatValue = (float)RuntimeHelpers.FastUnbox<int>(srcObject);
379+
floatValue = (float)Unsafe.As<byte, int>(ref rawScrValue);
378380
break;
379381
case EETypeElementType.UInt32:
380-
floatValue = (float)RuntimeHelpers.FastUnbox<uint>(srcObject);
382+
floatValue = (float)Unsafe.As<byte, uint>(ref rawScrValue);
381383
break;
382384
case EETypeElementType.Int64:
383-
floatValue = (float)RuntimeHelpers.FastUnbox<long>(srcObject);
385+
floatValue = (float)Unsafe.As<byte, long>(ref rawScrValue);
384386
break;
385387
case EETypeElementType.UInt64:
386-
floatValue = (float)RuntimeHelpers.FastUnbox<ulong>(srcObject);
388+
floatValue = (float)Unsafe.As<byte, ulong>(ref rawScrValue);
387389
break;
388390
case EETypeElementType.Single:
389-
floatValue = RuntimeHelpers.FastUnbox<float>(srcObject);
391+
floatValue = Unsafe.As<byte, float>(ref rawScrValue);
390392
break;
391393
default:
392394
goto Failure;
@@ -398,37 +400,37 @@ private static Exception ConvertOrWidenPrimitivesEnumsAndPointersIfPossible(obje
398400
switch (srcElementType)
399401
{
400402
case EETypeElementType.Char:
401-
doubleValue = (double)RuntimeHelpers.FastUnbox<char>(srcObject);
403+
doubleValue = (double)Unsafe.As<byte, char>(ref rawScrValue);
402404
break;
403405
case EETypeElementType.SByte:
404-
doubleValue = (double)RuntimeHelpers.FastUnbox<sbyte>(srcObject);
406+
doubleValue = (double)Unsafe.As<byte, sbyte>(ref rawScrValue);
405407
break;
406408
case EETypeElementType.Byte:
407-
doubleValue = (double)RuntimeHelpers.FastUnbox<byte>(srcObject);
409+
doubleValue = (double)rawScrValue;
408410
break;
409411
case EETypeElementType.Int16:
410-
doubleValue = (double)RuntimeHelpers.FastUnbox<short>(srcObject);
412+
doubleValue = (double)Unsafe.As<byte, short>(ref rawScrValue);
411413
break;
412414
case EETypeElementType.UInt16:
413-
doubleValue = (double)RuntimeHelpers.FastUnbox<ushort>(srcObject);
415+
doubleValue = (double)Unsafe.As<byte, ushort>(ref rawScrValue);
414416
break;
415417
case EETypeElementType.Int32:
416-
doubleValue = (double)RuntimeHelpers.FastUnbox<int>(srcObject);
418+
doubleValue = (double)Unsafe.As<byte, int>(ref rawScrValue);
417419
break;
418420
case EETypeElementType.UInt32:
419-
doubleValue = (double)RuntimeHelpers.FastUnbox<uint>(srcObject);
421+
doubleValue = (double)Unsafe.As<byte, uint>(ref rawScrValue);
420422
break;
421423
case EETypeElementType.Int64:
422-
doubleValue = (double)RuntimeHelpers.FastUnbox<long>(srcObject);
424+
doubleValue = (double)Unsafe.As<byte, long>(ref rawScrValue);
423425
break;
424426
case EETypeElementType.UInt64:
425-
doubleValue = (double)RuntimeHelpers.FastUnbox<ulong>(srcObject);
427+
doubleValue = (double)Unsafe.As<byte, ulong>(ref rawScrValue);
426428
break;
427429
case EETypeElementType.Single:
428-
doubleValue = (double)RuntimeHelpers.FastUnbox<float>(srcObject);
430+
doubleValue = (double)Unsafe.As<byte, float>(ref rawScrValue);
429431
break;
430432
case EETypeElementType.Double:
431-
doubleValue = RuntimeHelpers.FastUnbox<double>(srcObject);
433+
doubleValue = Unsafe.As<byte, double>(ref rawScrValue);
432434
break;
433435
default:
434436
goto Failure;

src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.NativeAot.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -206,11 +206,6 @@ internal static bool IsBitwiseEquatable<T>()
206206
internal static ref byte GetRawData(this object obj) =>
207207
ref Unsafe.As<RawData>(obj).Data;
208208

209-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
210-
internal static T FastUnbox<T>(this object obj)
211-
where T : unmanaged =>
212-
Unsafe.As<byte, T>(ref Unsafe.As<RawData>(obj).Data);
213-
214209
internal static unsafe nuint GetRawObjectDataSize(this object obj)
215210
{
216211
MethodTable* pMT = GetMethodTable(obj);

0 commit comments

Comments
 (0)