ruby-trunk-changes r62079 - r62091

今日は VM 命令の実装の insns.def からの自動生成でバイナリサイズを削減しパフォーマンスを向上する変更などがありました。

nobu: r62079 2018-01-28 23:05:39 +0900

parse.y の parser_append_options() で変数 default_location へのポインタを & で作っていたのを LOC という変数に格納しておいて、それを使うようにリファクタリング。ただ NULL_LOC への参照もこの LOC に置き換えてて、それはいいのかなぁ。中身はちょっと違うようだけど(default_location は (1, 0)-(1,0) で NULL_LOC は (0, -1)-(0, -1) なので後者は不正な位置情報となってる)。

nobu: r62080 2018-01-28 23:16:48 +0900

struct rb_method_definition_struct の bit field 型のメンバー type の bit 数を VM_METHOD_TYPE_MINIMUM_BITS という定数マクロに切り出すリファクタリング

normal: r62081 2018-01-29 06:07:13 +0900

標準添付ライブラリ uri の lib/uri/common.rb の magic comment frozen_string_literal を true に変更して、必要なところに String#+@ を追加しています。また TBLDECWWWCOMP_ というテーブルのキーと格納する値の文字列は fstring 化するようにしています。後者は動的に作った(String#% で生成した) String オブジェクトを fstring 化して意味あるのかな? [ruby-core:85161] [Feature #14410]

svn: r62082 2018-01-29 06:07:14 +0900

version.h の日付更新。

normal: r62083 2018-01-29 06:57:38 +0900

doc/signals.rdoc というファイルを追加して、Signal.trap のシグナルハンドラの仕組みやシグナルハンドラで行なってはいけない処理についてなどの Tips を書いています。 [ruby-core:85107] [Misc #14222]

svn: r62084 2018-01-29 06:57:39 +0900

r62083 で追加した doc/signals.rdoc の svn property 設定。

shyouhei: r62085 2018-01-29 15:47:05 +0900

insns.def から VM 用のコードを生成するツールで命令の attribute の sp_inc の処理を一般化して、INSNS_ATTR() という C のマクロで参照できるようにしています。

nobu: r62086 2018-01-29 15:54:22 +0900

ruby_init_loadpath_safe() においてファイルパスを格納する固定長の配列 libpath を利用する環境は存在しないはずということでその preprocessor の分岐を削除しています。

shyouhei: r62087 2018-01-29 15:56:56 +0900

insns.def の各命令の実装部分で POPN() や DEC_SP() を書いていたのを削って、かわりに VM のループのほうで VM stack の SP の調整を命令の inc_sp を参照して行うように一般化しています。これにより VM のメインループ実装のバイナリサイズが少し小さくなるようです。

shyouhei: r62088 2018-01-29 16:04:50 +0900

opt_plus などの最適化つきメソッド呼び出し系の VM 命令で VM スタック操作 + CALL_SIMPLE_METHOD() というマクロを利用していたのを r61120 で導入した DISPATCH_ORIGINAL_INSN() を利用して opt_send_without_block 命令の実装に委譲するようにしています。これで VM 命令の実装のバイナリサイズがぐっと小さくなるみたいです。 https://github.com/ruby/ruby/pull/1779

shyouhei: r62089 2018-01-29 16:15:08 +0900

さらに opt_neq、opt_aset_with、opt_aref_with などの最適化命令でも CALL_SIMPLE_METHOD() のかわりに DISPATCH_ORIGINAL_INSN() を使って opt_send_without_block 命令の実装にジャンプするようにしています。オペランドに引数があるのでオペランドの順番を変更して CALL_INFO と CALL_CACHE が最後になるようにして、VM スタックの sp を調整してからジャンプするようにしています。 https://github.com/ruby/ruby/pull/1779

shyouhei: r62090 2018-01-29 17:11:02 +0900

tool/ruby_vm/views/_attributes.erb というテンプレートで生成する C のコードに OFFSET, lindex_t, GENTRY, ISEQ などの型を定義している部分がありましたが、これは vm_exec.h で定義されている型なので #ifndef RUBY_VM_EXEC_H でくくってヘッダが読み込まれてたら再定義しないようにしています。

mame: r62091 2018-01-29 17:40:22 +0900

String#% の rdoc 用コメントのサンプルコードに %x 指示子を使って object_id を表示している例を %08x から %016x に変更しています。64bit 環境では object_id は hex 8文字(4byte幅)に収まらないので、というのと精度に2桁以上の数字が指定できることを例示するため、とのことです。