comparison gcc/ChangeLog.CbC @ 8:5066dc73ff8f

xxx
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 20 Aug 2009 19:10:35 +0900
parents
children
comparison
equal deleted inserted replaced
7:7ff9aed93de8 8:5066dc73ff8f
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