ruby-trunk-changes r66247 - r66273

今日は TracePoint に require/load や eval でスクリプトを compile した後のイベントフック script_compiled の追加、Hash のリテラルVM 命令の最適化などがありました。

naruse: r66247 2018-12-06 21:35:00 +0900

r66200 の ICC 向けの prototype 宣言の r66241 で include/ruby/ruby.h に移動したのは消して internal.h の export 部分に移動しています。

hsbt: r66248 2018-12-06 22:19:06 +0900

NEWS ファイルの bundler と rubygems の更新の追記とバージョンの更新。

ko1: r66249 2018-12-06 22:42:32 +0900

TracePoint に script_compiled というイベントフックの種類を追加しています。 その名の通り require や eval でスクリプトが compile されて ISeq が作られた後に呼ばれるようです。どんなふうに使うんだろう。 TracePoint#compiled_instruction_sequence メソッドも追加されて、このイベントの時に作られた ISeq オブジェクトも取れるようになっています。 [ruby-core:89742] [Feature #15287]

svn: r66250 2018-12-06 22:42:35 +0900

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

ko1: r66251 2018-12-06 22:53:48 +0900

r66249 で追加した TracePoint の script_compiled イベントのテストを追加。 [ruby-core:89742] [Feature #15287]

ko1: r66252 2018-12-06 22:56:36 +0900

NEWS ファイルに r66249 で追加した TracePoing の script_compiled イベント追加について追記しています。 [ruby-core:89742] [Feature #15287]

naruse: r66254 2018-12-07 00:33:54 +0900

r66200 から続いてた ICC 向けの prototype 宣言追加ですが rb_ary_ptr_use_end() も必要だったので追加しています。

svn: r66255 2018-12-07 00:33:56 +0900

version.h の日付更新。

tenderlove: r66256 2018-12-07 03:20:11 +0900

benchmark/ に文字列をキーにした Hash リテラルの評価のベンチマークをいくつか追加しています。これは embed の時と array hash (transient)の実装の時を意識した要素数なのかな。

svn: r66257 2018-12-07 03:20:12 +0900

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

tenderlove: r66258 2018-12-07 03:28:21 +0900

r66174 で配列リテラルで要素がリテラルの時に duparray 命令でオペランドからコピーするだけになりましたが、Hash のリテラルも同様にオペランドに Hash を作っておいてそれを duphash という命令でコピーするようにしています。newhashfromarray 命令は不要になったので削除しています。要素数の大きい Hash のリテラルを何度も評価するような場合は効くかも。とはいえそういうことはそんなにはないような。

svn: r66259 2018-12-07 03:28:26 +0900

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

suke: r66260 2018-12-07 06:56:55 +0900

r65027 あたりの win32ole のテストと同様に Microsoft Internet Controls という COM(?) を使っていたのを Microsoft Scripting Runtime というのを使うようにしています。コミットコメントをみると Microsoft Intenrt Controls というのはつまり IE の一部みたいですね。

nobu: r66261 2018-12-07 08:03:54 +0900

r65984 の Object#=~ の警告出力時に receiver の Class もメッセージに含めるようにしています。 [ruby-core:89438] [Feature #15231]

nobu: r66262 2018-12-07 08:06:13 +0900

Object の initialize, respond_to_missing?, method_missing, respond_to? などのメソッドは再定義する時に警告を出力するようにしています。これらは再帰的な呼び出しに陥ることに繋りやすいので。 [Bug #5473] [Bug #14670] [Bug #15382]

k0kubun: r66263 2018-12-07 08:16:01 +0900

rubygems のテストで require 時に Bundler::GemfileNotFound 例外が発生するのにも対応するようにしています。これ以前にも入れてた気がしますね。別のところかな。

k0kubun: r66264 2018-12-07 08:26:53 +0900

rubyspec の Socket.accept_loop のテストで Windows で hangup することがあるそうで platform_is_not で実行除外するようにしています。

nobu: r66265 2018-12-07 08:51:45 +0900

rdoc のテストで生成したファイルの mtime をチェックするテストでエラー時のメッセージを強化しています。妙な assertion だなーと思ったら rdoc は生成ファイルの mtime はソースファイルに合わせるようになってるみたいですね。

nobu: r66266 2018-12-07 10:42:03 +0900

r66265 の続きで生成ファイルの mtime を assertion 時じゃなくて先に取っておくようにしています。並列で実行してて同じファイルが上書きで生成されたりしてエラーになったのかな。

duerst: r66267 2018-12-07 16:04:00 +0900

r66239 のさらに続きで regparse.c の node_extended_grapheme_cluster() のリファクタリングと共用変数のサイズを拡張しています。一部 assert のつもりか exit(1) しているところがあるけどこれは例外か rb_bug() のほうがよさそうですね。

normal: r66268 2018-12-07 16:09:31 +0900

r61631 で拡張ライブラリ zlib の gzfile_write_raw() で書き込み後にバッファの文字列オブジェクトを rb_str_resize() を読んではやめにメモリ解放させるようにする最適化をしていましたが、ここでは write はメソッド呼び出しで読んでたので IO の実装とは限らず、独自に write メソッドを実装したなにかかもしれないので、書き出した String に対して破壊的操作をすると結果に影響する恐れがあったのでやめています。 Rack::Deflater がまさにこの影響で空のレスポンスを返してしまってたみたいです。 [ruby-core:90133] [Bug #15356]

duerst: r66269 2018-12-07 16:20:26 +0900

r66267 で指摘した exit(1) しちゃってるところは、コメントアウトされた状態の assert() に戻されてます。よかったよかった。

nobu: r66270 2018-12-07 17:51:26 +0900

rbconfig.rb の RbConfig::CONFIG["UNICODE_EMOJI_VERSION"] に Unicode の Emoji のバージョンを格納するようにしています。 [ruby-core:90068] [Feature #15341]

duerst: r66271 2018-12-07 18:01:13 +0900

r66270 の UNICODE_EMOJI_VERSION の RbConfig::CONFIG への追加に対応してテストで決めうちしてたバージョンを RbConfig を参照するようにしています。

hsbt: r66272 2018-12-07 19:00:21 +0900

bundled gem の rake のバージョンを 12.3.1 から 12.3.2 に更新しています。

nobu: r66273 2018-12-07 20:45:03 +0900

hash.c で hash 値の初期値というか未設定の値として 0 を使っていたのを RESERVED_HASH_VAL という定数マクロを使うようにしています。実際の値は 0 なので同じですが。 grep して気がついたのですが RESERVED_HASH_VAL って st.c でもマクロとして定義されてて、しかも値が違いますね(~0 なので逆に全bitが 1)。