Mercurial > hg > CbC > old > device
diff Idea @ 655:cddab906095e
struct init in function arg (or other expression).
author | kono |
---|---|
date | Sun, 14 Jan 2007 20:30:31 +0900 |
parents | fd2dfa1fa627 |
children | f536897fa3cb |
line wrap: on
line diff
--- a/Idea Sun Nov 26 21:54:03 2006 +0900 +++ b/Idea Sun Jan 14 20:30:31 2007 +0900 @@ -1962,6 +1962,7 @@ どうせ、だめではあるんだが。引数の型は一段階までしか、 チェックしないので、だめだね。 + このあたり、理論的な問題があるみたいだな。 stack を含めた有限な型付け @@ -1972,3 +1973,102 @@ そうか、parallel assignment では、同じ部分を前もって探した 方が効率がよいわけか。(どうせ、やっていることだが) +Sun Nov 26 23:22:12 JST 2006 + +fp のsave は必要。何故かと言うと、 + goto f(a,b,...) +で、後ろの部分がどれだけあるかは、間接的な引数での +宣言ではわからないから。 + +stack 上に全部 interface があるなら、良いが、 +部分は register に乗っている。 + + goto f(a,b,c,...) + +としたときに、... の一部はregisterに乗っている。どれだけ +乗っているのかを知る必要があるが、それをfpから推察する +ことはできない。浮動小数点とかの異なる型が散在している +から。 + +... で引き渡す引数は、メモリに乗っている必要がある。 +型が明解なら、レジスタ上でもだいじょぶなはずだが。 + +明示的な引数に大域的には変換できるはずだけど、open +な環境では、それはできない。 + +だとすれば、 + __code f(int a, int b : int h, ...) { + ... + goto g(a,b,c : d,e,f,...) + } +みたいな形で、stack 上に乗せる引数を明示する必要がある。 + +これは、なんなの? + + : の前の引数は可変に出来ない + : の後までは可変に出来る + +っていうことか。 + +構造体は、メモリ上に取るとしても.. + +まぁ、... のところまでレジスタで、それ以降は、メモリでも +十分だけどね。いずれにせよ、複雑すぎることは確か。 + + __code g(int c,__code (*n)(int a,int b,int d,...),...) { + goto n(int d,int e,int c,...); + } + +で、この... は、すべて、同じものに置き換わるはず。 ... が +入る場合もあるが。 + +受け側が + __code c(int d,int e,int c,int k,int j) {} +で定義されているときに、k,j がレジスタに乗っているかも知れず、 +乗っていたらダメダメ。なので、可変になる部分を明示する必要がある。 + +Mon Nov 27 11:17:39 JST 2006 + +結局、このn の定義と、実際のn の定義がずれることが問題なんだよね。 + __code c(int d,int e,int c,...) {} +で、受けることもあれば、 + __code c(int d,int e,int c,int k,int j) {} +で受けることもある。あるいは、 + __code c(int d,int e,int c,int k,int j,...) {} +とかも。 + +implements というか、accetps というか、そんな形の別な +宣言がいいのかな。 + __code f(int a, int b : int h, ...) { +でもいいんだが... + +Mon Nov 27 11:34:33 JST 2006 + + __code f(int a,int b,...) { + goto g(int c,__code *f,int a,int b,...); + } + + __code g(int c,__code (*n)(...),...) { + goto n(...); + } + + +g に入るときに、fp は、n の頭になければならない。これを +移動するのは、f の役割。出て行くときには、b の頭に +合わせる必要がある。これは、g の役割。g は、元の頭(fp) +を知らないから、これは取っておく必要がある。差では +判断できない。g 側で取っておくことは可能だが、その +時にも、f 側からずらす大きさを渡す必要がある。 + +明示しても良いんだけどね... + goto g(int c,__code *f,__environment,interface &rest), + __envronment+sizeof(interface); + __code g(int c,__code (*n)(...),(void*)parent,...) { + goto n(...),parent; + } +みたいな形でさ... その方がいいのかな。繁雑だけど。: よりかまし? + +: を使う方法だと、: が fp みたいな感じになる。 + +難しいね。きれいなsyntaxにならない。 +