ruby-trunk-changes r56763 - r56767

今日は Rational の最適化の続きや例外クラスで backtrace を undef すると例外処理でスタックオーバーフローしてしまう不具合の修正などがありました。

nobu: r56763 2016-11-13 10:51:29 +0900

rational.c で id_eqeq_p を使って "==" メソッドを rb_funcall() で呼び出していたところを rb_equal() を直接呼び出すように最適化して、不要になった id_eqeq_p 変数は削除しています。

nobu: r56764 2016-11-13 11:04:51 +0900

numeric.c の num_equal() で == メソッドを呼んだ結果をそのまま返すのではなくて RTEST() で真偽値を判定して Qtrue または Qfalse のみ返すようにしています。

nobu: r56765 2016-11-13 11:11:07 +0900

拡張ライブラリ readline から internal.h への依存関係を消して、rb_setup_fake_str() を呼んでいたところを rb_enc_str_new_static() という関数で代替しています。

nobu: r56766 2016-11-13 14:25:53 +0900

例外クラスの backtrace を undef で未定義にしてからその例外を発生させると SEGV するという不具合を修正しています。eval_error.c の get_backtrace() を error.c に移動して rb_get_backtrace() という export される関数にして、exc_backtrace() を直接呼び出すようにしています。例外の処理時に Ruby のメソッド呼び出しを利用していたので undef されるとそこでさらに例外が発生して…と無限に再帰してスタックオーバーフローしていたようです。 [ruby-core:78097] [Bug #12925]

nobu: r56767 2016-11-13 14:25:54 +0900

r56766 の追加修正。 rb_get_backtrace で Exception#backtrace が再定義されていたらそれを rb_funcall() で呼ぶようにしています。 [ruby-core:78097] [Bug #12925]