changeset 8:5066dc73ff8f

xxx
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 20 Aug 2009 19:10:35 +0900
parents 7ff9aed93de8
children ddf292032e7d
files gcc/ChangeLog.CbC
diffstat 1 files changed, 69 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gcc/ChangeLog.CbC	Thu Aug 20 19:10:35 2009 +0900
@@ -0,0 +1,69 @@
+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());
+    }
+