ruby-trunk-changes r59146 - r59161

今日は不正なバイト列を含むスクリプトを実行しようとするとハングする不具合の修正や VM 内部の構造のリファクタリングなどがありました。

nobu: r59146 2017-06-22 21:53:05 +0900

ObjectSpace.count_symbols のテストでメソッド定義前にも ObjectSpace.count_symbols で元々存在していた Symbol 数からの差分をチェックするように変更しています。

nobu: r59147 2017-06-23 09:29:45 +0900

doc/syntax/refinements.rdoc の文法の修正と、Fixnum というクラス名が使われていたところがあったので Integer を使うように書き換えています。 https://github.com/ruby/ruby/pull/1659

svn: r59148 2017-06-23 09:29:45 +0900

version.h の日付更新。

nobu: r59149 2017-06-23 10:43:39 +0900

VM 命令の leave 命令で stack pointer のチェックで不具合を検出した時の rb_bug() で異常終了する処理を vm_stack_consistency_error() という関数として切り出すリファクタリング

glass: r59150 2017-06-23 13:19:53 +0900

r59142 で IO#reopen にブロックつきの呼び出しの対応を追加したのを revert しています。ブロックを抜けたら close されてしまうと、ブロックの外と共有されるリソースの状態を変えてしまうのでよくないよねということみたいです。 [ruby-core:27701] [Feature #2631]

ko1: r59151 2017-06-23 14:45:50 +0900

TracePoint のテストで別の Thread で TracePoint のブロックが呼ばれた時に処理をスキップする対応を追加しています。

ko1: r59152 2017-06-23 14:50:35 +0900

r59151 のテストの修正でむしろエラーになってしまったみたいなので revert しています。

ko1: r59153 2017-06-23 14:52:28 +0900

r59151 のリトライ。 TracePoint#enable のブロックではなくて TracePoint.new のブロックのほうで別 Thread じゃないかチェックするようにしています。

ko1: r59154 2017-06-23 14:55:12 +0900

compile.c でポインタとして使う値に 0 を使っていたところを NULL に置き換えています。

ko1: r59155 2017-06-23 16:25:52 +0900

EXEC_TAG() や TAG_JUMP() で使う state の型を int から enum ruby_tag_type という専用の enum 型に変更しています。元々 enum 型は定数マクロから変更されていたので、そこに TAG_NONE = 0 というメンバー(enum 型の時はメンバーって言うのかな?)を追加して、これと比較して大域脱出したかどうか判定するようにしています。

nobu: r59156 2017-06-23 16:53:07 +0900

r59155 の state の型の変更で、分岐の if 節と else 節で異なる型が期待されているところでそれぞれのブロック内で変数定義するようにして警告除去しています。 rb_catch_protect() が int * 型を期待していたため。しかしその後その state は JUMP_TAG() に渡されるので、rb_catch_protect() の引数も enum ruby_tag_type * に変更したほうがよさそうですね。

ko1: r59157 2017-06-23 17:24:54 +0900

というわけで r59156 は revert して rb_catch_protect() の引数の型を int * から enum ruby_tag_type * に変更しています。

ko1: r59158 2017-06-23 17:48:41 +0900

rb_thread_t:state を rb_thread_t::tag_state というメンバー名に改名しています。

ko1: r59159 2017-06-23 18:43:52 +0900

r59158 に続き rb_thread_t::tag_state を構造体 struct rb_vm_tag のメンバーに移動しています。state は tag 自体と同じ寿命のはずなので rb_thread_t に常に持つ必要はないよねってことですね。まあでもメモリ使用量的には rb_thread_t に対して rb_vm_tag のほうが複数存在しうるから若干増えますね。

nobu: r59160 2017-06-23 20:15:26 +0900

r59159 で struct rb_vm_tag のメンバーの追加と同時に順番が変更されてましたが rb_jmpbuf_t buf メンバーを最後に戻しています。そうだ、スタックオーバーフローの検出の時にこれが最後にないと無限ループになってしまう問題があるんでしたね。 r40806 を参照のこと。さらにこのメンバーが最後になっていることを確認する STATIC_ASSERT() を追加しています。

nobu: r59161 2017-06-23 20:20:29 +0900

? の記法の文字列リテラルのあとに不正なマルチバイト文字というか中途半端なバイトがあると無限ループに陥ることがある不具合を修正しています。 [ruby-core:81746] [Bug #13672]