ruby-trunk-changes r67606 - r67618

今日は昨日の $; に続いて $, にも値が入ってて使われると警告を出すようにする変更や、Time.now でタイムゾーンを指定するためのオプション引数の追加などの変更がありました。

nobu: r67606 2019-04-19 06:56:55 +0900

r67603 の String#split での $; の参照時の警告と同様に Array#join で引数が省略された時にデリミタとして $, を使った時に nil 以外の値が入っていたら警告を出力するようにしています。こういう特殊変数による暗黙的な挙動の変更を全体的にやめる方向にしようっていうことみたいですね。

svn: r67607 2019-04-19 06:57:09 +0900

version.h の日付更新。

nobu: r67608 2019-04-19 07:24:03 +0900

parse.y でコマンドラインオプション -p や -n が指定されててワンライナーでフィルタのように挙動するモードの時に文字列を行に分解するのに String#split を呼んでいましたが、これが暗黙のうちに $; を使うようになってたので明示的に引数に渡すように修正して警告を除去しています。

nobu: r67609 2019-04-19 07:30:01 +0900

同じく fake.rb のテンプレートである template/fake.rb.in 内でも String#split に引数省略して呼んでるところがあったので明示的に指定するようにしています。

tenderlove: r67610 2019-04-19 15:21:55 +0900

gc_mark_children() でオブジェクトからの参照の GC mark を伝播させる所で T_CLASS/T_MODULE/T_ICLASS などのオブジェクトで super の指すクラスを mark する時に NULL じゃないかチェックするようにしています。 super が NULL ってあるのか。

k0kubun: r67611 2019-04-19 17:44:22 +0900

README.md の英文の修正など。 svn hook のテスト用に pull req をマージしたみたいですが、pull req の番号の参照の埋め込みに失敗しているようですね。 たぶんこれ https://github.com/ruby/ruby/pull/2004

svn: r67612 2019-04-19 17:44:23 +0900

r67611 の行末の空白除去。

nobu: r67613 2019-04-19 17:53:40 +0900

Time.now に :in というオプション引数を追加して、どのタイムゾーンで Time オブジェクトを生成するかを指定できるようになっています! これ欲しかった人は結構多いのではないでしょうか。

k0kubun: r67614 2019-04-19 18:00:26 +0900

r67611 を revert しています。 svn hook のテストのためだったのでコミットログの埋め込み失敗をやりなおすため。

k0kubun: r67615 2019-04-19 18:09:46 +0900

ということで r67611 を再度適用しています。今度はちゃんと pull req の URL が展開されました。 https://github.com/ruby/ruby/pull/2004

k0kubun: r67616 2019-04-19 18:23:13 +0900

r67615 の README.md の変更で長くなってしまった行に改行を追加しています。

nobu: r67617 2019-04-19 19:45:16 +0900

template/prelude.c.tmpl でインタプリタに埋め込む文字列を UTF-8 文字列としてオブジェクト化して、内容を置換する時に force_encoding で ASCII-8BIT に変換して処理するようにしています。埋め込むスクリプトUTF-8 の文字列を使えるようにしているようです。

nobu: r67618 2019-04-19 19:55:07 +0900

README.md の余分な空行を削除。

ruby-trunk-changes r67601 - r67605

今日は $; に nil 以外の値をセットすると警告が出るようにする変更や、strscan のメンテナを須藤さん(kou)にするという変更などがありました。

kou: r67601 2019-04-18 13:55:49 +0900

doc/maintainers.rdoc の拡張ライブラリ strscan のメンテナのところが unmaintained になってたのを須藤さん (kou) にしています。

svn: r67602 2019-04-18 13:55:52 +0900

version.h の日付更新。

nobu: r67603 2019-04-18 18:34:40 +0900

String#split で引数が省略されてて $; で分割する時に $; に nil 以外の文字列や正規表現がセットされていたら警告を出力するようにしています。 またそもそも $; に代入する時の警告するようにしています。 $; は使わないようにしようってことですかね。

nobu: r67604 2019-04-18 18:56:03 +0900

r67603 の影響でテストで警告が出るようになったところに警告避けの suppress_warning のブロックやコマンドラインオプション(子プロセス起動時)などを追加しています。

hsbt: r67605 2019-04-18 21:56:47 +0900

tool/sync_default_gems.rb の bundler の更新時の最初のファイル削除から libexec/bundle_ruby を消しています。もう存在してないので消す必要なくなったとのこと。

ruby-trunk-changes r67572 - r67600

