Mercurial > hg > Members > kaito > longjump
comparison pointer_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 |
comparison
equal
deleted
inserted
replaced
3:e6aa3b678e4a | 4:d75a89b10176 |
---|---|
1 #include <stdio.h> | 1 #include <stdio.h> |
2 #include <setjmp.h> | 2 #include <setjmp.h> |
3 #include <stdlib.h> | 3 #include <stdlib.h> |
4 | 4 |
5 __code code1(int n,void *__return,void *__enviroment,int *__ret_p){ | 5 __code code1(int n,__code(*__return)(int,void *,int *),void *__environment,int *__ret_p){ |
6 void(*ret)(int,void *,int *); | 6 printf("code1 : code entry1\n"); |
7 printf("code1\n"); | 7 goto __return(n,__environment,__ret_p); |
8 ret = (void(*)(int,void *,int *))__return; | |
9 ret(n,__enviroment,__ret_p); | |
10 //((void(*)(int,void *,int *))__return)(n,__enviroment,__ret_p); | |
11 } | 8 } |
12 | 9 |
13 void *return1 (int n,void* env,int* __ret_p){ | 10 __code return1 (int n,void* env,int* __ret_p){ |
14 printf("return1\n"); | 11 printf("return1 : __return entry\n"); |
15 *__ret_p = n; | 12 *__ret_p = n; |
16 longjmp(*(jmp_buf*)env,1); | 13 longjmp(*(jmp_buf*)env,1); |
17 } | 14 } |
18 | 15 |
19 int main1 (){ | 16 int main1 (){ |
20 void *__return; | 17 __code (*__return)(); |
21 void *__enviroment; | 18 void *__environment; |
19 int retval; | |
22 int *__ret_p; | 20 int *__ret_p; |
23 printf("main1 entry\n"); | 21 __ret_p = &retval; |
24 __enviroment = (void*)malloc(sizeof(jmp_buf)); | 22 printf("main1 : main1 entry\n"); |
25 __ret_p = (int*)malloc(sizeof(int)); | 23 __environment = (void*)malloc(sizeof(jmp_buf)); |
26 if (setjmp(__enviroment)){ | 24 if (setjmp(__environment)){ |
27 free(__enviroment); | 25 free(__environment); |
28 printf("main1 return\n"); | 26 printf("main1 : main1 return\n"); |
29 // We haven't freed __ret_p's memory... Where is the best position of the free()? | 27 return retval; |
30 return *__ret_p; | |
31 } | 28 } |
32 __return = (void*)return1; | 29 __return = return1; |
33 goto code1(30,__return,__enviroment,__ret_p); | 30 goto code1(30,__return,__environment,__ret_p); |
34 return 0; | 31 return 0; |
35 } | 32 } |
36 | 33 |
37 int main (){ | 34 int main (){ |
38 int n; | 35 int n; |