@@ -1225,7 +1225,7 @@ HCIMPLEND
12251225
12261226/* ************************************************************/
12271227
1228- #if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1228+ #if defined(TARGET_X86)
12291229EXTERN_C FCDECL1 (void , IL_Throw, Object* obj);
12301230EXTERN_C HCIMPL2 (void , IL_Throw_x86, Object* obj, TransitionBlock* transitionBlock)
12311231#else
@@ -1241,8 +1241,6 @@ HCIMPL1(void, IL_Throw, Object* obj)
12411241
12421242 OBJECTREF oref = ObjectToOBJECTREF (obj);
12431243
1244- #ifdef FEATURE_EH_FUNCLETS
1245-
12461244 Thread *pThread = GetThread ();
12471245
12481246 SoftwareExceptionFrame exceptionFrame;
@@ -1255,6 +1253,7 @@ HCIMPL1(void, IL_Throw, Object* obj)
12551253
12561254 FC_CAN_TRIGGER_GC ();
12571255
1256+ #ifdef FEATURE_EH_FUNCLETS
12581257 if (oref == 0 )
12591258 DispatchManagedException (kNullReferenceException );
12601259 else
@@ -1282,15 +1281,12 @@ HCIMPL1(void, IL_Throw, Object* obj)
12821281 }
12831282
12841283 DispatchManagedException (oref, exceptionFrame.GetContext ());
1285- FC_CAN_TRIGGER_GC_END ();
1286- UNREACHABLE ();
1287- #endif // FEATURE_EH_FUNCLETS
1288-
1289- HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL (Frame::FRAME_ATTR_EXCEPTION); // Set up a frame
1284+ #elif defined(TARGET_X86)
1285+ INSTALL_MANAGED_EXCEPTION_DISPATCHER;
1286+ INSTALL_UNWIND_AND_CONTINUE_HANDLER;
12901287
12911288#if defined(_DEBUG) && defined(TARGET_X86)
1292- __helperframe.EnsureInit (NULL );
1293- g_ExceptionEIP = (LPVOID)__helperframe.GetReturnAddress ();
1289+ g_ExceptionEIP = (PVOID)transitionBlock->m_ReturnAddress ;
12941290#endif // defined(_DEBUG) && defined(TARGET_X86)
12951291
12961292 if (oref == 0 )
@@ -1321,13 +1317,20 @@ HCIMPL1(void, IL_Throw, Object* obj)
13211317
13221318 RaiseTheExceptionInternalOnly (oref, FALSE );
13231319
1324- HELPER_METHOD_FRAME_END ();
1320+ UNINSTALL_UNWIND_AND_CONTINUE_HANDLER;
1321+ UNINSTALL_MANAGED_EXCEPTION_DISPATCHER;
1322+ #else // FEATURE_EH_FUNCLETS
1323+ PORTABILITY_ASSERT (" IL_Throw" );
1324+ #endif // FEATURE_EH_FUNCLETS
1325+
1326+ FC_CAN_TRIGGER_GC_END ();
1327+ UNREACHABLE ();
13251328}
13261329HCIMPLEND
13271330
13281331/* ************************************************************/
13291332
1330- #if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1333+ #if defined(TARGET_X86)
13311334EXTERN_C FCDECL0 (void , IL_Rethrow);
13321335EXTERN_C HCIMPL1 (void , IL_Rethrow_x86, TransitionBlock* transitionBlock)
13331336#else
@@ -1338,7 +1341,6 @@ HCIMPL0(void, IL_Rethrow)
13381341
13391342 FC_GC_POLL_NOT_NEEDED (); // throws always open up for GC
13401343
1341- #ifdef FEATURE_EH_FUNCLETS
13421344 Thread *pThread = GetThread ();
13431345
13441346 SoftwareExceptionFrame exceptionFrame;
@@ -1349,12 +1351,13 @@ HCIMPL0(void, IL_Rethrow)
13491351#endif
13501352 exceptionFrame.InitAndLink (pThread);
13511353
1354+ FC_CAN_TRIGGER_GC ();
1355+
1356+ #ifdef FEATURE_EH_FUNCLETS
13521357 ExInfo *pActiveExInfo = (ExInfo*)pThread->GetExceptionState ()->GetCurrentExceptionTracker ();
13531358
13541359 ExInfo exInfo (pThread, pActiveExInfo->m_ptrs .ExceptionRecord , exceptionFrame.GetContext (), ExKind::None);
13551360
1356- FC_CAN_TRIGGER_GC ();
1357-
13581361 GCPROTECT_BEGIN (exInfo.m_exception );
13591362 PREPARE_NONVIRTUAL_CALLSITE (METHOD__EH__RH_RETHROW);
13601363 DECLARE_ARGHOLDER_ARRAY (args, 2 );
@@ -1367,12 +1370,9 @@ HCIMPL0(void, IL_Rethrow)
13671370 // Ex.RhRethrow(ref ExInfo activeExInfo, ref ExInfo exInfo)
13681371 CALL_MANAGED_METHOD_NORET (args)
13691372 GCPROTECT_END ();
1370-
1371- FC_CAN_TRIGGER_GC_END ();
1372- UNREACHABLE ();
1373- #endif
1374-
1375- HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL (Frame::FRAME_ATTR_EXCEPTION); // Set up a frame
1373+ #elif defined(TARGET_X86)
1374+ INSTALL_MANAGED_EXCEPTION_DISPATCHER;
1375+ INSTALL_UNWIND_AND_CONTINUE_HANDLER;
13761376
13771377 OBJECTREF throwable = GetThread ()->GetThrowable ();
13781378 if (throwable != NULL )
@@ -1386,11 +1386,18 @@ HCIMPL0(void, IL_Rethrow)
13861386 RealCOMPlusThrow (kInvalidProgramException , (UINT)IDS_EE_RETHROW_NOT_ALLOWED);
13871387 }
13881388
1389- HELPER_METHOD_FRAME_END ();
1389+ UNINSTALL_UNWIND_AND_CONTINUE_HANDLER;
1390+ UNINSTALL_MANAGED_EXCEPTION_DISPATCHER;
1391+ #else // FEATURE_EH_FUNCLETS
1392+ PORTABILITY_ASSERT (" IL_Rethrow" );
1393+ #endif // FEATURE_EH_FUNCLETS
1394+
1395+ FC_CAN_TRIGGER_GC_END ();
1396+ UNREACHABLE ();
13901397}
13911398HCIMPLEND
13921399
1393- #if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1400+ #if defined(TARGET_X86)
13941401EXTERN_C FCDECL1 (void , IL_ThrowExact, Object* obj);
13951402EXTERN_C HCIMPL2 (void , IL_ThrowExact_x86, Object* obj, TransitionBlock* transitionBlock)
13961403#else
@@ -1407,7 +1414,6 @@ HCIMPL1(void, IL_ThrowExact, Object* obj)
14071414 OBJECTREF oref = ObjectToOBJECTREF (obj);
14081415 GetThread ()->GetExceptionState ()->SetRaisingForeignException ();
14091416
1410- #ifdef FEATURE_EH_FUNCLETS
14111417 Thread *pThread = GetThread ();
14121418
14131419 SoftwareExceptionFrame exceptionFrame;
@@ -1419,19 +1425,27 @@ HCIMPL1(void, IL_ThrowExact, Object* obj)
14191425 exceptionFrame.InitAndLink (pThread);
14201426
14211427 FC_CAN_TRIGGER_GC ();
1428+
1429+ #ifdef FEATURE_EH_FUNCLETS
14221430 DispatchManagedException (oref, exceptionFrame.GetContext ());
1423- FC_CAN_TRIGGER_GC_END ();
1424- UNREACHABLE () ;
1425- # else
1426- HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL (Frame::FRAME_ATTR_EXCEPTION); // Set up a frame
1431+ # elif defined(TARGET_X86)
1432+ INSTALL_MANAGED_EXCEPTION_DISPATCHER ;
1433+ INSTALL_UNWIND_AND_CONTINUE_HANDLER;
1434+
14271435#if defined(_DEBUG) && defined(TARGET_X86)
1428- __helperframe.EnsureInit (NULL );
1429- g_ExceptionEIP = (LPVOID)__helperframe.GetReturnAddress ();
1436+ g_ExceptionEIP = (PVOID)transitionBlock->m_ReturnAddress ;
14301437#endif // defined(_DEBUG) && defined(TARGET_X86)
14311438
14321439 RaiseTheExceptionInternalOnly (oref, FALSE );
1433- HELPER_METHOD_FRAME_END ();
1434- #endif
1440+
1441+ UNINSTALL_UNWIND_AND_CONTINUE_HANDLER;
1442+ UNINSTALL_MANAGED_EXCEPTION_DISPATCHER;
1443+ #else // FEATURE_EH_FUNCLETS
1444+ PORTABILITY_ASSERT (" IL_ThrowExact" );
1445+ #endif // FEATURE_EH_FUNCLETS
1446+
1447+ FC_CAN_TRIGGER_GC_END ();
1448+ UNREACHABLE ();
14351449}
14361450HCIMPLEND
14371451
0 commit comments