ruby-trunk-changes r38609 - r38622

今日は irb の修正/変更が多くありました。

keiju:r38609 2012-12-26 01:04:52 +0900

lib/irb/ruby-lex.rb で端末から読み込んだ文字列の最後の改行文字を検索するのに String#reverse してから String#index していたのを String#rindex を呼ぶように変更しています。効率的にするため。

svn:r38610 2012-12-26 01:04:57 +0900

version.h の日付更新。

keiju:r38611 2012-12-26 01:35:04 +0900

irb の起動後に conf.debug_level を変更するとエラーになる現象の修正です。 しかしこれでデフォルトのログレベルが変化してしまった模様で r38620 で再修正されています。 [ruby-dev:45517] [Bug #6301]

nobu:r38612 2012-12-26 03:10:46 +0900

irb の修正の行末の空白の除去。

naruse:r38613 2012-12-26 06:45:36 +0900

SEGV のハンドラのテストで子プロセスを起動する時のコマンドラインを文字列で全体を渡すのを文字列の配列で渡してシェルを介在しないで exec するようにしています。

nobu:r38614 2012-12-26 07:29:42 +0900

r38613 と同じく SEGV ハンドラのテストで子プロセスでファイルから読み込みするために $stdin から読み込んでいるところを ARGF.read に置き換えています。引数にファイルパスを指定していないから ARGF じゃだめなんじゃ……と思ったら ARGF は引数がない時は標準入力から読むんですね。しかしなぜ変更したんでしょう。

nobu:r38615 2012-12-26 07:31:16 +0900

string.c の rb_str_enumerate_chars() で部分文字列を切り出した String オブジェクトを変数に格納して RB_GC_GUARD() を使っています。しかし RB_GC_GUARD() に str を渡しているのですが str は引数なので不要で、substr の間違いじゃないでしょうか?

nobu:r38616 2012-12-26 07:31:21 +0900

string.c で String オブジェクトから部分文字列を切り出した String オブジェクトを作る処理で OBJ_INFECT() やエンコーディングのコピーなどの処理を含む rb_str_subseq() という関数を利用するようにリファクタリングしています。

nobu:r38617 2012-12-26 07:31:26 +0900

rb_enc_cr_str_copy_for_substr() という部分文字列の String オブジェクトにエンコーディングを設定する関数で、部分文字列が空文字列だったら RBasic::flags に立てるフラグを常に ENC_CODERANGE_VALID もしくは ENC_CODERANGE_7BIT にするようにしています。

naruse:r38618 2012-12-26 09:50:55 +0900

SEGV ハンドラのテストのために子プロセスを起動するところで、コアファイルの生成を抑制するための rlimit_core オプションの指定を assert_in_out_err() に渡すようにしています。

kosaki:r38619 2012-12-26 12:00:13 +0900

configure で位置独立実行形式にするリンク時のオプション -pie をチェックする時に -fPIE も指定するようにしています。 OpenBSD 上で両方指定しないとエラーになって -pie が使われていなかったようです。 [ruby-core:51082] [Bug #7606]

keiju:r38620 2012-12-26 12:55:22 +0900

r38611 で irb の config.debug_devel のデフォルト値が @CONF[:DEBUG_LEVEL] になったのですが、この値が 1 だった為デフォルトでメッセージが大量に出てしまっていたので @CONF[:DEBUG_LEVEL] を 0 に初期化するようにしています。 これは変更しちゃってもいいんですかね。使われてなかったのかな。 [ruby-dev:46805] [Bug #6301]

keiju:r38621 2012-12-26 21:29:28 +0900

irb は config.math_mode = true とすることで math mode というモードになり mathn を require して除算が Rational になるなどの変化をするのですが、config.math_mode = false としても元のモードには戻れない仕様でした。しかし nil を代入すると戻るという微妙な挙動をしていたので nil を代入した時もエラーにして弾くように修正しています。 [ruby-dev:45518] [Bug #6302]

keiju:r38622 2012-12-26 21:42:09 +0900

irb 内で irb メソッドによりサブirbというのを起動する*1とプロンプトに irb という名前が固定で表示されていたのを IRB.conf[:IRB_NAME] というオプションで設定された名前が表示されるように修正しています。 [ruby-dev:45543] [Bug #6338]

*1:ややこしいですが、サブirb は self をすりかえることができたりして便利です