ruby-trunk-changes r62058 - r62073

今日は for 文で to_ary メソッドによる変換が可能なオブジェクトを複数の変数に splat して代入できるようにする変更や、Windows 環境での nan() の代替実装を使う場合のコンパイルエラーの修正などがありました。

nobu: r62058 2018-01-26 22:27:56 +0900

tool/vcs.rb で Kernel#system を Refinements で上書きしてデバッグ時の標準エラー出力への引数の出力と exception キーワード引数の対応を追加しています。古い BASERUBY 対策ですかね(でも Module の refine って結構新しい feature だったような)。

nobu: r62059 2018-01-26 22:34:09 +0900

tool/vcs.rb で git svn dcommit で git で作業しているリポジトリからコミットする時に複数のコミットがあった時に一気にコミットせず、分割して1つずつ git svn dcommit して git rebase するようにしています。GitHub にミラーする post commit のスクリプトが一気にコミットされると同期に失敗することがあるので、それを避けるためみたいです。

nobu: r62060 2018-01-26 22:38:00 +0900

r62058 の再修正。やはり Module の refine は比較的新しい機能なので Module#prepend を使った上書きを使うようにしています。

usa: r62061 2018-01-27 01:38:38 +0900

r61938 や r61971 の nan(3) がない時の missing の代替実装で Windows 環境で $(RT_VAR) をみて HAVE_NAN の定義をするように win32/Makefile.sub に対応を追加しています。また include/ruby/missing.h に nan() のプロトタイプ宣言を追加するようにしています。

svn: r62062 2018-01-27 01:38:39 +0900

version.h の日付更新。

k0kubun: r62063 2018-01-27 10:28:21 +0900

r62061 でチェックしてた変数が RT_VAR になってたので RT_VER に修正しています。

k0kubun: r62064 2018-01-27 10:59:08 +0900

tool/ruby_vm/helpers/dumper.rb の RubyVM::Dumper でカレントディレクトリをベースにして出力先ファイルを決定するのをやめて、明示的に Pathname オブジェクトを受け取るようにリファクタリングしています。

k0kubun: r62065 2018-01-27 11:14:20 +0900

tool/ruby_vm/scripts/insns2vm.rb のメソッド群を Module の特異メソッドとして定義しなおして、また generate_parser は同じファイルの router メソッドからしか使われてないので private_class_method で private にしています。

k0kubun: r62066 2018-01-27 11:14:20 +0900

tool/ruby_vm/scripts/insns2vm.rb のコマンドラインオプションのヘルプメッセージの文法修正。

kazu: r62067 2018-01-27 13:14:26 +0900

configure で INFINITY, NAN, HUGE_VAL などのマクロの存在チェックをしていたのはやめて、include/ruby/missing.h で HAVE_INFINITY や HAVE_NAN をチェックしていたところは直接 defined?(INFINITY) や defined?(NAN) でチェックするようにしています。言われてみれば定数マクロならそうだな…。また include/ruby/missing.h で HAVE_XXX のかわりの USE_RB_INFINITY や USE_RB_NAN といったマクロを定義して代替実装を利用するかどうかの判定に使うようにしています。

k0kubun: r62068 2018-01-27 13:14:29 +0900

tool/ruby_vm/models/bare_instructions.rb の RubyVM::BareInstructions#inspect でクラス名も含めるようにしています。

nobu: r62069 2018-01-27 14:35:47 +0900

vm_insnhelper.c の vm_expandarray() で rb_check_array_type() での配列オブジェクトへの変換が失敗した時には要素1つの配列を作ってからそのバッファを参照することになっていたので、変換失敗時にはそのまま 1要素の C の配列としてローカル変数を参照して後続の処理に使うようにして不要な中間オブジェクトの生成を抑制しています。

nobu: r62070 2018-01-27 15:11:23 +0900

r62060 で tool/vcs.rb に追加した(Refinements のかわりの DebugSystem で 2.6 系では system のキーワード引数 exception がそのまま渡せるので渡すようにしています。また VCS にも Module#prepend で system メソッドを上書きするようにしています。あれ VCS で再定義されてるところはなさそうだし Kernel に prepend したので効くような気がするけどなぁ。

nobu: r62071 2018-01-27 15:12:09 +0900

r57244 で定数の探索のルールが変更されて、Foo::Bar でトップレベルの ::Bar が見えてしまわないようにしたのに defined? の判定が追随していなくて "constant" を返してしまっていたので、追随して nil を返すようにしています。 https://github.com/ruby/ruby/pull/1800 [ruby-core:85142] [Bug #14407]

nobu: r62072 2018-01-27 18:27:47 +0900

オブジェクトが配列でなかったら to_a メソッドで変換を試みる rb_check_convert_type_with_id() を使った処理を rb_check_to_array() という名前で関数として切り出すリファクタリング

nobu: r62073 2018-01-27 19:41:43 +0900

for 文の変数代入部分で複数の変数への代入が行なわれる場合の VM 命令へのコンパイル処理を変更して、内容が配列かどうかの判定を "===" メソッドで行なっていたのを try_convert メソッドで行なうようにしています。うーん、これはどういう効果があるのかなとチケットをみると、to_ary メソッドで配列への変換が定義されているオブジェクト(つまり暗黙的な変換時に配列と同等に扱かわれることが期待されているオブジェクト)が変換後に複数の変数に splat されるようになるようです。うーん、まあ for 文自体ほぼ使わないのでどの程度影響があるかわかりませんが。 [ruby-core:84931] [Bug #14374]