mirror of
https://github.com/reactos/reactos.git
synced 2025-07-31 12:02:02 +00:00
[COMPILER_APITEST] More SEH tests
This commit is contained in:
parent
cfb579dd67
commit
6d2eb03402
1 changed files with 162 additions and 0 deletions
|
@ -26,6 +26,12 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(_M_IX86) && !defined(_MSC_VER)
|
||||||
|
#define todo_pseh todo_if(1)
|
||||||
|
#else
|
||||||
|
#define todo_pseh
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <wine/test.h>
|
#include <wine/test.h>
|
||||||
#undef subtest
|
#undef subtest
|
||||||
|
|
||||||
|
@ -2765,8 +2771,164 @@ struct subtest
|
||||||
int (* func)(void);
|
int (* func)(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef _M_IX86
|
||||||
|
|
||||||
|
typedef struct _SCOPETABLE_ENTRY
|
||||||
|
{
|
||||||
|
unsigned long EnclosingLevel;
|
||||||
|
void* FilterFunc;
|
||||||
|
void* HandlerFunc;
|
||||||
|
} SCOPETABLE_ENTRY, *PSCOPETABLE_ENTRY;
|
||||||
|
|
||||||
|
typedef struct _EH3_EXCEPTION_REGISTRATION
|
||||||
|
{
|
||||||
|
struct _EH3_EXCEPTION_REGISTRATION *Next;
|
||||||
|
void* ExceptionHandler;
|
||||||
|
PSCOPETABLE_ENTRY ScopeTable;
|
||||||
|
unsigned long TryLevel;
|
||||||
|
} EH3_EXCEPTION_REGISTRATION, *PEH3_EXCEPTION_REGISTRATION;
|
||||||
|
|
||||||
|
#define okx(x) ok(x, #x "\n")
|
||||||
|
|
||||||
|
DECLSPEC_NOINLINE
|
||||||
|
static void Test_structs_no_seh(void)
|
||||||
|
{
|
||||||
|
PEH3_EXCEPTION_REGISTRATION EH3Registration = (PEH3_EXCEPTION_REGISTRATION)__readfsdword(0);
|
||||||
|
|
||||||
|
/* We should always have 2 exception registrations */
|
||||||
|
okx(EH3Registration != NULL);
|
||||||
|
todo_ros okx(EH3Registration->Next != (PVOID)0xFFFFFFFF);
|
||||||
|
okx(EH3Registration->ExceptionHandler != NULL);
|
||||||
|
okx(EH3Registration->ScopeTable != NULL);
|
||||||
|
okx(EH3Registration->TryLevel == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXTERN_C
|
||||||
|
void
|
||||||
|
__cdecl
|
||||||
|
_except_handler3(
|
||||||
|
PEXCEPTION_RECORD rec,
|
||||||
|
PEH3_EXCEPTION_REGISTRATION* frame,
|
||||||
|
PCONTEXT context,
|
||||||
|
void* dispatcher);
|
||||||
|
|
||||||
|
DECLSPEC_NOINLINE
|
||||||
|
static void Test_structs_seh_except(void)
|
||||||
|
{
|
||||||
|
PEH3_EXCEPTION_REGISTRATION EH3Registration;
|
||||||
|
PSCOPETABLE_ENTRY ScopeTable;
|
||||||
|
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
EH3Registration = (PEH3_EXCEPTION_REGISTRATION)__readfsdword(0);
|
||||||
|
okx(EH3Registration != NULL);
|
||||||
|
okx(EH3Registration != (PVOID)0xFFFFFFFF);
|
||||||
|
okx(EH3Registration->Next != (PVOID)0xFFFFFFFF);
|
||||||
|
okx(EH3Registration->ExceptionHandler != NULL);
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
okx(EH3Registration->ExceptionHandler == _except_handler3);
|
||||||
|
#endif
|
||||||
|
okx(EH3Registration->ScopeTable != NULL);
|
||||||
|
okx(EH3Registration->TryLevel == 0);
|
||||||
|
ScopeTable = EH3Registration->ScopeTable;
|
||||||
|
okx(ScopeTable->EnclosingLevel == 0xFFFFFFFF);
|
||||||
|
okx(ScopeTable->FilterFunc != NULL);
|
||||||
|
okx(ScopeTable->HandlerFunc != NULL);
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
}
|
||||||
|
|
||||||
|
DECLSPEC_NOINLINE
|
||||||
|
static void Test_structs_seh_finally(void)
|
||||||
|
{
|
||||||
|
PEH3_EXCEPTION_REGISTRATION EH3Registration;
|
||||||
|
PSCOPETABLE_ENTRY ScopeTable;
|
||||||
|
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
EH3Registration = (PEH3_EXCEPTION_REGISTRATION)__readfsdword(0);
|
||||||
|
okx(EH3Registration != NULL);
|
||||||
|
okx(EH3Registration != (PVOID)0xFFFFFFFF);
|
||||||
|
okx(EH3Registration->Next != (PVOID)0xFFFFFFFF);
|
||||||
|
okx(EH3Registration->ExceptionHandler != NULL);
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
okx(EH3Registration->ExceptionHandler == _except_handler3);
|
||||||
|
#endif
|
||||||
|
okx(EH3Registration->ScopeTable != NULL);
|
||||||
|
okx(EH3Registration->TryLevel == 0);
|
||||||
|
ScopeTable = EH3Registration->ScopeTable;
|
||||||
|
okx(ScopeTable->EnclosingLevel == 0xFFFFFFFF);
|
||||||
|
todo_pseh okx(ScopeTable->FilterFunc == NULL);
|
||||||
|
todo_pseh okx(ScopeTable->HandlerFunc != NULL);
|
||||||
|
}
|
||||||
|
_SEH2_FINALLY
|
||||||
|
{
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
}
|
||||||
|
|
||||||
|
DECLSPEC_NOINLINE
|
||||||
|
static void Test_structs_seh_nested(void)
|
||||||
|
{
|
||||||
|
PEH3_EXCEPTION_REGISTRATION EH3Registration1, EH3Registration2, NextHandler;
|
||||||
|
PSCOPETABLE_ENTRY ScopeTable;
|
||||||
|
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
EH3Registration1 = (PEH3_EXCEPTION_REGISTRATION)__readfsdword(0);
|
||||||
|
okx(EH3Registration1 != NULL);
|
||||||
|
okx(EH3Registration1 != (PVOID)0xFFFFFFFF);
|
||||||
|
okx(EH3Registration1->Next != (PVOID)0xFFFFFFFF);
|
||||||
|
NextHandler = EH3Registration1->Next;
|
||||||
|
okx(EH3Registration1->TryLevel == 0);
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
EH3Registration2 = (PEH3_EXCEPTION_REGISTRATION)__readfsdword(0);
|
||||||
|
okx(EH3Registration2 == EH3Registration1);
|
||||||
|
okx(EH3Registration2->ExceptionHandler != NULL);
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
okx(EH3Registration2->ExceptionHandler == _except_handler3);
|
||||||
|
#endif
|
||||||
|
okx(EH3Registration2->ScopeTable != NULL);
|
||||||
|
okx(EH3Registration2->ScopeTable == EH3Registration1->ScopeTable);
|
||||||
|
todo_pseh okx(EH3Registration2->TryLevel == 1);
|
||||||
|
ScopeTable = EH3Registration2->ScopeTable;
|
||||||
|
okx(ScopeTable[0].EnclosingLevel == 0xFFFFFFFF);
|
||||||
|
okx(ScopeTable[0].FilterFunc != NULL);
|
||||||
|
okx(ScopeTable[0].HandlerFunc != NULL);
|
||||||
|
okx(ScopeTable[1].EnclosingLevel == 0);
|
||||||
|
todo_pseh okx(ScopeTable[1].FilterFunc == NULL);
|
||||||
|
todo_pseh okx(ScopeTable[1].HandlerFunc != NULL);
|
||||||
|
}
|
||||||
|
_SEH2_FINALLY
|
||||||
|
{
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
|
||||||
|
okx(EH3Registration1 == (PEH3_EXCEPTION_REGISTRATION)__readfsdword(0));
|
||||||
|
okx(EH3Registration1->Next == NextHandler);
|
||||||
|
okx(EH3Registration1->TryLevel == 0);
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // _M_IX86
|
||||||
|
|
||||||
START_TEST(pseh)
|
START_TEST(pseh)
|
||||||
{
|
{
|
||||||
|
#ifdef _M_IX86
|
||||||
|
Test_structs_no_seh();
|
||||||
|
Test_structs_seh_except();
|
||||||
|
Test_structs_seh_finally();
|
||||||
|
Test_structs_seh_nested();
|
||||||
|
#endif
|
||||||
|
|
||||||
const struct subtest testsuite[] =
|
const struct subtest testsuite[] =
|
||||||
{
|
{
|
||||||
USE_TEST(test_empty_1),
|
USE_TEST(test_empty_1),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue