2 Copyright (c) 2008 KJK::Hyperion
4 Permission is hereby granted, free of charge, to any person obtaining a
5 copy of this software and associated documentation files (the "Software"),
6 to deal in the Software without restriction, including without limitation
7 the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 and/or sell copies of the Software, and to permit persons to whom the
9 Software is furnished to do so, subject to the following conditions:
11 The above copyright notice and this permission notice shall be included in
12 all copies or substantial portions of the Software.
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 DEALINGS IN THE SOFTWARE.
23 #include <pseh/pseh2.h>
29 #include <wine/test.h>
31 extern void no_op(void);
32 extern int return_arg(int);
34 extern int return_zero(void);
35 extern int return_positive(void);
36 extern int return_negative(void);
37 extern int return_one(void);
38 extern int return_minusone(void);
40 extern int return_zero_2(void *);
41 extern int return_positive_2(void *);
42 extern int return_negative_2(void *);
43 extern int return_one_2(void *);
44 extern int return_minusone_2(void *);
46 extern int return_zero_3(int);
47 extern int return_positive_3(int);
48 extern int return_negative_3(int);
49 extern int return_one_3(int);
50 extern int return_minusone_3(int);
52 extern int return_zero_4(void *, int);
53 extern int return_positive_4(void *, int);
54 extern int return_negative_4(void *, int);
55 extern int return_one_4(void *, int);
56 extern int return_minusone_4(void *, int);
58 extern void set_positive(int *);
60 //static int call_test(int (*)(void));
66 #define DEFINE_TEST(NAME_) static int NAME_(void)
68 /* Empty statements *///{{{
69 DEFINE_TEST(test_empty_1
)
71 _SEH2_TRY
{ } _SEH2_EXCEPT(0) { } _SEH2_END
;
75 DEFINE_TEST(test_empty_2
)
77 _SEH2_TRY
{ } _SEH2_EXCEPT(-1) { } _SEH2_END
;
81 DEFINE_TEST(test_empty_3
)
83 _SEH2_TRY
{ } _SEH2_EXCEPT(1) { } _SEH2_END
;
87 DEFINE_TEST(test_empty_4
)
89 _SEH2_TRY
{ } _SEH2_FINALLY
{ } _SEH2_END
;
93 DEFINE_TEST(test_empty_5
)
95 _SEH2_TRY
{ _SEH2_TRY
{ } _SEH2_EXCEPT(0) { } _SEH2_END
; } _SEH2_FINALLY
{ } _SEH2_END
;
99 DEFINE_TEST(test_empty_6
)
101 _SEH2_TRY
{ _SEH2_TRY
{ } _SEH2_EXCEPT(-1) { } _SEH2_END
; } _SEH2_FINALLY
{ } _SEH2_END
;
105 DEFINE_TEST(test_empty_7
)
107 _SEH2_TRY
{ _SEH2_TRY
{ } _SEH2_EXCEPT(1) { } _SEH2_END
; } _SEH2_FINALLY
{ } _SEH2_END
;
111 DEFINE_TEST(test_empty_8
)
113 _SEH2_TRY
{ _SEH2_TRY
{ } _SEH2_FINALLY
{ } _SEH2_END
; } _SEH2_FINALLY
{ } _SEH2_END
;
118 /* Static exception filters *///{{{
119 DEFINE_TEST(test_execute_handler_1
)
127 RaiseException(0xE00DEAD0, 0, 0, NULL
);
130 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
132 ret
= return_positive();
136 return ret
== return_positive();
139 DEFINE_TEST(test_continue_execution_1
)
147 RaiseException(0xE00DEAD0, 0, 0, NULL
);
148 ret
= return_positive();
150 _SEH2_EXCEPT(EXCEPTION_CONTINUE_EXECUTION
)
156 return ret
== return_positive();
159 DEFINE_TEST(test_continue_search_1
)
169 RaiseException(0xE00DEAD0, 0, 0, NULL
);
172 _SEH2_EXCEPT(EXCEPTION_CONTINUE_SEARCH
)
178 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
180 ret
= return_positive();
184 return ret
== return_positive();
187 DEFINE_TEST(test_execute_handler_2
)
195 RaiseException(0xE00DEAD0, 0, 0, NULL
);
200 ret
= return_positive();
204 return ret
== return_positive();
207 DEFINE_TEST(test_continue_execution_2
)
215 RaiseException(0xE00DEAD0, 0, 0, NULL
);
216 ret
= return_positive();
224 return ret
== return_positive();
228 /* Dynamic exception filters *///{{{
229 DEFINE_TEST(test_execute_handler_3
)
237 RaiseException(0xE00DEAD0, 0, 0, NULL
);
240 _SEH2_EXCEPT(return_one())
242 ret
= return_positive();
246 return ret
== return_positive();
249 DEFINE_TEST(test_continue_execution_3
)
257 RaiseException(0xE00DEAD0, 0, 0, NULL
);
258 ret
= return_positive();
260 _SEH2_EXCEPT(return_minusone())
266 return ret
== return_positive();
269 DEFINE_TEST(test_continue_search_2
)
279 RaiseException(0xE00DEAD0, 0, 0, NULL
);
282 _SEH2_EXCEPT(return_zero())
288 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
290 ret
= return_positive();
294 return ret
== return_positive();
297 DEFINE_TEST(test_execute_handler_4
)
305 RaiseException(0xE00DEAD0, 0, 0, NULL
);
308 _SEH2_EXCEPT(return_positive())
310 ret
= return_positive();
314 return ret
== return_positive();
317 DEFINE_TEST(test_continue_execution_4
)
325 RaiseException(0xE00DEAD0, 0, 0, NULL
);
326 ret
= return_positive();
328 _SEH2_EXCEPT(return_negative())
334 return ret
== return_positive();
338 /* Dynamic exception filters, using _SEH2_GetExceptionInformation() *///{{{
339 DEFINE_TEST(test_execute_handler_5
)
347 RaiseException(0xE00DEAD0, 0, 0, NULL
);
350 _SEH2_EXCEPT(return_one_2(_SEH2_GetExceptionInformation()))
352 ret
= return_positive();
356 return ret
== return_positive();
359 DEFINE_TEST(test_continue_execution_5
)
367 RaiseException(0xE00DEAD0, 0, 0, NULL
);
368 ret
= return_positive();
370 _SEH2_EXCEPT(return_minusone_2(_SEH2_GetExceptionInformation()))
376 return ret
== return_positive();
379 DEFINE_TEST(test_continue_search_3
)
383 ret
= return_positive();
389 RaiseException(0xE00DEAD0, 0, 0, NULL
);
392 _SEH2_EXCEPT(return_zero_2(_SEH2_GetExceptionInformation()))
398 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
400 ret
= return_arg(ret
);
404 return ret
== return_positive();
407 DEFINE_TEST(test_execute_handler_6
)
415 RaiseException(0xE00DEAD0, 0, 0, NULL
);
418 _SEH2_EXCEPT(return_positive_2(_SEH2_GetExceptionInformation()))
420 ret
= return_positive();
424 return ret
== return_positive();
427 DEFINE_TEST(test_continue_execution_6
)
435 RaiseException(0xE00DEAD0, 0, 0, NULL
);
436 ret
= return_positive();
438 _SEH2_EXCEPT(return_negative_2(_SEH2_GetExceptionInformation()))
444 return ret
== return_positive();
448 /* Dynamic exception filters, using _SEH2_GetExceptionCode() *///{{{
449 DEFINE_TEST(test_execute_handler_7
)
457 RaiseException(0xE00DEAD0, 0, 0, NULL
);
460 _SEH2_EXCEPT(return_one_3(_SEH2_GetExceptionCode()))
462 ret
= return_positive();
466 return ret
== return_positive();
469 DEFINE_TEST(test_continue_execution_7
)
477 RaiseException(0xE00DEAD0, 0, 0, NULL
);
478 ret
= return_positive();
480 _SEH2_EXCEPT(return_minusone_3(_SEH2_GetExceptionCode()))
486 return ret
== return_positive();
489 DEFINE_TEST(test_continue_search_4
)
499 RaiseException(0xE00DEAD0, 0, 0, NULL
);
502 _SEH2_EXCEPT(return_zero_3(_SEH2_GetExceptionCode()))
508 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
510 ret
= return_positive();
514 return ret
== return_positive();
517 DEFINE_TEST(test_execute_handler_8
)
525 RaiseException(0xE00DEAD0, 0, 0, NULL
);
528 _SEH2_EXCEPT(return_positive_3(_SEH2_GetExceptionCode()))
530 ret
= return_positive();
534 return ret
== return_positive();
537 DEFINE_TEST(test_continue_execution_8
)
545 RaiseException(0xE00DEAD0, 0, 0, NULL
);
546 ret
= return_positive();
548 _SEH2_EXCEPT(return_negative_3(_SEH2_GetExceptionCode()))
554 return ret
== return_positive();
558 /* Dynamic exception filters, using _SEH2_GetExceptionInformation() and _SEH2_GetExceptionCode() *///{{{
559 DEFINE_TEST(test_execute_handler_9
)
567 RaiseException(0xE00DEAD0, 0, 0, NULL
);
570 _SEH2_EXCEPT(return_one_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
572 ret
= return_positive();
576 return ret
== return_positive();
579 DEFINE_TEST(test_continue_execution_9
)
587 RaiseException(0xE00DEAD0, 0, 0, NULL
);
588 ret
= return_positive();
590 _SEH2_EXCEPT(return_minusone_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
596 return ret
== return_positive();
599 DEFINE_TEST(test_continue_search_5
)
609 RaiseException(0xE00DEAD0, 0, 0, NULL
);
612 _SEH2_EXCEPT(return_zero_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
618 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
620 ret
= return_positive();
624 return ret
== return_positive();
627 DEFINE_TEST(test_execute_handler_10
)
635 RaiseException(0xE00DEAD0, 0, 0, NULL
);
638 _SEH2_EXCEPT(return_positive_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
640 ret
= return_positive();
644 return ret
== return_positive();
647 DEFINE_TEST(test_continue_execution_10
)
655 RaiseException(0xE00DEAD0, 0, 0, NULL
);
656 ret
= return_positive();
658 _SEH2_EXCEPT(return_negative_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
664 return ret
== return_positive();
668 /* Constant exception filters with side effects *///{{{
669 DEFINE_TEST(test_execute_handler_11
)
677 RaiseException(0xE00DEAD0, 0, 0, NULL
);
680 _SEH2_EXCEPT(set_positive(&ret
), EXCEPTION_EXECUTE_HANDLER
)
682 ret
= ret
? return_positive() : return_zero();
686 return ret
== return_positive();
689 DEFINE_TEST(test_continue_execution_11
)
697 RaiseException(0xE00DEAD0, 0, 0, NULL
);
698 ret
= ret
? return_positive() : return_zero();
700 _SEH2_EXCEPT(set_positive(&ret
), EXCEPTION_CONTINUE_EXECUTION
)
706 return ret
== return_positive();
709 DEFINE_TEST(test_continue_search_6
)
715 ret2
= return_zero();
721 RaiseException(0xE00DEAD0, 0, 0, NULL
);
723 ret2
= return_zero();
725 _SEH2_EXCEPT(set_positive(&ret
), EXCEPTION_CONTINUE_SEARCH
)
728 ret2
= return_zero();
732 _SEH2_EXCEPT(set_positive(&ret2
), EXCEPTION_EXECUTE_HANDLER
)
734 ret
= return_arg(ret
);
735 ret2
= return_arg(ret2
);
739 return ret
== return_positive() && ret2
== return_positive();
742 DEFINE_TEST(test_execute_handler_12
)
750 RaiseException(0xE00DEAD0, 0, 0, NULL
);
753 _SEH2_EXCEPT(set_positive(&ret
), 12345)
755 ret
= return_arg(ret
);
759 return ret
== return_positive();
762 DEFINE_TEST(test_continue_execution_12
)
770 RaiseException(0xE00DEAD0, 0, 0, NULL
);
771 ret
= return_arg(ret
);
773 _SEH2_EXCEPT(set_positive(&ret
), -12345)
779 return ret
== return_positive();
783 /* _SEH2_LEAVE *///{{{
784 DEFINE_TEST(test_leave_1
)
792 ret
= return_positive();
796 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
802 return ret
== return_positive();
805 DEFINE_TEST(test_leave_2
)
813 ret
= return_positive();
816 RaiseException(0xE00DEAD0, 0, 0, NULL
);
819 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
825 return ret
== return_positive();
828 DEFINE_TEST(test_leave_3
)
836 ret
= return_positive();
843 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
849 return ret
== return_positive();
852 DEFINE_TEST(test_leave_4
)
861 int n
= return_one() + return_one();
863 for(i
= return_zero(); i
< n
; ++ i
)
865 if(i
== return_one())
867 ret
= return_positive();
874 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
880 return ret
== return_positive();
883 DEFINE_TEST(test_leave_5
)
893 case 0: ret
= return_zero();
894 case 1: ret
= return_positive(); _SEH2_LEAVE
;
895 case 2: ret
= return_zero();
900 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
906 return ret
== return_positive();
909 DEFINE_TEST(test_leave_6
)
921 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
927 ret
= return_positive();
929 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
935 return ret
== return_positive();
939 /* _SEH2_YIELD() *///{{{
941 int test_yield_1_helper(void)
945 _SEH2_YIELD(return return_positive());
947 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
949 _SEH2_YIELD(return return_zero());
953 return return_zero();
956 DEFINE_TEST(test_yield_1
)
958 return test_yield_1_helper() == return_positive();
962 int test_yield_2_helper(void)
966 RaiseException(0xE00DEAD0, 0, 0, NULL
);
967 _SEH2_YIELD(return return_zero());
969 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
971 _SEH2_YIELD(return return_positive());
975 return return_zero();
978 DEFINE_TEST(test_yield_2
)
980 return test_yield_2_helper() == return_positive();
984 int test_yield_3_helper(void)
990 _SEH2_YIELD(return return_positive());
992 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
994 _SEH2_YIELD(return return_zero());
998 _SEH2_YIELD(return return_zero());
1000 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1002 _SEH2_YIELD(return return_zero());
1006 return return_zero();
1009 DEFINE_TEST(test_yield_3
)
1011 return test_yield_3_helper() == return_positive();
1015 int test_yield_4_helper(void)
1021 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1022 _SEH2_YIELD(return return_zero());
1024 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1026 _SEH2_YIELD(return return_positive());
1030 _SEH2_YIELD(return return_zero());
1032 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1034 _SEH2_YIELD(return return_zero());
1038 return return_zero();
1041 DEFINE_TEST(test_yield_4
)
1043 return test_yield_4_helper() == return_positive();
1046 static int test_yield_5_ret
;
1049 int test_yield_5_helper(void)
1051 test_yield_5_ret
= return_zero();
1055 _SEH2_YIELD(return return_positive());
1059 test_yield_5_ret
= return_positive();
1063 return return_zero();
1066 DEFINE_TEST(test_yield_5
)
1068 return test_yield_5_helper() == return_positive() && test_yield_5_ret
== return_positive();
1071 int test_yield_6_ret
;
1074 int test_yield_6_helper(void)
1076 test_yield_6_ret
= return_zero();
1082 _SEH2_YIELD(return return_positive());
1086 test_yield_6_ret
= return_positive();
1092 test_yield_6_ret
+= return_one();
1096 return return_zero();
1099 DEFINE_TEST(test_yield_6
)
1101 return test_yield_6_helper() == return_positive() && test_yield_6_ret
== return_positive() + return_one();
1105 /* Termination blocks *///{{{
1106 DEFINE_TEST(test_finally_1
)
1110 ret
= return_zero();
1114 ret
= return_arg(ret
);
1118 ret
= return_positive();
1122 return ret
== return_positive();
1125 DEFINE_TEST(test_finally_2
)
1129 ret
= return_zero();
1133 ret
= return_arg(ret
);
1138 ret
= return_positive();
1142 return ret
== return_positive();
1145 DEFINE_TEST(test_finally_3
)
1149 ret
= return_zero();
1153 ret
= return_arg(ret
);
1154 _SEH2_YIELD(goto leave
);
1158 ret
= return_positive();
1163 return ret
== return_positive();
1166 static int test_finally_4_ret
;
1168 static int test_finally_4_helper(void)
1170 test_finally_4_ret
= return_zero();
1174 test_finally_4_ret
= return_arg(test_finally_4_ret
);
1175 _SEH2_YIELD(return return_positive());
1179 test_finally_4_ret
= return_positive();
1183 return return_zero();
1186 DEFINE_TEST(test_finally_4
)
1188 return test_finally_4_helper() == return_positive() && test_finally_4_ret
;
1191 DEFINE_TEST(test_finally_5
)
1195 ret
= return_zero();
1201 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1202 ret
= return_zero();
1206 ret
= return_positive();
1210 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1212 ret
= return_arg(ret
);
1216 return ret
== return_positive();
1219 DEFINE_TEST(test_finally_6
)
1223 ret
= return_zero();
1229 ret
= return_arg(ret
);
1233 if(ret
== return_zero())
1234 ret
= return_positive();
1240 if(ret
== return_positive())
1241 ret
= return_positive() + return_one();
1245 return ret
== return_positive() + return_one();
1248 DEFINE_TEST(test_finally_7
)
1252 ret
= return_zero();
1258 ret
= return_arg(ret
);
1263 if(ret
== return_zero())
1264 ret
= return_positive();
1270 if(ret
== return_positive())
1271 ret
= return_positive() + return_one();
1275 return ret
== return_positive() + return_one();
1278 DEFINE_TEST(test_finally_8
)
1282 ret
= return_zero();
1288 ret
= return_arg(ret
);
1289 _SEH2_YIELD(goto leave
);
1293 if(ret
== return_zero())
1294 ret
= return_positive();
1300 if(ret
== return_positive())
1301 ret
= return_positive() + return_one();
1306 return ret
== return_positive() + return_one();
1309 static int test_finally_9_ret
;
1311 static int test_finally_9_helper(void)
1313 test_finally_9_ret
= return_zero();
1319 test_finally_9_ret
= return_arg(test_finally_9_ret
);
1320 _SEH2_YIELD(return return_positive());
1324 if(test_finally_9_ret
== return_zero())
1325 test_finally_9_ret
= return_positive();
1331 if(test_finally_9_ret
== return_positive())
1332 test_finally_9_ret
= return_positive() + return_one();
1336 return return_zero();
1339 DEFINE_TEST(test_finally_9
)
1341 return test_finally_9_helper() == return_positive() && test_finally_9_ret
== return_positive() + return_one();
1344 DEFINE_TEST(test_finally_10
)
1348 ret
= return_zero();
1356 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1357 ret
= return_zero();
1361 if(ret
== return_zero())
1362 ret
= return_positive();
1368 if(ret
== return_positive())
1369 ret
= return_positive() + return_one();
1373 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1375 ret
= return_arg(ret
);
1379 return ret
== return_positive() + return_one();
1382 DEFINE_TEST(test_finally_11
)
1386 ret
= return_zero();
1394 ret
= return_arg(ret
);
1396 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1398 ret
= return_zero();
1404 ret
= return_positive();
1405 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1406 ret
= return_zero();
1410 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1412 if(ret
== return_positive())
1413 ret
+= return_one();
1417 return ret
== return_positive() + return_one();
1420 DEFINE_TEST(test_finally_12
)
1424 ret
= return_zero();
1432 ret
= return_arg(ret
);
1436 ret
= return_positive();
1437 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1438 ret
= return_zero();
1444 if(ret
== return_positive())
1445 ret
+= return_one();
1449 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1451 if(ret
== return_positive() + return_one())
1452 ret
+= return_one();
1456 return ret
== return_positive() + return_one() + return_one();
1459 static int test_finally_13_ret
;
1462 void test_finally_13_helper(void)
1464 test_finally_13_ret
= return_zero();
1470 test_finally_13_ret
= return_positive();
1471 _SEH2_YIELD(return);
1472 test_finally_13_ret
= return_zero();
1476 if(test_finally_13_ret
== return_positive())
1477 test_finally_13_ret
+= return_one();
1483 if(test_finally_13_ret
== return_positive() + return_one())
1484 test_finally_13_ret
+= return_one();
1486 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1487 test_finally_13_ret
= return_zero();
1491 test_finally_13_ret
= return_zero();
1494 DEFINE_TEST(test_finally_13
)
1498 ret
= return_zero();
1502 ret
= return_arg(ret
);
1503 test_finally_13_helper();
1504 ret
= return_zero();
1506 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1508 ret
= return_positive();
1512 return ret
== return_positive() && test_finally_13_ret
== return_positive() + return_one() + return_one();
1515 static int test_finally_14_ret
;
1518 void test_finally_14_helper(void)
1520 test_finally_14_ret
= return_zero();
1528 test_finally_14_ret
= return_positive();
1529 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1530 test_finally_14_ret
= return_zero();
1534 if(test_finally_14_ret
== return_positive())
1535 test_finally_14_ret
+= return_one();
1541 if(test_finally_14_ret
== return_positive() + return_one())
1542 test_finally_14_ret
+= return_one();
1544 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1545 test_finally_14_ret
= return_zero();
1549 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1551 if(test_finally_14_ret
== return_positive() + return_one() + return_one())
1552 test_finally_14_ret
+= return_one();
1556 test_finally_14_ret
= return_arg(test_finally_14_ret
);
1559 DEFINE_TEST(test_finally_14
)
1563 ret
= return_zero();
1567 ret
= return_arg(ret
);
1568 test_finally_14_helper();
1569 ret
= return_positive();
1571 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1573 ret
= return_zero();
1577 return ret
== return_positive() && test_finally_14_ret
== return_positive() + return_one() + return_one() + return_one();
1581 /* _SEH2_GetExceptionInformation() *///{{{
1583 int verify_xpointers(struct _EXCEPTION_POINTERS
* ep
, DWORD code
, DWORD flags
, DWORD argc
, const ULONG_PTR
* argv
, int * ret
, int filter
)
1587 ep
->ExceptionRecord
&&
1588 ep
->ContextRecord
&&
1589 ep
->ExceptionRecord
->ExceptionCode
== code
&&
1590 ep
->ExceptionRecord
->ExceptionFlags
== flags
&&
1591 ep
->ExceptionRecord
->NumberParameters
== argc
&&
1593 memcmp(ep
->ExceptionRecord
->ExceptionInformation
, argv
, sizeof(argv
[0]) * argc
) == 0;
1596 *ret
= return_positive();
1601 DEFINE_TEST(test_xpointers_1
)
1605 ret
= return_zero();
1609 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1611 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 0, NULL
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1613 ret
= return_arg(ret
);
1617 return ret
== return_positive();
1620 DEFINE_TEST(test_xpointers_2
)
1624 ret
= return_zero();
1628 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, NULL
);
1630 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, NULL
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1632 ret
= return_arg(ret
);
1636 return ret
== return_positive();
1639 DEFINE_TEST(test_xpointers_3
)
1642 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1644 ret
= return_zero();
1648 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, args
);
1650 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, args
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1652 ret
= return_arg(ret
);
1656 return ret
== return_positive();
1659 DEFINE_TEST(test_xpointers_4
)
1662 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1664 ret
= return_zero();
1668 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 1, args
);
1670 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 1, args
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1672 ret
= return_arg(ret
);
1676 return ret
== return_positive();
1679 DEFINE_TEST(test_xpointers_5
)
1682 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1684 ret
= return_zero();
1688 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 2, args
);
1690 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 2, args
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1692 ret
= return_arg(ret
);
1696 return ret
== return_positive();
1699 DEFINE_TEST(test_xpointers_6
)
1702 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1704 ret
= return_zero();
1708 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 3, args
);
1710 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 3, args
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1712 ret
= return_arg(ret
);
1716 return ret
== return_positive();
1719 DEFINE_TEST(test_xpointers_7
)
1723 ret
= return_zero();
1727 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1728 ret
= return_arg(ret
);
1730 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 0, NULL
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1732 ret
= return_zero();
1736 return ret
== return_positive();
1739 DEFINE_TEST(test_xpointers_8
)
1742 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1744 ret
= return_zero();
1748 RaiseException(0xE00DEAD0, 0, 0, args
);
1749 ret
= return_arg(ret
);
1751 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 0, args
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1753 ret
= return_zero();
1757 return ret
== return_positive();
1760 DEFINE_TEST(test_xpointers_9
)
1763 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1765 ret
= return_zero();
1769 RaiseException(0xE00DEAD0, 0, 1, args
);
1770 ret
= return_arg(ret
);
1772 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 1, args
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1774 ret
= return_zero();
1778 return ret
== return_positive();
1781 DEFINE_TEST(test_xpointers_10
)
1784 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1786 ret
= return_zero();
1790 RaiseException(0xE00DEAD0, 0, 2, args
);
1791 ret
= return_arg(ret
);
1793 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 2, args
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1795 ret
= return_zero();
1799 return ret
== return_positive();
1802 DEFINE_TEST(test_xpointers_11
)
1805 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1807 ret
= return_zero();
1811 RaiseException(0xE00DEAD0, 0, 3, args
);
1812 ret
= return_arg(ret
);
1814 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 3, args
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1816 ret
= return_zero();
1820 return ret
== return_positive();
1823 DEFINE_TEST(test_xpointers_12
)
1827 ret
= return_zero();
1833 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, NULL
);
1835 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, NULL
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1837 ret
= return_zero();
1841 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1843 ret
= return_arg(ret
);
1847 return ret
== return_positive();
1850 DEFINE_TEST(test_xpointers_13
)
1853 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1855 ret
= return_zero();
1861 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, args
);
1863 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, args
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1865 ret
= return_zero();
1869 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1871 ret
= return_arg(ret
);
1875 return ret
== return_positive();
1878 DEFINE_TEST(test_xpointers_14
)
1881 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1883 ret
= return_zero();
1889 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 1, args
);
1891 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 1, args
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1893 ret
= return_zero();
1897 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1899 ret
= return_arg(ret
);
1903 return ret
== return_positive();
1906 DEFINE_TEST(test_xpointers_15
)
1909 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1911 ret
= return_zero();
1917 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 2, args
);
1919 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 2, args
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1921 ret
= return_zero();
1925 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1927 ret
= return_arg(ret
);
1931 return ret
== return_positive();
1934 DEFINE_TEST(test_xpointers_16
)
1937 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1939 ret
= return_zero();
1945 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 3, args
);
1947 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 3, args
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1949 ret
= return_zero();
1953 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1955 ret
= return_arg(ret
);
1959 return ret
== return_positive();
1963 /* _SEH2_GetExceptionCode() *///{{{
1965 int verify_xcode(int code
, int xcode
, int * ret
, int filter
)
1967 *ret
= code
== xcode
;
1970 *ret
= return_positive();
1975 DEFINE_TEST(test_xcode_1
)
1979 ret
= return_zero();
1983 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1984 ret
= return_zero();
1986 _SEH2_EXCEPT(verify_xcode(_SEH2_GetExceptionCode(), 0xE00DEAD0, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1988 ret
= return_arg(ret
);
1992 return ret
== return_positive();
1995 DEFINE_TEST(test_xcode_2
)
1999 ret
= return_zero();
2003 RaiseException(0xE00DEAD0, 0, 0, NULL
);
2004 ret
= return_arg(ret
);
2006 _SEH2_EXCEPT(verify_xcode(_SEH2_GetExceptionCode(), 0xE00DEAD0, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
2008 ret
= return_zero();
2012 return ret
== return_positive();
2015 DEFINE_TEST(test_xcode_3
)
2019 ret
= return_zero();
2025 RaiseException(0xE00DEAD0, 0, 0, NULL
);
2026 ret
= return_zero();
2028 _SEH2_EXCEPT(verify_xcode(_SEH2_GetExceptionCode(), 0xE00DEAD0, &ret
, EXCEPTION_CONTINUE_SEARCH
))
2030 ret
= return_zero();
2034 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2036 ret
= return_arg(ret
);
2040 return ret
== return_positive();
2044 /* _SEH2_AbnormalTermination() *///{{{
2045 DEFINE_TEST(test_abnorm_1
)
2049 ret
= return_zero();
2053 ret
= return_arg(ret
);
2057 ret
= _SEH2_AbnormalTermination() ? return_zero() : return_positive();
2061 return ret
== return_positive();
2064 DEFINE_TEST(test_abnorm_2
)
2068 ret
= return_zero();
2076 ret
= _SEH2_AbnormalTermination() ? return_zero() : return_positive();
2080 return ret
== return_positive();
2083 DEFINE_TEST(test_abnorm_3
)
2087 ret
= return_zero();
2091 _SEH2_YIELD(goto leave
);
2095 ret
= _SEH2_AbnormalTermination() ? return_positive() : return_zero();
2100 return ret
== return_positive();
2103 DEFINE_TEST(test_abnorm_4
)
2107 ret
= return_zero();
2113 RaiseException(0xE00DEAD0, 0, 0, NULL
);
2114 ret
= return_zero();
2118 ret
= _SEH2_AbnormalTermination() ? return_positive() : return_zero();
2122 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2124 ret
= return_arg(ret
);
2128 return ret
== return_positive();
2131 DEFINE_TEST(test_abnorm_5
)
2135 ret
= return_zero();
2141 ret
= return_arg(ret
);
2145 ret
= _SEH2_AbnormalTermination() ? return_zero() : return_positive();
2151 ret
= ret
== return_positive() && !_SEH2_AbnormalTermination() ? return_positive() + return_one() : ret
;
2155 return ret
== return_positive() + return_one();
2158 DEFINE_TEST(test_abnorm_6
)
2162 ret
= return_zero();
2172 ret
= _SEH2_AbnormalTermination() ? return_zero() : return_positive();
2178 ret
= ret
== return_positive() && !_SEH2_AbnormalTermination() ? return_positive() + return_one() : ret
;
2182 return ret
== return_positive() + return_one();
2185 DEFINE_TEST(test_abnorm_7
)
2189 ret
= return_zero();
2195 _SEH2_YIELD(goto leave
);
2199 ret
= _SEH2_AbnormalTermination() ? return_positive() : return_zero();
2205 ret
= ret
== return_positive() && _SEH2_AbnormalTermination() ? return_positive() + return_one() : ret
;
2210 return ret
== return_positive() + return_one();
2213 DEFINE_TEST(test_abnorm_8
)
2217 ret
= return_zero();
2225 RaiseException(0xE00DEAD0, 0, 0, NULL
);
2226 ret
= return_zero();
2230 ret
= _SEH2_AbnormalTermination() ? return_positive() : return_zero();
2236 ret
= ret
== return_positive() && _SEH2_AbnormalTermination() ? return_positive() + return_one() : ret
;
2240 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2242 ret
= return_arg(ret
);
2246 return ret
== return_positive() + return_one();
2250 /* Use of local variables from _SEH2_EXCEPT(...) and _SEH2_FINALLY { ... } *///{{{
2251 DEFINE_TEST(test_nested_locals_1
)
2253 int var1
= return_one();
2257 RaiseException(0xE00DEAD0, 0, 0, 0);
2259 _SEH2_EXCEPT((var1
= (var1
== return_one() ? return_positive() : var1
)), EXCEPTION_EXECUTE_HANDLER
)
2261 if(var1
== return_positive())
2262 var1
= return_positive() + 1;
2266 return var1
== return_positive() + 1;
2269 DEFINE_TEST(test_nested_locals_2
)
2271 int var1
= return_positive();
2278 if(var1
== return_positive())
2279 var1
= return_positive() + 1;
2283 return var1
== return_positive() + 1;
2286 DEFINE_TEST(test_nested_locals_3
)
2288 int var1
= return_zero();
2294 var1
= return_one();
2295 RaiseException(0xE00DEAD0, 0, 0, 0);
2299 if(var1
== return_one())
2300 var1
= return_positive();
2304 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2306 if(var1
== return_positive())
2307 var1
= return_positive() + 1;
2311 return var1
== return_positive() + 1;
2315 /* System support *///{{{
2319 /* CPU faults *///{{{
2323 /* Past bugs, to detect regressions *///{{{
2324 /* #4004: volatile registers clobbered when catching across frames (originally misreported) *///{{{
2326 void test_bug_4004_helper_1(void)
2330 i1
= return_positive();
2331 i2
= return_positive();
2332 i3
= return_positive();
2333 (void)return_arg(i1
+ i2
+ i3
);
2337 RaiseException(0xE00DEAD0, 0, 0, NULL
);
2346 void test_bug_4004_helper_2(void)
2350 test_bug_4004_helper_1();
2352 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2358 DEFINE_TEST(test_bug_4004
)
2362 i1
= return_positive();
2363 i2
= return_positive();
2364 i3
= return_positive();
2366 test_bug_4004_helper_2();
2368 return return_arg(i1
) + return_arg(i2
) + return_arg(i3
) == return_positive() * 3;
2373 DEFINE_TEST(test_bug_4663
)
2377 i1
= return_positive();
2378 i2
= return_positive();
2384 RaiseException(0xE00DEAD0, 0, 0, 0);
2386 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2388 if (i1
== return_positive())
2390 i1
= return_positive() + 1;
2395 if (i1
== return_positive() + 1)
2397 i1
= return_negative();
2398 RaiseException(0xE00DEAD0, 0, 0, 0);
2401 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2403 i2
= return_negative();
2407 return ((i1
== return_negative()) && (i2
== return_negative()));
2412 DEFINE_TEST(test_unvolatile
)
2419 *((char*)(intptr_t)0xc0000000) = 0;
2421 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2430 DEFINE_TEST(test_unvolatile_2
)
2437 *((char*)(intptr_t)0xc0000000) = 0;
2440 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2446 return (val
== 3) || (val
== 4) || (val
== 5);
2449 /* This test is mainly for documentation purpose. As can be seen it doesn't
2450 provide a satisfying result. In fact the compiler could do even more
2451 crazy things like reusing val1 between the assignment to 0 and the last
2452 assignment to 3. This DOES happen with C++ and it's NOT a PSEH bug, but
2453 rather an unavoidable consequence of how the compiler works.
2454 The conclusion: Do not use assignments to a variable inside a __try block
2455 that is being used later inside the __except block, unless it is declared
2458 DEFINE_TEST(test_unvolatile_3
)
2460 register int val1
= 0, val2
= 0;
2469 *((char*)(intptr_t)0xc0000000) = 0;
2472 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2479 *((int*)(intptr_t)0xc0000000) = 1;
2482 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2488 /* The expected case */
2489 if ((val1
== 10) && (val2
== 5))
2492 /* The compiler can optimize away "val1 = 1" and "val1 = 2" and
2493 only use the last "val1 = 3", in this case val1 is still 0
2494 when the outer exception handler kicks in */
2495 if ((val1
== 0) && (val2
== 5))
2498 /* Same as above, but this time val2 optimized away */
2499 if (((val1
== 8) && (val2
== 4)) ||
2500 ((val1
== 0) && (val2
== 4)))
2505 #endif // __cplusplus
2507 DEFINE_TEST(test_unvolatile_4
)
2509 unsigned result
= 0xdeadbeef;
2513 *(char*)(intptr_t)0x80000000 = 1;
2515 _SEH2_EXCEPT(result
== 0xdeadbeef)
2521 result
= (result
== 0xdeadbeef) ? 0 : result
+ 1;
2526 DEFINE_TEST(test_finally_goto
)
2528 volatile int val
= 0;
2541 *((char*)(intptr_t)0xdeadc0de) = 0;
2549 *((char*)(intptr_t)0xdeadc0de) = 0;
2558 return (val
== (128|4|2|1));
2561 DEFINE_TEST(test_nested_exception
)
2563 volatile int val
= 0;
2571 *((char*)(intptr_t)0xdeadc0de) = 0;
2577 *((char*)(intptr_t)0xdeadc0de) = 0;
2583 *((char*)(intptr_t)0xdeadc0de) = 0;
2592 return (val
== (1|2|8|128));
2596 LONG WINAPI
unhandled_exception(PEXCEPTION_POINTERS ExceptionInfo
)
2598 trace("unhandled exception %08lX thrown from %p\n", ExceptionInfo
->ExceptionRecord
->ExceptionCode
, ExceptionInfo
->ExceptionRecord
->ExceptionAddress
);
2599 return EXCEPTION_CONTINUE_SEARCH
;
2602 #if defined(_M_IX86)
2603 struct volatile_context
2612 struct volatile_context
2620 int sanity_check(int ret
, struct volatile_context
* before
, struct volatile_context
* after
)
2622 if(ret
&& memcmp(before
, after
, sizeof(*before
)))
2624 trace("volatile context corrupted\n");
2633 int passthrough_handler(struct _EXCEPTION_RECORD
* e
, void * f
, struct _CONTEXT
* c
, void * d
)
2635 return ExceptionContinueSearch
;
2641 int call_test(int (* func
)(void))
2644 static struct volatile_context before
, after
;
2645 static LPTOP_LEVEL_EXCEPTION_FILTER prev_unhandled_exception
;
2646 #if !defined(_PSEH3_H_) && !defined(_MSC_VER)
2647 static _SEH2Registration_t
* prev_frame
;
2648 _SEH2Registration_t passthrough_frame
;
2651 prev_unhandled_exception
= SetUnhandledExceptionFilter(&unhandled_exception
);
2653 #if defined(_X86_) && !defined(_PSEH3_H_) && !defined(_MSC_VER)
2654 prev_frame
= (_SEH2Registration_t
*)__readfsdword(0);
2655 passthrough_frame
.SER_Prev
= prev_frame
;
2656 passthrough_frame
.SER_Handler
= passthrough_handler
;
2657 __writefsdword(0, (unsigned long)&passthrough_frame
);
2660 #if defined(__GNUC__) && defined(__i386__)
2661 __asm__ __volatile__
2663 "mov %%esp, 0x00 + %c[before]\n"
2664 "mov %%ebp, 0x04 + %c[before]\n"
2665 "mov %%ebx, 0x08 + %c[before]\n"
2666 "mov %%esi, 0x0c + %c[before]\n"
2667 "mov %%edi, 0x10 + %c[before]\n"
2669 "mov %%esp, 0x00 + %c[after]\n"
2670 "mov %%ebp, 0x04 + %c[after]\n"
2671 "mov %%ebx, 0x08 + %c[after]\n"
2672 "mov %%esi, 0x0c + %c[after]\n"
2673 "mov %%edi, 0x10 + %c[after]\n"
2677 "call %c[sanity_check]\n"
2682 [test
] "r" (func
), [before
] "i" (&before
), [after
] "i" (&after
), [sanity_check
] "i" (&sanity_check
) :
2683 "ebx", "ecx", "edx", "esi", "edi", "flags", "memory"
2689 #if defined(_X86_) && !defined(_PSEH3_H_) && !defined(_MSC_VER)
2690 if((_SEH2Registration_t
*)__readfsdword(0) != &passthrough_frame
|| passthrough_frame
.SER_Prev
!= prev_frame
)
2692 trace("exception registration list corrupted\n");
2696 __writefsdword(0, (unsigned long)prev_frame
);
2699 SetUnhandledExceptionFilter(prev_unhandled_exception
);
2703 DEFINE_TEST(test_PSEH3_bug
)
2705 volatile int count
= 0;
2712 *(volatile int*)0x12345678 = 0x12345678;
2715 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2722 return (count
== 1);
2726 use_lots_of_stack(void)
2729 volatile int arr
[512];
2730 for (i
= 0; i
< 512; i
++)
2735 DEFINE_TEST(test_PSEH3_bug2
)
2737 unsigned long status
= 0;
2740 *(volatile int*)0x12345678 = 0x12345678;
2742 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2744 use_lots_of_stack();
2745 status
= _SEH2_GetExceptionCode();
2749 return (status
== STATUS_ACCESS_VIOLATION
);
2752 #define USE_TEST_NAME_(NAME_) # NAME_
2753 #define USE_TEST_NAME(NAME_) USE_TEST_NAME_(NAME_)
2754 #define USE_TEST(NAME_) { USE_TEST_NAME(NAME_), NAME_ }
2764 const struct subtest testsuite
[] =
2766 USE_TEST(test_empty_1
),
2767 USE_TEST(test_empty_2
),
2768 USE_TEST(test_empty_3
),
2769 USE_TEST(test_empty_4
),
2770 USE_TEST(test_empty_5
),
2771 USE_TEST(test_empty_6
),
2772 USE_TEST(test_empty_7
),
2773 USE_TEST(test_empty_8
),
2775 USE_TEST(test_execute_handler_1
),
2776 USE_TEST(test_continue_execution_1
),
2777 USE_TEST(test_continue_search_1
),
2778 USE_TEST(test_execute_handler_2
),
2779 USE_TEST(test_continue_execution_2
),
2781 USE_TEST(test_execute_handler_3
),
2782 USE_TEST(test_continue_execution_3
),
2783 USE_TEST(test_continue_search_2
),
2784 USE_TEST(test_execute_handler_4
),
2785 USE_TEST(test_continue_execution_4
),
2787 USE_TEST(test_execute_handler_5
),
2788 USE_TEST(test_continue_execution_5
),
2789 USE_TEST(test_continue_search_3
),
2790 USE_TEST(test_execute_handler_6
),
2791 USE_TEST(test_continue_execution_6
),
2793 USE_TEST(test_execute_handler_7
),
2794 USE_TEST(test_continue_execution_7
),
2795 USE_TEST(test_continue_search_4
),
2796 USE_TEST(test_execute_handler_8
),
2797 USE_TEST(test_continue_execution_8
),
2799 USE_TEST(test_execute_handler_9
),
2800 USE_TEST(test_continue_execution_9
),
2801 USE_TEST(test_continue_search_5
),
2802 USE_TEST(test_execute_handler_10
),
2803 USE_TEST(test_continue_execution_10
),
2805 USE_TEST(test_execute_handler_11
),
2806 USE_TEST(test_continue_execution_11
),
2807 USE_TEST(test_continue_search_6
),
2808 USE_TEST(test_execute_handler_12
),
2809 USE_TEST(test_continue_execution_12
),
2811 USE_TEST(test_leave_1
),
2812 USE_TEST(test_leave_2
),
2813 USE_TEST(test_leave_3
),
2814 USE_TEST(test_leave_4
),
2815 USE_TEST(test_leave_5
),
2816 USE_TEST(test_leave_6
),
2818 USE_TEST(test_yield_1
),
2819 USE_TEST(test_yield_2
),
2820 USE_TEST(test_yield_3
),
2821 USE_TEST(test_yield_4
),
2822 USE_TEST(test_yield_5
),
2823 USE_TEST(test_yield_6
),
2825 USE_TEST(test_finally_1
),
2826 USE_TEST(test_finally_2
),
2827 USE_TEST(test_finally_3
),
2828 USE_TEST(test_finally_4
),
2829 USE_TEST(test_finally_5
),
2830 USE_TEST(test_finally_6
),
2831 USE_TEST(test_finally_7
),
2832 USE_TEST(test_finally_8
),
2833 USE_TEST(test_finally_9
),
2834 USE_TEST(test_finally_10
),
2835 USE_TEST(test_finally_11
),
2836 USE_TEST(test_finally_12
),
2837 USE_TEST(test_finally_13
),
2838 USE_TEST(test_finally_14
),
2840 USE_TEST(test_xpointers_1
),
2841 USE_TEST(test_xpointers_2
),
2842 USE_TEST(test_xpointers_3
),
2843 USE_TEST(test_xpointers_4
),
2844 USE_TEST(test_xpointers_5
),
2845 USE_TEST(test_xpointers_6
),
2846 USE_TEST(test_xpointers_7
),
2847 USE_TEST(test_xpointers_8
),
2848 USE_TEST(test_xpointers_9
),
2849 USE_TEST(test_xpointers_10
),
2850 USE_TEST(test_xpointers_11
),
2851 USE_TEST(test_xpointers_12
),
2852 USE_TEST(test_xpointers_13
),
2853 USE_TEST(test_xpointers_14
),
2854 USE_TEST(test_xpointers_15
),
2855 USE_TEST(test_xpointers_16
),
2857 USE_TEST(test_xcode_1
),
2858 USE_TEST(test_xcode_2
),
2859 USE_TEST(test_xcode_3
),
2861 USE_TEST(test_abnorm_1
),
2862 USE_TEST(test_abnorm_2
),
2863 USE_TEST(test_abnorm_3
),
2864 USE_TEST(test_abnorm_4
),
2865 USE_TEST(test_abnorm_5
),
2866 USE_TEST(test_abnorm_6
),
2867 USE_TEST(test_abnorm_7
),
2868 USE_TEST(test_abnorm_8
),
2870 USE_TEST(test_nested_locals_1
),
2871 USE_TEST(test_nested_locals_2
),
2872 USE_TEST(test_nested_locals_3
),
2874 USE_TEST(test_bug_4004
),
2875 USE_TEST(test_bug_4663
),
2877 USE_TEST(test_unvolatile
),
2878 USE_TEST(test_unvolatile_2
),
2880 USE_TEST(test_unvolatile_3
),
2882 USE_TEST(test_unvolatile_4
),
2883 USE_TEST(test_finally_goto
),
2884 USE_TEST(test_nested_exception
),
2885 USE_TEST(test_PSEH3_bug
),
2886 USE_TEST(test_PSEH3_bug2
),
2891 for(i
= 0; i
< sizeof(testsuite
) / sizeof(testsuite
[0]); ++ i
)
2892 ok(call_test(testsuite
[i
].func
), "%s failed\n", testsuite
[i
].name
);