From: matz@... (Yukihiro Matsumoto) Date: 2001-12-14T18:06:53+09:00 Subject: [ruby-dev:15446] Re: Time#utcoff まつもと ゆきひろです In message "[ruby-dev:15438] Re: Time#utcoff" on 01/12/14, Tanaka Akira writes: |ちなみに PR168 に関していえば、じつは原因がすでに判明しています。 |time_localtime 内の localtime が NULL を返すのが原因です。 | |ついでにいえば make_time_t が失敗するのもそれが原因です。 ふうむ。 |time_localtime に関しては対症療法的には検査を入れて例外を生成させれば |いいんですが、localtime_r だと問題ないのが奇妙です。 それ変ですねえ。 |で、次に問題になってるのが NUM2LONG です。これは現在中身が NUM2INT な |のですが、このマシンでは sizeof(int)==4, |sizeof(long)==sizeof(time_t)==8 なので、NUM2LONG を使うようにしても |Time.at がうまく動きません。 ruby.hを見ると #define NUM2LONG(x) (FIXNUM_P(x)?FIX2LONG(x):rb_num2long((VALUE)x)) #define NUM2ULONG(x) rb_num2ulong((VALUE)x) #if SIZEOF_INT < SIZEOF_LONG int rb_num2int _((VALUE)); #define NUM2INT(x) (FIXNUM_P(x)?FIX2INT(x):rb_num2int((VALUE)x)) int rb_fix2int _((VALUE)); #define FIX2INT(x) rb_fix2int((VALUE)x) #define NUM2UINT(x) ((unsigned int)NUM2INT(x)) #define FIX2UINT(x) ((unsigned int)FIX2INT(x)) #else #define NUM2INT(x) NUM2LONG(x) #define NUM2UINT(x) NUM2ULONG(x) #define FIX2INT(x) FIX2LONG(x) #define FIX2UINT(x) FIX2ULONG(x) #endif ですから、SIZEOF_INT < SIZEOF_LONG (このケース)では、 NUM2LONG()とNUM2INT()は違うものだと思うのですが。 どっちかというと rb_num2long() の実装のバグとかじゃないんで すかねえ。