2009-08-20  Shinji KONO  <kono@ie.u-ryukyu.ac.jp>

    どうも、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  <kono@ie.u-ryukyu.ac.jp>

以下のようにすれば良いらしい... いっそ #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());
    }