今日はなんといってもパターンマッチの文法が experimental ではありますが追加されました。これだけ大きな文法上の追加はひさしぶりのことです。また MJIT にも method inlining という今後主要な速度向上のキーになりそうな最適化の最初の実装が追加されています。

k0kubun: r67572 2019-04-17 02:01:05 +0900

r67566 で分離した mjit_compile_body() を利用して MJIT の method inlining を実装しています。ISeq 型の(つまり Ruby によって定義された)メソッド呼び出しが、末尾呼び出しである、ISeq が例外発生時に呼び元の control frame を pop しないタイプ(catch_except_p)である、ISeq のサイズが制限内であるなどの条件を見たした時に inline 化可能な C のソースコードを作っておいて、その ISeq の呼び出しの部分にそのまま埋め込むようにしています。Control Frame は積むのでバックトレースとかはちゃんと出るけど C のコードとしてはインライン化されてる、という意味だと思います、多分。

svn: r67573 2019-04-17 02:01:07 +0900

version.h の日付更新。

k0kubun: r67574 2019-04-17 02:02:16 +0900

で今度は r67572 に続いて frame-omitted method inlining というのを MJIT の実装に追加しています。今度はテンプレートの変更も含んでてもうちょっとマイクロに、メソッド呼び出しも例外発生もしないような短い ISeq になるようなメソッドはスタックに control frame を積まずにメソッド呼び出しに相当する処理自体を省くようにしているということだと思います。あんまりちゃんと読んでないですけど。

k0kubun: r67575 2019-04-17 02:02:35 +0900

そして r67572 および r67574 の method inlining も MJIT の JIT compile のオプションとして、他の最適化と同様に失敗したら off にしてコンパイルしなおすようにしています。

tenderlove: r67576 2019-04-17 12:17:25 +0900

