Author: tkreuzer
Date: Sun Dec 30 13:35:30 2012
New Revision: 58056
URL:
http://svn.reactos.org/svn/reactos?rev=58056&view=rev
Log:
[PSEH2_TEST]
Fix build with PSEH3
Modified:
trunk/rostests/tests/pseh2/psehtest.c
Modified: trunk/rostests/tests/pseh2/psehtest.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/tests/pseh2/psehtest.c?re…
==============================================================================
--- trunk/rostests/tests/pseh2/psehtest.c [iso-8859-1] (original)
+++ trunk/rostests/tests/pseh2/psehtest.c [iso-8859-1] Sun Dec 30 13:35:30 2012
@@ -2410,6 +2410,112 @@
//}}}
//}}}
+DEFINE_TEST(test_unvolatile)
+{
+ int val = 0;
+
+ _SEH2_TRY
+ {
+ val = return_one();
+ *((char*)0xc0000000) = 0;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ val = val + 3;
+ }
+ _SEH2_END;
+
+ return (val == 4);
+}
+
+DEFINE_TEST(test_unvolatile_2)
+{
+ int val = 0;
+
+ _SEH2_TRY
+ {
+ val = 1;
+ *((char*)0xc0000000) = 0;
+ val = 2;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ val = val + 3;
+ }
+ _SEH2_END;
+
+ return (val == 3) || (val == 4) || (val == 5);
+}
+
+DEFINE_TEST(test_finally_goto)
+{
+ volatile int val = 0;
+
+ _SEH2_TRY
+ {
+ val |= 1;
+ _SEH2_TRY
+ {
+ val |= 2;
+ goto next;
+ }
+ _SEH2_FINALLY
+ {
+ val |= 4;
+ *((char*)0xdeadc0de) = 0;
+ val |= 8;
+ }
+ _SEH2_END;
+
+ val |= 16;
+next:
+ val |= 32;
+ *((char*)0xdeadc0de) = 0;
+ val |= 64;
+ }
+ _SEH2_EXCEPT(1)
+ {
+ val |= 128;
+ }
+ _SEH2_END;
+
+ return (val == (128|4|2|1));
+}
+
+DEFINE_TEST(test_nested_exception)
+{
+ volatile int val = 0;
+
+ _SEH2_TRY
+ {
+ val |= 1;
+ _SEH2_TRY
+ {
+ val |= 2;
+ *((char*)0xdeadc0de) = 0;
+ val |= 4;
+ }
+ _SEH2_EXCEPT(1)
+ {
+ val |= 8;
+ *((char*)0xdeadc0de) = 0;
+ val |= 16;
+ }
+ _SEH2_END;
+
+ val |= 32;
+ *((char*)0xdeadc0de) = 0;
+ val |= 64;
+ }
+ _SEH2_EXCEPT(1)
+ {
+ val |= 128;
+ }
+ _SEH2_END;
+
+ return (val == (1|2|8|128));
+}
+
static
LONG WINAPI unhandled_exception(PEXCEPTION_POINTERS ExceptionInfo)
{
@@ -2446,11 +2552,13 @@
return ret;
}
+#ifndef _PSEH3_H_
static
int passthrough_handler(struct _EXCEPTION_RECORD * e, void * f, struct _CONTEXT * c, void
* d)
{
return ExceptionContinueSearch;
}
+#endif
static
DECLSPEC_NOINLINE
@@ -2459,12 +2567,14 @@
static int ret;
static struct volatile_context before, after;
static LPTOP_LEVEL_EXCEPTION_FILTER prev_unhandled_exception;
+#ifndef _PSEH3_H_
static _SEH2Registration_t * prev_frame;
_SEH2Registration_t passthrough_frame;
+#endif
prev_unhandled_exception = SetUnhandledExceptionFilter(&unhandled_exception);
-#if defined(_X86_)
+#if defined(_X86_) && !defined(_PSEH3_H_)
prev_frame = (_SEH2Registration_t *)__readfsdword(0);
passthrough_frame.SER_Prev = prev_frame;
passthrough_frame.SER_Handler = passthrough_handler;
@@ -2500,7 +2610,7 @@
ret = func();
#endif
-#if defined(_X86_)
+#if defined(_X86_) && !defined(_PSEH3_H_)
if((_SEH2Registration_t *)__readfsdword(0) != &passthrough_frame ||
passthrough_frame.SER_Prev != prev_frame)
{
trace("exception registration list corrupted\n");
@@ -2638,6 +2748,11 @@
USE_TEST(test_bug_4004),
USE_TEST(test_bug_4663),
+
+ USE_TEST(test_unvolatile),
+ USE_TEST(test_unvolatile_2),
+ USE_TEST(test_finally_goto),
+ USE_TEST(test_nested_exception),
};
size_t i;