Berger, Daniel
11/19/2003 3:25:00 PM
nobu.nokada@softhome.net wrote:
>
> 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
Forgive my ignorance, but does this just mean that pack("V") is always
32 bits, as in Perl?
Dan