# HG changeset patch # User Kaito Tokumori # Date 1385223016 -32400 # Node ID 509523ee1e274a58de30c671ae5738f548a51c4d # Parent 4e785859098537f03f576f38b82875ce8d938436 add struct_longjump.c diff -r 4e7858590985 -r 509523ee1e27 pointer_longjump.c --- a/pointer_longjump.c Sat Nov 23 23:31:02 2013 +0900 +++ b/pointer_longjump.c Sun Nov 24 01:10:16 2013 +0900 @@ -14,13 +14,13 @@ int main1 (){ __code (*__return)(); - void *__environment ; - int retval; + void *__environment; int *__ret_p; jmp_buf j_buf; + int retval; __ret_p = &retval; + __environment = &j_buf; printf("main1 : main1 entry\n"); - __environment = &j_buf; if (setjmp(__environment)){ printf("main1 : main1 return\n"); return retval; diff -r 4e7858590985 -r 509523ee1e27 struct_longjump.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/struct_longjump.c Sun Nov 24 01:10:16 2013 +0900 @@ -0,0 +1,42 @@ +#include +#include + +struct CbC_env { + void *ret_p,*env; +}; + +__code code1(int n,__code(*__return)(int,void *),void *__environment){ + printf("code1 : code entry1\n"); + goto __return(n,__environment); +} + +__code return1 (int n,void* env){ + printf("return1 : __return entry\n"); + *(int*)((struct CbC_env *)(env))->ret_p = n; + longjmp(*(jmp_buf*)(((struct CbC_env *)env)->env),1); +} + +int main1 (){ + __code (*__return)(); + struct CbC_env __environment; + jmp_buf j_buf; + int retval; + __environment.ret_p = &retval; + __environment.env = &j_buf; + printf("main1 : main1 entry\n"); + if (setjmp(__environment.env)){ + printf("main1 : main1 return\n"); + return *((int *)__environment.ret_p); + } + __return = return1; + goto code1(30,__return,&__environment); + return 0; +} + +int main (){ + int n; + n = main1(); + printf("returned\n"); + printf("return = %d\n",n); + return 1; +}