mirror of
https://github.com/reactos/reactos.git
synced 2025-06-24 03:30:25 +00:00
modified tests/pseh2/psehtest.c
Test case for bug #4663 (still unsolved) New sanity check for correct unlinking of the frame. !!!EIGHTY TESTS OUT OF NINETY-THREE CURRENTLY FAIL THIS!!! svn path=/trunk/; revision=41810
This commit is contained in:
parent
24fe0f5f8c
commit
dfccee750d
1 changed files with 71 additions and 0 deletions
|
@ -2304,6 +2304,45 @@ DEFINE_TEST(test_bug_4004)
|
||||||
return return_arg(i1) + return_arg(i2) + return_arg(i3) == return_positive() * 3;
|
return return_arg(i1) + return_arg(i2) + return_arg(i3) == return_positive() * 3;
|
||||||
}
|
}
|
||||||
//}}}
|
//}}}
|
||||||
|
|
||||||
|
/* #4663: *///{{{
|
||||||
|
DEFINE_TEST(test_bug_4663)
|
||||||
|
{
|
||||||
|
int i1, i2;
|
||||||
|
|
||||||
|
i1 = return_zero();
|
||||||
|
i2 = return_zero();
|
||||||
|
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
RaiseException(0xE00DEAD0, 0, 0, NULL);
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
if (i1 == return_zero())
|
||||||
|
{
|
||||||
|
i1 = return_one();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
|
||||||
|
if (i1 == return_one())
|
||||||
|
{
|
||||||
|
i1 = return_minusone();
|
||||||
|
RaiseException(0xE00DEAD0, 0, 0, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
i2 = return_one();
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
|
||||||
|
return ((i1 == return_minusone()) && (i2 == return_one()));
|
||||||
|
}
|
||||||
|
//}}}
|
||||||
//}}}
|
//}}}
|
||||||
|
|
||||||
static
|
static
|
||||||
|
@ -2334,11 +2373,20 @@ DECLSPEC_NOINLINE
|
||||||
int sanity_check(int ret, struct volatile_context * before, struct volatile_context * after)
|
int sanity_check(int ret, struct volatile_context * before, struct volatile_context * after)
|
||||||
{
|
{
|
||||||
if(ret && memcmp(before, after, sizeof(before)))
|
if(ret && memcmp(before, after, sizeof(before)))
|
||||||
|
{
|
||||||
ok(0, "volatile context corrupted\n");
|
ok(0, "volatile context corrupted\n");
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int passthrough_handler(struct _EXCEPTION_RECORD * e, void * f, struct _CONTEXT * c, void * d)
|
||||||
|
{
|
||||||
|
return ExceptionContinueSearch;
|
||||||
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
DECLSPEC_NOINLINE
|
DECLSPEC_NOINLINE
|
||||||
int call_test(int (* func)(void))
|
int call_test(int (* func)(void))
|
||||||
|
@ -2346,9 +2394,18 @@ int call_test(int (* func)(void))
|
||||||
static int ret;
|
static int ret;
|
||||||
static struct volatile_context before, after;
|
static struct volatile_context before, after;
|
||||||
static LPTOP_LEVEL_EXCEPTION_FILTER prev_unhandled_exception;
|
static LPTOP_LEVEL_EXCEPTION_FILTER prev_unhandled_exception;
|
||||||
|
static _SEH2Registration_t * prev_frame;
|
||||||
|
_SEH2Registration_t passthrough_frame;
|
||||||
|
|
||||||
prev_unhandled_exception = SetUnhandledExceptionFilter(&unhandled_exception);
|
prev_unhandled_exception = SetUnhandledExceptionFilter(&unhandled_exception);
|
||||||
|
|
||||||
|
#if defined(_X86_)
|
||||||
|
prev_frame = (_SEH2Registration_t *)__readfsdword(0);
|
||||||
|
passthrough_frame.SER_Prev = prev_frame;
|
||||||
|
passthrough_frame.SER_Handler = passthrough_handler;
|
||||||
|
__writefsdword(0, (unsigned long)&passthrough_frame);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__GNUC__) && defined(__i386__)
|
#if defined(__GNUC__) && defined(__i386__)
|
||||||
__asm__ __volatile__
|
__asm__ __volatile__
|
||||||
(
|
(
|
||||||
|
@ -2378,6 +2435,16 @@ int call_test(int (* func)(void))
|
||||||
ret = func();
|
ret = func();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(_X86_)
|
||||||
|
if((_SEH2Registration_t *)__readfsdword(0) != &passthrough_frame || passthrough_frame.SER_Prev != prev_frame)
|
||||||
|
{
|
||||||
|
ok(0, "exception registration list corrupted\n");
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
__writefsdword(0, (unsigned long)prev_frame);
|
||||||
|
#endif
|
||||||
|
|
||||||
SetUnhandledExceptionFilter(prev_unhandled_exception);
|
SetUnhandledExceptionFilter(prev_unhandled_exception);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -2501,12 +2568,16 @@ void testsuite_syntax(void)
|
||||||
USE_TEST(test_abnorm_8),
|
USE_TEST(test_abnorm_8),
|
||||||
|
|
||||||
USE_TEST(test_bug_4004),
|
USE_TEST(test_bug_4004),
|
||||||
|
USE_TEST(test_bug_4663),
|
||||||
};
|
};
|
||||||
|
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
for(i = 0; i < sizeof(testsuite) / sizeof(testsuite[0]); ++ i)
|
for(i = 0; i < sizeof(testsuite) / sizeof(testsuite[0]); ++ i)
|
||||||
|
{
|
||||||
|
//printf("%s\n", testsuite[i].name);
|
||||||
ok(call_test(testsuite[i].func), "%s failed\n", testsuite[i].name);
|
ok(call_test(testsuite[i].func), "%s failed\n", testsuite[i].name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct test winetest_testlist[] = {
|
const struct test winetest_testlist[] = {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue