@@ -135,7 +135,7 @@ cfg_if::cfg_if! {
135
135
EHAction :: None | EHAction :: Cleanup ( _) => {
136
136
return continue_unwind( exception_object, context) ;
137
137
}
138
- EHAction :: Catch ( _) => {
138
+ EHAction :: Catch ( _) | EHAction :: Filter ( _ ) => {
139
139
// EHABI requires the personality routine to update the
140
140
// SP value in the barrier cache of the exception object.
141
141
( * exception_object) . private[ 5 ] =
@@ -147,7 +147,8 @@ cfg_if::cfg_if! {
147
147
} else {
148
148
match eh_action {
149
149
EHAction :: None => return continue_unwind( exception_object, context) ,
150
- EHAction :: Cleanup ( lpad) | EHAction :: Catch ( lpad) => {
150
+ EHAction :: Filter ( _) if state & uw:: _US_FORCE_UNWIND as c_int != 0 => return continue_unwind( exception_object, context) ,
151
+ EHAction :: Cleanup ( lpad) | EHAction :: Catch ( lpad) | EHAction :: Filter ( lpad) => {
151
152
uw:: _Unwind_SetGR(
152
153
context,
153
154
UNWIND_DATA_REG . 0 ,
@@ -201,13 +202,15 @@ cfg_if::cfg_if! {
201
202
if actions as i32 & uw:: _UA_SEARCH_PHASE as i32 != 0 {
202
203
match eh_action {
203
204
EHAction :: None | EHAction :: Cleanup ( _) => uw:: _URC_CONTINUE_UNWIND,
204
- EHAction :: Catch ( _) => uw:: _URC_HANDLER_FOUND,
205
+ EHAction :: Catch ( _) | EHAction :: Filter ( _ ) => uw:: _URC_HANDLER_FOUND,
205
206
EHAction :: Terminate => uw:: _URC_FATAL_PHASE1_ERROR,
206
207
}
207
208
} else {
208
209
match eh_action {
209
210
EHAction :: None => uw:: _URC_CONTINUE_UNWIND,
210
- EHAction :: Cleanup ( lpad) | EHAction :: Catch ( lpad) => {
211
+ // Forced unwinding hits a terminate action.
212
+ EHAction :: Filter ( _) if actions as i32 & uw:: _UA_FORCE_UNWIND as i32 != 0 => uw:: _URC_CONTINUE_UNWIND,
213
+ EHAction :: Cleanup ( lpad) | EHAction :: Catch ( lpad) | EHAction :: Filter ( lpad) => {
211
214
uw:: _Unwind_SetGR(
212
215
context,
213
216
UNWIND_DATA_REG . 0 ,
0 commit comments