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>
30 #include <wine/test.h>
32 extern void no_op(void);
33 extern int return_arg(int);
35 extern int return_zero(void);
36 extern int return_positive(void);
37 extern int return_negative(void);
38 extern int return_one(void);
39 extern int return_minusone(void);
41 extern int return_zero_2(void *);
42 extern int return_positive_2(void *);
43 extern int return_negative_2(void *);
44 extern int return_one_2(void *);
45 extern int return_minusone_2(void *);
47 extern int return_zero_3(int);
48 extern int return_positive_3(int);
49 extern int return_negative_3(int);
50 extern int return_one_3(int);
51 extern int return_minusone_3(int);
53 extern int return_zero_4(void *, int);
54 extern int return_positive_4(void *, int);
55 extern int return_negative_4(void *, int);
56 extern int return_one_4(void *, int);
57 extern int return_minusone_4(void *, int);
59 extern void set_positive(int *);
61 //static int call_test(int (*)(void));
67 #define DEFINE_TEST(NAME_) static int NAME_(void)
69 /* Empty statements *///{{{
70 DEFINE_TEST(test_empty_1
)
72 _SEH2_TRY
{ } _SEH2_EXCEPT(0) { } _SEH2_END
;
76 DEFINE_TEST(test_empty_2
)
78 _SEH2_TRY
{ } _SEH2_EXCEPT(-1) { } _SEH2_END
;
82 DEFINE_TEST(test_empty_3
)
84 _SEH2_TRY
{ } _SEH2_EXCEPT(1) { } _SEH2_END
;
88 DEFINE_TEST(test_empty_4
)
90 _SEH2_TRY
{ } _SEH2_FINALLY
{ } _SEH2_END
;
94 DEFINE_TEST(test_empty_5
)
96 _SEH2_TRY
{ _SEH2_TRY
{ } _SEH2_EXCEPT(0) { } _SEH2_END
; } _SEH2_FINALLY
{ } _SEH2_END
;
100 DEFINE_TEST(test_empty_6
)
102 _SEH2_TRY
{ _SEH2_TRY
{ } _SEH2_EXCEPT(-1) { } _SEH2_END
; } _SEH2_FINALLY
{ } _SEH2_END
;
106 DEFINE_TEST(test_empty_7
)
108 _SEH2_TRY
{ _SEH2_TRY
{ } _SEH2_EXCEPT(1) { } _SEH2_END
; } _SEH2_FINALLY
{ } _SEH2_END
;
112 DEFINE_TEST(test_empty_8
)
114 _SEH2_TRY
{ _SEH2_TRY
{ } _SEH2_FINALLY
{ } _SEH2_END
; } _SEH2_FINALLY
{ } _SEH2_END
;
119 /* Static exception filters *///{{{
120 DEFINE_TEST(test_execute_handler_1
)
128 RaiseException(0xE00DEAD0, 0, 0, NULL
);
131 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
133 ret
= return_positive();
137 return ret
== return_positive();
140 DEFINE_TEST(test_continue_execution_1
)
148 RaiseException(0xE00DEAD0, 0, 0, NULL
);
149 ret
= return_positive();
151 _SEH2_EXCEPT(EXCEPTION_CONTINUE_EXECUTION
)
157 return ret
== return_positive();
160 DEFINE_TEST(test_continue_search_1
)
170 RaiseException(0xE00DEAD0, 0, 0, NULL
);
173 _SEH2_EXCEPT(EXCEPTION_CONTINUE_SEARCH
)
179 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
181 ret
= return_positive();
185 return ret
== return_positive();
188 DEFINE_TEST(test_execute_handler_2
)
196 RaiseException(0xE00DEAD0, 0, 0, NULL
);
201 ret
= return_positive();
205 return ret
== return_positive();
208 DEFINE_TEST(test_continue_execution_2
)
216 RaiseException(0xE00DEAD0, 0, 0, NULL
);
217 ret
= return_positive();
225 return ret
== return_positive();
229 /* Dynamic exception filters *///{{{
230 DEFINE_TEST(test_execute_handler_3
)
238 RaiseException(0xE00DEAD0, 0, 0, NULL
);
241 _SEH2_EXCEPT(return_one())
243 ret
= return_positive();
247 return ret
== return_positive();
250 DEFINE_TEST(test_continue_execution_3
)
258 RaiseException(0xE00DEAD0, 0, 0, NULL
);
259 ret
= return_positive();
261 _SEH2_EXCEPT(return_minusone())
267 return ret
== return_positive();
270 DEFINE_TEST(test_continue_search_2
)
280 RaiseException(0xE00DEAD0, 0, 0, NULL
);
283 _SEH2_EXCEPT(return_zero())
289 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
291 ret
= return_positive();
295 return ret
== return_positive();
298 DEFINE_TEST(test_execute_handler_4
)
306 RaiseException(0xE00DEAD0, 0, 0, NULL
);
309 _SEH2_EXCEPT(return_positive())
311 ret
= return_positive();
315 return ret
== return_positive();
318 DEFINE_TEST(test_continue_execution_4
)
326 RaiseException(0xE00DEAD0, 0, 0, NULL
);
327 ret
= return_positive();
329 _SEH2_EXCEPT(return_negative())
335 return ret
== return_positive();
339 /* Dynamic exception filters, using _SEH2_GetExceptionInformation() *///{{{
340 DEFINE_TEST(test_execute_handler_5
)
348 RaiseException(0xE00DEAD0, 0, 0, NULL
);
351 _SEH2_EXCEPT(return_one_2(_SEH2_GetExceptionInformation()))
353 ret
= return_positive();
357 return ret
== return_positive();
360 DEFINE_TEST(test_continue_execution_5
)
368 RaiseException(0xE00DEAD0, 0, 0, NULL
);
369 ret
= return_positive();
371 _SEH2_EXCEPT(return_minusone_2(_SEH2_GetExceptionInformation()))
377 return ret
== return_positive();
380 DEFINE_TEST(test_continue_search_3
)
384 ret
= return_positive();
390 RaiseException(0xE00DEAD0, 0, 0, NULL
);
393 _SEH2_EXCEPT(return_zero_2(_SEH2_GetExceptionInformation()))
399 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
401 ret
= return_arg(ret
);
405 return ret
== return_positive();
408 DEFINE_TEST(test_execute_handler_6
)
416 RaiseException(0xE00DEAD0, 0, 0, NULL
);
419 _SEH2_EXCEPT(return_positive_2(_SEH2_GetExceptionInformation()))
421 ret
= return_positive();
425 return ret
== return_positive();
428 DEFINE_TEST(test_continue_execution_6
)
436 RaiseException(0xE00DEAD0, 0, 0, NULL
);
437 ret
= return_positive();
439 _SEH2_EXCEPT(return_negative_2(_SEH2_GetExceptionInformation()))
445 return ret
== return_positive();
449 /* Dynamic exception filters, using _SEH2_GetExceptionCode() *///{{{
450 DEFINE_TEST(test_execute_handler_7
)
458 RaiseException(0xE00DEAD0, 0, 0, NULL
);
461 _SEH2_EXCEPT(return_one_3(_SEH2_GetExceptionCode()))
463 ret
= return_positive();
467 return ret
== return_positive();
470 DEFINE_TEST(test_continue_execution_7
)
478 RaiseException(0xE00DEAD0, 0, 0, NULL
);
479 ret
= return_positive();
481 _SEH2_EXCEPT(return_minusone_3(_SEH2_GetExceptionCode()))
487 return ret
== return_positive();
490 DEFINE_TEST(test_continue_search_4
)
500 RaiseException(0xE00DEAD0, 0, 0, NULL
);
503 _SEH2_EXCEPT(return_zero_3(_SEH2_GetExceptionCode()))
509 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
511 ret
= return_positive();
515 return ret
== return_positive();
518 DEFINE_TEST(test_execute_handler_8
)
526 RaiseException(0xE00DEAD0, 0, 0, NULL
);
529 _SEH2_EXCEPT(return_positive_3(_SEH2_GetExceptionCode()))
531 ret
= return_positive();
535 return ret
== return_positive();
538 DEFINE_TEST(test_continue_execution_8
)
546 RaiseException(0xE00DEAD0, 0, 0, NULL
);
547 ret
= return_positive();
549 _SEH2_EXCEPT(return_negative_3(_SEH2_GetExceptionCode()))
555 return ret
== return_positive();
559 /* Dynamic exception filters, using _SEH2_GetExceptionInformation() and _SEH2_GetExceptionCode() *///{{{
560 DEFINE_TEST(test_execute_handler_9
)
568 RaiseException(0xE00DEAD0, 0, 0, NULL
);
571 _SEH2_EXCEPT(return_one_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
573 ret
= return_positive();
577 return ret
== return_positive();
580 DEFINE_TEST(test_continue_execution_9
)
588 RaiseException(0xE00DEAD0, 0, 0, NULL
);
589 ret
= return_positive();
591 _SEH2_EXCEPT(return_minusone_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
597 return ret
== return_positive();
600 DEFINE_TEST(test_continue_search_5
)
610 RaiseException(0xE00DEAD0, 0, 0, NULL
);
613 _SEH2_EXCEPT(return_zero_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
619 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
621 ret
= return_positive();
625 return ret
== return_positive();
628 DEFINE_TEST(test_execute_handler_10
)
636 RaiseException(0xE00DEAD0, 0, 0, NULL
);
639 _SEH2_EXCEPT(return_positive_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
641 ret
= return_positive();
645 return ret
== return_positive();
648 DEFINE_TEST(test_continue_execution_10
)
656 RaiseException(0xE00DEAD0, 0, 0, NULL
);
657 ret
= return_positive();
659 _SEH2_EXCEPT(return_negative_4(_SEH2_GetExceptionInformation(), _SEH2_GetExceptionCode()))
665 return ret
== return_positive();
669 /* Constant exception filters with side effects *///{{{
670 DEFINE_TEST(test_execute_handler_11
)
678 RaiseException(0xE00DEAD0, 0, 0, NULL
);
681 _SEH2_EXCEPT(set_positive(&ret
), EXCEPTION_EXECUTE_HANDLER
)
683 ret
= ret
? return_positive() : return_zero();
687 return ret
== return_positive();
690 DEFINE_TEST(test_continue_execution_11
)
698 RaiseException(0xE00DEAD0, 0, 0, NULL
);
699 ret
= ret
? return_positive() : return_zero();
701 _SEH2_EXCEPT(set_positive(&ret
), EXCEPTION_CONTINUE_EXECUTION
)
707 return ret
== return_positive();
710 DEFINE_TEST(test_continue_search_6
)
716 ret2
= return_zero();
722 RaiseException(0xE00DEAD0, 0, 0, NULL
);
724 ret2
= return_zero();
726 _SEH2_EXCEPT(set_positive(&ret
), EXCEPTION_CONTINUE_SEARCH
)
729 ret2
= return_zero();
733 _SEH2_EXCEPT(set_positive(&ret2
), EXCEPTION_EXECUTE_HANDLER
)
735 ret
= return_arg(ret
);
736 ret2
= return_arg(ret2
);
740 return ret
== return_positive() && ret2
== return_positive();
743 DEFINE_TEST(test_execute_handler_12
)
751 RaiseException(0xE00DEAD0, 0, 0, NULL
);
754 _SEH2_EXCEPT(set_positive(&ret
), 12345)
756 ret
= return_arg(ret
);
760 return ret
== return_positive();
763 DEFINE_TEST(test_continue_execution_12
)
771 RaiseException(0xE00DEAD0, 0, 0, NULL
);
772 ret
= return_arg(ret
);
774 _SEH2_EXCEPT(set_positive(&ret
), -12345)
780 return ret
== return_positive();
784 /* _SEH2_LEAVE *///{{{
785 DEFINE_TEST(test_leave_1
)
793 ret
= return_positive();
797 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
803 return ret
== return_positive();
806 DEFINE_TEST(test_leave_2
)
814 ret
= return_positive();
817 RaiseException(0xE00DEAD0, 0, 0, NULL
);
820 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
826 return ret
== return_positive();
829 DEFINE_TEST(test_leave_3
)
837 ret
= return_positive();
844 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
850 return ret
== return_positive();
853 DEFINE_TEST(test_leave_4
)
862 int n
= return_one() + return_one();
864 for(i
= return_zero(); i
< n
; ++ i
)
866 if(i
== return_one())
868 ret
= return_positive();
875 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
881 return ret
== return_positive();
884 DEFINE_TEST(test_leave_5
)
894 case 0: ret
= return_zero();
895 case 1: ret
= return_positive(); _SEH2_LEAVE
;
896 case 2: ret
= return_zero();
901 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
907 return ret
== return_positive();
910 DEFINE_TEST(test_leave_6
)
922 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
928 ret
= return_positive();
930 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
936 return ret
== return_positive();
940 /* _SEH2_YIELD() *///{{{
942 int test_yield_1_helper(void)
946 _SEH2_YIELD(return return_positive());
948 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
950 _SEH2_YIELD(return return_zero());
954 return return_zero();
957 DEFINE_TEST(test_yield_1
)
959 return test_yield_1_helper() == return_positive();
963 int test_yield_2_helper(void)
967 RaiseException(0xE00DEAD0, 0, 0, NULL
);
968 _SEH2_YIELD(return return_zero());
970 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
972 _SEH2_YIELD(return return_positive());
976 return return_zero();
979 DEFINE_TEST(test_yield_2
)
981 return test_yield_2_helper() == return_positive();
985 int test_yield_3_helper(void)
991 _SEH2_YIELD(return return_positive());
993 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
995 _SEH2_YIELD(return return_zero());
999 _SEH2_YIELD(return return_zero());
1001 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1003 _SEH2_YIELD(return return_zero());
1007 return return_zero();
1010 DEFINE_TEST(test_yield_3
)
1012 return test_yield_3_helper() == return_positive();
1016 int test_yield_4_helper(void)
1022 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1023 _SEH2_YIELD(return return_zero());
1025 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1027 _SEH2_YIELD(return return_positive());
1031 _SEH2_YIELD(return return_zero());
1033 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1035 _SEH2_YIELD(return return_zero());
1039 return return_zero();
1042 DEFINE_TEST(test_yield_4
)
1044 return test_yield_4_helper() == return_positive();
1047 static int test_yield_5_ret
;
1050 int test_yield_5_helper(void)
1052 test_yield_5_ret
= return_zero();
1056 _SEH2_YIELD(return return_positive());
1060 test_yield_5_ret
= return_positive();
1064 return return_zero();
1067 DEFINE_TEST(test_yield_5
)
1069 return test_yield_5_helper() == return_positive() && test_yield_5_ret
== return_positive();
1072 int test_yield_6_ret
;
1075 int test_yield_6_helper(void)
1077 test_yield_6_ret
= return_zero();
1083 _SEH2_YIELD(return return_positive());
1087 test_yield_6_ret
= return_positive();
1093 test_yield_6_ret
+= return_one();
1097 return return_zero();
1100 DEFINE_TEST(test_yield_6
)
1102 return test_yield_6_helper() == return_positive() && test_yield_6_ret
== return_positive() + return_one();
1106 /* Termination blocks *///{{{
1107 DEFINE_TEST(test_finally_1
)
1111 ret
= return_zero();
1115 ret
= return_arg(ret
);
1119 ret
= return_positive();
1123 return ret
== return_positive();
1126 DEFINE_TEST(test_finally_2
)
1130 ret
= return_zero();
1134 ret
= return_arg(ret
);
1139 ret
= return_positive();
1143 return ret
== return_positive();
1146 DEFINE_TEST(test_finally_3
)
1150 ret
= return_zero();
1154 ret
= return_arg(ret
);
1155 _SEH2_YIELD(goto leave
);
1159 ret
= return_positive();
1164 return ret
== return_positive();
1167 static int test_finally_4_ret
;
1169 static int test_finally_4_helper(void)
1171 test_finally_4_ret
= return_zero();
1175 test_finally_4_ret
= return_arg(test_finally_4_ret
);
1176 _SEH2_YIELD(return return_positive());
1180 test_finally_4_ret
= return_positive();
1184 return return_zero();
1187 DEFINE_TEST(test_finally_4
)
1189 return test_finally_4_helper() == return_positive() && test_finally_4_ret
;
1192 DEFINE_TEST(test_finally_5
)
1196 ret
= return_zero();
1202 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1203 ret
= return_zero();
1207 ret
= return_positive();
1211 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1213 ret
= return_arg(ret
);
1217 return ret
== return_positive();
1220 DEFINE_TEST(test_finally_6
)
1224 ret
= return_zero();
1230 ret
= return_arg(ret
);
1234 if(ret
== return_zero())
1235 ret
= return_positive();
1241 if(ret
== return_positive())
1242 ret
= return_positive() + return_one();
1246 return ret
== return_positive() + return_one();
1249 DEFINE_TEST(test_finally_7
)
1253 ret
= return_zero();
1259 ret
= return_arg(ret
);
1264 if(ret
== return_zero())
1265 ret
= return_positive();
1271 if(ret
== return_positive())
1272 ret
= return_positive() + return_one();
1276 return ret
== return_positive() + return_one();
1279 DEFINE_TEST(test_finally_8
)
1283 ret
= return_zero();
1289 ret
= return_arg(ret
);
1290 _SEH2_YIELD(goto leave
);
1294 if(ret
== return_zero())
1295 ret
= return_positive();
1301 if(ret
== return_positive())
1302 ret
= return_positive() + return_one();
1307 return ret
== return_positive() + return_one();
1310 static int test_finally_9_ret
;
1312 static int test_finally_9_helper(void)
1314 test_finally_9_ret
= return_zero();
1320 test_finally_9_ret
= return_arg(test_finally_9_ret
);
1321 _SEH2_YIELD(return return_positive());
1325 if(test_finally_9_ret
== return_zero())
1326 test_finally_9_ret
= return_positive();
1332 if(test_finally_9_ret
== return_positive())
1333 test_finally_9_ret
= return_positive() + return_one();
1337 return return_zero();
1340 DEFINE_TEST(test_finally_9
)
1342 return test_finally_9_helper() == return_positive() && test_finally_9_ret
== return_positive() + return_one();
1345 DEFINE_TEST(test_finally_10
)
1349 ret
= return_zero();
1357 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1358 ret
= return_zero();
1362 if(ret
== return_zero())
1363 ret
= return_positive();
1369 if(ret
== return_positive())
1370 ret
= return_positive() + return_one();
1374 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1376 ret
= return_arg(ret
);
1380 return ret
== return_positive() + return_one();
1383 DEFINE_TEST(test_finally_11
)
1387 ret
= return_zero();
1395 ret
= return_arg(ret
);
1397 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1399 ret
= return_zero();
1405 ret
= return_positive();
1406 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1407 ret
= return_zero();
1411 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1413 if(ret
== return_positive())
1414 ret
+= return_one();
1418 return ret
== return_positive() + return_one();
1421 DEFINE_TEST(test_finally_12
)
1425 ret
= return_zero();
1433 ret
= return_arg(ret
);
1437 ret
= return_positive();
1438 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1439 ret
= return_zero();
1445 if(ret
== return_positive())
1446 ret
+= return_one();
1450 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1452 if(ret
== return_positive() + return_one())
1453 ret
+= return_one();
1457 return ret
== return_positive() + return_one() + return_one();
1460 static int test_finally_13_ret
;
1463 void test_finally_13_helper(void)
1465 test_finally_13_ret
= return_zero();
1471 test_finally_13_ret
= return_positive();
1472 _SEH2_YIELD(return);
1473 test_finally_13_ret
= return_zero();
1477 if(test_finally_13_ret
== return_positive())
1478 test_finally_13_ret
+= return_one();
1484 if(test_finally_13_ret
== return_positive() + return_one())
1485 test_finally_13_ret
+= return_one();
1487 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1488 test_finally_13_ret
= return_zero();
1492 test_finally_13_ret
= return_zero();
1495 DEFINE_TEST(test_finally_13
)
1499 ret
= return_zero();
1503 ret
= return_arg(ret
);
1504 test_finally_13_helper();
1505 ret
= return_zero();
1507 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1509 ret
= return_positive();
1513 return ret
== return_positive() && test_finally_13_ret
== return_positive() + return_one() + return_one();
1516 static int test_finally_14_ret
;
1519 void test_finally_14_helper(void)
1521 test_finally_14_ret
= return_zero();
1529 test_finally_14_ret
= return_positive();
1530 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1531 test_finally_14_ret
= return_zero();
1535 if(test_finally_14_ret
== return_positive())
1536 test_finally_14_ret
+= return_one();
1542 if(test_finally_14_ret
== return_positive() + return_one())
1543 test_finally_14_ret
+= return_one();
1545 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1546 test_finally_14_ret
= return_zero();
1550 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1552 if(test_finally_14_ret
== return_positive() + return_one() + return_one())
1553 test_finally_14_ret
+= return_one();
1557 test_finally_14_ret
= return_arg(test_finally_14_ret
);
1560 DEFINE_TEST(test_finally_14
)
1564 ret
= return_zero();
1568 ret
= return_arg(ret
);
1569 test_finally_14_helper();
1570 ret
= return_positive();
1572 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1574 ret
= return_zero();
1578 return ret
== return_positive() && test_finally_14_ret
== return_positive() + return_one() + return_one() + return_one();
1582 /* _SEH2_GetExceptionInformation() *///{{{
1584 int verify_xpointers(struct _EXCEPTION_POINTERS
* ep
, DWORD code
, DWORD flags
, DWORD argc
, const ULONG_PTR
* argv
, int * ret
, int filter
)
1588 ep
->ExceptionRecord
&&
1589 ep
->ContextRecord
&&
1590 ep
->ExceptionRecord
->ExceptionCode
== code
&&
1591 ep
->ExceptionRecord
->ExceptionFlags
== flags
&&
1592 ep
->ExceptionRecord
->NumberParameters
== argc
&&
1594 memcmp(ep
->ExceptionRecord
->ExceptionInformation
, argv
, sizeof(argv
[0]) * argc
) == 0;
1597 *ret
= return_positive();
1602 DEFINE_TEST(test_xpointers_1
)
1606 ret
= return_zero();
1610 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1612 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 0, NULL
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1614 ret
= return_arg(ret
);
1618 return ret
== return_positive();
1621 DEFINE_TEST(test_xpointers_2
)
1625 ret
= return_zero();
1629 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, NULL
);
1631 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, NULL
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1633 ret
= return_arg(ret
);
1637 return ret
== return_positive();
1640 DEFINE_TEST(test_xpointers_3
)
1643 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1645 ret
= return_zero();
1649 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, args
);
1651 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, args
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1653 ret
= return_arg(ret
);
1657 return ret
== return_positive();
1660 DEFINE_TEST(test_xpointers_4
)
1663 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1665 ret
= return_zero();
1669 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 1, args
);
1671 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 1, args
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1673 ret
= return_arg(ret
);
1677 return ret
== return_positive();
1680 DEFINE_TEST(test_xpointers_5
)
1683 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1685 ret
= return_zero();
1689 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 2, args
);
1691 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 2, args
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1693 ret
= return_arg(ret
);
1697 return ret
== return_positive();
1700 DEFINE_TEST(test_xpointers_6
)
1703 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1705 ret
= return_zero();
1709 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 3, args
);
1711 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 3, args
, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1713 ret
= return_arg(ret
);
1717 return ret
== return_positive();
1720 DEFINE_TEST(test_xpointers_7
)
1724 ret
= return_zero();
1728 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1729 ret
= return_arg(ret
);
1731 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 0, NULL
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1733 ret
= return_zero();
1737 return ret
== return_positive();
1740 DEFINE_TEST(test_xpointers_8
)
1743 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1745 ret
= return_zero();
1749 RaiseException(0xE00DEAD0, 0, 0, args
);
1750 ret
= return_arg(ret
);
1752 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 0, args
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1754 ret
= return_zero();
1758 return ret
== return_positive();
1761 DEFINE_TEST(test_xpointers_9
)
1764 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1766 ret
= return_zero();
1770 RaiseException(0xE00DEAD0, 0, 1, args
);
1771 ret
= return_arg(ret
);
1773 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 1, args
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1775 ret
= return_zero();
1779 return ret
== return_positive();
1782 DEFINE_TEST(test_xpointers_10
)
1785 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1787 ret
= return_zero();
1791 RaiseException(0xE00DEAD0, 0, 2, args
);
1792 ret
= return_arg(ret
);
1794 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 2, args
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1796 ret
= return_zero();
1800 return ret
== return_positive();
1803 DEFINE_TEST(test_xpointers_11
)
1806 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1808 ret
= return_zero();
1812 RaiseException(0xE00DEAD0, 0, 3, args
);
1813 ret
= return_arg(ret
);
1815 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, 0, 3, args
, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
1817 ret
= return_zero();
1821 return ret
== return_positive();
1824 DEFINE_TEST(test_xpointers_12
)
1828 ret
= return_zero();
1834 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, NULL
);
1836 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, NULL
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1838 ret
= return_zero();
1842 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1844 ret
= return_arg(ret
);
1848 return ret
== return_positive();
1851 DEFINE_TEST(test_xpointers_13
)
1854 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1856 ret
= return_zero();
1862 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, args
);
1864 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 0, args
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1866 ret
= return_zero();
1870 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1872 ret
= return_arg(ret
);
1876 return ret
== return_positive();
1879 DEFINE_TEST(test_xpointers_14
)
1882 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1884 ret
= return_zero();
1890 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 1, args
);
1892 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 1, args
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1894 ret
= return_zero();
1898 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1900 ret
= return_arg(ret
);
1904 return ret
== return_positive();
1907 DEFINE_TEST(test_xpointers_15
)
1910 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1912 ret
= return_zero();
1918 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 2, args
);
1920 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 2, args
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1922 ret
= return_zero();
1926 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1928 ret
= return_arg(ret
);
1932 return ret
== return_positive();
1935 DEFINE_TEST(test_xpointers_16
)
1938 static const ULONG_PTR args
[] = { 1, 2, 12345 };
1940 ret
= return_zero();
1946 RaiseException(0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 3, args
);
1948 _SEH2_EXCEPT(verify_xpointers(_SEH2_GetExceptionInformation(), 0xE00DEAD0, EXCEPTION_NONCONTINUABLE
, 3, args
, &ret
, EXCEPTION_CONTINUE_SEARCH
))
1950 ret
= return_zero();
1954 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
1956 ret
= return_arg(ret
);
1960 return ret
== return_positive();
1964 /* _SEH2_GetExceptionCode() *///{{{
1966 int verify_xcode(int code
, int xcode
, int * ret
, int filter
)
1968 *ret
= code
== xcode
;
1971 *ret
= return_positive();
1976 DEFINE_TEST(test_xcode_1
)
1980 ret
= return_zero();
1984 RaiseException(0xE00DEAD0, 0, 0, NULL
);
1985 ret
= return_zero();
1987 _SEH2_EXCEPT(verify_xcode(_SEH2_GetExceptionCode(), 0xE00DEAD0, &ret
, EXCEPTION_EXECUTE_HANDLER
))
1989 ret
= return_arg(ret
);
1993 return ret
== return_positive();
1996 DEFINE_TEST(test_xcode_2
)
2000 ret
= return_zero();
2004 RaiseException(0xE00DEAD0, 0, 0, NULL
);
2005 ret
= return_arg(ret
);
2007 _SEH2_EXCEPT(verify_xcode(_SEH2_GetExceptionCode(), 0xE00DEAD0, &ret
, EXCEPTION_CONTINUE_EXECUTION
))
2009 ret
= return_zero();
2013 return ret
== return_positive();
2016 DEFINE_TEST(test_xcode_3
)
2020 ret
= return_zero();
2026 RaiseException(0xE00DEAD0, 0, 0, NULL
);
2027 ret
= return_zero();
2029 _SEH2_EXCEPT(verify_xcode(_SEH2_GetExceptionCode(), 0xE00DEAD0, &ret
, EXCEPTION_CONTINUE_SEARCH
))
2031 ret
= return_zero();
2035 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2037 ret
= return_arg(ret
);
2041 return ret
== return_positive();
2045 /* _SEH2_AbnormalTermination() *///{{{
2046 DEFINE_TEST(test_abnorm_1
)
2050 ret
= return_zero();
2054 ret
= return_arg(ret
);
2058 ret
= _SEH2_AbnormalTermination() ? return_zero() : return_positive();
2062 return ret
== return_positive();
2065 DEFINE_TEST(test_abnorm_2
)
2069 ret
= return_zero();
2077 ret
= _SEH2_AbnormalTermination() ? return_zero() : return_positive();
2081 return ret
== return_positive();
2084 DEFINE_TEST(test_abnorm_3
)
2088 ret
= return_zero();
2092 _SEH2_YIELD(goto leave
);
2096 ret
= _SEH2_AbnormalTermination() ? return_positive() : return_zero();
2101 return ret
== return_positive();
2104 DEFINE_TEST(test_abnorm_4
)
2108 ret
= return_zero();
2114 RaiseException(0xE00DEAD0, 0, 0, NULL
);
2115 ret
= return_zero();
2119 ret
= _SEH2_AbnormalTermination() ? return_positive() : return_zero();
2123 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2125 ret
= return_arg(ret
);
2129 return ret
== return_positive();
2132 DEFINE_TEST(test_abnorm_5
)
2136 ret
= return_zero();
2142 ret
= return_arg(ret
);
2146 ret
= _SEH2_AbnormalTermination() ? return_zero() : return_positive();
2152 ret
= ret
== return_positive() && !_SEH2_AbnormalTermination() ? return_positive() + return_one() : ret
;
2156 return ret
== return_positive() + return_one();
2159 DEFINE_TEST(test_abnorm_6
)
2163 ret
= return_zero();
2173 ret
= _SEH2_AbnormalTermination() ? return_zero() : return_positive();
2179 ret
= ret
== return_positive() && !_SEH2_AbnormalTermination() ? return_positive() + return_one() : ret
;
2183 return ret
== return_positive() + return_one();
2186 DEFINE_TEST(test_abnorm_7
)
2190 ret
= return_zero();
2196 _SEH2_YIELD(goto leave
);
2200 ret
= _SEH2_AbnormalTermination() ? return_positive() : return_zero();
2206 ret
= ret
== return_positive() && _SEH2_AbnormalTermination() ? return_positive() + return_one() : ret
;
2211 return ret
== return_positive() + return_one();
2214 DEFINE_TEST(test_abnorm_8
)
2218 ret
= return_zero();
2226 RaiseException(0xE00DEAD0, 0, 0, NULL
);
2227 ret
= return_zero();
2231 ret
= _SEH2_AbnormalTermination() ? return_positive() : return_zero();
2237 ret
= ret
== return_positive() && _SEH2_AbnormalTermination() ? return_positive() + return_one() : ret
;
2241 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2243 ret
= return_arg(ret
);
2247 return ret
== return_positive() + return_one();
2251 /* Use of local variables from _SEH2_EXCEPT(...) and _SEH2_FINALLY { ... } *///{{{
2252 DEFINE_TEST(test_nested_locals_1
)
2254 int var1
= return_one();
2258 RaiseException(0xE00DEAD0, 0, 0, 0);
2260 _SEH2_EXCEPT((var1
= (var1
== return_one() ? return_positive() : var1
)), EXCEPTION_EXECUTE_HANDLER
)
2262 if(var1
== return_positive())
2263 var1
= return_positive() + 1;
2267 return var1
== return_positive() + 1;
2270 DEFINE_TEST(test_nested_locals_2
)
2272 int var1
= return_positive();
2279 if(var1
== return_positive())
2280 var1
= return_positive() + 1;
2284 return var1
== return_positive() + 1;
2287 DEFINE_TEST(test_nested_locals_3
)
2289 int var1
= return_zero();
2295 var1
= return_one();
2296 RaiseException(0xE00DEAD0, 0, 0, 0);
2300 if(var1
== return_one())
2301 var1
= return_positive();
2305 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2307 if(var1
== return_positive())
2308 var1
= return_positive() + 1;
2312 return var1
== return_positive() + 1;
2316 /* System support *///{{{
2320 /* CPU faults *///{{{
2324 /* Past bugs, to detect regressions *///{{{
2325 /* #4004: volatile registers clobbered when catching across frames (originally misreported) *///{{{
2327 void test_bug_4004_helper_1(void)
2331 i1
= return_positive();
2332 i2
= return_positive();
2333 i3
= return_positive();
2334 (void)return_arg(i1
+ i2
+ i3
);
2338 RaiseException(0xE00DEAD0, 0, 0, NULL
);
2347 void test_bug_4004_helper_2(void)
2351 test_bug_4004_helper_1();
2353 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2359 DEFINE_TEST(test_bug_4004
)
2363 i1
= return_positive();
2364 i2
= return_positive();
2365 i3
= return_positive();
2367 test_bug_4004_helper_2();
2369 return return_arg(i1
) + return_arg(i2
) + return_arg(i3
) == return_positive() * 3;
2374 DEFINE_TEST(test_bug_4663
)
2378 i1
= return_positive();
2379 i2
= return_positive();
2385 RaiseException(0xE00DEAD0, 0, 0, 0);
2387 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2389 if (i1
== return_positive())
2391 i1
= return_positive() + 1;
2396 if (i1
== return_positive() + 1)
2398 i1
= return_negative();
2399 RaiseException(0xE00DEAD0, 0, 0, 0);
2402 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2404 i2
= return_negative();
2408 return ((i1
== return_negative()) && (i2
== return_negative()));
2413 DEFINE_TEST(test_unvolatile
)
2420 *((char*)0xc0000000) = 0;
2422 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2431 DEFINE_TEST(test_unvolatile_2
)
2438 *((char*)0xc0000000) = 0;
2441 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2447 return (val
== 3) || (val
== 4) || (val
== 5);
2450 /* This test is mainly for documentation purpose. As can be seen it doesn't
2451 provide a satisfying result. In fact the compiler could do even more
2452 crazy things like reusing val1 between the assignment to 0 and the last
2453 assignment to 3. This DOES happen with C++ and it's NOT a PSEH bug, but
2454 rather an unavoidable consequence of how the compiler works.
2455 The conclusion: Do not use assignments to a variable inside a __try block
2456 that is being used later inside the __except block, unless it is declared
2459 DEFINE_TEST(test_unvolatile_3
)
2461 register int val1
= 0, val2
= 0;
2470 *((char*)0xc0000000) = 0;
2473 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2480 *((int*)0xc0000000) = 1;
2483 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2489 /* The expected case */
2490 if ((val1
== 10) && (val2
== 5))
2493 /* The compiler can optimize away "val1 = 1" and "val1 = 2" and
2494 only use the last "val1 = 3", in this case val1 is still 0
2495 when the outer exception handler kicks in */
2496 if ((val1
== 0) && (val2
== 5))
2499 /* Same as above, but this time val2 optimized away */
2500 if (((val1
== 8) && (val2
== 4)) ||
2501 ((val1
== 0) && (val2
== 4)))
2506 #endif // __cplusplus
2508 DEFINE_TEST(test_unvolatile_4
)
2510 unsigned result
= 0xdeadbeef;
2514 *(char*)0x80000000 = 1;
2516 _SEH2_EXCEPT(result
== 0xdeadbeef)
2522 result
= (result
== 0xdeadbeef) ? 0 : result
+ 1;
2527 DEFINE_TEST(test_finally_goto
)
2529 volatile int val
= 0;
2542 *((char*)0xdeadc0de) = 0;
2550 *((char*)0xdeadc0de) = 0;
2559 return (val
== (128|4|2|1));
2562 DEFINE_TEST(test_nested_exception
)
2564 volatile int val
= 0;
2572 *((char*)0xdeadc0de) = 0;
2578 *((char*)0xdeadc0de) = 0;
2584 *((char*)0xdeadc0de) = 0;
2593 return (val
== (1|2|8|128));
2597 LONG WINAPI
unhandled_exception(PEXCEPTION_POINTERS ExceptionInfo
)
2599 trace("unhandled exception %08lX thrown from %p\n", ExceptionInfo
->ExceptionRecord
->ExceptionCode
, ExceptionInfo
->ExceptionRecord
->ExceptionAddress
);
2600 return EXCEPTION_CONTINUE_SEARCH
;
2603 #if defined(_M_IX86)
2604 struct volatile_context
2613 struct volatile_context
2621 int sanity_check(int ret
, struct volatile_context
* before
, struct volatile_context
* after
)
2623 if(ret
&& memcmp(before
, after
, sizeof(*before
)))
2625 trace("volatile context corrupted\n");
2634 int passthrough_handler(struct _EXCEPTION_RECORD
* e
, void * f
, struct _CONTEXT
* c
, void * d
)
2636 return ExceptionContinueSearch
;
2642 int call_test(int (* func
)(void))
2645 static struct volatile_context before
, after
;
2646 static LPTOP_LEVEL_EXCEPTION_FILTER prev_unhandled_exception
;
2648 static _SEH2Registration_t
* prev_frame
;
2649 _SEH2Registration_t passthrough_frame
;
2652 prev_unhandled_exception
= SetUnhandledExceptionFilter(&unhandled_exception
);
2654 #if defined(_X86_) && !defined(_PSEH3_H_)
2655 prev_frame
= (_SEH2Registration_t
*)__readfsdword(0);
2656 passthrough_frame
.SER_Prev
= prev_frame
;
2657 passthrough_frame
.SER_Handler
= passthrough_handler
;
2658 __writefsdword(0, (unsigned long)&passthrough_frame
);
2661 #if defined(__GNUC__) && defined(__i386__)
2662 __asm__ __volatile__
2664 "mov %%esp, 0x00 + %c[before]\n"
2665 "mov %%ebp, 0x04 + %c[before]\n"
2666 "mov %%ebx, 0x08 + %c[before]\n"
2667 "mov %%esi, 0x0c + %c[before]\n"
2668 "mov %%edi, 0x10 + %c[before]\n"
2670 "mov %%esp, 0x00 + %c[after]\n"
2671 "mov %%ebp, 0x04 + %c[after]\n"
2672 "mov %%ebx, 0x08 + %c[after]\n"
2673 "mov %%esi, 0x0c + %c[after]\n"
2674 "mov %%edi, 0x10 + %c[after]\n"
2678 "call %c[sanity_check]\n"
2683 [test
] "r" (func
), [before
] "i" (&before
), [after
] "i" (&after
), [sanity_check
] "i" (&sanity_check
) :
2684 "ebx", "ecx", "edx", "esi", "edi", "flags", "memory"
2690 #if defined(_X86_) && !defined(_PSEH3_H_)
2691 if((_SEH2Registration_t
*)__readfsdword(0) != &passthrough_frame
|| passthrough_frame
.SER_Prev
!= prev_frame
)
2693 trace("exception registration list corrupted\n");
2697 __writefsdword(0, (unsigned long)prev_frame
);
2700 SetUnhandledExceptionFilter(prev_unhandled_exception
);
2704 DEFINE_TEST(test_PSEH3_bug
)
2706 volatile int count
= 0;
2713 *(volatile int*)0x12345678 = 0x12345678;
2716 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2723 return (count
== 1);
2727 use_lots_of_stack(void)
2730 volatile int arr
[512];
2731 for (i
= 0; i
< 512; i
++)
2736 DEFINE_TEST(test_PSEH3_bug2
)
2738 unsigned long status
= 0;
2741 *(volatile int*)0x12345678 = 0x12345678;
2743 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
2745 use_lots_of_stack();
2746 status
= _SEH2_GetExceptionCode();
2750 return (status
== STATUS_ACCESS_VIOLATION
);
2753 #define USE_TEST_NAME_(NAME_) # NAME_
2754 #define USE_TEST_NAME(NAME_) USE_TEST_NAME_(NAME_)
2755 #define USE_TEST(NAME_) { USE_TEST_NAME(NAME_), NAME_ }
2763 void testsuite_syntax(void)
2765 const struct subtest testsuite
[] =
2767 USE_TEST(test_empty_1
),
2768 USE_TEST(test_empty_2
),
2769 USE_TEST(test_empty_3
),
2770 USE_TEST(test_empty_4
),
2771 USE_TEST(test_empty_5
),
2772 USE_TEST(test_empty_6
),
2773 USE_TEST(test_empty_7
),
2774 USE_TEST(test_empty_8
),
2776 USE_TEST(test_execute_handler_1
),
2777 USE_TEST(test_continue_execution_1
),
2778 USE_TEST(test_continue_search_1
),
2779 USE_TEST(test_execute_handler_2
),
2780 USE_TEST(test_continue_execution_2
),
2782 USE_TEST(test_execute_handler_3
),
2783 USE_TEST(test_continue_execution_3
),
2784 USE_TEST(test_continue_search_2
),
2785 USE_TEST(test_execute_handler_4
),
2786 USE_TEST(test_continue_execution_4
),
2788 USE_TEST(test_execute_handler_5
),
2789 USE_TEST(test_continue_execution_5
),
2790 USE_TEST(test_continue_search_3
),
2791 USE_TEST(test_execute_handler_6
),
2792 USE_TEST(test_continue_execution_6
),
2794 USE_TEST(test_execute_handler_7
),
2795 USE_TEST(test_continue_execution_7
),
2796 USE_TEST(test_continue_search_4
),
2797 USE_TEST(test_execute_handler_8
),
2798 USE_TEST(test_continue_execution_8
),
2800 USE_TEST(test_execute_handler_9
),
2801 USE_TEST(test_continue_execution_9
),
2802 USE_TEST(test_continue_search_5
),
2803 USE_TEST(test_execute_handler_10
),
2804 USE_TEST(test_continue_execution_10
),
2806 USE_TEST(test_execute_handler_11
),
2807 USE_TEST(test_continue_execution_11
),
2808 USE_TEST(test_continue_search_6
),
2809 USE_TEST(test_execute_handler_12
),
2810 USE_TEST(test_continue_execution_12
),
2812 USE_TEST(test_leave_1
),
2813 USE_TEST(test_leave_2
),
2814 USE_TEST(test_leave_3
),
2815 USE_TEST(test_leave_4
),
2816 USE_TEST(test_leave_5
),
2817 USE_TEST(test_leave_6
),
2819 USE_TEST(test_yield_1
),
2820 USE_TEST(test_yield_2
),
2821 USE_TEST(test_yield_3
),
2822 USE_TEST(test_yield_4
),
2823 USE_TEST(test_yield_5
),
2824 USE_TEST(test_yield_6
),
2826 USE_TEST(test_finally_1
),
2827 USE_TEST(test_finally_2
),
2828 USE_TEST(test_finally_3
),
2829 USE_TEST(test_finally_4
),
2830 USE_TEST(test_finally_5
),
2831 USE_TEST(test_finally_6
),
2832 USE_TEST(test_finally_7
),
2833 USE_TEST(test_finally_8
),
2834 USE_TEST(test_finally_9
),
2835 USE_TEST(test_finally_10
),
2836 USE_TEST(test_finally_11
),
2837 USE_TEST(test_finally_12
),
2838 USE_TEST(test_finally_13
),
2839 USE_TEST(test_finally_14
),
2841 USE_TEST(test_xpointers_1
),
2842 USE_TEST(test_xpointers_2
),
2843 USE_TEST(test_xpointers_3
),
2844 USE_TEST(test_xpointers_4
),
2845 USE_TEST(test_xpointers_5
),
2846 USE_TEST(test_xpointers_6
),
2847 USE_TEST(test_xpointers_7
),
2848 USE_TEST(test_xpointers_8
),
2849 USE_TEST(test_xpointers_9
),
2850 USE_TEST(test_xpointers_10
),
2851 USE_TEST(test_xpointers_11
),
2852 USE_TEST(test_xpointers_12
),
2853 USE_TEST(test_xpointers_13
),
2854 USE_TEST(test_xpointers_14
),
2855 USE_TEST(test_xpointers_15
),
2856 USE_TEST(test_xpointers_16
),
2858 USE_TEST(test_xcode_1
),
2859 USE_TEST(test_xcode_2
),
2860 USE_TEST(test_xcode_3
),
2862 USE_TEST(test_abnorm_1
),
2863 USE_TEST(test_abnorm_2
),
2864 USE_TEST(test_abnorm_3
),
2865 USE_TEST(test_abnorm_4
),
2866 USE_TEST(test_abnorm_5
),
2867 USE_TEST(test_abnorm_6
),
2868 USE_TEST(test_abnorm_7
),
2869 USE_TEST(test_abnorm_8
),
2871 USE_TEST(test_nested_locals_1
),
2872 USE_TEST(test_nested_locals_2
),
2873 USE_TEST(test_nested_locals_3
),
2875 USE_TEST(test_bug_4004
),
2876 USE_TEST(test_bug_4663
),
2878 USE_TEST(test_unvolatile
),
2879 USE_TEST(test_unvolatile_2
),
2881 USE_TEST(test_unvolatile_3
),
2883 USE_TEST(test_unvolatile_4
),
2884 USE_TEST(test_finally_goto
),
2885 USE_TEST(test_nested_exception
),
2886 USE_TEST(test_PSEH3_bug
),
2887 USE_TEST(test_PSEH3_bug2
),
2892 for(i
= 0; i
< sizeof(testsuite
) / sizeof(testsuite
[0]); ++ i
)
2893 ok(call_test(testsuite
[i
].func
), "%s failed\n", testsuite
[i
].name
);
2896 const struct test winetest_testlist
[] = {
2897 { "pseh2_syntax", testsuite_syntax
},