ruby-trunk-changes r36418 - r36452

今日はなぜかたくさんコミットがありましたが、特に Thread への非同期割り込みの処理方法の変更と、それにも関連して rb_thread_call_without_gvl2() という GVL を解放する新 API の追加などがありました。拡張ライブラリを書く人はブロックする処理、CPU時間がかかる処理などのために GVL 解放する時には rb_thread_call_without_gvl2() を使う必要がないか確認してみるのがいいでしょう。

ayumin:r36418 2012-07-18 01:13:10 +0900

不要な行末の空白削除。

svn:r36419 2012-07-18 01:13:13 +0900

version.h の日付更新。

naruse:r36420 2012-07-18 03:08:40 +0900

r36415 の Proc#arity の省略可能引数を持つ lambda 型 Proc オブジェクトのテストを追加しています。というか lambda の時のテストというのがなかったようでがっつり追加されています。

naruse:r36421 2012-07-18 04:07:15 +0900

Array#join の separator 引数として明示的に nil が渡された時にデフォルトのセパレータである $, が利用されるので、"" をセパレータとして扱うようにしてはどうかという提案があったのですが、nil は特別な値なので特殊な用途であってもいいだろうということ、$ 変数は推奨されないのでこれを変更した場合の挙動についての変更は優先度が高くないなどの理由で現在の挙動を保つようにして、rdoc への追記するに留めています。 [ruby-core:42194] [Bug #5915]
コミットログに書かれている理由で「nil を "" にするとしたら to_s で変換するというルールが自然だけど、to_s は受け入れられない(超訳)」というのがあるのですが、to_s はなぜだめなのでしょう。

xibbar:r36422 2012-07-18 08:04:46 +0900

