16#if defined(_M_IX86) && !defined(_MSC_VER)
17#define todo_pseh todo_if(1)
26 volatile int stage = 0;
50 skip(
"avoiding clang build crash\n");
58 finally_called =
TRUE;
76 skip(
"avoiding clang build crash\n");
104#define CHECK_POINT(number) do { \
105 assert(number < _countof(s_check_points)); \
106 s_check_points[number] = __LINE__; \
111 volatile int x = 1001,
value;
121 else if (
value == 999)
152 else if (
value == 0xBEEFCAFE)
206void call_setjmpex(_JUMP_BUFFER *Buf);
207#elif defined(_M_IX86)
210void call_setjmp3(_JUMP_BUFFER *Buf);
250#elif defined(_M_IX86)
259#define check_buffer_registers(Buf, Sp, Pc) \
260 check_buffer_registers_(__LINE__, Buf, Sp, Pc)
276#elif defined(_M_IX86)
292 *ExceptionRegistrationPtr = 0xFFFFFFFF;
337static void Test_setjmp1_longjmp_inside_SEH(
void)
340 int finally_called = 0;
343 int longjmp_value = _setjmp1(
buf);
344 if (longjmp_value == 0)
348 longjmp(
buf, 0x12345678);
362static int Test_setjmp1_inner(
void)
366 int longjmp_value = _setjmp1(
buf);
367 if (longjmp_value == 0)
369 longjmp(
buf, 0x12345678);
371 return longjmp_value;
375static void Test_setjmp1_external_inside_SEH(
void)
377 volatile int ret = 0;
382 ret = Test_setjmp1_inner();
401void Test_setjmp1_no_SEH_registration(
void)
408 *ExceptionRegistrationPtr = 0xFFFFFFFF;
411 int longjmp_value = _setjmp1(
buf);
412 if (longjmp_value == 0)
428static void Test_setjmp3(
void)
430 ULONG BufferData[18];
431 _JUMP_BUFFER* Buf = (_JUMP_BUFFER*)&BufferData;
433 memset(&BufferData, 0xCC,
sizeof(BufferData));
440 ok_eq_hex(Buf->UnwindData[0], 0x12345678);
441 ok_eq_hex(Buf->UnwindData[1], 0x23456789);
442 ok_eq_hex(Buf->UnwindData[2], 0x3456789a);
443 ok_eq_hex(Buf->UnwindData[3], 0xCCCCCCCC);
444 ok_eq_hex(Buf->UnwindData[4], 0xCCCCCCCC);
445 ok_eq_hex(Buf->UnwindData[5], 0xCCCCCCCC);
447 memset(&BufferData, 0xCC,
sizeof(BufferData));
448 _setjmp3((
int*)Buf, 0, (
void*)0x12345, 3, 0xA1A1A1A1, 0xA2A2A2A2, 0xA3A3A3A3, 0xA4A4A4A4);
453 ok_eq_hex(Buf->UnwindData[0], 0xCCCCCCCC);
454 ok_eq_hex(Buf->UnwindData[1], 0xCCCCCCCC);
455 ok_eq_hex(Buf->UnwindData[2], 0xCCCCCCCC);
456 ok_eq_hex(Buf->UnwindData[3], 0xCCCCCCCC);
457 ok_eq_hex(Buf->UnwindData[4], 0xCCCCCCCC);
458 ok_eq_hex(Buf->UnwindData[5], 0xCCCCCCCC);
460 static ULONG Data[4] = { 0x0123, 0x1234, 0x2345, 0x3456 };
461 memset(&BufferData, 0xCC,
sizeof(BufferData));
462 _setjmp3((
int*)Buf, 1,
Data, 7, 0xA1A1A1A1, 0xA2A2A2A2, 0xA3A3A3A3, 0xA4A4A4A4);
467 ok_eq_hex(Buf->UnwindData[0], 0xCCCCCCCC);
469 memset(&BufferData, 0xCC,
sizeof(BufferData));
470 _setjmp3((
int*)Buf, 2,
Data, 7, 0xA1A1A1A1, 0xA2A2A2A2, 0xA3A3A3A3, 0xA4A4A4A4);
475 ok_eq_hex(Buf->UnwindData[0], 0xCCCCCCCC);
477 memset(&BufferData, 0xCC,
sizeof(BufferData));
478 _setjmp3((
int*)Buf, 3,
Data, 7, 0xA1A1A1A1, 0xA2A2A2A2, 0xA3A3A3A3, 0xA4A4A4A4);
483 ok_eq_hex(Buf->UnwindData[0], 0xA1A1A1A1);
484 ok_eq_hex(Buf->UnwindData[1], 0xCCCCCCCC);
486 memset(&BufferData, 0xCC,
sizeof(BufferData));
487 _setjmp3((
int*)Buf, 11, (
PVOID)0xdeadbeef, 7, 0xA1A1A1A1, 0xA2A2A2A2, 0xA3A3A3A3, 0xA4A4A4A4, 0xA5A5A5A5, 0xA6A6A6A6, 0xA7A7A7A7, 0xA8A8A8A8, 0xA9A9A9A9);
492 ok_eq_hex(Buf->UnwindData[0], 0xA1A1A1A1);
493 ok_eq_hex(Buf->UnwindData[1], 0xA2A2A2A2);
494 ok_eq_hex(Buf->UnwindData[2], 0xA3A3A3A3);
495 ok_eq_hex(Buf->UnwindData[3], 0xA4A4A4A4);
496 ok_eq_hex(Buf->UnwindData[4], 0xA5A5A5A5);
497 ok_eq_hex(Buf->UnwindData[5], 0xA6A6A6A6);
504 *ExceptionRegistrationPtr = 0xFFFFFFFF;
506 memset(&BufferData, 0xCC,
sizeof(BufferData));
507 _setjmp3((
int*)Buf, 11, (
PVOID)0xdeadbeef, 7, 0xA1A1A1A1, 0xA2A2A2A2, 0xA3A3A3A3, 0xA4A4A4A4, 0xA5A5A5A5, 0xA6A6A6A6, 0xA7A7A7A7, 0xA8A8A8A8, 0xA9A9A9A9);
508 ok_eq_hex(Buf->Registration, 0xFFFFFFFF);
512 ok_eq_hex(Buf->UnwindData[0], 0xCCCCCCCC);
513 ok_eq_hex(Buf->UnwindData[1], 0xCCCCCCCC);
518 ok_eq_hex(Buf->Registration, 0xFFFFFFFF);
522 ok_eq_hex(Buf->UnwindData[0], 0xCCCCCCCC);
523 ok_eq_hex(Buf->UnwindData[1], 0xCCCCCCCC);
524 longjmp((
int*)Buf, 0xBEEFCAFE);
525 ok(0,
"Should not get here\n");
534void Test_setjmp3_with_SEH(
void)
550 _setjmp3((
int*)&
buf, 0, (
void*)0x12345, 3, 0xA1A1A1A1, 0xA2A2A2A2, 0xA3A3A3A3, 0xA4A4A4A4);
569 Test_setjmp1_longjmp_inside_SEH();
570 Test_setjmp1_external_inside_SEH();
573 Test_setjmp3_with_SEH();
576#define DO_COME(number) \
577 ok(s_check_points[number], "CheckPoint #%d: Didn't reach\n", number)
578#define NEVER_COME(number) \
579 ok(!s_check_points[number], "CheckPoint #%d: Wrongly reached Line %d\n", \
580 number, s_check_points[number])
#define ok_eq_hex(value, expected)
#define ok_eq_hex_(file, line, value, expected)
#define ok_eq_hex64_(file, line, value, expected)
#define ok_eq_int(value, expected)
#define ok_int(expression, result)
static LPCWSTR LPCWSTR LPCWSTR env
_Must_inspect_result_ _In_ CONST FLT_REGISTRATION * Registration
void __declspec(noinline) __cdecl _free_base(void *const block)
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei count
GLenum GLuint GLenum GLsizei const GLchar * buf
#define EXCEPTION_EXECUTE_HANDLER
#define AbnormalTermination
PPC_QUAL unsigned long __readfsdword(const unsigned long Offset)
#define _SEH2_AbnormalTermination()
#define _SEH2_EXCEPT(...)
int _setjmp3(jmp_buf env, int count,...)
static void TEST_buffer_contents(void)
char setjmp_return_address
static void TEST_setjmp_normal(void)
#define NEVER_COME(number)
static void check_buffer_registers_(ULONG Line, _JUMP_BUFFER *Buf, ULONG_PTR Sp, void *Pc)
static void TEST_setjmp_return_check(void)
static INT s_check_points[16]
#define CHECK_POINT(number)
static void TEST_longjmp(int value)
void call_setjmp(_JUMP_BUFFER *Buf)
#define check_buffer_registers(Buf, Sp, Pc)
static void TEST_setjmp_zero_longjmp_check(void)
static void TEST_setjmp_longjmp_integration(void)