ruby-changes:16527
From: akr <ko1@a...>
Date: Fri, 2 Jul 2010 05:39:48 +0900 (JST)
Subject: [ruby-changes:16527] Ruby:r28518 (trunk): * numeric.c (rb_num2long): accept LONG_MAX < x < LONG_MAX+1 and
akr 2010-07-02 05:39:32 +0900 (Fri, 02 Jul 2010) New Revision: 28518 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28518 Log: * numeric.c (rb_num2long): accept LONG_MAX < x < LONG_MAX+1 and LONG_MIN-1 < x < LONG_MIN as well because they are converted into the valid range of long by truncation. (rb_num2ulong): accept ULONG_MAX < x < ULONG_MAX+1 and LONG_MIN-1 < x < LONG_MIN as well. (rb_num2ll): accept LLONG_MAX < x < LLONG_MAX+1 and LLONG_MIN-1 < x < LLONG_MIN. Modified files: trunk/ChangeLog trunk/numeric.c Index: ChangeLog =================================================================== --- ChangeLog (revision 28517) +++ ChangeLog (revision 28518) @@ -1,3 +1,13 @@ +Fri Jul 2 05:31:51 2010 Tanaka Akira <akr@f...> + + * numeric.c (rb_num2long): accept LONG_MAX < x < LONG_MAX+1 and + LONG_MIN-1 < x < LONG_MIN as well because they are converted + into the valid range of long by truncation. + (rb_num2ulong): accept ULONG_MAX < x < ULONG_MAX+1 and + LONG_MIN-1 < x < LONG_MIN as well. + (rb_num2ll): accept LLONG_MAX < x < LLONG_MAX+1 and + LLONG_MIN-1 < x < LLONG_MIN. + Thu Jul 1 23:10:25 2010 James Edward Gray II <jeg2@r...> * lib/csv.rb: Improving documentation. Index: numeric.c =================================================================== --- numeric.c (revision 28517) +++ numeric.c (revision 28518) @@ -1683,6 +1683,10 @@ return from; } +#define LONG_MIN_MINUS_ONE ((double)LONG_MIN-1) +#define LONG_MAX_PLUS_ONE (2*(double)(LONG_MAX/2+1)) +#define ULONG_MAX_PLUS_ONE (2*(double)(ULONG_MAX/2+1)) + SIGNED_VALUE rb_num2long(VALUE val) { @@ -1695,8 +1699,8 @@ switch (TYPE(val)) { case T_FLOAT: - if (RFLOAT_VALUE(val) <= (double)LONG_MAX - && RFLOAT_VALUE(val) >= (double)LONG_MIN) { + if (RFLOAT_VALUE(val) < LONG_MAX_PLUS_ONE + && RFLOAT_VALUE(val) > LONG_MIN_MINUS_ONE) { return (SIGNED_VALUE)(RFLOAT_VALUE(val)); } else { @@ -1729,8 +1733,8 @@ switch (TYPE(val)) { case T_FLOAT: - if (RFLOAT_VALUE(val) <= (double)ULONG_MAX - && RFLOAT_VALUE(val) >= (double)LONG_MIN) { + if (RFLOAT_VALUE(val) < ULONG_MAX_PLUS_ONE + && RFLOAT_VALUE(val) > LONG_MIN_MINUS_ONE) { return (VALUE)RFLOAT_VALUE(val); } else { @@ -1853,6 +1857,10 @@ #if HAVE_LONG_LONG +#define LLONG_MIN_MINUS_ONE ((double)LLONG_MIN-1) +#define LLONG_MAX_PLUS_ONE (2*(double)(LLONG_MAX/2+1)) +#define ULLONG_MAX_PLUS_ONE (2*(double)(ULLONG_MAX/2+1)) + LONG_LONG rb_num2ll(VALUE val) { @@ -1864,8 +1872,8 @@ switch (TYPE(val)) { case T_FLOAT: - if (RFLOAT_VALUE(val) <= (double)LLONG_MAX - && RFLOAT_VALUE(val) >= (double)LLONG_MIN) { + if (RFLOAT_VALUE(val) < LLONG_MAX_PLUS_ONE + && RFLOAT_VALUE(val) > LLONG_MIN_MINUS_ONE) { return (LONG_LONG)(RFLOAT_VALUE(val)); } else { -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/