Permalink
Browse files

* time.c (num_exact): use to_r method only if to_int method is

  available.
  [ruby-core:53764] [Bug #8173] reported by Hiro Asari.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39967 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information...
1 parent 2f1e7f6 commit c64f26a28171e3e9400f027e63d02dc5af5f8ca5 @akr akr committed Mar 27, 2013
Showing with 10 additions and 1 deletion.
  1. +6 −0 ChangeLog
  2. +1 −0 test/ruby/test_time.rb
  3. +3 −1 time.c
View
@@ -1,3 +1,9 @@
+Wed Mar 27 12:45:41 2013 Tanaka Akira <akr@fsij.org>
+
+ * time.c (num_exact): use to_r method only if to_int method is
+ available.
+ [ruby-core:53764] [Bug #8173] reported by Hiro Asari.
+
Wed Mar 27 12:07:40 2013 Tanaka Akira <akr@fsij.org>
* test/-ext-/num2int/test_num2int.rb (test_num2ll): test LLONG_MIN,
View
@@ -351,6 +351,7 @@ def test_utc_or_local
end
assert_raise(ArgumentError) { Time.gm(2000, 1, 1, 0, 0, -(2**31), :foo, :foo) }
o = Object.new
+ def o.to_int; 0; end
def o.to_r; nil; end
assert_raise(TypeError) { Time.gm(2000, 1, 1, 0, 0, o, :foo, :foo) }
def o.to_r; ""; end
View
4 time.c
@@ -683,7 +683,9 @@ num_exact(VALUE v)
default:
if ((tmp = rb_check_funcall(v, rb_intern("to_r"), 0, NULL)) != Qundef) {
- if (rb_respond_to(v, rb_intern("to_str"))) goto typeerror;
+ /* test to_int method availability to reject non-Numeric
+ * objects such as String, Time, etc which have to_r method. */
+ if (!rb_respond_to(v, rb_intern("to_int"))) goto typeerror;
v = tmp;
break;
}

0 comments on commit c64f26a

Please sign in to comment.