@@ -1320,11 +1320,11 @@ HCIMPLEND
13201320
13211321/* ************************************************************/
13221322
1323- #if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1323+ #if defined(TARGET_X86)
13241324EXTERN_C FCDECL1 (void , IL_Throw, Object* obj);
1325- EXTERN_C HCIMPL2 (void , IL_Throw_x86, Object* obj, TransitionBlock* transitionBlock)
1325+ EXTERN_C FCIMPL2 (void , IL_Throw_x86, Object* obj, TransitionBlock* transitionBlock)
13261326#else
1327- HCIMPL1 (void , IL_Throw, Object* obj)
1327+ FCIMPL1 (void , IL_Throw, Object* obj)
13281328#endif
13291329{
13301330 FCALL_CONTRACT;
@@ -1336,8 +1336,6 @@ HCIMPL1(void, IL_Throw, Object* obj)
13361336
13371337 OBJECTREF oref = ObjectToOBJECTREF (obj);
13381338
1339- #ifdef FEATURE_EH_FUNCLETS
1340-
13411339 Thread *pThread = GetThread ();
13421340
13431341 SoftwareExceptionFrame exceptionFrame;
@@ -1350,6 +1348,7 @@ HCIMPL1(void, IL_Throw, Object* obj)
13501348
13511349 FC_CAN_TRIGGER_GC ();
13521350
1351+ #ifdef FEATURE_EH_FUNCLETS
13531352 if (oref == 0 )
13541353 DispatchManagedException (kNullReferenceException );
13551354 else
@@ -1377,15 +1376,12 @@ HCIMPL1(void, IL_Throw, Object* obj)
13771376 }
13781377
13791378 DispatchManagedException (oref, exceptionFrame.GetContext ());
1380- FC_CAN_TRIGGER_GC_END ();
1381- UNREACHABLE ();
1382- #endif // FEATURE_EH_FUNCLETS
1383-
1384- HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL (Frame::FRAME_ATTR_EXCEPTION); // Set up a frame
1379+ #else // FEATURE_EH_FUNCLETS
1380+ INSTALL_MANAGED_EXCEPTION_DISPATCHER;
1381+ INSTALL_UNWIND_AND_CONTINUE_HANDLER;
13851382
13861383#if defined(_DEBUG) && defined(TARGET_X86)
1387- __helperframe.EnsureInit (NULL );
1388- g_ExceptionEIP = (LPVOID)__helperframe.GetReturnAddress ();
1384+ g_ExceptionEIP = transitionBlock->m_ReturnAddress ;
13891385#endif // defined(_DEBUG) && defined(TARGET_X86)
13901386
13911387 if (oref == 0 )
@@ -1416,24 +1412,28 @@ HCIMPL1(void, IL_Throw, Object* obj)
14161412
14171413 RaiseTheExceptionInternalOnly (oref, FALSE );
14181414
1419- HELPER_METHOD_FRAME_END ();
1415+ UNINSTALL_UNWIND_AND_CONTINUE_HANDLER;
1416+ UNINSTALL_MANAGED_EXCEPTION_DISPATCHER;
1417+ #endif // FEATURE_EH_FUNCLETS
1418+
1419+ FC_CAN_TRIGGER_GC_END ();
1420+ UNREACHABLE ();
14201421}
1421- HCIMPLEND
1422+ FCIMPLEND
14221423
14231424/* ************************************************************/
14241425
1425- #if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1426+ #if defined(TARGET_X86)
14261427EXTERN_C FCDECL0 (void , IL_Rethrow);
1427- EXTERN_C HCIMPL1 (void , IL_Rethrow_x86, TransitionBlock* transitionBlock)
1428+ EXTERN_C FCIMPL1 (void , IL_Rethrow_x86, TransitionBlock* transitionBlock)
14281429#else
1429- HCIMPL0 (void , IL_Rethrow)
1430+ FCIMPL0 (void , IL_Rethrow)
14301431#endif
14311432{
14321433 FCALL_CONTRACT;
14331434
14341435 FC_GC_POLL_NOT_NEEDED (); // throws always open up for GC
14351436
1436- #ifdef FEATURE_EH_FUNCLETS
14371437 Thread *pThread = GetThread ();
14381438
14391439 SoftwareExceptionFrame exceptionFrame;
@@ -1444,12 +1444,13 @@ HCIMPL0(void, IL_Rethrow)
14441444#endif
14451445 exceptionFrame.InitAndLink (pThread);
14461446
1447+ FC_CAN_TRIGGER_GC ();
1448+
1449+ #ifdef FEATURE_EH_FUNCLETS
14471450 ExInfo *pActiveExInfo = (ExInfo*)pThread->GetExceptionState ()->GetCurrentExceptionTracker ();
14481451
14491452 ExInfo exInfo (pThread, pActiveExInfo->m_ptrs .ExceptionRecord , exceptionFrame.GetContext (), ExKind::None);
14501453
1451- FC_CAN_TRIGGER_GC ();
1452-
14531454 GCPROTECT_BEGIN (exInfo.m_exception );
14541455 PREPARE_NONVIRTUAL_CALLSITE (METHOD__EH__RH_RETHROW);
14551456 DECLARE_ARGHOLDER_ARRAY (args, 2 );
@@ -1462,12 +1463,9 @@ HCIMPL0(void, IL_Rethrow)
14621463 // Ex.RhRethrow(ref ExInfo activeExInfo, ref ExInfo exInfo)
14631464 CALL_MANAGED_METHOD_NORET (args)
14641465 GCPROTECT_END ();
1465-
1466- FC_CAN_TRIGGER_GC_END ();
1467- UNREACHABLE ();
1468- #endif
1469-
1470- HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL (Frame::FRAME_ATTR_EXCEPTION); // Set up a frame
1466+ #else // FEATURE_EH_FUNCLETS
1467+ INSTALL_MANAGED_EXCEPTION_DISPATCHER;
1468+ INSTALL_UNWIND_AND_CONTINUE_HANDLER;
14711469
14721470 OBJECTREF throwable = GetThread ()->GetThrowable ();
14731471 if (throwable != NULL )
@@ -1481,15 +1479,20 @@ HCIMPL0(void, IL_Rethrow)
14811479 RealCOMPlusThrow (kInvalidProgramException , (UINT)IDS_EE_RETHROW_NOT_ALLOWED);
14821480 }
14831481
1484- HELPER_METHOD_FRAME_END ();
1482+ UNINSTALL_UNWIND_AND_CONTINUE_HANDLER;
1483+ UNINSTALL_MANAGED_EXCEPTION_DISPATCHER;
1484+ #endif // FEATURE_EH_FUNCLETS
1485+
1486+ FC_CAN_TRIGGER_GC_END ();
1487+ UNREACHABLE ();
14851488}
1486- HCIMPLEND
1489+ FCIMPLEND
14871490
1488- #if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1491+ #if defined(TARGET_X86)
14891492EXTERN_C FCDECL1 (void , IL_ThrowExact, Object* obj);
1490- EXTERN_C HCIMPL2 (void , IL_ThrowExact_x86, Object* obj, TransitionBlock* transitionBlock)
1493+ EXTERN_C FCIMPL2 (void , IL_ThrowExact_x86, Object* obj, TransitionBlock* transitionBlock)
14911494#else
1492- HCIMPL1 (void , IL_ThrowExact, Object* obj)
1495+ FCIMPL1 (void , IL_ThrowExact, Object* obj)
14931496#endif
14941497{
14951498 FCALL_CONTRACT;
@@ -1502,7 +1505,6 @@ HCIMPL1(void, IL_ThrowExact, Object* obj)
15021505 OBJECTREF oref = ObjectToOBJECTREF (obj);
15031506 GetThread ()->GetExceptionState ()->SetRaisingForeignException ();
15041507
1505- #ifdef FEATURE_EH_FUNCLETS
15061508 Thread *pThread = GetThread ();
15071509
15081510 SoftwareExceptionFrame exceptionFrame;
@@ -1514,21 +1516,27 @@ HCIMPL1(void, IL_ThrowExact, Object* obj)
15141516 exceptionFrame.InitAndLink (pThread);
15151517
15161518 FC_CAN_TRIGGER_GC ();
1519+
1520+ #ifdef FEATURE_EH_FUNCLETS
15171521 DispatchManagedException (oref, exceptionFrame.GetContext ());
1518- FC_CAN_TRIGGER_GC_END ();
1519- UNREACHABLE () ;
1520- # else
1521- HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL (Frame::FRAME_ATTR_EXCEPTION); // Set up a frame
1522+ # else // FEATURE_EH_FUNCLETS
1523+ INSTALL_MANAGED_EXCEPTION_DISPATCHER ;
1524+ INSTALL_UNWIND_AND_CONTINUE_HANDLER;
1525+
15221526#if defined(_DEBUG) && defined(TARGET_X86)
1523- __helperframe.EnsureInit (NULL );
1524- g_ExceptionEIP = (LPVOID)__helperframe.GetReturnAddress ();
1527+ g_ExceptionEIP = transitionBlock->m_ReturnAddress ;
15251528#endif // defined(_DEBUG) && defined(TARGET_X86)
15261529
15271530 RaiseTheExceptionInternalOnly (oref, FALSE );
1528- HELPER_METHOD_FRAME_END ();
1529- #endif
1531+
1532+ UNINSTALL_UNWIND_AND_CONTINUE_HANDLER;
1533+ UNINSTALL_MANAGED_EXCEPTION_DISPATCHER;
1534+ #endif // FEATURE_EH_FUNCLETS
1535+
1536+ FC_CAN_TRIGGER_GC_END ();
1537+ UNREACHABLE ();
15301538}
1531- HCIMPLEND
1539+ FCIMPLEND
15321540
15331541#ifndef STATUS_STACK_BUFFER_OVERRUN // Not defined yet in CESDK includes
15341542# define STATUS_STACK_BUFFER_OVERRUN ((NTSTATUS)0xC0000409L )
0 commit comments