俺と ruby 1.8.5-p12 と emx の罠

投げやりな日記。せっかくだから移植してみようかーとか思って先月の終わりぐらいからちょろちょろ作業しているのですが、(1.8.4 の頃みたいに)中途半端に放り出す可能性も甚大。だいたい make test-all の結果が "1505 tests, 13891 assertions, 12 failures, 77 errors" とかだし。

でもまあきょうは failure の原因がひとつわかった。これ↓

なぜ正しい結果(900000)にならんのかと思ったら、要するにこういうことだった。

emx/include/time.h

#if !defined(_TIME_T)
#define _TIME_T
typedef unsigned long time_t;
#endif

ああ…だから usec 部分の減算結果がマイナスになるとバグるわけね。納得しました。ただの long に書き直したら正しい結果が得られた。
しかし思うのですが、time_t を unsigned 型で定義してる処理系って実はレアなんだろうか。

念のため InnoTek GCC 3.3.5 も調べてみたが、こちらは time_t、suseconds_t(これは emx では未定義)共に符号つきらしい。やっぱ素の emx 環境は厳しいんじゃねえのかと思えてきた。