山本です。

Takahiro Kambe <taca / back-street.net> wrote:
(2005/09/12 00:29)

>	int main()
>	{
>	    hoge(3,4);
>	    hoge((VALUE)3,(VALUE)4);
>	}
>
>とかすると、
>
>% ./a.out   
>3 134518828
>3 4
>
>といった結果となり、
>
>	int main()
>	{
>	    hoge((VALUE)3,(VALUE)4);
>	    hoge(3,4);
>	}
>
>とかすると、
>
>% ./a.out   
>3 4
>3 4
>
>となりました。やっぱり、危険な匂いがしませんか。

やはり ANYARGS のままにするのは気持ち悪いものがありますね・・・・

Tanaka Akira <akr / m17n.org> wrote:
(2005/09/12 00:56)

>ただ、rb_thread_create についていえば引数は VALUE (*)(VALUE) で受けて
>VALUE (*)(VALUE, rb_thread_t) に cast してから rb_thread_start_0 にわ
>たせばいいことだと思います。
>
>もちろん、(ANSI C では保証されないけれど) 引数の個数が少なくても呼べる
>と信じるなら、ですが。まぁ、固定引数の関数に余計な引数与えて呼ぶのはそ
>れほど分の悪い賭けではないと思います。
>
>一般に、関数の型に全部 prototype をつけるのは、そういう暗黙の期待を明
>示的に書くようにするだけの話で、cast を入れる以上にコードを変更する必
>要はないのではないか、と思っているんですが。

田中さんのおっしゃるようにキャストするのがベターの気がしてきました。

>> というわけで、放置するのは良くないような気がしてきました。typedef void* VALUE とすれば
>> 64bit 環境でも問題ない可能性はありますが、そのかわりコールバック側で VALUE * で受けたり、
>> struct のポインタで受けたりはできなくなるんじゃないでしょうか。
>
>ここで述べられている理由はよくわかりませんが、

仕様書の該当個所に、整数型の場合の挙動は書いてあったのですが、ポインタ型の場合の
挙動が特に書いてないようだったので、未定義ではないかと思ってました。

>個人的には VALUE は void* にするのが適切であろうと思っています。
>それは、AS/400 なるシステムではポインタと同じサイズの整数型が存在しな
>いということを知ってしまったというのが理由です。

同感です。

  #define IMMEDIATE_P(x) ((VALUE)(x) & IMMEDIATE_MASK)

とかしている部分がそのままでは動かないので、修正が必要そうですが。