Project

General

Profile

Bug #10470

Updated by nobu (Nobuyoshi Nakada) over 9 years ago

TracePointを利用して`attr_accessor`で定義したメソッドの`:c_call`, `:c_return`イベントを取得することができません。 TracePointを利用してattr_accessorで定義したメソッドの:c_call, :c_returnイベントを取得することができません。 

 ```ruby 
 class Foo 
   attr_accessor :hoge 

   def bar 
     @bar 
   end 

   def initialize(val) 
     @bar = val 
   end 
 end 

 foo = Foo.new("FOO") 

 trace = TracePoint.new(:return, :c_return) do |tp| 
   p [tp.lineno, tp.defined_class, tp.method_id, tp.event, tp.binding, tp.return_value] 
 end 

 trace.enable do 
   foo.bar 
   foo.hoge = "hoge" 
   foo.hoge 
 end 
 ``` 

 上記のコードを実行した時、attr_accessorで定義した`hoge`メソッドのイベントが発生しません。 上記のコードを実行した時、attr_accessorで定義したhogeメソッドのイベントが発生しません。 
 調査した所、`EXEC_EVENT_HOOK`の呼び出し自体が無いようです。 調査した所、EXEC_EVENT_HOOKの呼び出し自体が無いようです。 
 このため、例えばpower_assertを利用した時にアクセサメソッドの戻り値を取得できない等の問題が発生します。 

 attributeの読み書きを行う処理の中に`EXEC_EVENT_HOOK`を呼び出す簡単なパッチを書きましたので、添付します。 attributeの読み書きを行う処理の中にEXEC_EVENT_HOOKを呼び出す簡単なパッチを書きましたので、添付します。

Back