r67499 で関連コミットその他も巻き込んで revert された r67479 の GC.compact メソッド追加のリトライ。 [ruby-core:91634] [Feature #15626]

svn: r67577 2019-04-17 12:17:42 +0900

r67576 のインデントのタブを空白に展開。

svn: r67578 2019-04-17 12:17:42 +0900

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

tenderlove: r67579 2019-04-17 13:05:29 +0900

r67576 で再追加したテストで GC.compact のかわりに GC.compact で移動されたオブジェクトの slot を参照しているものがないことを追加で確認する GC.verify_compaction_references を呼び出すようにしています。

tenderlove: r67581 2019-04-17 14:19:05 +0900

そして GC.verify_compaction_references の実装を GC.compact の実装にそろえて gc_check_references_for_moved() を呼ぶ前に gc_update_references() を呼んだり、チェック後に GC しなおしたり method cache/constant cache をクリアしたりして不正な参照を残さないように? しています。

nobu: r67582 2019-04-17 14:34:46 +0900

String#split で空文字列を指定して文字単位に分割する時の最適化パスを追加しています。元々 String#split には awk(ってなんだろ)、string といったパターンの最適化パスがあったところに文字単位の chars というのを追加しています。

tenderlove: r67583 2019-04-17 15:13:11 +0900

GC.compact の実装で T_CLASS および T_ICLASS 型オブジェクトの super の参照を移動するタイミングを rb_classext_t へのポインタが NULL でも実行するように前のほうに移動しています。

tenderlove: r67584 2019-04-17 15:16:35 +0900

r67583 と同様に gc_mark_children() でも super の mark を classext の NULL チェックの前にしています。 これって r67576 の前からですよね。ということは元からバグがあったのか r67576 で classext が NULL でかつ super があるという T_MODULE/T_CLASS が存在するようになったのか……(たぶん前者)。

svn: r67585 2019-04-17 15:16:39 +0900

r67584 のインデントのタブを空白に展開。

ktsj: r67586 2019-04-17 15:48:03 +0900

パターンマッチが入りました! パターンマッチの機能についての議論ぜんぜん追ってなかったので実は仕様を知らないのですが、ともかく新しい文法の追加と、それに対応して compile の追加がありました。VM 命令の追加はないようです。あとは……文法とかはチケットやテストを参照してください(まだ理解してない)。 [ruby-core:87945] [Feature #14912]

ktsj: r67587 2019-04-17 15:48:05 +0900

r67586 の追加変更で Struct をパターンマッチに使った時のための Struct#deconstruct メソッドの追加。実体としては to_a と同じです。

svn: r67588 2019-04-17 15:48:07 +0900

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

svn: r67589 2019-04-17 15:48:26 +0900

r67586 のインデントのタブを空白に展開。

nobu: r67590 2019-04-17 16:09:24 +0900

make update-unicodeUnicode の Emoji 関係のファイル群もダウンロード試行するようにしています。

nobu: r67591 2019-04-17 16:09:28 +0900

tool/downloader.rb で IO.read のかわりに File.read を使うように修正しています。 oh...

yui-knk: r67592 2019-04-17 16:15:08 +0900

r67586 のパターンマッチ実装で予約語 in に対応する NODE を --dump=parsetree_with_comment でダンプした時のコメントの typo 修正。

nobu: r67593 2019-04-17 16:35:27 +0900

make update-unicode-property-files と make update-unicode-files を統合して make update-unicode-files で両方のファイル群をダウンロードするようにしています。

nobu: r67594 2019-04-17 16:35:29 +0900

tool/downloader.rb で Unicode 関連の beta バージョンのファイルダウンロード時に index.html ファイルの内容の一致でキャッシュを捨てるかどうかの判定に使うようにしているようです。

kazu: r67595 2019-04-17 17:39:52 +0900

r67586 のパターンマッチの文法追加では experimental な機能だということを警告で出力しているため、テストでこの警告が大量に出てつらいということで、テストクラス定義部分全体をヒアドキュメントにして、$VERBOSE を nil にした上で eval するという方法で警告抑制するようにしています。そうか parse 時点で警告が出るので実行時に $VERBOSE をいじっても抑制できないわけか。

kazu: r67596 2019-04-17 17:53:32 +0900

r67595 と同様に r67586 のパターンマッチのテストでさらに内部で eval しているところでも警告を抑制するようにしています。

k0kubun: r67597 2019-04-17 18:24:48 +0900

NEWS ファイルに MJIT が最適化(cache の利用や method inlining など)が理由でキャンセルされた時に最適化をオフにして再度コンパイルに挑戦するようにしたことについて追記しています。

tenderlove: r67598 2019-04-17 18:41:41 +0900

r67576 およびその後の GC.compact 関連の変更を再度 revert しています。 CI で直接関係ないところで SEGV が起きてしまっていたようです。

svn: r67599 2019-04-17 18:41:55 +0900

r67598 のインデントのタブを空白に展開。

hsbt: r67600 2019-04-17 22:20:02 +0900

NEWS ファイルに rubygems と bundler のバージョン更新について追記しています。

ruby-trunk-changes r67566 - r67569

今日はリファクタリングと NEWS ファイルの追記だけでした。

k0kubun: r67566 2019-04-15 23:38:57 +0900

mjit_compile.c の JIT 用のソースコードを生成する mjit_compile() から、関数の宣言部分を除いた関数の中身を出力する部分を mjit_compile_body() という関数に切り出すリファクタリング。コミットログによると inline 化の最適化のためにこれを利用する予定とのこと。ISeq 単位でブロックやメソッド呼び出しを inline 化するのかな。

knu: r67568 2019-04-16 08:58:06 +0900

NEWS ファイルに r67563 で再適用した標準添付ライブラリ net/imap の SNI 対応について追記しています。

svn: r67569 2019-04-16 08:58:09 +0900

version.h の日付更新。

ruby-trunk-changes r67550 - r67563

今日は MJIT の不具合修正や標準添付ライブラリ csv のパフォーマンス改善やオプション追加などの更新がありました。

k0kubun: r67550 2019-04-14 21:25:23 +0900

r67530 の MJIT の再コンパイルするようにする変更で JIT 時に生成する C コードで cancel 時の理由によってコンパイル条件を調整する部分を compile_cancel_handler() から生成するコード内に移動してそこに goto で飛ぶようにしています。

k0kubun: r67551 2019-04-14 21:40:44 +0900

MJIT の worker に inline cache をコピーする mjit_copy_job_handler() で既に ISeq が GC されていたら処理をやめるようにしています。ここで SEGV することがあった模様。

k0kubun: r67552 2019-04-14 21:49:20 +0900

r67551 と同様 JIT しようとしたタイミングで ISeq が GC されていたというケースを print_jit_result() という関数でも考慮して GC 済みというのを表示するだけにしています。

k0kubun: r67553 2019-04-14 22:10:14 +0900

r67550 で debug counters の mjit_cancel_ivar をインクリメントするところをまちがって mjit_cancel_ivar_inline としてしまっていたので、そこじゃなくて debug counters の定義のほうを追随して修正しています。

k0kubun: r67554 2019-04-14 22:29:22 +0900

r67548 で tool/ruby_vm/views/mjit_compile.inc.erb の中で String#match? メソッドを使っていましたが、ここは BASERUBY で実行されるので古い Ruby で動かなくなってしまうので String#match を使うように修正しています。

k0kubun: r67555 2019-04-14 22:42:13 +0900

azure-pipelines.yml で r67428 で追加した TEST_BUNDLED_GEMS_ALLOW_FAILURES という環境変数で指定した bundled gem のテストのエラーは無視するようにしたのがうまくきいてないみたいなので azure-pipelines.yml の記法をちょっと修正しています。

marcandre: r67556 2019-04-14 22:47:24 +0900

標準添付ライブラリ ostruct の OpenStruct で、メソッドの引数の数が多すぎた時に NoMethodError が発生させられていましたが ArgumentError を発生させるように変更しています。 [ruby-core:90918] [Bug #15515]

k0kubun: r67557 2019-04-15 00:13:49 +0900

r67555 の追加修正。 azure-pipelines.yml で matrix のところに変数を書いてもきかないようなので make コマンド実行のところに直接書くようにしています。

svn: r67558 2019-04-15 00:13:50 +0900

version.h の日付更新。

k0kubun: r67559 2019-04-15 00:25:11 +0900

見落してましたけど r67555 で Azure Pipelines でのデバッグのために Makefile.in の test-bundled-gems-run のところに環境変数の出力が追加されてたのでそれを削除しています。

kou: r67560 2019-04-15 06:01:51 +0900

標準添付ライブラリ csv の upstream の 3.0.8 に更新しています。 3.0.5 で大きく変更があってパフォーマンス改善があったようですね。また CSV.new にオプション write_converters、write_nil_value、write_empty_value、strip などが追加されています。あれ、CSV.new のオプションっていつから keyword 引数になったんだっけ…。 https://github.com/ruby/csv/blob/master/NEWS.md#308---2019-04-11

kou: r67561 2019-04-15 11:05:03 +0900

r67560 の csv 3.0.8 のテストでファイルオープン時の binmode 指定方法が間違ってて Windows 環境で失敗してたのを修正しています。

knu: r67563 2019-04-15 19:52:34 +0900

標準添付ライブラリ net/imap で SNI 対応。なんかこれ見憶えが…と思ったら r67488 で一旦入ったのが r67499 でこれも巻き込み revert されてました。 openssl の修正の再適用と混同しててこれも入ったものと勘違いしてました。 https://github.com/ruby/ruby/pull/2077 [ruby-core:91466] [Feature #15594]

ruby-trunk-changes r67530 - r67549

今日は MJIT で inline cache 利用する最適化の失敗でコンパイルできなかった時に最適化をオフにして再コンパイルするようにする変更などがありました。

k0kubun: r67530 2019-04-14 13:52:02 +0900

MJIT で compile option を指定する struct rb_mjit_compile_info という構造体を導入して、ivar cache や send cache などの最適化の失敗でコンパイルがキャンセルされた時にこれらの最適化を off にしてコンパイルをリトライするようにしています。

svn: r67531 2019-04-14 13:52:04 +0900

version.h の日付更新。

k0kubun: r67532 2019-04-14 14:26:23 +0900

r67530 で導入した MJIT の再コンパイルのテストを i686 Linux では skip するようにしています。再コンパイルが実行されないとのこと。

k0kubun: r67533 2019-04-14 14:26:46 +0900

mjit*.{hc} や MJIT 用のソース生成ツールが作るソースコード内での C のコメントを /* */ のスタイルから // の行コメントに変更しています。

k0kubun: r67534 2019-04-14 14:40:18 +0900

r67532 のテストのスキップで正規表現とマッチさせるつもりで == と書いてたので =~ に修正。

k0kubun: r67535 2019-04-14 14:48:38 +0900

.travis.yml の大量の build matrix を一旦消して MJIT のテストのみ行うようにしています。デバッグのためとのこと。

k0kubun: r67536 2019-04-14 14:48:39 +0900

r67532 および r67534 の MJIT の再コンパイルテストの skip を revert しています。

k0kubun: r67537 2019-04-14 14:48:40 +0900

r67530 の再修正で mjit_add_iseq_to_process() で引数の struct rb_mjit_compile_info が NULL だった時に明示的に各種オプションを false に指定して最適化有効にするようにしています。初期化されてないので元から最適化が無効でコンパイルされるので再コンパイルされないという場合があったみたいですね。

k0kubun: r67538 2019-04-14 14:52:14 +0900

と、思ったらやっぱり r67537 は revert されて r67535 と r67536 も revert されました。これらはブランチで(Travis-CI を走らせて)デバッグするだけで trunk にコミットするつもりじゃなかったのがうっかり入っちゃったみたいです。 r67537 は入れてもよさそうだけど。

hsbt: r67539 2019-04-14 15:01:35 +0900

添付 bunlder を 2.1.0.pre.1 に更新しています。

hsbt: r67540 2019-04-14 15:02:47 +0900

r67539 の bundler の spec に require "rspec" を追加しています。

hsbt: r67541 2019-04-14 15:03:58 +0900

r67539 の bundler の更新で rubyリポジトリに入れてるせいで失敗するテストにタグを追加して skip させるようにしています。

hsbt: r67542 2019-04-14 15:05:27 +0900

逆に r67541 で入った bundler のテストのうちいくつかはタグを外して実行対象にしています。

kazu: r67543 2019-04-14 15:52:37 +0900

r67347 で .travis.yml に追加した Travis-CI の macOS での並列ビルド時の Permission Error のデバッグのために追加したエラー時に実行するコマンドに ext/ と ext/bigdecimal/ の ls の結果も表示させるように追加しています。

k0kubun: r67544 2019-04-14 15:57:21 +0900

debug counters が有効にビルドされている時に RubyVM.reset_debug_counters というメソッドでカウンタをリセットできるようにしています。debug counters って確かプロセス終了時に表示するって感じだったと思うから、おそらくプロセス起動時とかファイルのロードなどに起きるイベントのぶんを除外して、知りたい処理の間のカウントだけしたいっていう時に使うんでしょうね。

k0kubun: r67545 2019-04-14 16:10:34 +0900

r67544 の再修正。 MJIT 関係の一部のカウンタは実際にはカウンタではなくて増減可能な変数で、これをリセットしてしまうと負になってしまうのでリセット対象にしないようにしています。

k0kubun: r67546 2019-04-14 16:12:44 +0900

debug counters に MJIT の length_stale_units というカウンタを追加して stale_units リストのサイズを記録するようにしています。

k0kubun: r67547 2019-04-14 17:33:43 +0900

MJIT の JIT 時のコード生成用の C コードを生成するテンプレート tool/ruby_vm/views/mjit_compile.inc.erb で opt_aref, opt_aset と opt_mod の命令のコンパイル時に inline call cache が効いてない時に(?) mjit_compile_insn というテンプレートを使う方法に fallback するようにしている、と思う。さすがに C のコード生成する C のコードを生成する ERB を観てるだけだとぱっと見では理解不能ですね。せめて render してできた C のコードみてみないと。

k0kubun: r67548 2019-04-14 17:53:19 +0900

r67547 の追加修正で send 最適化対象の VM 命令を send_compatible_opt_insns という変数に入れておいて、opt_ で始まって CALL_SIMPLE_METHOD フラグがついてる命令は自動に入るようにしています。

k0kubun: r67549 2019-04-14 18:31:24 +0900

r67530 の MJIT 再コンパイルのテストを r67532 で i686 で skip するようにしてましたが、これは rb_mjit_recompile_iseq() で LAST_JIT_ISEQ_FUNC を ptrdiff_t にキャストして比較してたけど uintptr_t に修正しています。であらためてテストの skip を消しています。 https://github.com/ruby/ruby/pull/2130

ruby-trunk-changes r67519 - r67523

今日は Kernel#proc や Proc.new の暗黙のブロック引き継ぎの時の警告メッセージのちょっとした変更などがありました。

marcandre: r67519 2019-04-13 09:56:12 +0900

proc や Proc.new をブロックなしで呼び出した時にそのメソッドに渡されたブロックをそのまま暗黙に引き継ぐ挙動をした時の警告を変更しています。参照されてるチケットは引数のデフォルト値に使う時には警告を出さないようにして欲しいっていうものなのでこれが修正というわけではなさそうですが。 [ruby-core:91109] [Bug #15539]

svn: r67520 2019-04-13 09:56:14 +0900

r67519 のインデントのタブを空白に展開。

svn: r67521 2019-04-13 09:56:14 +0900

version.h の日付更新。

k0kubun: r67522 2019-04-13 15:27:52 +0900

r66565 で vm_sendish() という関数でブロックの起動も行うようにメソッド/ブロック起動を整理した時に vm_sendish() で GET_ISEQ() と GET_EP() を使ってましたが、これは reg_cfp から参照されるもので、VM_ENV_FLAGS_SET() に渡すためのものは VM control frame を push した後の呼ばれるメソッドなどの情報が必要だったので ec->cfp をみるように修正しています。

k0kubun: r67523 2019-04-13 15:55:35 +0900

r67522 を revert しています。 vm_sendish() では上のほうで RESTORE_REGS() というマクロで reg_cfp が ec->cfp に変更済みなので不要だったみたいです。