summaryrefslogtreecommitdiff
path: root/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER_EX/test2/pal_except_filter_ex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER_EX/test2/pal_except_filter_ex.cpp')
-rw-r--r--src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER_EX/test2/pal_except_filter_ex.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER_EX/test2/pal_except_filter_ex.cpp b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER_EX/test2/pal_except_filter_ex.cpp
new file mode 100644
index 0000000000..ab25c49733
--- /dev/null
+++ b/src/pal/tests/palsuite/exception_handling/PAL_EXCEPT_FILTER_EX/test2/pal_except_filter_ex.cpp
@@ -0,0 +1,142 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*=====================================================================
+**
+** Source: PAL_EXCEPT_FILTER_EX.c (test 2)
+**
+** Purpose: Tests the PAL implementation of the PAL_EXCEPT_FILTER_EX.
+** There is a nested try blocks in this test. The nested
+** PAL_TRY creates an exception and the FILTER creates another.
+** This test makes sure that this case does not end in a
+** infinite loop.
+**
+**
+**===================================================================*/
+
+#include <palsuite.h>
+
+BOOL bFilter = FALSE;
+BOOL bTry = FALSE;
+BOOL bTry2 = FALSE;
+const int nValidator = 12321;
+
+/* Filter function for the first try block.
+ */
+LONG Filter_01(EXCEPTION_POINTERS* ep, VOID *pnTestInt)
+{
+ int nTestInt = *(int *)pnTestInt;
+
+ /* Signal main() that filter has been executed. */
+ bFilter = TRUE;
+
+ if (!bTry)
+ {
+ Fail("ERROR: The filter was executed without "
+ "entering the first PAL_TRY.\n");
+ }
+
+ if (!bTry2)
+ {
+ Fail("ERROR: The filter was executed without "
+ "entering the second PAL_TRY.\n");
+ }
+
+ /* Was the correct value passed? */
+ if (nValidator != nTestInt)
+ {
+ Fail("ERROR: Parameter passed to filter function "
+ "should have been \"%d\" but was \"%d\".\n",
+ nValidator,
+ nTestInt);
+ }
+
+ return EXCEPTION_EXECUTE_HANDLER;
+}
+
+int __cdecl main(int argc, char *argv[])
+{
+ int* p = 0x00000000;
+ BOOL bExcept = FALSE;
+ BOOL bExcept2 = FALSE;
+
+ /* Initalize the PAL.
+ */
+ if (0 != PAL_Initialize(argc, argv))
+ {
+ return FAIL;
+ }
+
+ /* Test a nested PAL_Try block.
+ */
+ PAL_TRY
+ {
+ /* Signal entry into first PAL_TRY block.*/
+ bTry = TRUE;
+
+ PAL_TRY
+ {
+ /* Signal entry into second PAL_TRY block.*/
+ bTry2 = TRUE;
+ /* Cause an exception.*/
+ *p = 13;
+ }
+ PAL_EXCEPT_FILTER(Filter_01, (LPVOID)&nValidator)
+ {
+ /* Signal entry into second PAL_EXCEPT filter.*/
+ bExcept = TRUE;
+ /* Cause another exception.*/
+ *p = 13;
+ }
+ PAL_ENDTRY
+
+ }
+ PAL_EXCEPT_FILTER(Filter_01, (LPVOID)&nValidator)
+ {
+ /* Signal entry into second PAL_EXCEPT filter.*/
+ bExcept2 = TRUE;
+ }
+ PAL_ENDTRY;
+
+ if (!bTry)
+ {
+ Trace("ERROR: The code in the first "
+ "PAL_TRY block was not executed.\n");
+ }
+
+ if (!bTry2)
+ {
+ Trace("ERROR: The code in the nested "
+ "PAL_TRY block was not executed.\n");
+ }
+
+ if (!bExcept)
+ {
+ Trace("ERROR: The code in the first "
+ "PAL_EXCEPT_FILTER_EX block was not executed.\n");
+ }
+
+ if (!bExcept2)
+ {
+ Trace("ERROR: The code in the second "
+ "PAL_EXCEPT_FILTER_EX block was not executed.\n");
+ }
+
+ if (!bFilter)
+ {
+ Trace("ERROR: The code in the first "
+ "filter function was not executed.\n");
+ }
+
+ if(!bTry || !bTry2 || !bExcept || !bExcept2 || !bFilter )
+ {
+ Fail("");
+ }
+
+ /* Terminate the PAL.
+ */
+ PAL_Terminate();
+ return PASS;
+
+}