@@ -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) ]
0 commit comments