Mercurial > hg > Members > kaito > longjump
annotate struct_longjump.c @ 11:635eb6d562f0
__return
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 14 Dec 2013 18:23:35 +0900 |
parents | a4f34209ba63 |
children | 7c8d5d4074b8 |
rev | line source |
---|---|
8
a7c771f554e7
remove #include but warnings were not removed
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
1 int setjmp(int*); |
a7c771f554e7
remove #include but warnings were not removed
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
2 int longjmp(int*,int); |
a7c771f554e7
remove #include but warnings were not removed
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
7
diff
changeset
|
3 int printf(const char*,...); |
6
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 |
11 | 5 __code code1(int n,__code(*exit___code)(int,void *),void *exit_env){ |
6
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 printf("code1 : code entry1\n"); |
11 | 7 goto exit___code(n,exit_env); |
6
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 } |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 __code return1 (int n,void* env){ |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 printf("return1 : __return entry\n"); |
10
a4f34209ba63
remove __CbC_env from struct_longjmp.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
12 *(int*)((struct __CbC_env *)(env))->ret_p = n; |
a4f34209ba63
remove __CbC_env from struct_longjmp.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
13 longjmp((((struct __CbC_env *)env)->env),1); |
6
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 } |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 int main1 (){ |
11 | 17 __return; |
18 __code (*___return)(); | |
19 struct __CbC_env ___environment; | |
7
c49bf9e28ea8
remove jmp_buf (replaced by integer array)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
6
diff
changeset
|
20 int i_buf[128]; |
6
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 int retval; |
11 | 22 ___environment.ret_p = &retval; |
23 ___environment.env = i_buf; | |
6
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 printf("main1 : main1 entry\n"); |
11 | 25 if (setjmp(___environment.env)){ |
6
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 printf("main1 : main1 return\n"); |
11 | 27 return *((int *)___environment.ret_p); |
6
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 } |
11 | 29 __CbC_return = return1; |
30 goto code1(30,__CbC_return,&___environment); | |
6
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 return 0; |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 } |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 int main (){ |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 int n; |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 n = main1(); |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 printf("returned\n"); |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 printf("return = %d\n",n); |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 return 1; |
509523ee1e27
add struct_longjump.c
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 } |