えぐち@エスアンドイー です。

>>> In message [ruby-list:19562] Re: build on alpha
    On Thu, 16 Dec 1999 02:48:28 +0900, tokoma / sco.bekkoame.ne.jp (中川 誠) said:

中川> 中川です。
中川> 
中川> In message "[ruby-list:19543] Re: build on alpha"
中川>     on 99/12/15, EGUCHI Osamu <eguchi / shizuokanet.ne.jp> wrote:

中川>   >   というわけで、[ruby-list:19520]のパッチは、そのままでは
中川>   >   きっと正しく機能しないので、  結果は追究しないでください。^^;;
中川> 
中川> とりあえずコンパイル時のワーニングから類推しておこなった結果を付けておき
中川> ます。あと eval.c へおこなっていた修正もパッチの形にしました。Makefile
中川> で -std のフラグが付くようにする方法は分りませんので、パッチにはしていま
中川> せん。

configure.in で、

  CFLAGS="$CFLAGS -std'

でいいと思いますが、 host_os は何になるかわかりません。

  ./config.guess 

の結果はどんな文字列になりますか?

中川> marshal のテストまでに失敗してしまうです。

これが、

中川>   >   + marshal が、*digits が 2 バイトであることを仮定している
中川>   >     ∴marshal で store されたデータが、いじると非互換になる

です。

従来との互換性をもったまま、32 ビット USHORT に
対応するパッチを作ってみました。

中川>   > など、小手先で対応できない物も多いので、ちょっと深く考えてみます。

結局、深い考えはなく、互換性は守る方向で対応できそう。。

あと、USHORT は誤解されそうなので、HALFLONG あたりが妥当?

	えぐち

Index: marshal.c =================================================================== RCS file: /usr/home/eguchi/cvs.netlab.co.jp/ruby/marshal.c,v retrieving revision 1.7 diff -d -u -r1.7 marshal.c --- marshal.c 1999/12/02 06:58:48 1.7 +++ marshal.c 1999/12/16 03:01:14 @@ -289,13 +289,19 @@ { char sign = RBIGNUM(obj)->sign?'+':'-'; int len = RBIGNUM(obj)->len; - unsigned short *d = RBIGNUM(obj)->digits; + USHORT *d = RBIGNUM(obj)->digits; + size_t width = sizeof(USHORT) / 2; w_byte(sign, arg); - w_long(len, arg); + w_long(len * width, arg); while (len--) { - w_short(*d, arg); - d++; + int i; + USHORT e = *d++; + + for (i = 0; i < width; i++) { + w_short(e & 0xffffffff, arg); + e >>= 16; + } } } return; @@ -680,15 +686,25 @@ case TYPE_BIGNUM: { int len; - unsigned short *digits; + USHORT *digits; + size_t width = sizeof(USHORT) / 2; NEWOBJ(big, struct RBignum); OBJSETUP(big, rb_cBignum, T_BIGNUM); big->sign = (r_byte(arg) == '+'); - big->len = len = r_long(arg); - big->digits = digits = ALLOC_N(unsigned short, len); - while (len--) { - *digits++ = r_short(arg); + len = r_long(arg); + big->len = (len + width - 1) / width; + big->digits = digits = ALLOC_N(USHORT, big->len); + while (len) { + int i; + USHORT e = 0; + + for (i = 0; i < width; i++) { + e <<= 16; + e |= r_short(arg); + len--; + } + *digits++ = e; } big = RBIGNUM(rb_big_norm((VALUE)big)); if (TYPE(big) == T_BIGNUM) {