Skip to content

Commit 2e7de96

Browse files
AaronRobinsonMSFTpull[bot]
authored andcommitted
Remove Helper Method Frames from all StubHelpers (#106793)
* Convert GetCOMIPFromRCW * Convert AllocateInternal * Convert GetHRExceptionObject and GetCOMHRExceptionObject. * Convert MarshalToManagedVaListInternal and MarshalToUnmanagedVaListInternal. * Convert ValidateObject and ValidateByref.
1 parent 36cd2cf commit 2e7de96

File tree

8 files changed

+256
-268
lines changed

8 files changed

+256
-268
lines changed

src/coreclr/System.Private.CoreLib/src/System/StubHelpers.cs

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1353,25 +1353,26 @@ internal static void DestroyCleanupList(ref CleanupWorkListElement? pCleanupWork
13531353

13541354
internal static Exception GetHRExceptionObject(int hr)
13551355
{
1356-
Exception ex = InternalGetHRExceptionObject(hr);
1357-
ex.InternalPreserveStackTrace();
1358-
return ex;
1356+
Exception? ex = null;
1357+
GetHRExceptionObject(hr, ObjectHandleOnStack.Create(ref ex));
1358+
ex!.InternalPreserveStackTrace();
1359+
return ex!;
13591360
}
13601361

1361-
[MethodImpl(MethodImplOptions.InternalCall)]
1362-
internal static extern Exception InternalGetHRExceptionObject(int hr);
1362+
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "StubHelpers_GetHRExceptionObject")]
1363+
private static partial void GetHRExceptionObject(int hr, ObjectHandleOnStack throwable);
13631364

13641365
#if FEATURE_COMINTEROP
13651366
internal static Exception GetCOMHRExceptionObject(int hr, IntPtr pCPCMD, object pThis)
13661367
{
1367-
Exception ex = InternalGetCOMHRExceptionObject(hr, pCPCMD, pThis);
1368-
ex.InternalPreserveStackTrace();
1369-
return ex;
1368+
Exception? ex = null;
1369+
GetCOMHRExceptionObject(hr, pCPCMD, ObjectHandleOnStack.Create(ref pThis), ObjectHandleOnStack.Create(ref ex));
1370+
ex!.InternalPreserveStackTrace();
1371+
return ex!;
13701372
}
13711373

1372-
[MethodImpl(MethodImplOptions.InternalCall)]
1373-
internal static extern Exception InternalGetCOMHRExceptionObject(int hr, IntPtr pCPCMD, object? pThis);
1374-
1374+
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "StubHelpers_GetCOMHRExceptionObject")]
1375+
private static partial void GetCOMHRExceptionObject(int hr, IntPtr pCPCMD, ObjectHandleOnStack pThis, ObjectHandleOnStack throwable);
13751376
#endif // FEATURE_COMINTEROP
13761377

13771378
[ThreadStatic]
@@ -1426,7 +1427,27 @@ internal static void SafeHandleRelease(SafeHandle pHandle)
14261427

14271428
#if FEATURE_COMINTEROP
14281429
[MethodImpl(MethodImplOptions.InternalCall)]
1429-
internal static extern IntPtr GetCOMIPFromRCW(object objSrc, IntPtr pCPCMD, out IntPtr ppTarget, out bool pfNeedsRelease);
1430+
private static extern IntPtr GetCOMIPFromRCW(object objSrc, IntPtr pCPCMD, out IntPtr ppTarget);
1431+
1432+
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "StubHelpers_GetCOMIPFromRCWSlow")]
1433+
private static partial IntPtr GetCOMIPFromRCWSlow(ObjectHandleOnStack objSrc, IntPtr pCPCMD, out IntPtr ppTarget);
1434+
1435+
internal static IntPtr GetCOMIPFromRCW(object objSrc, IntPtr pCPCMD, out IntPtr ppTarget, out bool pfNeedsRelease)
1436+
{
1437+
IntPtr rcw = GetCOMIPFromRCW(objSrc, pCPCMD, out ppTarget);
1438+
if (rcw == IntPtr.Zero)
1439+
{
1440+
// If we didn't find the COM interface pointer in the cache we need to release the pointer.
1441+
pfNeedsRelease = true;
1442+
return GetCOMIPFromRCWWorker(objSrc, pCPCMD, out ppTarget);
1443+
}
1444+
pfNeedsRelease = false;
1445+
return rcw;
1446+
1447+
[MethodImpl(MethodImplOptions.NoInlining)]
1448+
static IntPtr GetCOMIPFromRCWWorker(object objSrc, IntPtr pCPCMD, out IntPtr ppTarget)
1449+
=> GetCOMIPFromRCWSlow(ObjectHandleOnStack.Create(ref objSrc), pCPCMD, out ppTarget);
1450+
}
14301451
#endif // FEATURE_COMINTEROP
14311452

