зеркало из https://github.com/github/ruby.git
object.c: fixable float to fixnum
* object.c (rb_convert_to_integer): convert a fixable float to a fixnum directly without the convesion method, as well as bignum case. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56497 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
cc08515cf8
Коммит
c94855855e
|
@ -1,4 +1,8 @@
|
|||
Thu Oct 27 09:12:32 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
Thu Oct 27 09:42:09 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* object.c (rb_convert_to_integer): convert a fixable float to a
|
||||
fixnum directly without the convesion method, as well as bignum
|
||||
case.
|
||||
|
||||
* object.c (rb_convert_to_integer): should not drop the converted
|
||||
string.
|
||||
|
|
27
object.c
27
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;
|
||||
f = RFLOAT_VALUE(val);
|
||||
if (FIXABLE(f)) return LONG2FIX((long)f);
|
||||
return rb_dbl2big(f);
|
||||
}
|
||||
return rb_dbl2big(RFLOAT_VALUE(val));
|
||||
|
||||
case T_FIXNUM:
|
||||
case T_BIGNUM:
|
||||
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);
|
||||
|
|
|
@ -104,6 +104,16 @@ class TestInteger < Test::Unit::TestCase
|
|||
obj = Struct.new(:s).new(%w[42 not-an-integer])
|
||||
def obj.to_str; s.shift; end
|
||||
assert_equal(42, Integer(obj, 10))
|
||||
|
||||
assert_separately([], "#{<<-"begin;"}\n#{<<-"end;"}")
|
||||
begin;
|
||||
class Float
|
||||
undef to_int
|
||||
def to_int; raise "conversion failed"; end
|
||||
end
|
||||
assert_equal (1 << 100), Integer((1 << 100).to_f)
|
||||
assert_equal 1, Integer(1.0)
|
||||
end;
|
||||
end
|
||||
|
||||
def test_int_p
|
||||
|
|
Загрузка…
Ссылка в новой задаче