[前][次][番号順一覧][スレッド一覧]

ruby-changes:20286

From: ko1 <ko1@a...>
Date: Thu, 30 Jun 2011 22:35:02 +0900 (JST)
Subject: [ruby-changes:20286] ko1:r32334 (trunk): * vm_insnhelper.c (vm_call_bmethod): fix to hook call/return event

ko1	2011-06-30 22:34:53 +0900 (Thu, 30 Jun 2011)

  New Revision: 32334

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32334

  Log:
    * vm_insnhelper.c (vm_call_bmethod): fix to hook call/return event
      for methods defined by define_method().
    * thread.c (call_trace_proc): Fix to skip if class is not given (0).
      Note that ID and Class object are passed for call/return event
      if the called method was defined by define_method().
      If you are author of tracer/profiler/debugger, this may be an
      important change.  You should check passed class as zero or
      non-zero instead of checking the event type.
    * test/ruby/test_settracefunc.rb: add a test for above.

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_settracefunc.rb
    trunk/thread.c
    trunk/vm_insnhelper.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32333)
+++ ChangeLog	(revision 32334)
@@ -1,3 +1,17 @@
+Thu Jun 30 22:17:04 2011  Koichi Sasada  <ko1@a...>
+
+	* vm_insnhelper.c (vm_call_bmethod): fix to hook call/return event
+	  for methods defined by define_method().
+
+	* thread.c (call_trace_proc): Fix to skip if class is not given (0).
+	  Note that ID and Class object are passed for call/return event
+	  if the called method was defined by define_method().
+	  If you are author of tracer/profiler/debugger, this may be an
+	  important change.  You should check passed class as zero or
+	  non-zero instead of checking the event type.
+
+	* test/ruby/test_settracefunc.rb: add a test for above.
+
 Thu Jun 30 21:18:35 2011  Yutaka Kanemoto  <kanemoto@r...>
 
 	* configure.in: Add warnflags for XL/C on AIX during configure
Index: thread.c
===================================================================
--- thread.c	(revision 32333)
+++ thread.c	(revision 32334)
@@ -4447,8 +4447,7 @@
     ID id = 0;
     VALUE klass = 0;
 
-    if (p->event == RUBY_EVENT_C_CALL ||
-	p->event == RUBY_EVENT_C_RETURN) {
+    if (p->klass != 0) {
 	id = p->id;
 	klass = p->klass;
     }
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 32333)
+++ vm_insnhelper.c	(revision 32334)
@@ -421,11 +421,15 @@
     rb_proc_t *proc;
     VALUE val;
 
+    EXEC_EVENT_HOOK(th, RUBY_EVENT_CALL, recv, me->called_id, me->klass);
+
     /* control block frame */
     th->passed_me = me;
-
     GetProcPtr(me->def->body.proc, proc);
     val = rb_vm_invoke_proc(th, proc, recv, argc, argv, blockptr);
+
+    EXEC_EVENT_HOOK(th, RUBY_EVENT_RETURN, recv, me->called_id, me->klass);
+
     return val;
 }
 
Index: test/ruby/test_settracefunc.rb
===================================================================
--- test/ruby/test_settracefunc.rb	(revision 32333)
+++ test/ruby/test_settracefunc.rb	(revision 32334)
@@ -355,6 +355,28 @@
     assert_equal([], events[:add])
   end
 
+  def test_trace_defined_method
+    events = []
+    eval <<-EOF.gsub(/^.*?: /, "")
+     1: class FooBar; define_method(:foobar){}; end
+     2: fb = FooBar.new
+     3: set_trace_func(Proc.new { |event, file, lineno, mid, binding, klass|
+     4:   events << [event, lineno, mid, klass]
+     5: })
+     6: fb.foobar
+     7: set_trace_func(nil)
+    EOF
+
+    [["c-return", 5, :set_trace_func, Kernel],
+     ["line", 6, __method__, self.class],
+     ["call", 6, :foobar, FooBar],
+     ["return", 6, :foobar, FooBar],
+     ["line", 7, __method__, self.class],
+     ["c-call", 7, :set_trace_func, Kernel]].each{|e|
+      assert_equal(e, events.shift)
+    }
+  end
+
   def test_remove_in_trace
     bug3921 = '[ruby-dev:42350]'
     ok = false

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]