14321453
#if PROFILING_SUPPORTED
@@ -1522,26 +1543,26 @@ internal static unsafe void LayoutDestroyNativeInternal(object obj, byte* pNativ
15221543
}
15231544
}
15241545

1525-
[MethodImpl(MethodImplOptions.InternalCall)]
1526-
internal static extern object AllocateInternal(IntPtr typeHandle);
1546+
[LibraryImport(RuntimeHelpers.QCall, EntryPoint="StubHelpers_MarshalToManagedVaList")]
1547+
internal static partial void MarshalToManagedVaList(IntPtr va_list, IntPtr pArgIterator);
15271548

1528-
[MethodImpl(MethodImplOptions.InternalCall)]
1529-
internal static extern void MarshalToUnmanagedVaListInternal(IntPtr va_list, uint vaListSize, IntPtr pArgIterator);
1530-
1531-
[MethodImpl(MethodImplOptions.InternalCall)]
1532-
internal static extern void MarshalToManagedVaListInternal(IntPtr va_list, IntPtr pArgIterator);
1549+
[LibraryImport(RuntimeHelpers.QCall, EntryPoint="StubHelpers_MarshalToUnmanagedVaList")]
1550+
internal static partial void MarshalToUnmanagedVaList(IntPtr va_list, uint vaListSize, IntPtr pArgIterator);
15331551

15341552
[MethodImpl(MethodImplOptions.InternalCall)]
15351553
internal static extern uint CalcVaListSize(IntPtr va_list);
15361554

1537-
[MethodImpl(MethodImplOptions.InternalCall)]
1538-
internal static extern void ValidateObject(object obj, IntPtr pMD, object pThis);
1539-
15401555
[MethodImpl(MethodImplOptions.InternalCall)]
15411556
internal static extern void LogPinnedArgument(IntPtr localDesc, IntPtr nativeArg);
15421557

1543-
[MethodImpl(MethodImplOptions.InternalCall)]
1544-
internal static extern void ValidateByref(IntPtr byref, IntPtr pMD, object pThis); // the byref is pinned so we can safely "cast" it to IntPtr
1558+
[LibraryImport(RuntimeHelpers.QCall, EntryPoint="StubHelpers_ValidateObject")]
1559+
private static partial void ValidateObject(ObjectHandleOnStack obj, IntPtr pMD);
1560+
1561+
internal static void ValidateObject(object obj, IntPtr pMD)
1562+
=> ValidateObject(ObjectHandleOnStack.Create(ref obj), pMD);
1563+
1564+
[LibraryImport(RuntimeHelpers.QCall, EntryPoint="StubHelpers_ValidateByref")]
1565+
internal static partial void ValidateByref(IntPtr byref, IntPtr pMD); // the byref is pinned so we can safely "cast" it to IntPtr
15451566

15461567
[Intrinsic]
15471568
[MethodImpl(MethodImplOptions.InternalCall)]

