From: nobu.nokada@... Date: 2003-11-18T09:51:07+09:00 Subject: Re: pack bug on 64-bit ruby Hi, At Tue, 18 Nov 2003 07:03:54 +0900, Berger, Daniel wrote: > The question I have now then is, if I've got code that uses > [-1].pack("V"), how should I handle this on 64 bit platforms? Is there > a way to tell the bit-ness of Ruby from within Ruby? Perhaps a > RUBY_BITNESS constant? Or is there some sort of "cross-bitness" > approach I can use? [-1].pack("v") gently gives "\377\377" on 32 bit platforms, so it might be better to just mask, like as Perl. * pack.c (pack_pack): mask for lower bits. [ruby-talk:85377] Index: pack.c =================================================================== RCS file: /cvs/ruby/src/ruby/pack.c,v retrieving revision 1.57 diff -u -2 -p -r1.57 pack.c --- pack.c 9 Oct 2003 17:45:52 -0000 1.57 +++ pack.c 18 Nov 2003 00:45:32 -0000 @@ -676,4 +676,5 @@ pack_pack(ary, fmt) if (NIL_P(from)) s = 0; else { + from = rb_funcall(from, '&', 1, INT2FIX(0xffff)); s = NUM2INT(from); } @@ -690,5 +691,6 @@ pack_pack(ary, fmt) if (NIL_P(from)) l = 0; else { - l = NATINT_U32(from); + from = rb_funcall(from, '&', 1, UINT2NUM(0xffffffff)); + l = NUM2ULONG(from); } l = htonl(l); @@ -704,4 +706,5 @@ pack_pack(ary, fmt) if (NIL_P(from)) s = 0; else { + from = rb_funcall(from, '&', 1, INT2FIX(0xffff)); s = NUM2INT(from); } @@ -718,5 +721,6 @@ pack_pack(ary, fmt) if (NIL_P(from)) l = 0; else { - l = NATINT_U32(from); + from = rb_funcall(from, '&', 1, UINT2NUM(0xffffffff)); + l = NUM2ULONG(from); } l = htovl(l); -- Nobu Nakada