ruby-trunk-changes r61116 - r61162

今日はとてもたくさん新機能の追加がありました。 TracePoint の off 時に命令の再書き換えをしないようにして on/off を繰り返しても遅くならないようにする変更(そのかわり一度 on にするとずっと trace の分岐ありになる)、Exception#full_message、FrozenError 例外クラス、Process.last_status, Struct.new の :keyword_init オプション、Kernel#warn の uplevel キーワード引数、Method#=== メソッドなどの新規追加がありました。
2.5 のリリースが近いのでコミットラッシュになっているようですね。

naruse: r61116 2017-12-11 21:09:47 +0900

Time#utc_offset に対応する C の関数を rb_time_utc_offset() と改名して、include/ruby/intern.h に prototype 宣言を追加して外部から呼べる C API として公開するようにしています。

kou: r61117 2017-12-12 00:30:00 +0900

gems/bundled_gems の test-unit のバージョンを 3.2.6 -> 3.2.7 に更新しています。

svn: r61118 2017-12-12 00:30:01 +0900

version.h の日付更新。

usa: r61119 2017-12-12 01:06:41 +0900

include/ruby/win32.h で SIZEOF_STRUCT_STAT_ST_INO というマクロ定数を定義する前に #undef しておくようにしています。 MinGW でのビルド時の警告の修正。 [ruby-core:84148] [Bug #14165]

ko1: r61120 2017-12-12 01:07:21 +0900

tool/instruction.rb で VM 命令実行のソースコードを生成する時に、次の命令にジャンプする方法を START_OF_ORIGINAL_INSN() および DISPATCH_ORIGINAL_INSN() というマクロを利用するようにして、OPT_CALL_THREADED_CODE や OPT_DIRECT_THREADED_CODE などの方式の違いをマクロで吸収するようにしています。

usa: r61121 2017-12-12 02:31:43 +0900

Windows の ReFS 対応の再修正。 stati128_handle() で構造体のメンバーを参照しわすれていたのを修正しています。多分たまたま先頭のメンバーだったので問題にならなかったのかなぁと推測。[追記]実は先頭ではなかったそうですが、ino の一部は参照してたのでたまたまテストは通ってた(まあまあ一致してた)そうです。[/追記]

ko1: r61122 2017-12-12 04:17:25 +0900

r60763 で trace 命令を廃止して、TracePoint 有効化時に動的に命令を書き換えるようにした変更ですが、TracePoint の on/off を頻繁に繰り返すと遅くなるという問題があったため、一度 trace つきの命令に書き換えたら TracePoint を off にしても再度通常の命令に戻すのをやめて、trace フラグの分岐は残したままにするようにしています。 ruby_vm_event_enabled_flags というグローバル変数を導入して、どの event flag が on になったかを憶えておくようにしています。つまり一度 TracePoint を使うと、それ以降はずっと r60763 以前と同様にちょっと(trace flag のチェックぶん)よけいな処理が行なわれる状態に戻るということですね。

ko1: r61123 2017-12-12 05:30:37 +0900

r58402 で導入した二項演算子の最適化命令の実行を vm_opt_binop_dispatch() という関数に括り出して共通化してバイナリのサイズの削減を目指した変更を revert して、再度各 vm_opt_{plus, minus, div, mod, lt, le, gt, ge}() などの関数内に if 文を展開するようにしています。理由として switch 文だと評価順序がコントロールできず、hotspot になる分岐を最初にチェックするようにしたりという細かい最適化ができないためとのことです。また le, gt, ge ではメソッド再定義時の不具合があったみたいで、それも修正しています。

yui-knk: r61124 2017-12-12 08:13:47 +0900

ブロックパラメーターに (a,b) のようにして配列を分解して受け取る記法の時の NODE_DVAR の範囲情報を修正しています。

yui-knk: r61125 2017-12-12 08:20:42 +0900

r61123 で追加しているテストのテストメソッドの名前が間違って重複していたのを修正しています。

yui-knk: r61126 2017-12-12 08:38:00 +0900

メソッド定義時のブロック引数(&b のようにブロックを Proc オブジェクトとして受け取る仮引数の記法)を含む時の引数の NODE_ARRAY の位置情報を修正しています。

marcandre: r61127 2017-12-12 08:50:40 +0900

NEWS ファイルに標準添付ライブラリ matrix の Matrix.combine, Matrix#combine と Matrix#entrywise_product のメソッド追加について追記しています。

yui-knk: r61128 2017-12-12 09:12:43 +0900

メソッド呼び出しの引数にキーワード引数を書いて最後に dangling comma があった時の NODE_ARRAY の範囲情報に最後のカンマは含めないようにしています。

