diff options
| author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-05-03 09:12:13 +0000 |
|---|---|---|
| committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-05-03 09:12:13 +0000 |
| commit | dfa7e6a5f2bca76060c7d7f5dd22ea738af201e9 (patch) | |
| tree | ae4d5b2d854a65b2e53f249f41eee2c8ede52b2d /time.c | |
| parent | 5e4dc946afd3bbdba5a6b9bd6ad9e163491844e6 (diff) | |
| download | ruby-dfa7e6a5f2bca76060c7d7f5dd22ea738af201e9.tar.gz ruby-dfa7e6a5f2bca76060c7d7f5dd22ea738af201e9.tar.xz ruby-dfa7e6a5f2bca76060c7d7f5dd22ea738af201e9.zip | |
* time.c (time_timespec): raise TypeError for nil and other objects
which has no divmod method.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@16277 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'time.c')
| -rw-r--r-- | time.c | 24 |
1 files changed, 15 insertions, 9 deletions
@@ -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; |
