ruby-trunk-changes r51320 - r51343

今日はなんといっても ISeq のオブジェクトの T_IMEMO 型オブジェクト化という内部的には大きな変更がありました。また ObjectSpace.each_object が特異クラスも取り出せるようにする変更もありました。

ko1: r51320 2015-07-22 04:04:56 +0900

ObjectSpace.each_object で特異クラスは内部的オブジェクトの一種として現れないようにされていたのですが、現れるように変更されています。 これは NEWS ファイルにも追記したほうが良さそうですね。 [ruby-core:70006] [Bug #11360]

svn: r51321 2015-07-22 04:07:22 +0900

version.h の日付更新。

ko1: r51322 2015-07-22 06:19:02 +0900

構造体メンバ rb_method_iseq_t::iseqptr の型を rb_iseq_t * const から const rb_iseq_t * const に変更し、def_iseq_ptr() の戻り値にも const 修飾子を追加しています。

ko1: r51323 2015-07-22 06:28:43 +0900

構造体メンバ rb_call_info_t::blockiseq と rb_block_t::iseq の型にも const 修飾子を追加しています。

ko1: r51324 2015-07-22 06:39:10 +0900

r51323 の ChangeLog エントリの構造体名の間違いを修正しています。が typo していますね。

ko1: r51325 2015-07-22 06:41:04 +0900

構造体メンバ rb_call_info_t::kw_arg と rb_control_frame_t::iseq と rb_control_frame_t::block_iseq の型にも const 修飾子を追加しています。

ko1: r51326 2015-07-22 07:19:48 +0900

r51320 で ObjectSpace.each_object で特異クラスが現れるようになったのにあわせて、ObjectSpace.memsize_of_all でも特異クラスをスキップしないようにしています。

ko1: r51327 2015-07-22 07:52:59 +0900

rb_iseq_t を T_IMEMO 型のオブジェクトの一種に変更しています。 正確には T_IMEMO 型のオブジェクトのタイプに imemo_iseq を追加してこの時の型を struct rb_iseq_struct にして、これまでの struct rb_iseq_struct とほぼ同じ内容の構造体は struct_iseq_body に改名して struct RVALUE 内のポインタから指すようにしています。 また RubyVM::InstructionSequence クラスのオブジェクトは、これまで T_DATA 型のオブジェクトで rb_iseq_t を wrap するものでしたが、今度からは T_IMEMO/imemo_iseq のオブジェクトの参照('@' で始まらない内部的なインスタンス変数で参照する)を持つただの T_OBJECT 型のオブジェクトとして作成するようにしています。大きな変更ですね。 [ruby-core:63721] [Bug #10037]
こうしてこの変更をみると、iseq は基本的には内部的に作られるけど RubyVM::InstructionSequence というオブジェクトとしても存在している(取り出せる)ので、self というメンバがあってそのオブジェクトの struct RVALE の参照も保持していて……というややこしい構造をしていたのがわかりますね。

naruse: r51328 2015-07-22 08:24:02 +0900

テスト test/ruby/test_process.rb の未使用の変数の警告除去やエラー時のメッセージの追加。

naruse: r51329 2015-07-22 08:24:18 +0900

r51064 の st_table の linked list 構造に ccan/list を利用するようにした変更に追随して .gdbinit の gdb 用コマンド rb_ps_vm を変更しています。

nobu: r51330 2015-07-22 09:34:47 +0900

r51319 で rb_wait_for_single_fd() の goto を do { } while ループに書きかえた時にエラー処理が抜けていたのを修正しています。

nobu: r51331 2015-07-22 09:35:23 +0900

common.mk で $(BOOTSTRAPRUBY) や $(RUNRUBY) を使って実行するコマンドに $(Q)$(EXEC) を頭に追加しています 。 $(Q) は V=1 や Q=1 などでコマンドの表示/抑制を制御できるようにするためだと思います。$(EXEC) は定義されてなくて、$(exec) は exec というコマンド(というかシェルの組み込みコマンド)になっているようですが EXEC でいいのかな。 Makefile の変数名って大文字小文字区別しますよね。また一部の引数にはクオートを追加して $srcdir などに空白を含んでいた時の問題に対処しているようです。

nobu: r51332 2015-07-22 09:36:09 +0900

parse.y の parse_ident() で識別子を作る時に文字列の長さは既に知っているので rb_intern() のかわりに rb_intern2() を直接呼んで不要な strlen(3) を呼ばないように最適化しています。

nobu: r51333 2015-07-22 09:37:09 +0900

lex.c に予約語用のテーブルを生成する時に位置独立(PIC)なテーブルを作るようにしています。struct kwtable という構造体は name というメンバに予約語がそのまま入っていたのを、int 型にして、その値を予約語をchar[]型のメンバとして敷き詰めた struct stringpool_t という型を導入して、そのメンバの offsetof() で予約語を表す数値を取得するという方法で初期化するようにしています。元のテーブルが位置独立じゃないというのがどこのことなのかよくわからないです…(struct kwtable::name がポインタで静的領域を指すのでメモリ上でバラバラな位置に存在する可能性がありますが、PIC じゃないということはないような)。

nobu: r51334 2015-07-22 09:45:33 +0900

Numeric#coerce の rdoc 用コメントで引数の mark up の閉じ漏れを修正しています。 https://github.com/ruby/ruby/pull/974

hsbt: r51335 2015-07-22 15:48:53 +0900

Range#end のテストで終端を含まない Range の時のケースを追加しています。 https://github.com/ruby/ruby/pull/968

nobu: r51336 2015-07-22 16:14:20 +0900

r51331 で common.mk のいくつかのコマンドに $(EXEC) を追加していましたが、$(exec) に修正しています。

hsbt: r51337 2015-07-22 17:50:41 +0900

lib/matrix/eigenvalue_decomposition.rb の代入文が連続しているところで等号の前後に空白を入れるようにスタイルの修正。 https://github.com/ruby/ruby/pull/959

usa: r51338 2015-07-22 18:04:57 +0900

r51235 以降 test/webrick/test_utils.rb の WEBrick::Utils::TimeoutHandler のテストでタイムアウトが短すぎてテストが失敗することがあったそうで 0.01 → 0.1 にのばしています。 10msec だと確かにちと短すぎますね。

ko1: r51339 2015-07-22 19:55:02 +0900

r51327 の rb_iseq_t の T_IMEMO 型オブジェクト化で改名された構造体 struct rb_iseq_body をさらに struct rb_iseq_constant_body と struct rb_iseq_variable_body と2つの構造体に分割して、coverage 情報の格納用のメンバや flip-flop 用のメンバを可変情報用の構造体に分離しています。ほほう…。共有とかするのかなーと思ったけど、もう同じスクリプトコンパイルしたら iseq は1つしか作らないはずなのである意味既に共有化はできてるはずですし readability のためですかね。

ko1: r51340 2015-07-22 19:58:33 +0900

vm_core.h から不要になった構造体の宣言(struct iseq_compile_data_ensure_node_stack)を削除しています。

ko1: r51341 2015-07-22 20:21:21 +0900

構造体 struct rb_iseq_constant_body のメンバの順番を入れ換えています。 packing のためというよりは頻繁にアクセスするものを先頭に寄せてキャッシュ効率を良くするのが目的みたいです。

nobu: r51342 2015-07-22 20:27:46 +0900

ASSUME() という関数マクロを定義しています。引数が常に真であることを宣言してコンパイラの最適化のヒントにするというもので、win32/Makefile.sub で生成する config.h では __assume() というコンパイラの組み込み関数を利用しています。 include/ruby/ruby.h では代替の実装として UNREACHABLE を使った定義をしています。

nagachika: r51343 2015-07-22 22:26:06 +0900

r51324 の ChangeLog の修正がまた typo していたのを修正。