src/coreclr/vm/corelib.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -940,9 +940,8 @@ DEFINE_METHOD(STUBHELPERS, CHECK_STRING_LENGTH, CheckStringLength,
940940
DEFINE_METHOD(STUBHELPERS, FMT_CLASS_UPDATE_NATIVE_INTERNAL, FmtClassUpdateNativeInternal, SM_Obj_PtrByte_RefCleanupWorkListElement_RetVoid)
941941
DEFINE_METHOD(STUBHELPERS, FMT_CLASS_UPDATE_CLR_INTERNAL, FmtClassUpdateCLRInternal, SM_Obj_PtrByte_RetVoid)
942942
DEFINE_METHOD(STUBHELPERS, LAYOUT_DESTROY_NATIVE_INTERNAL, LayoutDestroyNativeInternal, SM_Obj_PtrByte_RetVoid)
943-
DEFINE_METHOD(STUBHELPERS, ALLOCATE_INTERNAL, AllocateInternal, SM_IntPtr_RetObj)
944-
DEFINE_METHOD(STUBHELPERS, MARSHAL_TO_MANAGED_VA_LIST_INTERNAL,MarshalToManagedVaListInternal, SM_IntPtr_IntPtr_RetVoid)
945-
DEFINE_METHOD(STUBHELPERS, MARSHAL_TO_UNMANAGED_VA_LIST_INTERNAL,MarshalToUnmanagedVaListInternal,SM_IntPtr_UInt_IntPtr_RetVoid)
943+
DEFINE_METHOD(STUBHELPERS, MARSHAL_TO_MANAGED_VA_LIST, MarshalToManagedVaList, SM_IntPtr_IntPtr_RetVoid)
944+
DEFINE_METHOD(STUBHELPERS, MARSHAL_TO_UNMANAGED_VA_LIST, MarshalToUnmanagedVaList, SM_IntPtr_UInt_IntPtr_RetVoid)
946945
DEFINE_METHOD(STUBHELPERS, CALC_VA_LIST_SIZE, CalcVaListSize, SM_IntPtr_RetUInt)
947946
DEFINE_METHOD(STUBHELPERS, VALIDATE_OBJECT, ValidateObject, SM_Obj_IntPtr_Obj_RetVoid)
948947
DEFINE_METHOD(STUBHELPERS, VALIDATE_BYREF, ValidateByref, SM_IntPtr_IntPtr_Obj_RetVoid)

src/coreclr/vm/dllimport.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2277,30 +2277,28 @@ void NDirectStubLinker::EmitValidateLocal(ILCodeStream* pcsEmit, DWORD dwLocalNu
22772277

22782278
if (SF_IsDelegateStub(dwStubFlags))
22792279
{
2280-
pcsEmit->EmitLoadNullPtr();
22812280
pcsEmit->EmitLoadThis();
2281+
pcsEmit->EmitCALL(METHOD__DELEGATE__GET_INVOKE_METHOD, 1, 1);
22822282
}
22832283
else if (SF_IsCALLIStub(dwStubFlags))
22842284
{
22852285
pcsEmit->EmitLoadNullPtr();
2286-
pcsEmit->EmitLDNULL();
22872286
}
22882287
else
22892288
{
22902289
// P/Invoke, CLR->COM
22912290
EmitLoadStubContext(pcsEmit, dwStubFlags);
2292-
pcsEmit->EmitLDNULL();
22932291
}
22942292

22952293
if (fIsByref)
22962294
{
2297-
// StubHelpers.ValidateByref(byref, pMD, pThis)
2298-
pcsEmit->EmitCALL(METHOD__STUBHELPERS__VALIDATE_BYREF, 3, 0);
2295+
// StubHelpers.ValidateByref(byref, pMD)
2296+
pcsEmit->EmitCALL(METHOD__STUBHELPERS__VALIDATE_BYREF, 2, 0);
22992297
}
23002298
else
23012299
{
2302-
// StubHelpers.ValidateObject(obj, pMD, pThis)
2303-
pcsEmit->EmitCALL(METHOD__STUBHELPERS__VALIDATE_OBJECT, 3, 0);
2300+
// StubHelpers.ValidateObject(obj, pMD)
2301+
pcsEmit->EmitCALL(METHOD__STUBHELPERS__VALIDATE_OBJECT, 2, 0);
23042302
}
23052303
}
23062304

src/coreclr/vm/ecalllist.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -447,17 +447,10 @@ FCFuncStart(gStubHelperFuncs)
447447
FCFuncElement("TryGetStringTrailByte", StubHelpers::TryGetStringTrailByte)
448448
FCFuncElement("SetLastError", StubHelpers::SetLastError)
449449
FCFuncElement("ClearLastError", StubHelpers::ClearLastError)
450-
FCFuncElement("InternalGetHRExceptionObject", StubHelpers::GetHRExceptionObject)
451450
#ifdef FEATURE_COMINTEROP
452-
FCFuncElement("InternalGetCOMHRExceptionObject", StubHelpers::GetCOMHRExceptionObject)
453451
FCFuncElement("GetCOMIPFromRCW", StubHelpers::GetCOMIPFromRCW)
454452
#endif // FEATURE_COMINTEROP
455-
FCFuncElement("AllocateInternal", StubHelpers::AllocateInternal)
456-
FCFuncElement("MarshalToUnmanagedVaListInternal", StubHelpers::MarshalToUnmanagedVaListInternal)
457-
FCFuncElement("MarshalToManagedVaListInternal", StubHelpers::MarshalToManagedVaListInternal)
458453
FCFuncElement("CalcVaListSize", StubHelpers::CalcVaListSize)
459-
FCFuncElement("ValidateObject", StubHelpers::ValidateObject)
460-
FCFuncElement("ValidateByref", StubHelpers::ValidateByref)
461454
FCFuncElement("LogPinnedArgument", StubHelpers::LogPinnedArgument)
462455
FCFuncElement("GetStubContext", StubHelpers::GetStubContext)
463456
FCFuncElement("MulticastDebuggerTraceHelper", StubHelpers::MulticastDebuggerTraceHelper)

src/coreclr/vm/ilmarshalers.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2233,9 +2233,10 @@ void ILLayoutClassPtrMarshalerBase::EmitConvertSpaceNativeToCLR(ILCodeStream* ps
22332233
pslILEmit->EmitBRFALSE(pNullRefLabel);
22342234

22352235
pslILEmit->EmitLDTOKEN(pslILEmit->GetToken(m_pargs->m_pMT));
2236-
pslILEmit->EmitCALL(METHOD__RT_TYPE_HANDLE__TO_INTPTR, 1, 1);
2237-
// static object AllocateInternal(IntPtr typeHandle);
2238-
pslILEmit->EmitCALL(METHOD__STUBHELPERS__ALLOCATE_INTERNAL, 1, 1);
2236+
// static Type Type.GetTypeFromHandle(RuntimeTypeHandle handle)
2237+
pslILEmit->EmitCALL(METHOD__TYPE__GET_TYPE_FROM_HANDLE, 1, 1);
2238+
// static object RuntimeHelpers.GetUninitializedObject(Type type)
2239+
pslILEmit->EmitCALL(METHOD__RUNTIME_HELPERS__GET_UNINITIALIZED_OBJECT, 1, 1);
22392240
EmitStoreManagedValue(pslILEmit);
22402241
pslILEmit->EmitLabel(pNullRefLabel);
22412242
}
@@ -3522,11 +3523,11 @@ void ILArgIteratorMarshaler::EmitConvertSpaceAndContentsCLRToNative(ILCodeStream
35223523
pslILEmit->EmitLOCALLOC();
35233524
EmitStoreNativeValue(pslILEmit);
35243525

3525-
// void MarshalToUnmanagedVaListInternal(va_list, uint vaListSize, VARARGS* data)
3526+
// void MarshalToUnmanagedVaList(va_list, uint vaListSize, VARARGS* data)
35263527
EmitLoadNativeValue(pslILEmit);
35273528
pslILEmit->EmitLDLOC(dwVaListSizeLocal);
35283529
EmitLoadManagedHomeAddr(pslILEmit);
3529-
pslILEmit->EmitCALL(METHOD__STUBHELPERS__MARSHAL_TO_UNMANAGED_VA_LIST_INTERNAL, 3, 0);
3530+
pslILEmit->EmitCALL(METHOD__STUBHELPERS__MARSHAL_TO_UNMANAGED_VA_LIST, 3, 0);
35303531
}
35313532

35323533
void ILArgIteratorMarshaler::EmitConvertContentsNativeToCLR(ILCodeStream* pslILEmit)
@@ -3535,7 +3536,7 @@ void ILArgIteratorMarshaler::EmitConvertContentsNativeToCLR(ILCodeStream* pslILE
35353536
EmitLoadManagedHomeAddr(pslILEmit);
35363537

35373538
// void MarshalToManagedVaList(va_list va, VARARGS *dataout)
3538-
pslILEmit->EmitCALL(METHOD__STUBHELPERS__MARSHAL_TO_MANAGED_VA_LIST_INTERNAL, 2, 0);
3539+
pslILEmit->EmitCALL(METHOD__STUBHELPERS__MARSHAL_TO_MANAGED_VA_LIST, 2, 0);
35393540
}
35403541

35413542
LocalDesc ILArrayWithOffsetMarshaler::GetNativeType()

src/coreclr/vm/qcallentrypoints.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,11 +425,18 @@ static const Entry s_QCall[] =
425425
DllImportEntry(StubHelpers_CreateCustomMarshalerHelper)
426426
DllImportEntry(StubHelpers_SetStringTrailByte)
427427
DllImportEntry(StubHelpers_ThrowInteropParamException)
428+
DllImportEntry(StubHelpers_MarshalToManagedVaList)
429+
DllImportEntry(StubHelpers_MarshalToUnmanagedVaList)
430+
DllImportEntry(StubHelpers_ValidateObject)
431+
DllImportEntry(StubHelpers_ValidateByref)
428432
#ifdef PROFILING_SUPPORTED
429433
DllImportEntry(StubHelpers_ProfilerBeginTransitionCallback)
430434
DllImportEntry(StubHelpers_ProfilerEndTransitionCallback)
431435
#endif
436+
DllImportEntry(StubHelpers_GetHRExceptionObject)
432437
#if defined(FEATURE_COMINTEROP)
438+
DllImportEntry(StubHelpers_GetCOMHRExceptionObject)
439+
DllImportEntry(StubHelpers_GetCOMIPFromRCWSlow)
433440
DllImportEntry(ObjectMarshaler_ConvertToNative)
434441
DllImportEntry(ObjectMarshaler_ConvertToManaged)
435442
DllImportEntry(InterfaceMarshaler_ConvertToNative)

0 commit comments

Comments
 (0)