summaryrefslogtreecommitdiff
path: root/numeric.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-04-01 03:06:09 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-04-01 03:06:09 +0000
commit92f59c6d7937b14bb5eefb052099ef0a3ef3bcd0 (patch)
tree1c4529417573e8ca3aab023e2e766eb2a129925c /numeric.c
parent6a23960f3fe722050d29cf91022d14ad949fa6d3 (diff)
* 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
Diffstat (limited to 'numeric.c')
-rw-r--r--numeric.c26
1 files changed, 10 insertions, 16 deletions
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);
}
}