At Tue, 31 Dec 2002 19:24:29 +0000,
I wrote:
> knu         Tue, 31 Dec 2002 19:24:29 +0000
> 
>   Modified files:
>     ruby:
>       node.h ChangeLog
>   Log:
>     * node.h (struct RNode): Change argc from int to long.  Otherwize
>       NEW_CFUNC() sets argc to a wrong value on platforms where
>       sizeof(int) != sizeof(long) and the byte order is big-endian.
>       This fixes breakage on FreeBSD/sparc64.
>   
>   Revision    Changes    Path
>   1.39        +3   -3    ruby/node.h
>     http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/node.h?cvsroot=src&r1=1.38&r2=1.39

 これですが、 rev 1.12 (ruby 1.4.5 の前)で int -> long になって
以来ずっと long だったが、 1.7 の途中、 rev 1.31 で int に戻った
ようです。

http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/node.h#rev1.31

ChangeLog を見ても理由が見あたらないのですが、意図は何だったか
心当たりはありませんか?


 int argc にするなら NEW_CFUNC() と rb_node_newnode() で正しく
型を変換するようにしないとまずそうです。FreeBSD/sparc64 で観察
した限りでは、 int より long が大きくて big-endian なので、
argc の格納時は u2.node から入れるので long 幅に拡張されて格納
されますが、取り出すときは u2.argc が int なので、得られるのは
上位部分(事実上 0)だけ、という状況でした。

 他のビッグエンディアン環境では問題ないのかなあ。報告を聞かない
から FreeBSD/sparc64 の gcc 固有?

-- 
                     /
                    /__  __            Akinori.org / MUSHA.org
                   / )  )  ) )  /     FreeBSD.org / Ruby-lang.org
Akinori MUSHA aka / (_ /  ( (__(  @ iDaemons.org / and.or.jp

"I believe in what I see, I believe in what I hear,
   I believe that what I'm feeling changes how the world appears."