ruby-trunk-changes r36710 - r36715

今日は trace_func の実装に変更/修正がありました。 Ruby スクリプトから見える仕様変更はないと思いますが、内部の実装はかなり変更されたようです。複雑になっていたのでシンプルになるように変更したそうです。

nobu:r36710 2012-08-16 09:46:12 +0900

strftime.c の不要な #if directive と K&R スタイルの関数宣言を削除しています。

svn:r36711 2012-08-16 09:46:16 +0900

version.h の日付更新。

nobu:r36712 2012-08-16 11:52:09 +0900

r36707 で追加した inspect が tainted フラグを伝播するテストで to_s を呼ばれることを期待していたので失敗していたのを修正しています。 [ruby-dev:46053] [Bug #6881]

nobu:r36713 2012-08-16 14:33:03 +0900

make test-ruby という test/ruby/ の下だけテストするターゲットに test/-ext- もテストするように追加しています。ただし -ext- を引数に指定するために -- を前置している都合からか TESTS 環境変数をオプションに展開する機能は削られています。

nobu:r36714 2012-08-16 19:15:28 +0900

Class#initialize で引数に superclass として渡されたクラスが未初期化のクラスだったら TypeError を発生させるようにしています。 元のチケットの報告は initialize に Class.allocate で生成した自分自身を渡すと無限ループになるという内容ですが、自分に限らず未初期化(superclass が定義されていない。ただし BasicObject は可能)のクラスを継承できないようにしています。 [ruby-core:47148] [Bug #6863]

ko1:r36715 2012-08-16 20:41:24 +0900

set_trace_func/add_trace_func による trace_func の管理方法の変更です。コミットログによると……

  1. rb_hook_list_t という型を導入して RubyVM や Thread 毎の trace_func を管理するようにした。実体は rb_event_hook_t にあってフラグだけ管理している。また削除はすぐにリストから外さずに clean_flag だけ立てておいて trace_func 実行前に掃除するようにしている。
  2. チェック方法を変更した。詳しくは vm_core.h の EXEC_EVENT_HOOK() をみてね。
    • ではあんまりなんでみてみると、Thread 毎のフラグと RubyVM 毎(全体)のフラグを OR しておくグローバル変数を持っておいてそれをチェックするようにすることで RUBY_EVENT_VM という不要なフラグを排除しているみたいです
  3. "raw" タイプの hook を登録する API を追加した。通常 hook は rb_protect() で大域脱出とか例外があってもいいように保護されて呼ばれるけど、例外などを発生させないとわかっている小さな関数を呼びたい場合にも rb_protect() 経由で呼ばれるとオーバヘッドがあるのでそれを省きたい場合のため。なのだけど、実は今は API があるだけで実際に rb_protect() なしで直接呼ぶようにはなっていない。今後の布石。

また trace_func で Continuation でコンテキスト切り替えすると trace_func 実行中のフラグが消えてしまう不具合修正。 [ruby-core:34998] [Feature #4347]