ruby-trunk-changes r52506 - r52526

今日は標準添付ライブラリ resolv の不具合修正、Time 関係の C API 追加、そして Hash#>, Hash#<, Hash#>=, Hash#<= などの Hash の包含関係を確認するメソッド群と、Hash#to_proc というメソッドの追加がありました。今日も新機能の追加がありました。リリース前にどんどん入りますね。

ktsj: r52506 2015-11-10 00:27:16 +0900

gems/bundled_gems に記載されている bundle する power_assert のバージョンを 0.2.6 に更新しています。

svn: r52507 2015-11-10 00:27:46 +0900

version.h の日付更新。

akr: r52508 2015-11-10 00:37:04 +0900

標準添付ライブラリ resolv で Resolv::DNS::Message::MessageEncoder#put_labels を呼び過ぎるとバッファサイズが仕様上可能なサイズを超えてしまう不具合を修正しています。 [ruby-core:71248] [Bug #11632]

akr: r52509 2015-11-10 00:57:07 +0900

Refinements で using を有効にした後で同じ Module の refine ブロックの中でメソッドを再定義した時に変更が反映されなくなっているという不具合(?)のテストを追加しています。このテストは trunk で失敗する状態です。 [ruby-core:71423] [Bug #11672]

naruse: r52510 2015-11-10 02:18:35 +0900

time.c の struct time_object のメンバ gmt の値について書かれたコメントの 0:localtime と 1:utc が逆になっていたので修正しています。

normal: r52511 2015-11-10 06:18:42 +0900

autoload で設定されたファイルをロード中にまた autoload で別のファイルを load すると r52332 で追加した linked list 構造によるロック機能がうまく働かずデッドロックになってしまう不具合を修正しています。 [ruby-core:71345] [Bug #11658] [ruby-core:71390]

akr: r52512 2015-11-10 07:25:10 +0900

r52509 で追加したテストに ML とチケット番号の参照を追加しています。 [ruby-core:71423] [Bug #11672]

naruse: r52513 2015-11-10 11:25:52 +0900

r52509 で追加された失敗するテストを "expected to fail" として当面 skip するようにしています。 [ruby-core:71423] [Bug #11672]

naruse: r52514 2015-11-10 11:59:47 +0900

rb_timespec_now() と rb_time_timespec_new() という C API を追加しています。 struct timespec を用いて現在時刻を得たり Time オブジェクトを生成したりする API です。

usa: r52515 2015-11-10 12:08:41 +0900

r52442 で CI でのエラーのデバッグ用に drb のテストにしこんだ peer のアドレスを出力する変更を revert しています。どうやら発生しなくなってしまった模様。

nobu: r52516 2015-11-10 12:36:08 +0900

.gdbinit に rbi というコマンドを追加しています。引数の LINK_ELEMENT* を type 毎に出力してくれるものだそうです。ISeq のコンパイル時に使う構造体ですね。

nobu: r52517 2015-11-10 12:45:10 +0900

ISeq へのコンパイル時に pop の直前に putnil, putself, putobject, putstring などスタックに push する命令があった場合は無駄なのでまとめて消すようにする最適化を iseq_peephole_optimize() に追加しています。

nobu: r52518 2015-11-10 14:02:02 +0900

Hash に比較用演算子メソッド Hash#>, Hash#<, Hash#>=, Hash#<= などを追加しています。チケットでは Hash#contain? の追加が提案されていましたが、議論中に Matz から Hash#>= が良いのではないかという案があって追加されたようです。このメソッドではより「小さい」ほうの Hash の全要素のキーと値がもう一方に含まれているか(キーが同じでも値が異なる場合はだめ)という条件で「比較」しているようです。なので集合の包含関係のチェックに似たようなものだと思ったら良さそうです。 [ruby-core:68561] [Feature #10984]

naruse: r52519 2015-11-10 14:36:47 +0900

r52514 で追加した Time 生成用 API rb_time_timespec_new() でタイムゾーンutc にするか localtime にするかの指定に INT_MAX と INT_MAX-1 で指定できるようにしていましたが、この指定を逆にして offset=INT_MAX だと localtime、offset=INT_MAX-1 だと utc とするようにしています。 offset = INT_MAX - gmtoff で計算できるようにしたそうです。

nobu: r52520 2015-11-10 16:57:17 +0900

Hash#to_proc という新メソッドが追加されています。これは Hash を1つの引数を受け取る Proc オブジェクトに変換するもので、引数を Hash のキーとして参照して、その値を返すような Proc オブジェクトを返します。要は hash.to_proc は ->(x) { hash[x] } のような Proc オブジェクトになるということですね。これまた便利そう。 [ruby-core:71327] [Feature #11653]

ngoto: r52521 2015-11-10 17:50:06 +0900

Solaris 10 では Process:RLIMIT_NPROC が未定義なので bootstraptest/test_fork.rb で参照しているところで defined? でチェックしてなかったら Process.setrlimit の呼び出しをスキップするようにしています。

nobu: r52522 2015-11-10 18:22:37 +0900

r52520 で追加した Hash#to_proc とそれが返す Proc オブジェクトの呼び出しのベンチマークを追加しています。 [ruby-core:71327] [Feature #11653]

nobu: r52523 2015-11-10 18:24:41 +0900

C の関数を呼び出すような Proc オブジェクトを作成するための API rb_func_proc_new() および rb_func_lambda_new() を追加して cfunc_proc_t::env の要素数を増やして method entry も積むようにしています。これは変更しているところだけみると追加しているだけですが、参照され得る(block.ep - 1 に method entry が入っていることが期待されている)のに対応しているようです。確かに vm_insnhelper.c の rb_vm_frame_method_entry() とかみると ep[-1] をみてるっぽい。これまでは rb_proc_t basic の領域をうっかりみてた(method entry でないと判定されれば、VM_CHECK_MODE が1以上でコンパイルされてなければ無視するだけなので不正な参照だけど見逃がされてた)のを修正したということですかね。まあでもこのへんは 2.3 からの部分のはずなので backport は不要かな。

nobu: r52524 2015-11-10 18:25:58 +0900

r52520 で追加した Hash#to_proc の実装で r52523 で追加した rb_func_proc_new() を利用するようにしています。 これで C の関数を直接呼び出すような Proc オブジェクトが生成できるので効率的になったはず。 [ruby-core:71327] [Feature #11653]

nobu: r52525 2015-11-10 18:42:27 +0900

parser のトークン名 DOTQ を ANDDOT に改名しています。 r52214 で導入した obj.?meth 記法ですが r52462 で obj&.meth に文法が変更されたので、それに対応して .? を表わす DOTQ という名前がそのままだったのを &. を表わす ANDDOT とトークン名を変更しています。 https://github.com/ruby/ruby/pull/1090 [Feature #11537]

akr: r52526 2015-11-10 20:48:14 +0900

標準添付ライブラリやテストなどの frozen_string_literal: true の magic comment の indicator (-*- ... -*- で挟むようにしていたこと)をやめています。 r52208 で magic comment 全般に indicator が不要になったのでそれに追随しているようです。