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

ruby-changes:26075

From: ko1 <ko1@a...>
Date: Sun, 2 Dec 2012 02:47:50 +0900 (JST)
Subject: [ruby-changes:26075] ko1:r38132 (trunk): * vm_trace.c: add TracePoint#inspect.

ko1	2012-12-02 02:47:37 +0900 (Sun, 02 Dec 2012)

  New Revision: 38132

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

  Log:
    * vm_trace.c: add TracePoint#inspect.
    * test/ruby/test_settracefunc.rb: add a test for this change.

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

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 38131)
+++ ChangeLog	(revision 38132)
@@ -1,3 +1,9 @@
+Sun Dec  2 02:46:04 2012  Koichi Sasada  <ko1@a...>
+
+	* vm_trace.c: add TracePoint#inspect.
+
+	* test/ruby/test_settracefunc.rb: add a test for this change.
+
 Sat Dec  1 21:18:19 2012  Koichi Sasada  <ko1@a...>
 
 	* test/ruby/test_backtrace.rb: add a test for
Index: vm_trace.c
===================================================================
--- vm_trace.c	(revision 38131)
+++ vm_trace.c	(revision 38132)
@@ -1169,6 +1169,60 @@
     return trace;
 }
 
+/*
+ *  call-seq:
+ *    trace.inspect  -> string
+ *
+ *  Return a string containing a human-readable TracePoint
+ *  status.
+ */
+
+static VALUE
+tracepoint_inspect(VALUE self)
+{
+    rb_tp_t *tp = tpptr(self);
+
+    if (tp->trace_arg) {
+	switch (tp->trace_arg->event) {
+	  case RUBY_EVENT_LINE:
+	  case RUBY_EVENT_SPECIFIED_LINE:
+	    {
+		VALUE sym = rb_tracearg_method_id(tp->trace_arg);
+		if (NIL_P(sym))
+		  goto default_inspect;
+		return rb_sprintf("#<TracePoint:%"PRIsVALUE"@%"PRIsVALUE":%d in `%"PRIsVALUE"'>",
+				  rb_tracearg_event(tp->trace_arg),
+				  rb_tracearg_path(tp->trace_arg),
+				  FIX2INT(rb_tracearg_lineno(tp->trace_arg)),
+				  sym);
+	    }
+	  case RUBY_EVENT_CALL:
+	  case RUBY_EVENT_C_CALL:
+	  case RUBY_EVENT_RETURN:
+	  case RUBY_EVENT_C_RETURN:
+	    return rb_sprintf("#<TracePoint:%"PRIsVALUE" `%"PRIsVALUE"'@%"PRIsVALUE":%d>",
+			      rb_tracearg_event(tp->trace_arg),
+			      rb_tracearg_method_id(tp->trace_arg),
+			      rb_tracearg_path(tp->trace_arg),
+			      FIX2INT(rb_tracearg_lineno(tp->trace_arg)));
+	  case RUBY_EVENT_THREAD_BEGIN:
+	  case RUBY_EVENT_THREAD_END:
+	    return rb_sprintf("#<TracePoint:%"PRIsVALUE" %"PRIsVALUE">",
+			      rb_tracearg_event(tp->trace_arg),
+			      rb_tracearg_self(tp->trace_arg));
+	  default:
+	  default_inspect:
+	    return rb_sprintf("#<TracePoint:%"PRIsVALUE"@%"PRIsVALUE":%d>",
+				  rb_tracearg_event(tp->trace_arg),
+				  rb_tracearg_path(tp->trace_arg),
+				  FIX2INT(rb_tracearg_lineno(tp->trace_arg)));
+	}
+    }
+    else {
+	return rb_sprintf("#<TracePoint:%s>", tp->tracing ? "enabled" : "disabled");
+    }
+}
+
 /* This function is called from inits.c */
 void
 Init_vm_trace(void)
@@ -1226,6 +1280,8 @@
     rb_define_method(rb_cTracePoint, "disable", tracepoint_disable_m, 0);
     rb_define_method(rb_cTracePoint, "enabled?", rb_tracepoint_enabled_p, 0);
 
+    rb_define_method(rb_cTracePoint, "inspect", tracepoint_inspect, 0);
+
     rb_define_method(rb_cTracePoint, "event", tracepoint_attr_event, 0);
     rb_define_method(rb_cTracePoint, "lineno", tracepoint_attr_lineno, 0);
     rb_define_method(rb_cTracePoint, "path", tracepoint_attr_path, 0);
Index: test/ruby/test_settracefunc.rb
===================================================================
--- test/ruby/test_settracefunc.rb	(revision 38131)
+++ test/ruby/test_settracefunc.rb	(revision 38132)
@@ -746,4 +746,29 @@
     assert_equal([created_thread, :thread_end, 0, nil, nil, nil, Thread], events[1])
     assert_equal(2, events.size)
   end
+
+  def test_tracepoint_inspect
+    events = []
+    trace = TracePoint.new{|tp| events << [tp.event, tp.inspect]}
+    assert_equal("#<TracePoint:disabled>", trace.inspect)
+    trace.enable{
+      assert_equal("#<TracePoint:enabled>", trace.inspect)
+      Thread.new{}.join
+    }
+    assert_equal("#<TracePoint:disabled>", trace.inspect)
+    events.each{|(ev, str)|
+      case ev
+      when :line
+        assert_match(/ in /, str)
+      when :call, :c_call
+        assert_match(/call \`/, str) # #<TracePoint:c_call `inherited'@../trunk/test.rb:11>
+      when :return, :c_return
+        assert_match(/return \`/, str) # #<TracePoint:return `m'@../trunk/test.rb:3>
+      when /thread/
+        assert_match(/\#<Thread:/, str) # #<TracePoint:thread_end of #<Thread:0x87076c0>>
+      else
+        assert_match(/\#<TracePoint:/, str)
+      end
+    }
+  end
 end

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

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