Mercurial > hg > CbC > old > device
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 がないとだめだな。実装する?