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;