diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-07-01 20:39:32 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-07-01 20:39:32 +0000 |
commit | 26202fba935372c269d690b4273b96e61ef58b7c (patch) | |
tree | 1524fef79b8218f1006479384b4e0ba81ad2e456 /numeric.c | |
parent | 5d229db887ec42178ef90c20c014d5073c49cc6f (diff) |
* 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.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28518 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'numeric.c')
-rw-r--r-- | numeric.c | 20 |
1 files changed, 14 insertions, 6 deletions
@@ -1683,6 +1683,10 @@ num_step(int argc, VALUE *argv, VALUE from) 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 @@ rb_num2long(VALUE val) 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 @@ rb_num2ulong(VALUE val) 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 @@ rb_num2fix(VALUE val) #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 @@ rb_num2ll(VALUE val) 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 { |