Mercurial > hg > Members > kaito > longjump
annotate global_longjump.c @ 4:d75a89b10176
write pointer_longjump.c
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 14 Nov 2013 13:16:46 +0900 |
parents | e6aa3b678e4a |
children | 4e7858590985 |
rev | line source |
---|---|
0 | 1 #include <stdio.h> |
2 #include <setjmp.h> | |
3 #include <stdlib.h> | |
4 | |
5 int retval; | |
4
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
6 |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
7 __code code1(int n,__code(*__return)(int,void *),void *__environment){ |
3
e6aa3b678e4a
remove ret from global_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
8 printf("code1 : code1 entry\n"); |
4
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
9 goto __return(n,__environment); |
0 | 10 } |
11 | |
3
e6aa3b678e4a
remove ret from global_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
12 __code return1 (int n,void* env){ |
e6aa3b678e4a
remove ret from global_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
13 printf("return1 : __return entry\n"); |
0 | 14 retval = n; |
15 longjmp(*(jmp_buf*)env,1); | |
16 } | |
17 | |
18 int main1 (){ | |
3
e6aa3b678e4a
remove ret from global_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
19 __code (*__return)(); |
4
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
20 void *__environment; |
3
e6aa3b678e4a
remove ret from global_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
21 printf("main1 : main1 entry\n"); |
4
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
22 __environment = (void*)malloc(sizeof(jmp_buf)); |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
23 if (setjmp(__environment)){ |
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
24 free(__environment); |
3
e6aa3b678e4a
remove ret from global_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
25 printf("main1 : main1 return\n"); |
0 | 26 return retval; |
27 } | |
3
e6aa3b678e4a
remove ret from global_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
28 __return = return1; |
4
d75a89b10176
write pointer_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
29 goto code1(30,__return,__environment); |
0 | 30 return 0; |
31 } | |
32 | |
33 int main (){ | |
34 int n; | |
35 n = main1(); | |
3
e6aa3b678e4a
remove ret from global_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
36 printf("main : return = %d\n",n); |
0 | 37 return 1; |
38 } |