ruby-trunk-changes r59947 - r59956

今日は RubyKaigi 2017 の1日目でした。今日のコミットには nobu によるキーノートの壇上で行なわれたものもあるみたいです。拡張ライブラリ ripper の機能追加、文字列リテラルの式展開中の暗黙の to_s に Refinements が効くようにする変更、KeyError のメソッド追加などがありました。

mame: r59947 2017-09-18 08:56:37 +0900

拡張ライブラリ objspace の count_objects_size() と count_symbols() と count_nodes() で setup_hash() で生成しているので冗長だった nil チェックなどを削除しています。

svn: r59948 2017-09-18 08:56:38 +0900

version.h の日付更新。

nobu: r59949 2017-09-18 09:08:19 +0900

拡張ライブラリ ripper に Ripper.lex_state_name というクラスメソッドを追加して、lexer の状態を文字列で取得できるようにして、Ripper::Lexer::Elem で to_a の結果を inspect した時にこれを使って状態を文字列表示するようにしています。

nobu: r59950 2017-09-18 11:27:13 +0900

文字列リテラル内の式展開の中で呼ばれる暗黙の to_s による文字列化に Refinements による to_s メソッドの再定義が効かなかったのを効くようにしています。send 命令での明示的なメソッド呼び出しをするようにしているのですが、そのままだと遅くなってしまうので、このために VM 命令に branchiftype という命令が追加されていて、オブジェクトの型が T_STRING だったら to_s の呼び出しが不要なので VM 命令レベルで分岐して、余分なメソッド呼び出しが抑制されるようにしています。String#to_s が再定義されてた時は…というのはまあいいのか(元から文字列だった時に to_s 相当の処理が呼ばれるのかどうかははっきりしていない気がする)。 [ruby-dev:50200] [Feature #13812]

nobu: r59951 2017-09-18 14:16:37 +0900

String から Symbol を生成するいわゆる rb_str_intern() を VM 命令として intern 命令を追加しています。 r59946 で opt_call_c_function 命令を直接コンパイラが吐くようにしてましたが、これは ISeq.dump で出力できないそうなので専用の命令を追加して対処することにしたようです。

yui-knk: r59952 2017-09-18 14:17:21 +0900

thread.c の rb_reset_coverages() で method coverage 用の配列のクリアが漏れていたので修正しています。

rhe: r59953 2017-09-18 14:37:29 +0900

re.c の未使用の関数 rb_memcmp() を削除しています。static じゃない関数だから外から見えてないかなーと思いましたが r13641 から使われてないとのことでだいぶ古いので、まあ大丈夫かな。

nobu: r59954 2017-09-18 16:52:58 +0900

r59454 で configure.in で darwin の時に ar コマンドとして libtool コマンドを使うようにして警告除去していましたが、libtool が古すぎると問題があるみたいなのでメッセージでチェックしてから使うようにしています。

nobu: r59955 2017-09-18 17:05:53 +0900

例外クラス KeyError に receiver と key というメソッドを追加していて、Hash#fetch や ENV.fetch でエラー発生したときに、なんというキー名がみつからなかったのか例外からわかるようにしています。 [ruby-core:73774] [Feature #12063]

ktsj: r59956 2017-09-18 17:21:08 +0900

TracePoint を使ってメソッド呼び出しのフックの実行中に例外が発生すると stack frame の操作がずれて cfp consistency error になっていたので、stack frame を積む時に flag に VM_FRAME_FLAG_FINISH は立てなくて、フック呼び出し後にフラグを立てるようにしています。 [ruby-dev:50162] [Bug #13705]