From: Yukihiro Matsumoto Date: 2008-08-13T16:03:11+09:00 Subject: [ruby-dev:35838] Re: [Bug:1.9] Time.now <=> SimpleDelegator.new(Time.now) まつもと ゆきひろです In message "Re: [ruby-dev:35830] Re: [Bug:1.9] Time.now <=> SimpleDelegator.new(Time.now)" on Tue, 12 Aug 2008 18:49:39 +0900, wanabe writes: |2008/06/09 15:56 Tanaka Akira : |> Time.now <=> SimpleDelegator.new(Time.now) が nil になるのは |> SimpleDelegator.new(Time.now) <=> Time.now がそうならないの |> と違ってよろしくないんじゃないでしょうか。 | |パッチを書いてみましたが rb_funcall が多く、結果がコストに見合っていない気がします。 |なにか良い方法をご存知の方は教えていただけるとありがたいです。 <=>が型が合わないとnilを返すことが期待されていることを利用し て以下のようにしてみました。 --- a/time.c +++ b/time.c @@ -1087,8 +1087,18 @@ time_cmp(VALUE time1, VALUE time2) if (tobj1->ts.tv_sec > tobj2->ts.tv_sec) return INT2FIX(1); return INT2FIX(-1); } + else { + VALUE cmp; + int n; + + cmp = rb_funcall(time2, rb_intern("<=>"), 1, time1); + if (NIL_P(cmp)) return Qnil; - return Qnil; + n = rb_cmpint(cmp, time1, time2); + if (n == 0) return INT2FIX(0); + if (n > 0) return INT2FIX(1); + return INT2FIX(-1); + } } /*