2009-08-20 Shinji KONO どうも、goto hoge(0),env; で、env を渡すのがよろしくない。 goto hoge(0,env); と言う形にして、hoge 側で env を設定するのはどうか? __code main_return2_1(int i,stack sp) { goto (( (struct main_continuation *)sp)->main_ret)(0), ((struct main_continuation *)sp)->env; } を、 __code main_return2_1(int i,stack sp) { goto (( (struct main_continuation *)sp)->main_ret)(0, ((struct main_continuation *)sp)->env); } という形にする。 そうすれば、goto 文は、かなり簡単になる。 2009-08-20 Shinji KONO 以下のようにすれば良いらしい... いっそ #define でも出来るが。 extern int printf(const char *, ...); void g( void (*ret)(int retval_,void *f) , void *fp) { printf("g: fp = 0x%x\n",__builtin_frame_address(0)); (*ret)(5,fp); } int f() { int retval = 1; void (*ret)(int retval_,void *fp) ; ret = ({ __label__ exit0; volatile static flag = 0; void __return_func(int retval_,void *fp) { retval = retval_; goto exit0; } if (flag) { exit0: printf("f1: fp = 0x%x\n",__builtin_frame_address(0)); return retval; } __return_func; }); printf("f0: fp = 0x%x\n",__builtin_frame_address(0)); g(ret,__builtin_frame_address(0)); printf("bad\n"); return retval; } int main() { printf("%d\n",f()); }