Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Move unboxing helpers to managed code#109135

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
davidwrighton merged 19 commits intodotnet:mainfromdavidwrighton:UnboxingHelpers
Nov 21, 2024
Merged
Show file tree
Hide file tree
Changes from1 commit
Commits
Show all changes
19 commits
Select commitHold shift + click to select a range
c70a57c
Move unboxing helpers to managed code
davidwrightonOct 23, 2024
f1258a4
Add boxinghelpers.cs
davidwrightonOct 23, 2024
02636f8
Fix issues noted in CI/Review
davidwrightonOct 24, 2024
d8e01e3
Fix more issues found in CI
davidwrightonOct 24, 2024
b2c6991
Fix issue where UnboxNoCheck writes too many bytes when unboxing a tr…
davidwrightonOct 25, 2024
12d17e5
Move unboxing helpers to CastHelpers class
davidwrightonOct 28, 2024
3f281b9
Before conversion to ref byte everywhere
davidwrightonOct 30, 2024
8dfaedc
It should all work now, and be fast
davidwrightonOct 30, 2024
be624da
Cleanup dead code
davidwrightonOct 30, 2024
dec085f
Update src/coreclr/System.Private.CoreLib/src/System/Runtime/Compiler…
davidwrightonOct 30, 2024
e22038b
Merge branch 'main' of https://github.com/dotnet/runtime into Unboxin…
davidwrightonOct 30, 2024
e44fab4
Fix build break
davidwrightonOct 30, 2024
2964105
And finish up the details around optimizing for the fastest case in U…
davidwrightonOct 30, 2024
6469fbb
Merge branch 'UnboxingHelpers' of https://github.com/davidwrighton/ru…
davidwrightonOct 30, 2024
1e51dd2
- Remove unused helper functions InitValueClass and InitValueClassPtr
davidwrightonOct 31, 2024
ee6d42d
Performance seeking behavior has finished. The perf is amazing
davidwrightonNov 13, 2024
7761ad8
Create GetNumInstanceFieldBytesIfContainsGCPointers helper and use it…
davidwrightonNov 13, 2024
55e0df9
Last minute changes
davidwrightonNov 13, 2024
6a8d1ae
Update wording
davidwrightonNov 19, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
NextNext commit
Move unboxing helpers to managed code
  • Loading branch information
