8
|
1 2009-08-20 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
|
|
2
|
|
3 どうも、goto hoge(0),env; で、env を渡すのがよろしくない。
|
|
4 goto hoge(0,env);
|
|
5 と言う形にして、hoge 側で env を設定するのはどうか?
|
|
6
|
|
7 __code main_return2_1(int i,stack sp) {
|
|
8 goto (( (struct main_continuation *)sp)->main_ret)(0),
|
|
9 ((struct main_continuation *)sp)->env;
|
|
10 }
|
|
11
|
|
12 を、
|
|
13
|
|
14 __code main_return2_1(int i,stack sp) {
|
|
15 goto (( (struct main_continuation *)sp)->main_ret)(0,
|
|
16 ((struct main_continuation *)sp)->env);
|
|
17 }
|
|
18 という形にする。
|
|
19
|
|
20 そうすれば、goto 文は、かなり簡単になる。
|
|
21
|
|
22 2009-08-20 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
|
|
23
|
|
24 以下のようにすれば良いらしい... いっそ #define でも出来るが。
|
|
25
|
|
26 extern int printf(const char *, ...);
|
|
27
|
|
28 void g( void (*ret)(int retval_,void *f) , void *fp) {
|
|
29 printf("g: fp = 0x%x\n",__builtin_frame_address(0));
|
|
30 (*ret)(5,fp);
|
|
31 }
|
|
32
|
|
33 int f()
|
|
34 {
|
|
35
|
|
36 int retval = 1;
|
|
37 void (*ret)(int retval_,void *fp) ;
|
|
38
|
|
39 ret = ({
|
|
40 __label__ exit0;
|
|
41 volatile static flag = 0;
|
|
42 void __return_func(int retval_,void *fp) {
|
|
43 retval = retval_;
|
|
44 goto exit0;
|
|
45 }
|
|
46 if (flag) {
|
|
47 exit0:
|
|
48 printf("f1: fp = 0x%x\n",__builtin_frame_address(0));
|
|
49 return retval;
|
|
50 }
|
|
51 __return_func;
|
|
52 });
|
|
53
|
|
54 printf("f0: fp = 0x%x\n",__builtin_frame_address(0));
|
|
55
|
|
56 g(ret,__builtin_frame_address(0));
|
|
57
|
|
58 printf("bad\n");
|
|
59
|
|
60 return retval;
|
|
61 }
|
|
62
|
|
63
|
|
64 int
|
|
65 main()
|
|
66 {
|
|
67 printf("%d\n",f());
|
|
68 }
|
|
69
|