ruby-trunk-changes r64161 - r64171

今日は Range#rand の引数に endless range を渡した時の例外の修正などがありました。

k0kubun: r64161 2018-08-02 22:41:27 +0900

r64143 の MJIT 用ヘッダをビルドディレクトリのものも許容するようにする環境変数 MJIT_SEARCH_BUILD_DIR が設定されていた時の処理は configure 時のオプション --enable-load-relative が設定されていなかった時のみ行うようにしています。

k0kubun: r64162 2018-08-02 23:40:36 +0900

r64094 の MJIT で複数のメソッドの *.o を1つの *.so にまとめてリンクしなおす処理は MinGW では無効にするようにしています。 MinGW では同名の関数定義に static 修飾子がついてない時に問題になるとのこと。なるほどー。

k0kubun: r64163 2018-08-03 00:35:05 +0900

r64072 の MJIT の --jit-max-cache オプションのテストを MinGW では skip していましたが、これは削除してかわりに putiseq 命令を含むメソッドのテストを skip するようにしています。

svn: r64164 2018-08-03 00:35:06 +0900

version.h の日付更新。

normal: r64165 2018-08-03 06:13:50 +0900

thread_pthread.c の gvl_acquire_common() で native_cond_timedwait() に渡すタイムアウトの時刻をループ内で毎回 TIME_QUANTUM_USEC ぶん現在時刻から先にしてましたが、ETIMEDOUT で抜けるまでは時刻を更新しないようにしています。

mame: r64166 2018-08-03 14:11:20 +0900

thread_pthread.c の mjit_worker() で pthread_setcancelstate(3) を呼び出しているところを pthread_cancel() が利用可能な環境かどうか preprocessor で PTHREAD_CANCEL_ENABLE のチェックで括るようにしています。 Android の環境などで使えないことがあるようです。

nobu: r64167 2018-08-03 15:31:22 +0900

Random#rand の引数には Range オブジェクトを渡してその範囲の一様分布乱数を返すことができますが、その引数に終端が省略されたいわゆる endless range を渡した時に考慮していなくて TypeError が発生していたのを Errno::EDOM を発生させるようにしています。 [ruby-core:88261] [Bug #14958]

nobu: r64168 2018-08-03 15:53:14 +0900

AST::Node クラスの allocate を undef して initialize を通さずにオブジェクトを生成するのを禁止するようにしています。未初期化の AST::Node を使うと SEGV してしまう不具合があったため。

nobu: r64169 2018-08-03 16:17:20 +0900

r64167 で Random#rand の引数に endless range を渡した時に Errno::EDOM を発生させるのに range_values() 関数で例外発生させていましたが、ここでは Qnil を返して呼び元で例外発生させるようにしています。といっても range_values() は static で今のところ rand_range() からしか呼ばれないのですが関数名からして Range の始点終点などの属性を取り出すための関数なのでここで例外を発生させるのはおかしいから、ってことですね。

nobu: r64170 2018-08-03 16:24:33 +0900

さらに range_values() で id_minus でメソッドが呼べるのかをチェックしてから rb_funcallv() でメソッド呼び出ししていたのをまとめた rb_check_funcall() という関数を利用するようにしています。

nobu: r64171 2018-08-03 20:13:15 +0900

更に更に range_values() で rb_check_funcall() でチェック後に Qnil がかえってきていたら Qfalse を返すようにしていたのを、未定義時に返すオブジェクトを指定できる rb_check_funcall_default() をいう関数を使うようにリファクタリングしています。