diff --git a/object.c b/object.c index d0c0e34f82..0d99c6db47 100644 --- a/object.c +++ b/object.c @@ -3138,6 +3138,9 @@ rb_convert_to_integer(VALUE val, int base, int raise_exception) tmp = rb_protect(rb_check_to_int, val, NULL); if (RB_INTEGER_TYPE_P(tmp)) return tmp; rb_set_errinfo(Qnil); + if (!NIL_P(tmp = rb_check_string_type(val))) { + return rb_str_convert_to_inum(tmp, base, TRUE, raise_exception); + } if (!raise_exception) { VALUE result = rb_protect(rb_check_to_i, val, NULL); diff --git a/test/ruby/test_integer.rb b/test/ruby/test_integer.rb index c3e11498be..886888e7b0 100644 --- a/test/ruby/test_integer.rb +++ b/test/ruby/test_integer.rb @@ -247,6 +247,13 @@ class TestInteger < Test::Unit::TestCase end; end + def test_Integer_when_to_str + def (obj = Object.new).to_str + "0x10" + end + assert_equal(16, Integer(obj)) + end + def test_int_p assert_not_predicate(1.0, :integer?) assert_predicate(1, :integer?)