ruby-trunk-changes r56694 - r56703

今日は Refinements を定義している Module を prepend した時に Refinements が効いてしまう不具合の修正や不正な文字列から Marshal.load した時の Rational や Range のチェックの追加などがありました。

nobu: r56694 2016-11-10 23:18:52 +0900

Refinements を持っている(refine が呼ばれた) Module を Module#prepend で追加した時に refine での上書きが効いてしまっていた不具合を修正しています。 2.4.1-preview2 では再現しなかったとのことなので r56520 とかそのへんの Refinements がらみの修正で顕在化した問題ですかね。 method_entry_t::def::type が VM_METHOD_TYPE_REFINED の時に RCLASS_ORIGIN() を使ってしまうと Refinements の影響が出るようなので辿らないようにしています。 RCLASS_ORIGIN() が prepend と Refinements の両方のために使われているのでうかつに RCLASS_ORIGIN() を使うとまずいのでしょうか。 [ruby-core:78073] [Bug #12920]

mrkn: r56695 2016-11-11 00:23:33 +0900

Integer#fdiv の実装である int_fdiv() を rb_int_fdiv() と改名して internal.h にプロトタイプ宣言を追加してインタプリタ内で呼べるようにしています。

svn: r56696 2016-11-11 00:23:34 +0900

version.h の日付更新。

mrkn: r56697 2016-11-11 00:23:43 +0900

r56695 で static 関数でなくした rb_int_fdiv() を rational.c の nurat_to_f() で利用するようにしています。最適化のためとのこと。

nobu: r56698 2016-11-11 09:08:41 +0900

r56694 の修正部分のリファクタリング。条件分岐を整理してわかりやすくしています。 [ruby-core:78073] [Bug #12920]

akr: r56699 2016-11-11 12:04:38 +0900

標準添付ライブラリ pp の Kernel#pp の rdoc を生成するように :nodoc: のタグを消しています。

nobu: r56700 2016-11-11 16:08:52 +0900

rational.c で RB_TYPE_P() で T_FIXNUM と T_BIGNUM のチェックをしているところを RB_INTEGER_TYPE_P() を使ったチェックに置き換えています。

nobu: r56701 2016-11-11 16:08:53 +0900

rational.c の比較や f_zero, f_one など数値のチェックを行う関数群で可能なら変換を行わずに C の VALUE の値を直接利用したり、不要な分岐を減らしたりといった最適化を行なっています。また戻り値を VALUE から int に変更しています。

nobu: r56702 2016-11-11 16:26:14 +0900

Rational の Marshal.load でロードした num や den のデータが Integer であることをチェックするようにしています。 意図的に生成した文字列から Marshal.load すると不正な Rational オブジェクトが作れてしまっていたようです。 [ruby-core:78071] [Bug #12918]

nobu: r56703 2016-11-11 20:52:03 +0900

Range でも Marshal.load で不正な文字列を load すると不正な Range オブジェクトができてしまっていたので、load 時にチェックを追加しています。 [ruby-core:78067] [Bug #12915]