mame: r61129 2017-12-12 09:20:58 +0900

r59874 で拡張ライブラリ coverage に experimental feature として入っていた branch coverage の機能を、環境変数 COVERAGE_EXPERIMENTAL_MODE の指定がなくても常に有効にするようにしています。 NEWS ファイルにも新機能として追記しています。 [Feature #13901]

yui-knk: r61130 2017-12-12 09:28:29 +0900

parse.y の match_op_gen() で =~ 演算子をパースした時の NODE_MATCH の子ノードの NODE_ARRAY の範囲情報が正しくセットされていなかったのを右辺値のみ含めるように修正しています。

shyouhei: r61131 2017-12-12 09:46:34 +0900

freeze されたオブジェクトに破壊的変更を行おうとした時に発生する例外を RuntimeError からそれを継承した FrozenError という例外を発生させるようにしています。おお、例外クラスで判定できるようになるんですね。これは結構大きな変更ですね。

ko1: r61132 2017-12-12 09:56:24 +0900

r61131 の FrozenError の導入で rubyspec に一箇所変更が必要だったのを修正しています。

yui-knk: r61133 2017-12-12 10:13:56 +0900

代入の左辺値や for 文の変数の部分に (a,) のように配列を分解して受け取る記法をした時の NODE_ARRAY の範囲情報に dangling comma を含めないようにしています。

hsbt: r61134 2017-12-12 15:15:44 +0900

bundler の upstream から 1.16.1 のリリース用ブランチのコードをマージしています。内容はあまり読んでないけど ruby trunk でテストするための変更も多く入っているようです。 hsbt さんは bundler のコミット権も持ったそうなので 2.5 リリースにむけて bundler にも変更を入れることができてるみたいですね。

svn: r61135 2017-12-12 15:15:45 +0900

r61134 の行末の空白除去やファイル末尾の改行追加など。

svn: r61136 2017-12-12 15:15:45 +0900

r61134 の新規追加ファイルの svn property 設定。

k0kubun: r61137 2017-12-12 17:12:43 +0900

Struct.new に keyword_init というキーワード引数を追加して、これに真値が渡されたら Struct.new で生成した Class の new メソッドでインスタンスを作る時に、引数に Hash を渡して名前で属性を指定できるようにしています。厳密にはキーワード引数ではなくてオプション引数(最後の Hash の引数)として処理しているようですね。 https://github.com/ruby/ruby/pull/1771 [ruby-core:72595] [Feature #11925]

k0kubun: r61138 2017-12-12 17:27:33 +0900

r61137 の Struct.new の :keyword_init オプションの追加について NEWS ファイルに追記しています。 [ruby-core:72595] [Feature #11925]

hsbt: r61139 2017-12-12 17:34:13 +0900

lib/.document と lib/webrick/.document を追加しています。 .gemspec ファイルを rdoc のドキュメント生成の対象にならないようにするためみたいです。

svn: r61140 2017-12-12 17:34:14 +0900

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

duerst: r61141 2017-12-12 17:35:08 +0900

NEWS ファイルに Unicode の新しい emoji 対応について追記しています。

yui-knk: r61142 2017-12-12 17:54:34 +0900

ブロック渡しのメソッド呼び出しでブロックに { } の記法が使われてる時の NODE_ITER の範囲情報をメソッド呼び出し全体を含むように修正しています。 NODE_ITER はブロックを表す NODE_SCOPE とメソッド呼び出しの NODE を含む NODE なので両方の範囲を含むべきってことみたいですね。

mrkn: r61143 2017-12-12 18:00:17 +0900

Process.last_status というメソッドを $? の代替として追加しています。そういえば $? には同じ機能をもつメソッドがなかったのかー。 Process.last_status は同じ Thread で Process.waitpid や Kernel#system などで起動した子プロセスの終了ステータスの Process::Status オブジェクトを返します。 $? も実は見た目はグローバル変数だけど thread local なんですよね。 [ruby-core:83514] [Feature #14043]

mrkn: r61144 2017-12-12 18:00:19 +0900

NEWS ファイルに r61143 で追加した Process.last_status について追記しています。 [ruby-core:83514] [Feature #14043]

duerst: r61145 2017-12-12 18:00:20 +0900

tool/downloader.rb で Unicode のデータファイルをダウンロードする時の URL を http -> https に変更しています。 [ruby-core:83074] [Bug #13962]

hsbt: r61146 2017-12-12 18:01:34 +0900

fileutils の default gem としての gemspec のバージョンを 1.0.0 に更新しています。 [ruby-core:79455] [Feature #13197]

naruse: r61147 2017-12-12 18:12:14 +0900

Integer#allbits?, Integer#anybits?, Integer#nobits? というメソッド群を追加して、整数をビット列として解釈して引数に mask を渡してそれらの bit が全て立ってるか、一部立ってるか、全て立ってないかという判定をすることができるようにしています。 つまりは a.allbits?(b) で a & b == b ってことですね。 [ruby-core:77251] [Feature #12753]

hsbt: r61148 2017-12-12 19:57:58 +0900

r61146 の再修正。 fileutils の gemspec のバージョンを 1.0.1 に更新しています。また spec.metadata.source_code_uri の設定を追加しています。 [ruby-core:79455] [Feature #13197]

k0kubun: r61149 2017-12-12 20:25:16 +0900

irbIRB.parse_opts で ARGV を破壊的に変更してしまうのが Binding#irb で起動した時にも ARGV を変更してしまうようなので、引数で ARGV を渡すようにして Binding#irb からの起動時には空の配列を明示的に渡すことで ARGV が変更されるのを防いでいるようです。将来的には IRB.parse_opts や IRB.setup を private にして引数を変更するつもりとのこと。 [ruby-core:84135] [Bug #14162]

svn: r61150 2017-12-12 20:25:17 +0900

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

k0kubun: r61151 2017-12-12 20:32:37 +0900

r61149 の追加修正。 IRB.parse_opts や IRB.setup に追加したキーワード引数 argv のデフォルト値の ARGV の参照を ::ARGV と明示的にトップレベルの名前空間から探索するように指定しています。

shyouhei: r61152 2017-12-12 20:33:26 +0900

NEWS ファイルに r61131 で追加した FrozenError 例外クラスについて追記しています。 [ruby-core:79581] [Feature #13224]

usa: r61153 2017-12-12 20:43:18 +0900

r61096 で追加した win32/win32.c の get_ino() の未使用の変数 err を削除しています。 [ruby-dev:50345]

sorah: r61154 2017-12-12 20:47:16 +0900

Exception#full_message というメソッドを追加して、例外オブジェクトが rescue されなかった時の backtrace つきのメッセージに相当する文字列を返すようにしています。 [ruby-core:83967] [Feature #14141]

shyouhei: r61155 2017-12-12 20:56:25 +0900

Kernel#warn に uplevel というキーワード引数を追加しています。そして標準添付ライブラリで warn を使っているところでも uplevel を指定するようにしています。これは警告メッセージのにファイルと行数の位置情報を表示するようにし、さらに位置情報に使うメソッドのスタックフレームをいくつか巻き戻す指定もできるように整数を指定するためのものです。 [ruby-core:77802] [Feature #12882]

shyouhei: r61156 2017-12-12 21:10:20 +0900

r61155 の Kernel#warn の uplevel キーワード引数追加について NEWS ファイルに追記しています。 [ruby-core:77802] [Feature #12882]

sorah: r61157 2017-12-12 21:10:21 +0900

r61154 の Exception#full_message の追加に prototype 宣言の漏れがあったので修正しています。さらにrb_ec_error_write() の 引数の不要な volatile 修飾子を削除しています。

a_matsuda: r61158 2017-12-12 21:12:38 +0900

Method#=== メソッドを追加して、これで Method#call と同じ機能を使えるようにしています。つまり meth.call(a) と同じことが meth === a でできるってことですね。たぶん case 文の when 節で使うことを前提にしているのかなと。チケットをみると Proc#=== は既に同じように call の別名になっているのでそれに揃えるという意図だそうです。 [ruby-dev:50329] [Feature #14142]

a_matsuda: r61159 2017-12-12 21:12:39 +0900

r61158 で追加したテストで Method.instance_methods(false) をチェックしている assertion は削除しています。

a_matsuda: r61160 2017-12-12 21:12:40 +0900

NEWS ファイルに r61158 の Method#=== の追加について追記しています。 [ruby-dev:50329] [Feature #14142]

sorah: r61161 2017-12-12 21:17:38 +0900

r61154 で追加した Exception#full_message の実装で追加した rb_ec_error_write() は rb_execution_context_t は引数に受け取ってないので rb_error_write() に改名しています。

ko1: r61162 2017-12-12 21:40:41 +0900

rubyspec の net/http と net/ftp のテストで警告メッセージのチェックをしているところで全体の一致ではなくメッセージ部分だけマッチすればいいことにしています。 r61155 の変更で Kernel#warn で位置情報も含まれるようになったのでそれでエラーになったのを修正しています。