@davidwrighton
davidwrighton committedOct 23, 2024
commitc70a57c15b60052fde84daf20ff3f86ee239908a
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -195,6 +195,7 @@
<Compile Include="$(BclSourcesRoot)\System\Reflection\RuntimePropertyInfo.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\TypeNameResolver.CoreCLR.cs" />
<Compile Include="$(BclSourcesRoot)\System\Reflection\Metadata\RuntimeTypeMetadataUpdateHandler.cs" />
<Compile Include="$(BclSourcesRoot)\System\Runtime\CompilerServices\BoxingHelpers.cs" />
<Compile Include="$(BclSourcesRoot)\System\Runtime\CompilerServices\CastHelpers.cs" />
<Compile Include="$(BclSourcesRoot)\System\Runtime\CompilerServices\GenericsHelpers.cs" />
<Compile Include="$(BclSourcesRoot)\System\Runtime\CompilerServices\InitHelpers.cs" />
Expand Down
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -253,7 +253,7 @@ private static unsafe void CopyImplUnBoxEachElement(Array sourceArray, int sourc

if (pDestMT->IsNullable)
{
RuntimeHelpers.Unbox_Nullable(ref dest, pDestMT, obj);
BoxingHelpers.Unbox_Nullable(ref dest, pDestMT, obj);
}
else if (obj is null || RuntimeHelpers.GetMethodTable(obj) != pDestMT)
{
Expand DownExpand Up@@ -546,7 +546,7 @@ private unsafe void InternalSetValue(object? value, nint flattenedIndex)
{
if (pElementMethodTable->IsNullable)
{
RuntimeHelpers.Unbox_Nullable(ref offsetDataRef, pElementMethodTable, value);
BoxingHelpers.Unbox_Nullable(ref offsetDataRef, pElementMethodTable, value);
}
else
{
Expand Down
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,20 +8,25 @@ namespace System.Runtime.CompilerServices
{
[StackTraceHidden]
[DebuggerStepThrough]
internal static unsafe class CastHelpers
internal static unsafepartialclass CastHelpers
{
// In coreclr the table is allocated and written to on the native side.
internal static int[]? s_table;

[LibraryImport(RuntimeHelpers.QCall)]
internal static partial void ThrowInvalidCastException(void* fromTypeHnd, void* toTypeHnd);

internal static void ThrowInvalidCastException(object fromTypeHnd, void* toTypeHnd)
{
ThrowInvalidCastException(RuntimeHelpers.GetMethodTable(fromTypeHnd), toTypeHnd);
}

[MethodImpl(MethodImplOptions.InternalCall)]
private static extern object IsInstanceOfAny_NoCacheLookup(void* toTypeHnd, object obj);

[MethodImpl(MethodImplOptions.InternalCall)]
private static extern object ChkCastAny_NoCacheLookup(void* toTypeHnd, object obj);

[MethodImpl(MethodImplOptions.InternalCall)]
private static extern ref byte Unbox_Helper(void* toTypeHnd, object obj);

[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void WriteBarrier(ref object? dst, object? obj);

Expand DownExpand Up@@ -365,13 +370,13 @@ internal static unsafe class CastHelpers
}

[DebuggerHidden]
private static ref byte Unbox(void* toTypeHnd, object obj)
private static ref byte Unbox(MethodTable* toTypeHnd, object obj)
{
// This will throw NullReferenceException if obj is null.
if (RuntimeHelpers.GetMethodTable(obj) == toTypeHnd)
return ref obj.GetRawData();

return ref Unbox_Helper(toTypeHnd, obj);
return refBoxingHelpers.Unbox_Helper(toTypeHnd, obj);
}

[DebuggerHidden]
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -443,9 +443,6 @@ internal static unsafe bool ObjectHasComponentSize(object obj)
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern unsafe object? Box(MethodTable* methodTable, ref byte data);

[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern unsafe void Unbox_Nullable(ref byte destination, MethodTable* toTypeHnd, object? obj);

// Given an object reference, returns its MethodTable*.
//
// WARNING: The caller has to ensure that MethodTable* does not get unloaded. The most robust way
Expand DownExpand Up@@ -872,6 +869,12 @@ public TypeHandle GetArrayElementTypeHandle()
/// </summary>
[MethodImpl(MethodImplOptions.InternalCall)]
public extern MethodTable* GetMethodTableMatchingParentClass(MethodTable* parent);

[MethodImpl(MethodImplOptions.InternalCall)]
public extern ref byte GetNullableValueFieldReferenceAndSize(ref byte nullableAddr, out uint size);

[MethodImpl(MethodImplOptions.InternalCall)]
public extern MethodTable* InstantiationArg0();
}

// Subset of src\vm\methodtable.h
Expand Down
4 changes: 2 additions & 2 deletionssrc/coreclr/inc/jithelpers.h
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -114,8 +114,8 @@
DYNAMICJITHELPER(CORINFO_HELP_BOX, JIT_Box, METHOD__NIL)
JITHELPER(CORINFO_HELP_BOX_NULLABLE, JIT_Box, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_UNBOX, NULL, METHOD__CASTHELPERS__UNBOX)
JITHELPER(CORINFO_HELP_UNBOX_TYPETEST,JIT_Unbox_TypeTest, METHOD__NIL)
JITHELPER(CORINFO_HELP_UNBOX_NULLABLE,JIT_Unbox_Nullable, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_UNBOX_TYPETEST,NULL, METHOD__BOXINGHELPERS__UNBOX_TYPETEST)
DYNAMICJITHELPER(CORINFO_HELP_UNBOX_NULLABLE,NULL, METHOD__BOXINGHELPERS__UNBOX_NULLABLE)

JITHELPER(CORINFO_HELP_GETREFANY, JIT_GetRefAny, METHOD__NIL)
DYNAMICJITHELPER(CORINFO_HELP_ARRADDR_ST, NULL, METHOD__CASTHELPERS__STELEMREF)
Expand Down
1 change: 1 addition & 0 deletionssrc/coreclr/vm/JitQCallHelpers.h
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,5 +21,6 @@ class MethodDesc;
extern "C" void * QCALLTYPE ResolveVirtualFunctionPointer(QCall::ObjectHandleOnStack obj, CORINFO_CLASS_HANDLE classHnd, CORINFO_METHOD_HANDLE methodHnd);
extern "C" CORINFO_GENERIC_HANDLE QCALLTYPE GenericHandleWorker(MethodDesc * pMD, MethodTable * pMT, LPVOID signature, DWORD dictionaryIndexAndSlot, Module* pModule);
extern "C" void QCALLTYPE InitClassHelper(MethodTable* pMT);
extern "C" void QCALLTYPE ThrowInvalidCastException(CORINFO_CLASS_HANDLE pTargetType, CORINFO_CLASS_HANDLE pSourceType);

#endif //_JITQCALLHELPERS_H
19 changes: 19 additions & 0 deletionssrc/coreclr/vm/comutilnative.cpp
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -1818,6 +1818,25 @@ FCIMPL2(MethodTable*, MethodTableNative::GetMethodTableMatchingParentClass, Meth
}
FCIMPLEND

FCIMPL3(uint8_t*, MethodTableNative::GetNullableValueFieldReferenceAndSize, MethodTable* mt, uint8_t* nullableAddr, uint32_t* pSize)
{
FCALL_CONTRACT;
_ASSERTE(Nullable::IsNullableType(mt));
_ASSERTE(strcmp(mt->GetApproxFieldDescListRaw()[1].GetDebugName(), "value") == 0);

*pSize = mt->GetInstantiation()[0].AsMethodTable()->GetNumInstanceFieldBytes();
return nullableAddr + mt->GetApproxFieldDescListRaw()[1].GetOffset();
}
FCIMPLEND

FCIMPL1(MethodTable*, MethodTableNative::InstantiationArg0, MethodTable* mt);
{
FCALL_CONTRACT;

return mt->GetInstantiation()[0].AsMethodTable();
}
FCIMPLEND

extern "C" BOOL QCALLTYPE MethodTable_AreTypesEquivalent(MethodTable* mta, MethodTable* mtb)
{
QCALL_CONTRACT;
Expand Down
2 changes: 2 additions & 0 deletionssrc/coreclr/vm/comutilnative.h
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -259,6 +259,8 @@ class MethodTableNative {
static FCDECL1(UINT32, GetNumInstanceFieldBytes, MethodTable* mt);
static FCDECL1(CorElementType, GetPrimitiveCorElementType, MethodTable* mt);
static FCDECL2(MethodTable*, GetMethodTableMatchingParentClass, MethodTable* mt, MethodTable* parent);
static FCDECL3(uint8_t*, GetNullableValueFieldReferenceAndSize, MethodTable* mt, uint8_t* nullableAddr, uint32_t* pSize);
static FCDECL1(MethodTable*, InstantiationArg0, MethodTable* mt);
};

extern "C" BOOL QCALLTYPE MethodTable_AreTypesEquivalent(MethodTable* mta, MethodTable* mtb);
Expand Down
6 changes: 5 additions & 1 deletionsrc/coreclr/vm/corelib.h
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -1164,11 +1164,15 @@ DEFINE_METHOD(CASTHELPERS, CHKCASTANY, ChkCastAny, SM_Ptr
DEFINE_METHOD(CASTHELPERS, CHKCASTINTERFACE, ChkCastInterface, SM_PtrVoid_Obj_RetObj)
DEFINE_METHOD(CASTHELPERS, CHKCASTCLASS, ChkCastClass, SM_PtrVoid_Obj_RetObj)
DEFINE_METHOD(CASTHELPERS, CHKCASTCLASSSPECIAL, ChkCastClassSpecial, SM_PtrVoid_Obj_RetObj)
DEFINE_METHOD(CASTHELPERS, UNBOX, Unbox,SM_PtrVoid_Obj_RetRefByte)
DEFINE_METHOD(CASTHELPERS, UNBOX, Unbox,NoSig)
DEFINE_METHOD(CASTHELPERS, STELEMREF, StelemRef, SM_ArrObject_IntPtr_Obj_RetVoid)
DEFINE_METHOD(CASTHELPERS, LDELEMAREF, LdelemaRef, SM_ArrObject_IntPtr_PtrVoid_RetRefObj)
DEFINE_METHOD(CASTHELPERS, ARRAYTYPECHECK, ArrayTypeCheck, SM_Obj_Array_RetVoid)

DEFINE_CLASS(BOXINGHELPERS, CompilerServices, BoxingHelpers)
DEFINE_METHOD(BOXINGHELPERS, UNBOX_NULLABLE, Unbox_Nullable, NoSig)
DEFINE_METHOD(BOXINGHELPERS, UNBOX_TYPETEST, Unbox_TypeTest, NoSig)

DEFINE_CLASS(VIRTUALDISPATCHHELPERS, CompilerServices, VirtualDispatchHelpers)
DEFINE_METHOD(VIRTUALDISPATCHHELPERS, VIRTUALFUNCTIONPOINTER, VirtualFunctionPointer, NoSig)
DEFINE_METHOD(VIRTUALDISPATCHHELPERS, VIRTUALFUNCTIONPOINTER_DYNAMIC, VirtualFunctionPointer_Dynamic, NoSig)
Expand Down
4 changes: 1 addition & 3 deletionssrc/coreclr/vm/ecalllist.h
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -269,8 +269,6 @@ FCFuncEnd()
FCFuncStart(gCastHelpers)
FCFuncElement("IsInstanceOfAny_NoCacheLookup", ::IsInstanceOfAny_NoCacheLookup)
FCFuncElement("ChkCastAny_NoCacheLookup", ::ChkCastAny_NoCacheLookup)
FCFuncElement("Unbox_Helper", ::Unbox_Helper)
FCFuncElement("JIT_Unbox_TypeTest", ::JIT_Unbox_TypeTest)
FCFuncElement("WriteBarrier", ::WriteBarrier_Helper)
FCFuncEnd()

Expand DownExpand Up@@ -356,13 +354,13 @@ FCFuncStart(gRuntimeHelpers)
FCFuncElement("AllocTailCallArgBufferWorker", TailCallHelp::AllocTailCallArgBufferWorker)
FCFuncElement("GetTailCallInfo", TailCallHelp::GetTailCallInfo)
FCFuncElement("Box", JIT_Box)
FCFuncElement("Unbox_Nullable", JIT_Unbox_Nullable)
FCFuncEnd()

FCFuncStart(gMethodTableFuncs)
FCFuncElement("GetNumInstanceFieldBytes", MethodTableNative::GetNumInstanceFieldBytes)
FCFuncElement("GetPrimitiveCorElementType", MethodTableNative::GetPrimitiveCorElementType)
FCFuncElement("GetMethodTableMatchingParentClass", MethodTableNative::GetMethodTableMatchingParentClass)
FCFuncElement("GetNullableValueFieldReferenceAndSize", MethodTableNative::GetNullableValueFieldReferenceAndSize)
FCFuncEnd()

FCFuncStart(gStubHelperFuncs)
Expand Down
179 changes: 13 additions & 166 deletionssrc/coreclr/vm/jithelpers.cpp
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -1657,172 +1657,6 @@ HCIMPL2(Object*, JIT_Box, CORINFO_CLASS_HANDLE type, void* unboxedData)
}
HCIMPLEND

/*************************************************************/
NOINLINE HCIMPL3(VOID, JIT_Unbox_Nullable_Framed, void * destPtr, MethodTable* typeMT, OBJECTREF objRef)
{
FCALL_CONTRACT;

HELPER_METHOD_FRAME_BEGIN_1(objRef);
if (!Nullable::UnBox(destPtr, objRef, typeMT))
{
COMPlusThrowInvalidCastException(&objRef, TypeHandle(typeMT));
}
HELPER_METHOD_POLL();
HELPER_METHOD_FRAME_END();
}
HCIMPLEND

/*************************************************************/
HCIMPL3(VOID, JIT_Unbox_Nullable, void * destPtr, CORINFO_CLASS_HANDLE type, Object* obj)
{
FCALL_CONTRACT;

TypeHandle typeHnd(type);
_ASSERTE(Nullable::IsNullableType(typeHnd));

MethodTable* typeMT = typeHnd.AsMethodTable();

OBJECTREF objRef = ObjectToOBJECTREF(obj);

if (Nullable::UnBoxNoGC(destPtr, objRef, typeMT))
{
// exact match (type equivalence not needed)
FC_GC_POLL();
return;
}

// Fall back to a framed helper that handles type equivalence.
ENDFORBIDGC();
HCCALL3(JIT_Unbox_Nullable_Framed, destPtr, typeMT, objRef);
}
HCIMPLEND

/*************************************************************/
/* framed Unbox helper that handles enums and full-blown type equivalence */
NOINLINE HCIMPL2(LPVOID, Unbox_Helper_Framed, MethodTable* pMT1, Object* obj)
{
FCALL_CONTRACT;

LPVOID result = NULL;
MethodTable* pMT2 = obj->GetMethodTable();

OBJECTREF objRef = ObjectToOBJECTREF(obj);
HELPER_METHOD_FRAME_BEGIN_RET_1(objRef);
HELPER_METHOD_POLL();

if (pMT1->GetInternalCorElementType() == pMT2->GetInternalCorElementType() &&
(pMT1->IsEnum() || pMT1->IsTruePrimitive()) &&
(pMT2->IsEnum() || pMT2->IsTruePrimitive()))
{
// we allow enums and their primitive type to be interchangeable
result = objRef->GetData();
}
else if (pMT1->IsEquivalentTo(pMT2))
{
// the structures are equivalent
result = objRef->GetData();
}
else
{
COMPlusThrowInvalidCastException(&objRef, TypeHandle(pMT1));
}
HELPER_METHOD_FRAME_END();

return result;
}
HCIMPLEND

/*************************************************************/
/* Unbox helper that handles enums */
HCIMPL2(LPVOID, Unbox_Helper, CORINFO_CLASS_HANDLE type, Object* obj)
{
FCALL_CONTRACT;

TypeHandle typeHnd(type);
// boxable types have method tables
_ASSERTE(!typeHnd.IsTypeDesc());

MethodTable* pMT1 = typeHnd.AsMethodTable();
// must be a value type
_ASSERTE(pMT1->IsValueType());

MethodTable* pMT2 = obj->GetMethodTable();

// we allow enums and their primitive type to be interchangeable.
// if suspension is requested, defer to the framed helper.
if (pMT1->GetInternalCorElementType() == pMT2->GetInternalCorElementType() &&
(pMT1->IsEnum() || pMT1->IsTruePrimitive()) &&
(pMT2->IsEnum() || pMT2->IsTruePrimitive()) &&
g_TrapReturningThreads == 0)
{
return obj->GetData();
}

// Fall back to a framed helper that can also handle GC suspension and type equivalence.
ENDFORBIDGC();
return HCCALL2(Unbox_Helper_Framed, pMT1, obj);
}
HCIMPLEND

/* framed Unbox type test helper that handles enums and full-blown type equivalence */
NOINLINE HCIMPL2(void, JIT_Unbox_TypeTest_Framed, MethodTable* pMT1, MethodTable* pMT2)
{
FCALL_CONTRACT;

HELPER_METHOD_FRAME_BEGIN_0();
HELPER_METHOD_POLL();

if (pMT1->GetInternalCorElementType() == pMT2->GetInternalCorElementType() &&
(pMT1->IsEnum() || pMT1->IsTruePrimitive()) &&
(pMT2->IsEnum() || pMT2->IsTruePrimitive()))
{
// type test test passes
}
else if (pMT1->IsEquivalentTo(pMT2))
{
// the structures are equivalent
}
else
{
COMPlusThrowInvalidCastException(TypeHandle(pMT2), TypeHandle(pMT1));
}
HELPER_METHOD_FRAME_END();
}
HCIMPLEND

/*************************************************************/
/* Unbox type test that handles enums */
HCIMPL2(void, JIT_Unbox_TypeTest, CORINFO_CLASS_HANDLE type, CORINFO_CLASS_HANDLE boxType)
{
FCALL_CONTRACT;

TypeHandle typeHnd(type);
// boxable types have method tables
_ASSERTE(!typeHnd.IsTypeDesc());

MethodTable* pMT1 = typeHnd.AsMethodTable();
// must be a value type
_ASSERTE(pMT1->IsValueType());

TypeHandle boxTypeHnd(boxType);
MethodTable* pMT2 = boxTypeHnd.AsMethodTable();

// we allow enums and their primitive type to be interchangeable.
// if suspension is requested, defer to the framed helper.
if (pMT1->GetInternalCorElementType() == pMT2->GetInternalCorElementType() &&
(pMT1->IsEnum() || pMT1->IsTruePrimitive()) &&
(pMT2->IsEnum() || pMT2->IsTruePrimitive()) &&
g_TrapReturningThreads == 0)
{
return;
}

// Fall back to a framed helper that can also handle GC suspension and type equivalence.
ENDFORBIDGC();
HCCALL2(JIT_Unbox_TypeTest_Framed, pMT1, pMT2);
}
HCIMPLEND

/*************************************************************/
HCIMPL2_IV(LPVOID, JIT_GetRefAny, CORINFO_CLASS_HANDLE type, TypedByRef typedByRef)
{
Expand DownExpand Up@@ -1850,6 +1684,19 @@ HCIMPL2(BOOL, JIT_IsInstanceOfException, CORINFO_CLASS_HANDLE type, Object* obj)
}
HCIMPLEND

extern "C" void QCALLTYPE ThrowInvalidCastException(CORINFO_CLASS_HANDLE pTargetType, CORINFO_CLASS_HANDLE pSourceType)
{
QCALL_CONTRACT;

BEGIN_QCALL;

TypeHandle targetType(pTargetType);
TypeHandle sourceType(pSourceType);

COMPlusThrowInvalidCastException(sourceType, targetType);

END_QCALL;
}

//========================================================================
//
Expand Down
3 changes: 0 additions & 3 deletionssrc/coreclr/vm/jitinterface.h
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -232,9 +232,6 @@ extern "C" FCDECL2(VOID, JIT_WriteBarrierEnsureNonHeapTarget, Object **dst, Obje

extern "C" FCDECL2(Object*, ChkCastAny_NoCacheLookup, CORINFO_CLASS_HANDLE type, Object* obj);
extern "C" FCDECL2(Object*, IsInstanceOfAny_NoCacheLookup, CORINFO_CLASS_HANDLE type, Object* obj);
extern "C" FCDECL2(LPVOID, Unbox_Helper, CORINFO_CLASS_HANDLE type, Object* obj);
extern "C" FCDECL2(void, JIT_Unbox_TypeTest, CORINFO_CLASS_HANDLE type, CORINFO_CLASS_HANDLE boxType);
extern "C" FCDECL3(void, JIT_Unbox_Nullable, void * destPtr, CORINFO_CLASS_HANDLE type, Object* obj);

// ARM64 JIT_WriteBarrier uses speciall ABI and thus is not callable directly
// Copied write barriers must be called at a different location
Expand Down
1 change: 0 additions & 1 deletionsrc/coreclr/vm/methodtable.h
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -2676,7 +2676,6 @@ class MethodTable
OBJECTREF Box(void* data);
OBJECTREF FastBox(void** data);
#ifndef DACCESS_COMPILE
BOOL UnBoxInto(void *dest, OBJECTREF src);
void UnBoxIntoUnchecked(void *dest, OBJECTREF src);
#endif

Expand Down
Loading

[8]ページ先頭

©2009-2026 Movatter.jp