summaryrefslogtreecommitdiff
path: root/numeric.c
diff options
context:
space:
mode:
Diffstat (limited to 'numeric.c')
-rw-r--r--numeric.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/numeric.c b/numeric.c
index 7d373e4083..b030d8795a 100644
--- a/numeric.c
+++ b/numeric.c
@@ -1029,54 +1029,62 @@ check_uint(num)
}
}
-int
+long
rb_num2int(val)
VALUE val;
{
long num = rb_num2long(val);
check_int(num);
- return (int)num;
+ return num;
}
-int
+long
rb_fix2int(val)
VALUE val;
{
long num = FIXNUM_P(val)?FIX2LONG(val):rb_num2long(val);
check_int(num);
- return (int)num;
+ return num;
}
-unsigned int
+unsigned long
rb_num2uint(val)
VALUE val;
{
unsigned long num = rb_num2ulong(val);
- check_uint(num);
- return (int)num;
+ if (RTEST(rb_funcall(INT2FIX(0), '<', 1, val))) {
+ check_uint(num);
+ }
+ return num;
}
-unsigned int
+unsigned long
rb_fix2uint(val)
VALUE val;
{
- unsigned long num = FIXNUM_P(val)?FIX2LONG(val):rb_num2ulong(val);
+ unsigned long num;
- check_uint(num);
- return (int)num;
+ if (!FIXNUM_P(val)) {
+ return rb_num2uint(val);
+ }
+ num = FIX2ULONG(val);
+ if (FIX2LONG(val) > 0) {
+ check_uint(num);
+ }
+ return num;
}
#else
-int
+long
rb_num2int(val)
VALUE val;
{
return rb_num2long(val);
}
-int
+long
rb_fix2int(val)
VALUE val;
{