summaryrefslogtreecommitdiff
path: root/time.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-05-03 09:12:13 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-05-03 09:12:13 +0000
commit74697788d4e93eafabc652657ecb477a39b75507 (patch)
treeae4d5b2d854a65b2e53f249f41eee2c8ede52b2d /time.c
parente5248cfd79f61f9bb73bd755632aa28d8a1b97f1 (diff)
* time.c (time_timespec): raise TypeError for nil and other objects
which has no divmod method. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16277 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'time.c')
-rw-r--r--time.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/time.c b/time.c
index 1760332655..460a184507 100644
--- a/time.c
+++ b/time.c
@@ -217,18 +217,24 @@ time_timespec(VALUE num, int interval)
break;
default:
- ary = rb_check_array_type(rb_funcall(num, id_divmod, 1, INT2FIX(1)));
- if (NIL_P(ary)) {
+ if (rb_respond_to(num, id_divmod)) {
+ ary = rb_check_array_type(rb_funcall(num, id_divmod, 1, INT2FIX(1)));
+ if (NIL_P(ary)) {
+ goto typeerror;
+ }
+ i = rb_ary_entry(ary, 0);
+ f = rb_ary_entry(ary, 1);
+ t.tv_sec = NUM2LONG(i);
+ if (interval && t.tv_sec < 0)
+ rb_raise(rb_eArgError, "%s must be positive", tstr);
+ f = rb_funcall(f, id_mul, 1, INT2FIX(1000000000));
+ t.tv_nsec = NUM2LONG(f);
+ }
+ else {
+typeerror:
rb_raise(rb_eTypeError, "can't convert %s into %s",
rb_obj_classname(num), tstr);
}
- i = rb_ary_entry(ary, 0);
- f = rb_ary_entry(ary, 1);
- t.tv_sec = NUM2LONG(i);
- if (interval && t.tv_sec < 0)
- rb_raise(rb_eArgError, "%s must be positive", tstr);
- f = rb_funcall(f, id_mul, 1, INT2FIX(1000000000));
- t.tv_nsec = NUM2LONG(f);
break;
}
return t;