@@ -1225,7 +1225,7 @@ HCIMPLEND
1225
1225
1226
1226
/* ************************************************************/
1227
1227
1228
- #if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1228
+ #if defined(TARGET_X86)
1229
1229
EXTERN_C FCDECL1 (void , IL_Throw, Object* obj);
1230
1230
EXTERN_C HCIMPL2 (void , IL_Throw_x86, Object* obj, TransitionBlock* transitionBlock)
1231
1231
#else
@@ -1241,8 +1241,6 @@ HCIMPL1(void, IL_Throw, Object* obj)
1241
1241
1242
1242
OBJECTREF oref = ObjectToOBJECTREF (obj);
1243
1243
1244
- #ifdef FEATURE_EH_FUNCLETS
1245
-
1246
1244
Thread *pThread = GetThread ();
1247
1245
1248
1246
SoftwareExceptionFrame exceptionFrame;
@@ -1255,6 +1253,7 @@ HCIMPL1(void, IL_Throw, Object* obj)
1255
1253
1256
1254
FC_CAN_TRIGGER_GC ();
1257
1255
1256
+ #ifdef FEATURE_EH_FUNCLETS
1258
1257
if (oref == 0 )
1259
1258
DispatchManagedException (kNullReferenceException );
1260
1259
else
@@ -1282,15 +1281,12 @@ HCIMPL1(void, IL_Throw, Object* obj)
1282
1281
}
1283
1282
1284
1283
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;
1290
1287
1291
1288
#if defined(_DEBUG) && defined(TARGET_X86)
1292
- __helperframe.EnsureInit (NULL );
1293
- g_ExceptionEIP = (LPVOID)__helperframe.GetReturnAddress ();
1289
+ g_ExceptionEIP = (PVOID)transitionBlock->m_ReturnAddress ;
1294
1290
#endif // defined(_DEBUG) && defined(TARGET_X86)
1295
1291
1296
1292
if (oref == 0 )
@@ -1321,13 +1317,20 @@ HCIMPL1(void, IL_Throw, Object* obj)
1321
1317
1322
1318
RaiseTheExceptionInternalOnly (oref, FALSE );
1323
1319
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 ();
1325
1328
}
1326
1329
HCIMPLEND
1327
1330
1328
1331
/* ************************************************************/
1329
1332
1330
- #if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1333
+ #if defined(TARGET_X86)
1331
1334
EXTERN_C FCDECL0 (void , IL_Rethrow);
1332
1335
EXTERN_C HCIMPL1 (void , IL_Rethrow_x86, TransitionBlock* transitionBlock)
1333
1336
#else
@@ -1338,7 +1341,6 @@ HCIMPL0(void, IL_Rethrow)
1338
1341
1339
1342
FC_GC_POLL_NOT_NEEDED (); // throws always open up for GC
1340
1343
1341
- #ifdef FEATURE_EH_FUNCLETS
1342
1344
Thread *pThread = GetThread ();
1343
1345
1344
1346
SoftwareExceptionFrame exceptionFrame;
@@ -1349,12 +1351,13 @@ HCIMPL0(void, IL_Rethrow)
1349
1351
#endif
1350
1352
exceptionFrame.InitAndLink (pThread);
1351
1353
1354
+ FC_CAN_TRIGGER_GC ();
1355
+
1356
+ #ifdef FEATURE_EH_FUNCLETS
1352
1357
ExInfo *pActiveExInfo = (ExInfo*)pThread->GetExceptionState ()->GetCurrentExceptionTracker ();
1353
1358
1354
1359
ExInfo exInfo (pThread, pActiveExInfo->m_ptrs .ExceptionRecord , exceptionFrame.GetContext (), ExKind::None);
1355
1360
1356
- FC_CAN_TRIGGER_GC ();
1357
-
1358
1361
GCPROTECT_BEGIN (exInfo.m_exception );
1359
1362
PREPARE_NONVIRTUAL_CALLSITE (METHOD__EH__RH_RETHROW);
1360
1363
DECLARE_ARGHOLDER_ARRAY (args, 2 );
@@ -1367,12 +1370,9 @@ HCIMPL0(void, IL_Rethrow)
1367
1370
// Ex.RhRethrow(ref ExInfo activeExInfo, ref ExInfo exInfo)
1368
1371
CALL_MANAGED_METHOD_NORET (args)
1369
1372
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;
1376
1376
1377
1377
OBJECTREF throwable = GetThread ()->GetThrowable ();
1378
1378
if (throwable != NULL )
@@ -1386,11 +1386,18 @@ HCIMPL0(void, IL_Rethrow)
1386
1386
RealCOMPlusThrow (kInvalidProgramException , (UINT)IDS_EE_RETHROW_NOT_ALLOWED);
1387
1387
}
1388
1388
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 ();
1390
1397
}
1391
1398
HCIMPLEND
1392
1399
1393
- #if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1400
+ #if defined(TARGET_X86)
1394
1401
EXTERN_C FCDECL1 (void , IL_ThrowExact, Object* obj);
1395
1402
EXTERN_C HCIMPL2 (void , IL_ThrowExact_x86, Object* obj, TransitionBlock* transitionBlock)
1396
1403
#else
@@ -1407,7 +1414,6 @@ HCIMPL1(void, IL_ThrowExact, Object* obj)
1407
1414
OBJECTREF oref = ObjectToOBJECTREF (obj);
1408
1415
GetThread ()->GetExceptionState ()->SetRaisingForeignException ();
1409
1416
1410
- #ifdef FEATURE_EH_FUNCLETS
1411
1417
Thread *pThread = GetThread ();
1412
1418
1413
1419
SoftwareExceptionFrame exceptionFrame;
@@ -1419,19 +1425,27 @@ HCIMPL1(void, IL_ThrowExact, Object* obj)
1419
1425
exceptionFrame.InitAndLink (pThread);
1420
1426
1421
1427
FC_CAN_TRIGGER_GC ();
1428
+
1429
+ #ifdef FEATURE_EH_FUNCLETS
1422
1430
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
+
1427
1435
#if defined(_DEBUG) && defined(TARGET_X86)
1428
- __helperframe.EnsureInit (NULL );
1429
- g_ExceptionEIP = (LPVOID)__helperframe.GetReturnAddress ();
1436
+ g_ExceptionEIP = (PVOID)transitionBlock->m_ReturnAddress ;
1430
1437
#endif // defined(_DEBUG) && defined(TARGET_X86)
1431
1438
1432
1439
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 ();
1435
1449
}
1436
1450
HCIMPLEND
1437
1451
0 commit comments