ruby-trunk-changes r61360 - r61391

今日は IO#pwrite に渡した文字列オブジェクトが multi thread で書き換えられると異常終了する可能性があった不具合の修正や class/module 文の NODE_SCOPE の範囲情報の変更などがありました。

nobu: r61360 2017-12-20 23:10:06 +0900

コマンドラインオプションの --dump=insns で VM 命令をダンプする時にローカル変数名を表示する時にブロックパラメータも表示対象にするようにしています。

nobu: r61371 2017-12-21 00:45:01 +0900

compile_branch_condition() で条件分岐の条件部にブロック引数として受け取ったローカル変数があった場合に、defined?(yield) 相当の命令にすりかえるようにしています。2.5 から m(&b) のようなブロック引数を参照せずにそのまま別のメソッドにブロック引数として渡す時には Proc オブジェクト化をしないようにしていますが、m(&b) if b みたいにしてると b の参照されたところで Proc 化されてしまうからそれも抑制できるように、ってことですかね。でも b が nil ならそれはそれで &b でそのまま渡せるんじゃありませんでしたっけ。別のメソッドにただ渡すだけの使い方でブロック引数で分岐することそんなにあるかなぁ。

svn: r61372 2017-12-21 00:45:02 +0900

version.h の日付更新。

usa: r61374 2017-12-21 01:04:41 +0900

r61349 の Resolv::Hosts のテストで Windows ではパスに "|" が使えなくて Errno::EINVAL が発生するので、期待する例外クラスに追加しています。 [ruby-core:84347] [Bug #14205]

ko1: r61375 2017-12-21 08:49:30 +0900

rubyspec で t = Thread.new { ... } のような Thread 内部で t を利用しようとしていたところがあって、この代入の前に参照される可能性があったのでローカル変数経由でなく Thread.current で参照するように修正しています。

normal: r61376 2017-12-21 09:26:24 +0900

IO#pwrite で引数の文字列オブジェクトが GVL 解放中に別 Thread で書き換えられて不正メモリアクセスになってしまわないように rb_str_tmp_frozen_acquire() を使って別オブジェクトにコピー(バッファ内容はコピーされない)してから参照するようにしています。 [ruby-core:84316] [Bug #14195]

tenderlove: r61377 2017-12-21 09:40:54 +0900

拡張ライブラリ objspace で T_IMEMO 型オブジェクトのダンプ時にサブタイプの alloc, ast, parser_strterm の対応を追加しています。

sonots: r61378 2017-12-21 14:07:43 +0900

標準添付ライブラリ logger で Logger::LogDevice#open_logfile, #create_logfile でファイルを開く時に Kernel#open を使っていたのを File.open を使って意図しないコマンド起動を避けるようにしています。 [ruby-dev:50380] [Bug #14212]

naruse: r61379 2017-12-21 14:08:57 +0900

r61228 で追加した String#undump で \u{...} のエスケープを戻すところで {} の中の文字数の対応あたり修正しているようです。

naruse: r61380 2017-12-21 14:09:16 +0900

同じく r61228 の String#undump の実装で check_undump_source_format() は削除して str_undump() に展開しています。また \u{ ... } のエスケープを使っているのに元の文字列の Encodingが Unicode 系でなかったら例外を発生させるようにしています。

naruse: r61381 2017-12-21 14:09:17 +0900

String#undump で "\xXX" の記法と "\uXXXX" が混ざっていたら例外を発生させるようにしています。おお、これ文字列リテラルとして書くぶんには OK ですよね。

ko1: r61382 2017-12-21 15:40:28 +0900

rb_iseq_code_range() という C API を内部的に追加しています。 rb_iseq_t の全体の範囲情報(開始行、カラム、終了行、カラム)を取得するための関数です。 iseq.h に宣言があるからこれは内部向けですよね。

mame: r61383 2017-12-21 15:52:15 +0900

class/module 文の NODE_SCOPE の範囲情報を変更して、class/module の予約語を含めるようにしています。けどこういう調整は ad-hoc なので将来的にはやめたい、とのこと。

yui-knk: r61384 2017-12-21 16:09:03 +0900

r61382 で追加された rb_iseq_code_range() に二重にセミコロンが並んでるところがあったので除去しています。

nobu: r61385 2017-12-21 16:50:46 +0900

r58542 の enc.mk を作成するために enc/make_encmake.rb を実行するのに $BOOTSTRAPRUBY を使うようにしていたのを、$MINIRUBY を使うようにしています。 r58542 の変更を revert。クロスコンパイル時に BASERUBY のバージョンがビルド中の ruby と一致してないとエラーになるのを修正しているみたいです。しかしクロスコンパイル中だと MINIRUBY も動かないんじゃないのかなぁ。でも過去にも同じ変更を revert したことがあるので、これで直るんだろうなぁ。 [ruby-core:84385] [Bug #14213]

nobu: r61386 2017-12-21 16:59:00 +0900

String#undump の実装で ALLOC_N() で確保したバッファの解放漏れによるメモリリークがあったのを修正しています。

ko1: r61387 2017-12-21 17:29:56 +0900

r61371 の条件分岐の条件部でのブロック引数のチェックの最適化を revert しています。ブロック引数に代入されてると defined?(yield) にはおきかえられないため。なるほど。 [ruby-core:84387] [Bug #14214]

hsbt: r61388 2017-12-21 18:22:15 +0900

添付している bundler を 1.16.1 に更新しています。

eregon: r61389 2017-12-21 18:29:18 +0900

rubyspec の r61375 で修正されてた Thread のテストは Thread.new をローカル変数に格納しておく必要もなくなったので変数を削除するように変更しています。

hsbt: r61390 2017-12-21 18:29:47 +0900

NEWS ファイルに bundler のバージョン番号を追記しています。

nobu: r61391 2017-12-21 20:59:31 +0900

r61371 で入れて r61387 で revert したブロック引数の最適化について、ブロック引数に代入されてから分岐の条件に使ったケースのテストを追加しています。 [ruby-core:84387] [Bug #14214]