diff --git a/tests/core/test_longjmp_stacked.in b/tests/core/test_longjmp_stacked.in new file mode 100644 index 000000000..195395613 --- /dev/null +++ b/tests/core/test_longjmp_stacked.in @@ -0,0 +1,44 @@ + + #include + #include + #include + #include + + int bottom, top; + + int run(int y) { + // confuse stack + char *s = (char*)alloca(100); + memset(s, 1, 100); + s[y] = y; + s[y/2] = y*2; + volatile int x = s[y]; + top = (int)alloca(4); + if (x <= 2) return x; + jmp_buf buf; + printf("setjmp of %d\n", x); + if (setjmp(buf) == 0) { + printf("going\n"); + x += run(x/2); + longjmp(buf, 1); + } + printf("back\n"); + return x/2; + } + + int main(int argc, char **argv) { + int sum = 0; + for (int i = 0; i < argc*2; i++) { + bottom = (int)alloca(4); + sum += run(10); + // scorch the earth + if (bottom < top) { + memset((void*)bottom, 1, top - bottom); + } else { + memset((void*)top, 1, bottom - top); + } + } + printf("%d\n", sum); + return sum; + } + \ No newline at end of file diff --git a/tests/core/test_longjmp_stacked.out b/tests/core/test_longjmp_stacked.out new file mode 100644 index 000000000..d16a8e7da --- /dev/null +++ b/tests/core/test_longjmp_stacked.out @@ -0,0 +1,13 @@ +setjmp of 10 +going +setjmp of 5 +going +back +back +setjmp of 10 +going +setjmp of 5 +going +back +back +12 diff --git a/tests/test_core.py b/tests/test_core.py index 136016e5b..07edda55b 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -1124,64 +1124,11 @@ class T(RunnerCore): # Short name, to make it more fun to use manually on the co self.do_run_from_file(src, output) def test_longjmp_stacked(self): - src = r''' - #include - #include - #include - #include + test_path = path_from_root('tests', 'core', 'test_longjmp_stacked') + src, output = (test_path + s for s in ('.in', '.out')) - int bottom, top; + self.do_run_from_file(src, output) - int run(int y) { - // confuse stack - char *s = (char*)alloca(100); - memset(s, 1, 100); - s[y] = y; - s[y/2] = y*2; - volatile int x = s[y]; - top = (int)alloca(4); - if (x <= 2) return x; - jmp_buf buf; - printf("setjmp of %d\n", x); - if (setjmp(buf) == 0) { - printf("going\n"); - x += run(x/2); - longjmp(buf, 1); - } - printf("back\n"); - return x/2; - } - - int main(int argc, char **argv) { - int sum = 0; - for (int i = 0; i < argc*2; i++) { - bottom = (int)alloca(4); - sum += run(10); - // scorch the earth - if (bottom < top) { - memset((void*)bottom, 1, top - bottom); - } else { - memset((void*)top, 1, bottom - top); - } - } - printf("%d\n", sum); - return sum; - } - ''' - self.do_run(src, '''setjmp of 10 -going -setjmp of 5 -going -back -back -setjmp of 10 -going -setjmp of 5 -going -back -back -12 -''') def test_longjmp_exc(self): src = r'''