CGI.escapeHTML, unescapeHTML でアポストロフィ(')をエスケープ対象(')に追加しています。 HTML5 向けとのこと。 [ruby-core:45760] [Feature #6620]

xibbar:r36423 2012-07-18 08:04:48 +0900

RSS のパーサのテストで結果を CGI.escapeHTML して比較していたところを逆に期待される値を CGI.unescapeHTML してから比較するように変更しています。

drbrain:r36424 2012-07-18 09:27:04 +0900

Logger の rdoc 用コメントの細かな修正です。 [ruby-core:46493] [Bug #6738]

usa:r36425 2012-07-18 09:36:01 +0900

WIN32OLE のテストで ADO が利用できない時に skip するために独自でメッセージを出力してメソッド定義を if で括っていたので標準の skip メソッドを利用するように変更しています。

drbrain:r36426 2012-07-18 10:02:12 +0900

debug.rb の rdoc 用コメントを追加しています。 [ruby-core:46520] [Bug #6743]

naruse:r36427 2012-07-18 12:56:58 +0900

標準ライブラリ Benchmark.benchmark の出力の整形を修正しています。 caption が空の時のヘッダのインデントを修正。その他定数を使っていたところを変数やメソッドに置き換えるなどリファクタリングもしているようです。 [ruby-core:45719] [Bug #6610]

shyouhei:r36428 2012-07-18 13:46:04 +0900

bignum.c と encoding.c で情報量の失なわれる型への代入に明示的なキャストを付けてコンパイラ警告除去しています。

shyouhei:r36429 2012-07-18 14:29:24 +0900

pack.c でもビット演算結果に明示的なキャストを追加しています。

ko1:r36430 2012-07-18 14:46:40 +0900

Thread#raise や Thread#kill など外部から Thread へ割り込みをかけた時に例外などを格納するのに使っていた rb_thread_t::thrown_errinfo を削除し、かわりに queue として扱われる async_errinfo_queue というメンバを追加しています。割り込みする時には async_errinfo_queue へ enque して、逐次処理されるようにしています。また rb_thread_io_blocking_region() で呼び出す関数から例外など大域脱出で抜けてくることを想定して TH_TAG_PUSH() しておいて rb_thread_t::waiting_fd をリセットする後始末処理を確実に実行するように修正しています。
async_errinfo_queue のために Array オブジェクトを生成しているところは ObjectSpace で見えないように rb_ary_tmp_new() を使ったほうが良いのではないでしょうか?

ko1:r36431 2012-07-18 14:47:48 +0900

r36430 で余計な行が混ざってしまっていたのを削除。

nobu:r36432 2012-07-18 14:53:23 +0900

configure に AIX, BeOS, Haiku などでの ruby.pc (pkg-conf 用の設定ファイル)の出力についての修正のようです。

ko1:r36433 2012-07-18 15:47:43 +0900

rb_thread_call_without_gvl2() という API が追加されました。 rb_thread_call_without_gvl() と違う点は呼び出す関数にの第2引数に skip_check_flag というフラグへのポインタが追加されていて、ブロックする処理が成功したので blocking_region から抜けた後の非同期割り込みのチェックをやめてそのまま Thread の切り替えをせずに処理を続けたい時にそのフラグを立てることでチェックを抑制できるようになっています。詳しいことはコメントにも書かれていますし、きっとささださんのだいありーにも書かれると思うので「後でここにリンクを張る」。

shugo:r36434 2012-07-18 16:05:12 +0900

単項演算子 not の引数に空のかっこを書くとパースエラーになっていたのを修正しています。 [ruby-core:45976] [Bug #6674] () という式は nil になるんですね。Lisp みたい。
また単項演算子 not の引数にかっこをつける時は not と開きかっこのあいだに空白を入れると $VERBOSE = true の時に警告が出力されるのを修正しています。これわたしは良く知られた制限なんだと思っていたんですけど、バグだったんですね。 [ruby-core:39050] [Bug #5214]

nobu:r36435 2012-07-18 16:08:09 +0900

新規追加されたファイルの svn property 設定。

shugo:r36436 2012-07-18 16:11:20 +0900

拡張ライブラリ curses に PDCurses というライブラリもサポートするように extconf.rb に検出対象を追加しています。 [ruby-core:46485] [Feature #6735]

nobu:r36437 2012-07-18 16:17:43 +0900

mkmf.rb で Mac OS X 上の gcc の -framework オプションが -framework=xxx のような記法を許さないのでオプションの引数と分割されずにひとまとまりで指定するために "\0" で埋めておいて後で Makefile に出力する時に "\0" を空白文字に変換するという方法を取っています。

nobu:r36438 2012-07-18 16:44:17 +0900

拡張ライブラリdbm/sdbm の DBM#empty? 等の実装で不要にループを回していたりしたところを最初のエントリだけ見てあればすぐ Qfalse を返すようにして効率的にしています。また gcc 4.7 で -Wstrict-overflow というオプションをつけると、このループでカウンタがオーバフローする可能性についての警告が出ていたのを抑制しているそうです。

nobu:r36439 2012-07-18 17:40:17 +0900

vm.c, vm_insnhelper.c で未使用のローカル変数を削除しています。

nobu:r36440 2012-07-18 17:41:01 +0900

ちょっとよくわからないのですが、regparse.c で文字が見付かったことを示すのに found というフラグ用変数に 1 を代入する方法が gcc 4.7 で警告されるようになったので、逆に見付からなかったことを示す not_found という変数を持っておいて c を同じ値で初期化しておいてこれが変化したら見付かったと見做すという判定方法に変更しています。 元の方法のどこがだめなのかわからないですね。

nobu:r36441 2012-07-18 17:45:29 +0900

error.c の rb_builtin_type_name() も gcc 4.7 がカウンタのオーバフローの検出したからでしょうか、ループを回さなくていいようにリファクタリングしています。

nobu:r36442 2012-07-18 18:25:18 +0900

r36441 の条件分岐の等号の漏れを修正。また builtin_types の初期化の typo を修正しています。

akr:r36443 2012-07-18 19:42:40 +0900

拡張ライブラリ openssl のテストで Tempfile で作成した一時ファイルを積極的に削除するように後始末処理を追加しています。

nobu:r36444 2012-07-18 21:07:19 +0900

r36437 で -framework オプションのために "\0" を空白に置換するために誤って String#tr! を利用していたので String#tr に修正。

akr:r36445 2012-07-18 22:00:57 +0900

ARGF のテストで一時ファイルを複数作るところは Dir.mktmpdir を利用して一時ディレクトリを作成してその下にまとめておいて、後始末で消す時にディレクトリごと削除するようにしています。

akr:r36446 2012-07-18 22:43:22 +0900

test/ruby/test_autoload.rb のテストで Tempfile を利用しているところは積極的に一時ファイルを削除するようにしています。

akr:r36447 2012-07-18 23:09:21 +0900

同じように test/ruby/test_beginendblock.rb でも一時ファイルを積極的に削除するようにしています。また後始末処理(ファイルの close)が ensure 節に書かれていなかったのを ensure 節に移動する修正もあります。

naruse:r36448 2012-07-18 23:09:59 +0900

r36448 で拡張ライブラリ dbm, sdbm の DBM#empty? 等の判定が逆になっていた条件部があったのを修正しています。

nobu:r36449 2012-07-18 23:20:09 +0900

r36434 で not と開きかっこの間に空白があった時の警告を消したのでエラーになっていたテスト(警告が出ることをテストしていた)を対応しています。[ruby-core:39050] [Bug #5214]

nobu:r36450 2012-07-18 23:57:40 +0900

pack の指示子 "u" を使って uuencode する時に改行するサイズの上限が 63byte ごとなので、それ以上の数が指定されても 63 にまるめるようにしています。

akr:r36451 2012-07-19 00:23:35 +0900

r36445 で ARGF のテストに一時ディレクトリを使うようにした修正で一時ファイルを一意にするためのカウンタを increment し忘れていたのを修正しています。

svn:r36452 2012-07-19 00:23:40 +0900

version.h の日付更新。