summaryrefslogtreecommitdiff
path: root/numeric.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-07-11 06:47:09 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-07-11 06:47:09 +0000
commit1db0db3ba0b90787e9db8c2dc72bfed879d5ee20 (patch)
treea0b9f5b623b16f9436f0a687782c2480b32e93ce /numeric.c
parent4bacdc1e46ab788f9285ccd8eccd2776260f9528 (diff)
* bignum.c (rb_int2big): use SIGNED_VALUE. [ruby-dev:29019]
* bignum.c (rb_int2inum, rb_uint2inum): use VALUE sized integer. * bignum.c (rb_big2long, rb_big2ulong): ditto. * numeric.c (rb_num2long, rb_num2ulong): ditto. * numeric.c (check_int, check_uint): ditto. * bignum.c (rb_quad_pack): typo fixed. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10511 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'numeric.c')
-rw-r--r--numeric.c38
1 files changed, 20 insertions, 18 deletions
diff --git a/numeric.c b/numeric.c
index 2448cce894..1a2f779318 100644
--- a/numeric.c
+++ b/numeric.c
@@ -1458,7 +1458,7 @@ num_step(int argc, VALUE *argv, VALUE from)
return from;
}
-long
+SIGNED_VALUE
rb_num2long(VALUE val)
{
if (NIL_P(val)) {
@@ -1471,7 +1471,7 @@ rb_num2long(VALUE val)
case T_FLOAT:
if (RFLOAT(val)->value <= (double)LONG_MAX
&& RFLOAT(val)->value >= (double)LONG_MIN) {
- return (long)(RFLOAT(val)->value);
+ return (SIGNED_VALUE)(RFLOAT(val)->value);
}
else {
char buf[24];
@@ -1491,19 +1491,18 @@ rb_num2long(VALUE val)
}
}
-unsigned long
+VALUE
rb_num2ulong(VALUE val)
{
if (TYPE(val) == T_BIGNUM) {
return rb_big2ulong(val);
}
- return (unsigned long)rb_num2long(val);
+ return (VALUE)rb_num2long(val);
}
-#if SIZEOF_INT < SIZEOF_LONG
+#if SIZEOF_INT < SIZEOF_VALUE
static void
-check_int(num)
- long num;
+check_int(SIGNED_VALUE num)
{
const char *s;
@@ -1516,21 +1515,27 @@ check_int(num)
else {
return;
}
+#if LONG_LONG_VALUE
+ rb_raise(rb_eRangeError, "integer %lld too %s to convert to `int'", num, s);
+#else
rb_raise(rb_eRangeError, "integer %ld too %s to convert to `int'", num, s);
+#endif
}
static void
-check_uint(num)
- unsigned long num;
+check_uint(VALUE num)
{
if (num > UINT_MAX) {
+#if LONG_LONG_VALUE
+ rb_raise(rb_eRangeError, "integer %llu too big to convert to `unsigned int'", num);
+#else
rb_raise(rb_eRangeError, "integer %lu too big to convert to `unsigned int'", num);
+#endif
}
}
long
-rb_num2int(val)
- VALUE val;
+rb_num2int(VALUE val)
{
long num = rb_num2long(val);
@@ -1539,8 +1544,7 @@ rb_num2int(val)
}
long
-rb_fix2int(val)
- VALUE val;
+rb_fix2int(VALUE val)
{
long num = FIXNUM_P(val)?FIX2LONG(val):rb_num2long(val);
@@ -1549,8 +1553,7 @@ rb_fix2int(val)
}
unsigned long
-rb_num2uint(val)
- VALUE val;
+rb_num2uint(VALUE val)
{
unsigned long num = rb_num2ulong(val);
@@ -1561,8 +1564,7 @@ rb_num2uint(val)
}
unsigned long
-rb_fix2uint(val)
- VALUE val;
+rb_fix2uint(VALUE val)
{
unsigned long num;
@@ -1837,7 +1839,7 @@ VALUE
rb_fix2str(VALUE x, int base)
{
extern const char ruby_digitmap[];
- char buf[SIZEOF_LONG*CHAR_BIT + 2], *b = buf + sizeof buf;
+ char buf[SIZEOF_VALUE*CHAR_BIT + 2], *b = buf + sizeof buf;
long val = FIX2LONG(x);
int neg = 0;