aboutsummaryrefslogtreecommitdiffstats
path: root/object.c
diff options
context:
space:
mode:
Diffstat (limited to 'object.c')
-rw-r--r--object.c29
1 files changed, 11 insertions, 18 deletions
diff --git a/object.c b/object.c
index 228b67e8f8..05bef4df28 100644
--- a/object.c
+++ b/object.c
@@ -2684,30 +2684,23 @@ rb_convert_to_integer(VALUE val, int base)
{
VALUE tmp;
- switch (TYPE(val)) {
- case T_FLOAT:
+ if (RB_FLOAT_TYPE_P(val)) {
+ double f;
if (base != 0) goto arg_error;
- if (RFLOAT_VALUE(val) <= (double)FIXNUM_MAX
- && RFLOAT_VALUE(val) >= (double)FIXNUM_MIN) {
- break;
- }
- return rb_dbl2big(RFLOAT_VALUE(val));
-
- case T_FIXNUM:
- case T_BIGNUM:
+ f = RFLOAT_VALUE(val);
+ if (FIXABLE(f)) return LONG2FIX((long)f);
+ return rb_dbl2big(f);
+ }
+ else if (RB_INTEGER_TYPE_P(val)) {
if (base != 0) goto arg_error;
return val;
-
- case T_STRING:
+ }
+ else if (RB_TYPE_P(val, T_STRING)) {
return rb_str_to_inum(val, base, TRUE);
-
- case T_NIL:
+ }
+ else if (NIL_P(val)) {
if (base != 0) goto arg_error;
rb_raise(rb_eTypeError, "can't convert nil into Integer");
- break;
-
- default:
- break;
}
if (base != 0) {
tmp = rb_check_string_type(val);