Mercurial > hg > CbC > CbC_gcc
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 |