ruby-trunk-changes r52928 - r52971

今日はかなり大きな変更がいくつもありました。
RubyVM::InstructionSequence のバイナリフォーマットへのdump/load の機能の追加、require/load で処理を代替するフックを追加できる機能の追加、NameError#local_variables の追加、case 文用の最適化命令の true/false/nil の対応追加、Enumerator::Lazy#grep_v の追加などがありました。

normal: r52928 2015-12-08 08:56:57 +0900

case 文の when のマッチで用いられる === 演算子の最適化命令で Float の時にメソッドの再定義が行なわれているかのチェックがされていなくて Float#=== の再定義が効かない不具合があったのを修正しています。 [ruby-core:71818] [ruby-core:71920] [Bug #11784]

nobu: r52929 2015-12-08 09:03:21 +0900

拡張ライブラリ date の d_lite_ 系の関数で引数が数値であることをチェックする処理を expect_numeric() という関数に切り出すリファクタリング

nobu: r52930 2015-12-08 10:19:04 +0900

標準添付ライブラリ optparse.rb の rdoc 用コメントの typo 修正。 https://github.com/ruby/ruby/pull/1126 [ruby-core:66901] [misc #10608]

normal: r52931 2015-12-08 10:46:45 +0900

case 文の when のマッチで使う最適化命令で true/false/nil も最適化を行うようにしています。このため TrueClass/FalseClass/NilClass の === 演算子メソッドも定義されるようになっています(実体は rb_equal() なので Object#equal というか正確には Kernel#equal と同じ)。 ベンチマークも追加されています。 [ruby-core:71923] [Feature #11769]

svn: r52932 2015-12-08 10:47:15 +0900

r52931 で新規追加したファイルの svn property 設定。

nobu: r52935 2015-12-08 12:08:33 +0900

NEWS ファイルに r52916 で追加したインデント除去つきヒアドキュメントについて追記しています。 [Feature #9098]

usa: r52936 2015-12-08 12:20:07 +0900

tool/merger.rb で svn merge 後のプロンプトを色付けするようにしています。まあ、これ関係あるのわたしと usa さんくらいでしょうけど。

ngoto: r52937 2015-12-08 13:03:53 +0900

拡張ライブラリ io/console の IO#getpass のテストを修正しています。 このテストちょっと難しいなぁと思ってたんですけど Thread のレースコンディションがあったみたいです。それ以前に PTY による IO の両端の向きが逆だったみたいで Solaris で失敗していたようです。 [ruby-dev:49412] [Bug #11780]

normal: r52938 2015-12-08 13:32:23 +0900

rb_iseq_load() で配列から RubyVM::InstructionSequence を構築する時に opt_case_dispatch 最適化命令用の CDHASH をロードする時に余分な dup をしていたのを省略しています。

nobu: r52939 2015-12-08 14:12:15 +0900

r52937 で修正した r52902 の IO#getpass のテストの再修正です。 PTY の両側の読み書きする Thread を入れ換えています。 r52937 だと OS Xデッドロックしたそうです。 先にパスワード入力されてから IO#getpass されると先に書かれてたバッファが消されるからかな。 [ruby-dev:49412] [Bug #11780]

nobu: r52940 2015-12-08 14:20:41 +0900

Marshal.dump で T_OBJECT 型の内部的な id によるインスタンス変数をインスタンス変数の数をカウントする時に除外するようにしています。ここで言う内部的というのは "@" で始まってないというだけではなくて、Encoding の index や文字列表現に紐付かない(:E というのだけは例外みたいです。これはなんだろ) ID のことみたいです。
テスト用の拡張ライブラリで id_internal_ivar を明示的に初期化してないような気がするんですけどこれはいいのかな? 0 に初期化されているのを使ってるということなのかな。

marcandre: r52941 2015-12-08 14:21:11 +0900

Array#dig, Hash#dig, Struct#dig の rdoc 用コメントを追記、修正しています。また Hash#dig のテストに任意のオブジェクトの dig メソッド定義時の挙動についてチェックを追加しています。 [ruby-core:71853] [Bug #11776]

nobu: r52942 2015-12-08 14:27:10 +0900

NameError に発生元の ISeq も保持しておいて NameError#local_variables で例外発生時点でのローカル変数名一覧も取得できるようにしています。おそらく did_you_mean.gem で利用するためで、internal use only とコメントされているのであまり外部から使って欲しくはない(依存しないほうがいい、というくらいかな)みたいですね。 [ruby-core:71855] [Feature #11777]

nobu: r52943 2015-12-08 16:23:43 +0900

Enumerator::Lazy に Enumerable に入った grep_v メソッドの対応を追加しています。 [ruby-core:71845] [Feature #11773]

duerst: r52944 2015-12-08 17:36:43 +0900

str_gsub() の未使用の変数除去。

naruse: r52945 2015-12-08 19:54:42 +0900

r52902 で追加された拡張ライブラリ console の IO#getpass およびそのテスト修正の r52903, r52910, r52911, r52937, r52939 などを revert しています。テストが複数のプラットフォームでうまく動かないので。

kazu: r52946 2015-12-08 21:20:25 +0900

r52907 で r52839 の configure の条件を修正したのを revert しています。あれ、そうなのかな…と思ってみてみると RUBY_FUNC_ATTRIBUTE() は RUBY_DECL_ATTRIBUTE() を使ってて、この定義が結構むずいのですが、attribute なしの時は x になりそうなので、そうなのかも。 x"$var" = "x" という shell script のイディオムがあるのでそれと混同してしまいました。

kazu: r52947 2015-12-08 21:31:28 +0900

r52943 の Enumerator::Lazy#grep_v の追加について NEWS ファイルに追記しています。 [ruby-core:71845] [Feature #11773]

nobu: r52948 2015-12-08 22:26:56 +0900

r52945 で revert された拡張ライブラリ io/console の IO#getpass メソッドを再度追加しています。今度は Thread を使わずに run_pty で PTY.spawn を使って子プロセスで IO#getpass を実行させるようにしています。

ko1: r52949 2015-12-08 22:58:50 +0900

RubyVM::InstructionSequence をバイナリのファイルに出力/ロードするという機能追加です。 ISeq のダンプについては ISeq#to_a で Array にしたものを Marshal を使って、rb_iseq_load() を利用する拡張ライブラリを使って(iseq.gem という gem があります)戻すという方法がありますが、これは期待したよりもかなり遅くて普通にスクリプトを parse したほうが早いという結果になってしまっていたので実用的ではありませんでした。今回専用のフォーマットでダンプするようにしてより高速にロードできるようにしたということのようです。
RubyVM::InstructionSequence#to_binary_format と RubyVM::InstructionSequence.from_binary_format および RubyVM::InstructionSequence.from_binary_format_extra_data というメソッドを追加しています。またスクリプトのロード処理で RubyVM::InstructionSequence.load_iseq というメソッドが定義されていたらこれにファイルパスを渡して呼び出し、これが返した ISeq を利用するというフックが仕込めるようになっています。これを利用した例として sample/iseq_loader.rb というのが追加されていて、AOT みたいに(機械語にではないですが)事前にスクリプトコンパイルして .rb.yarb というファイルに(その他の方法もあるみたいです)保存しておいたら、require でこちらをロードするというようなこともできるようです。凄いでかい機能が入りましたね。
また USE_LAZY_LOAD というマクロが真に定義されていると lazy load という機能も ON になるようですが、これは現状ではデフォルトで無効みたいです。 [ruby-core:71943] [Feature #11788]

svn: r52950 2015-12-08 22:59:15 +0900

r52949 の行末の空白除去。

svn: r52951 2015-12-08 22:59:39 +0900

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

kazu: r52952 2015-12-08 23:03:44 +0900

r52919 による NEWS ファイルへの String#+@, #-@ の追加についての記述の typo 修正。

ko1: r52953 2015-12-08 23:05:44 +0900

r52949 で iseq_s_load() の引数チェックで仕様を変更してしまっていたのを修正しています。

ko1: r52954 2015-12-08 23:06:13 +0900

r52949 の iseq_ibf_dump() で clang でのビルドエラー修正のため明示的なキャストを追加しています。

nobu: r52955 2015-12-08 23:12:11 +0900

r52954 のキャスト追加による修正を revert して RSTRING_LENINT() を使うことでオーバフローチェックするようにしています。また rb_iseq_check() が常に定義されるようにして USE_LAZY_LOAD の有無による未使用変数の警告除去。

nobu: r52956 2015-12-08 23:33:11 +0900

r52949 の ISeq のバイナリロードでインデックスの範囲チェックを強化しています。

ngoto: r52957 2015-12-08 23:33:29 +0900

拡張ライブラリ io/console のテストで run_pty というユーティリティで Process.wait が else 節と ensure 節で重複しているのを ensure 節のみにしています。

nobu: r52958 2015-12-08 23:47:38 +0900

さらに r52949 の ISeq のバイナリフォーマットへのダンプでも rb_check_string_type() で Qnil がかえってくる可能性があるのに対処しています。

kazu: r52959 2015-12-08 23:49:29 +0900

r52921 および r52949 の ChangeLogtypo 修正。

nobu: r52960 2015-12-08 23:50:55 +0900

さらにさらに r52949 の ISeq のバイナリフォーマットへのダンプで struct ibf_dump を T_TYPEDDATA 型のオブジェクトに wrap してメモリ管理を GC にまかせるようにしています。

kazu: r52961 2015-12-09 00:05:13 +0900

NEWS ファイルの frozen_string_literal や &. 演算子、インデント除去つきヒアドキュメントなどの記述にチケットへの参照を追記しています。

kazu: r52962 2015-12-09 00:05:37 +0900

NEWS ファイルのインデント修正。

svn: r52963 2015-12-09 00:05:37 +0900

version.h の日付更新。

nobu: r52964 2015-12-09 00:07:41 +0900

いくつかの関数を static にして export されないようにしています。

ko1: r52965 2015-12-09 00:14:55 +0900

ibf_setup_load() を ibf_load_setup() に改名して、ファイルフォーマットのヘッダ部分の値のチェックなどを追加しています。

ko1: r52966 2015-12-09 00:18:30 +0900

ibf_load_setup() で明示的なキャストの追加をしています。

yuki: r52967 2015-12-09 00:23:39 +0900

gems/bundled_gems に記載されている did_you_mean のバージョンを 1.0.0.rc1 に更新しています。

nobu: r52968 2015-12-09 00:26:58 +0900

RubyVM::InstructionSequence.from_binary_format_extra_data で extra_data というのを読み込む時のバッファの位置の間違いと、NUL 終端文字を期待してしまっていたのをサイズを指定して String オブジェクト化するようにしています。

ko1: r52969 2015-12-09 00:30:46 +0900

RubyVM::InstructionSequence#to_binary_format で引数の extra_data を出力する時に1バイト余分なサイズをヘッダに出してしまっていたのを修正しています。

nobu: r52970 2015-12-09 00:52:40 +0900

File::Stat#world_writable? と File::Stat#world_readable? の実装で get_stat() を繰り返し呼ばないように結果をローカル変数に格納するようにしています。 [ruby-core:71949] [misc #11789]

nobu: r52971 2015-12-09 00:59:05 +0900

ibf_dump_overwrite() で警告除去のため明示的なキャストを追加しています。