aboutsummaryrefslogtreecommitdiff
path: root/tests/runner.py
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-11-22 20:12:04 +0100
committerAlon Zakai <alonzakai@gmail.com>2012-11-22 20:12:04 +0100
commite7491225c9ab4104342bb3d1079dbbc4f1b326d6 (patch)
treecdc396e8ae743a4007a6b3784c2ce6c450c80252 /tests/runner.py
parent23a27e95809a8437ed553c20eb4b1d6237ddd849 (diff)
fix setjmp/longjmp to notice if we actually setjmped in the invocation of the function on the stack, so recursive functions can use setjmp/longjmp
Diffstat (limited to 'tests/runner.py')
-rwxr-xr-xtests/runner.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/tests/runner.py b/tests/runner.py
index aa976652..a4bc4944 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -1987,6 +1987,52 @@ c5,de,15,8a
else:
self.do_run(src, 'second\nmain: 0\n')
+ def test_longjmp2(self):
+ src = r'''
+ #include <setjmp.h>
+ #include <stdio.h>
+
+ typedef struct {
+ jmp_buf* jmp;
+ } jmp_state;
+
+ void stack_manipulate_func(jmp_state* s, int level) {
+ jmp_buf buf;
+
+ printf("Entering stack_manipulate_func, level: %d\n", level);
+
+ if (level == 0) {
+ s->jmp = &buf;
+ if (setjmp(*(s->jmp)) == 0) {
+ printf("Setjmp normal execution path, level: %d\n", level);
+ stack_manipulate_func(s, level + 1);
+ } else {
+ printf("Setjmp error execution path, level: %d\n", level);
+ }
+ } else {
+ printf("Perform longjmp at level %d\n", level);
+ longjmp(*(s->jmp), 1);
+ }
+
+ printf("Exiting stack_manipulate_func, level: %d\n", level);
+ }
+
+ int main(int argc, char *argv[]) {
+ jmp_state s;
+ s.jmp = NULL;
+ stack_manipulate_func(&s, 0);
+
+ return 0;
+ }
+ '''
+ self.do_run(src, '''Entering stack_manipulate_func, level: 0
+Setjmp normal execution path, level: 0
+Entering stack_manipulate_func, level: 1
+Perform longjmp at level 1
+Setjmp error execution path, level: 0
+Exiting stack_manipulate_func, level: 0
+''')
+
def test_exceptions(self):
if Settings.QUANTUM_SIZE == 1: return self.skip("we don't support libcxx in q1")