Skip to content

Instantly share code, notes, and snippets.

@xxuejie
Created December 8, 2012 23:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xxuejie/4242509 to your computer and use it in GitHub Desktop.
Save xxuejie/4242509 to your computer and use it in GitHub Desktop.
setjmp testcase compiled with -O2 option
$ clang -O2 setjmp-twice.c
$ ./a.out
Normal execution path of first function!
Exception execution path of first function!
Exception execution path of first function!
Calling longjmp the second time!
$ emcc -O2 setjmp-twice.c
$ node ./a.out.js
ormal execution path of first function!
Exception execution path of first function!
Exception execution path of first function!
Calling longjmp the second time!
#include <setjmp.h>
#include <stdio.h>
typedef struct {
jmp_buf* jmp;
} jmp_state;
void second_func(jmp_state* s);
void first_func(jmp_state* s) {
jmp_buf* prev_jmp = s->jmp;
jmp_buf c_jmp;
volatile int once = 0;
if (setjmp(c_jmp) == 0) {
printf("Normal execution path of first function!\n");
s->jmp = &c_jmp;
second_func(s);
} else {
printf("Exception execution path of first function!\n");
if (!once) {
once = 1;
longjmp(*(s->jmp), 1);
} else {
printf("Calling longjmp the second time!\n");
}
}
}
void second_func(jmp_state* s) {
longjmp(*(s->jmp), 1);
}
int main(int argc, char *argv[]) {
jmp_state s;
s.jmp = NULL;
first_func(&s);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment