From 92f59c6d7937b14bb5eefb052099ef0a3ef3bcd0 Mon Sep 17 00:00:00 2001 From: akr Date: Mon, 1 Apr 2013 03:06:09 +0000 Subject: * numeric.c (check_uint): Take the 1st argument as unsigned long, instead of VALUE. Refine the validity test conditions. (check_ushort): Ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40029 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ numeric.c | 26 ++++++++++---------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index f259f7bde3..b2207a41ae 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Mon Apr 1 12:05:15 2013 Tanaka Akira + + * numeric.c (check_uint): Take the 1st argument as unsigned long, + instead of VALUE. Refine the validity test conditions. + (check_ushort): Ditto. + Mon Apr 1 07:15:03 2013 Ayumu AIZAWA * configure.in: use quadrigraph to put '[' or ']'. [Bug #8192] diff --git a/numeric.c b/numeric.c index 30e5e33045..bf404ff14c 100644 --- a/numeric.c +++ b/numeric.c @@ -2049,20 +2049,17 @@ check_int(SIGNED_VALUE num) } static void -check_uint(VALUE num, int sign) +check_uint(unsigned long num, int sign) { - static const VALUE mask = ~(VALUE)UINT_MAX; - if (sign) { /* minus */ - if ((num & mask) != mask || (num & ~mask) <= INT_MAX) -#define VALUE_MSBMASK ((VALUE)1 << ((sizeof(VALUE) * CHAR_BIT) - 1)) - rb_raise(rb_eRangeError, "integer %"PRIdVALUE " too small to convert to `unsigned int'", num|VALUE_MSBMASK); + if (num < (unsigned long)INT_MIN) + rb_raise(rb_eRangeError, "integer %ld too small to convert to `unsigned int'", (long)num); } else { /* plus */ - if ((num & mask) != 0) - rb_raise(rb_eRangeError, "integer %"PRIuVALUE " too big to convert to `unsigned int'", num); + if (UINT_MAX < num) + rb_raise(rb_eRangeError, "integer %lu too big to convert to `unsigned int'", num); } } @@ -2137,20 +2134,17 @@ check_short(SIGNED_VALUE num) } static void -check_ushort(VALUE num, int sign) +check_ushort(unsigned long num, int sign) { - static const VALUE mask = ~(VALUE)USHRT_MAX; - if (sign) { /* minus */ - if ((num & mask) != mask || (num & ~mask) <= SHRT_MAX) -#define VALUE_MSBMASK ((VALUE)1 << ((sizeof(VALUE) * CHAR_BIT) - 1)) - rb_raise(rb_eRangeError, "integer %"PRIdVALUE " too small to convert to `unsigned short'", num|VALUE_MSBMASK); + if (num < (unsigned long)SHRT_MIN) + rb_raise(rb_eRangeError, "integer %ld too small to convert to `unsigned short'", (long)num); } else { /* plus */ - if ((num & mask) != 0) - rb_raise(rb_eRangeError, "integer %"PRIuVALUE " too big to convert to `unsigned short'", num); + if (USHRT_MAX < num) + rb_raise(rb_eRangeError, "integer %lu too big to convert to `unsigned short'", num); } } -- cgit v1.2.3