Skip to content

Commit e165eb4

Browse files
authored
Move GetRefAny (with FCThrow) to managed (#110344)
* Move GetRefAny (with FCThrow) to managed * Move impl. to TypeReference
1 parent 949c3ec commit e165eb4

File tree

4 files changed

+23
-21
lines changed

4 files changed

+23
-21
lines changed

src/coreclr/System.Private.CoreLib/src/System/TypedReference.CoreCLR.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// These are blob that must be dealt with by the compiler.
66

77
using System.Diagnostics;
8+
using System.Diagnostics.CodeAnalysis;
89
using System.Runtime.CompilerServices;
910
using System.Runtime.Versioning;
1011

@@ -16,6 +17,22 @@ public ref partial struct TypedReference
1617
private readonly ref byte _value;
1718
private readonly IntPtr _type;
1819

20+
// implementation of CORINFO_HELP_GETREFANY
21+
[StackTraceHidden]
22+
internal static ref byte GetRefAny(IntPtr clsHnd, TypedReference typedByRef)
23+
{
24+
if (clsHnd != typedByRef._type)
25+
{
26+
ThrowInvalidCastException();
27+
}
28+
29+
return ref typedByRef._value;
30+
31+
[DoesNotReturn]
32+
[StackTraceHidden]
33+
static void ThrowInvalidCastException() => throw new InvalidCastException();
34+
}
35+
1936
private TypedReference(ref byte target, RuntimeType type)
2037
{
2138
_value = ref target;

src/coreclr/inc/jithelpers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@
117117
DYNAMICJITHELPER(CORINFO_HELP_UNBOX_TYPETEST,NULL, METHOD__CASTHELPERS__UNBOX_TYPETEST)
118118
DYNAMICJITHELPER(CORINFO_HELP_UNBOX_NULLABLE,NULL, METHOD__CASTHELPERS__UNBOX_NULLABLE)
119119

120-
JITHELPER(CORINFO_HELP_GETREFANY, JIT_GetRefAny, METHOD__NIL)
120+
DYNAMICJITHELPER(CORINFO_HELP_GETREFANY, NULL, METHOD__TYPED_REFERENCE__GETREFANY)
121121
DYNAMICJITHELPER(CORINFO_HELP_ARRADDR_ST, NULL, METHOD__CASTHELPERS__STELEMREF)
122122
DYNAMICJITHELPER(CORINFO_HELP_LDELEMA_REF, NULL, METHOD__CASTHELPERS__LDELEMAREF)
123123

src/coreclr/vm/corelib.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,9 @@ DEFINE_METHOD(RT_TYPE_HANDLE, ALLOCATECOMOBJECT, AllocateComObject,
344344
#endif
345345
DEFINE_FIELD(RT_TYPE_HANDLE, M_TYPE, m_type)
346346

347+
// DEFINE_CLASS(TYPED_REFERENCE, System, TypedReference)
348+
DEFINE_METHOD(TYPED_REFERENCE, GETREFANY, GetRefAny, NoSig)
349+
347350
DEFINE_CLASS(TYPE_NAME_RESOLVER, Reflection, TypeNameResolver)
348351
DEFINE_METHOD(TYPE_NAME_RESOLVER, GET_TYPE_HELPER, GetTypeHelper, SM_Type_CharPtr_RuntimeAssembly_Bool_Bool_RetRuntimeType)
349352

@@ -1178,8 +1181,8 @@ DEFINE_METHOD(CASTHELPERS, UNBOX, Unbox, NoSig)
11781181
DEFINE_METHOD(CASTHELPERS, STELEMREF, StelemRef, SM_ArrObject_IntPtr_Obj_RetVoid)
11791182
DEFINE_METHOD(CASTHELPERS, LDELEMAREF, LdelemaRef, SM_ArrObject_IntPtr_PtrVoid_RetRefObj)
11801183
DEFINE_METHOD(CASTHELPERS, ARRAYTYPECHECK, ArrayTypeCheck, SM_Obj_Array_RetVoid)
1181-
DEFINE_METHOD(CASTHELPERS, UNBOX_NULLABLE, Unbox_Nullable, NoSig)
1182-
DEFINE_METHOD(CASTHELPERS, UNBOX_TYPETEST, Unbox_TypeTest, NoSig)
1184+
DEFINE_METHOD(CASTHELPERS, UNBOX_NULLABLE, Unbox_Nullable, NoSig)
1185+
DEFINE_METHOD(CASTHELPERS, UNBOX_TYPETEST, Unbox_TypeTest, NoSig)
11831186

11841187
DEFINE_CLASS(VIRTUALDISPATCHHELPERS, CompilerServices, VirtualDispatchHelpers)
11851188
DEFINE_METHOD(VIRTUALDISPATCHHELPERS, VIRTUALFUNCTIONPOINTER, VirtualFunctionPointer, NoSig)

src/coreclr/vm/jithelpers.cpp

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,24 +1382,6 @@ HCIMPL2(Object*, JIT_Box, CORINFO_CLASS_HANDLE type, void* unboxedData)
13821382
}
13831383
HCIMPLEND
13841384

1385-
/*************************************************************/
1386-
HCIMPL2_IV(LPVOID, JIT_GetRefAny, CORINFO_CLASS_HANDLE type, TypedByRef typedByRef)
1387-
{
1388-
FCALL_CONTRACT;
1389-
1390-
TypeHandle clsHnd(type);
1391-
// <TODO>@TODO right now we check for precisely the correct type.
1392-
// do we want to allow inheritance? (watch out since value
1393-
// classes inherit from object but do not normal object layout).</TODO>
1394-
if (clsHnd != typedByRef.type) {
1395-
FCThrow(kInvalidCastException);
1396-
}
1397-
1398-
return(typedByRef.data);
1399-
}
1400-
HCIMPLEND
1401-
1402-
14031385
/*************************************************************/
14041386
HCIMPL2(BOOL, JIT_IsInstanceOfException, CORINFO_CLASS_HANDLE type, Object* obj)
14051387
{

0 commit comments

Comments
 (0)