diff Idea @ 18:df7fa8cee67b

pass -Wall add ifdef
author kono
date Sat, 01 Feb 2003 22:19:29 +0900
parents ca0bce3b4810
children e605560e6146
line wrap: on
line diff
--- a/Idea	Thu Jun 28 14:33:44 2001 +0900
+++ b/Idea	Sat Feb 01 22:19:29 2003 +0900
@@ -1154,3 +1154,83 @@
 これもcontinuationを渡してやると言う手法が使えないことはないんだが...
 
 関数呼び出しの最初にやってやればいいか。それでできるかな?
+
+
+Mon Jan 20 18:25:27 JST 2003
+
+3年間さわってないのかよ。何やってんだ?
+
+goto 文のバグをとらないといけない。
+
+まず、関数引数の構造体の展開。これは、どうってことないはず。
+
+   goto (*code)(i+1,j,...)
+
+まず、いじらなくてすむ変数を摘出する。
+
+   foreach arg 
+      compare
+
+単純演算 ( op+const , pointer , const assign ) などは、ここで検出する。
+大半は、そのようになるはず。
+レジスタに乗せる分があるから... それには触らないとして...
+
+複雑なものは、前もって計算しておく。(get_register する)
+スタック上かレジスタ上に作る。
+
+残りは並列代入となる。再帰的に計算する。
+
+えーと、大きな順にやるんだっけ? 小さな順にやるんだっけ?
+    code f( int a, int b, int c ) {
+        goto g(b,c,a);
+    }
+みたいなやつだよね。
+
+    移動するものを一つ検出する。
+    そのために移動が必要なものを移動しておく(再帰)
+    代入する
+
+こんなんでいいのか? ループしない? するよね。ループしたら
+get_register する。
+
+前の例だと、
+
+    g(b,c,a) のbに着目する。
+    bに代入するコードを出すと、a が壊れる。
+    a が必要かどうかを調べる。それは、引数のリストを見ればわかる。
+    その前に、a を移動する。a の移動先を見て、
+       空いていれば、移動してOk。しかし、c 
+    なので、 c を見る。と b になるので、ループするのがわかるので、
+    b を get_register する。
+    で、c が移動できる。で、aを移動して、とっておいたbを代入。
+
+Tue Jan 21 22:45:09 JST 2003
+
+とりあえず、jump は複雑すぎる。もっと簡単にすることを考える。
+parser 側である程度処理できない?
+
+     goto f(a+3,b(),c);
+
+などを、
+
+     a = a+3;
+     b = b();
+     goto f(a,b,c);
+
+程度に簡略化する。この時、f(a,b,c) は(できるだけ)、元の
+関数の引数リストに近付ける。のは無理なので、単純変数
+まで落す。
+
+あまり関係ないか。一時変数はどうせいるわけだし。ってこと
+みたいね。
+
+だとすると、元のコードと、そう変わらんね。前のも、そんなに
+悪くないってことか。
+
+Wed Jan 22 14:33:12 JST 2003
+
+やっぱり、途中で局所変数を増やしたいよね。
+
+Fri Jan 31 20:30:36 JST 2003
+
+なんか #ifdef / #if がないとだめだな。実装する?