1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* vm_trace.c: Documentation for TracePoint API

[ruby-core:47243] [Feature #6895]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38045 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
zzak 2012-11-30 09:25:24 +00:00
parent 020cc0ad5c
commit f2fee84466
2 changed files with 161 additions and 1 deletions

View file

@ -1,3 +1,8 @@
Fri Nov 30 18:24:00 2012 Zachary Scott <zachary@zacharyscott.net>
* vm_trace.c: Documentation for TracePoint API
[ruby-core:47243] [Feature #6895]
Fri Nov 30 17:43:50 2012 Nobuyoshi Nakada <nobu@ruby-lang.org> Fri Nov 30 17:43:50 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* string.c (rb_str_cmp_m): try to compare with to_str result if * string.c (rb_str_cmp_m): try to compare with to_str result if

View file

@ -785,6 +785,11 @@ rb_tracearg_raised_exception(rb_trace_arg_t *trace_arg)
return trace_arg->data; return trace_arg->data;
} }
/*
* Type of event
*
* See TracePoint.new for events
*/
static VALUE static VALUE
tracepoint_attr_event(VALUE tpval) tracepoint_attr_event(VALUE tpval)
{ {
@ -793,6 +798,9 @@ tracepoint_attr_event(VALUE tpval)
return rb_tracearg_event(tp->trace_arg); return rb_tracearg_event(tp->trace_arg);
} }
/*
* Line number of the event
*/
static VALUE static VALUE
tracepoint_attr_lineno(VALUE tpval) tracepoint_attr_lineno(VALUE tpval)
{ {
@ -801,6 +809,9 @@ tracepoint_attr_lineno(VALUE tpval)
return rb_tracearg_lineno(tp->trace_arg); return rb_tracearg_lineno(tp->trace_arg);
} }
/*
* Path of the file being run
*/
static VALUE static VALUE
tracepoint_attr_path(VALUE tpval) tracepoint_attr_path(VALUE tpval)
{ {
@ -809,6 +820,9 @@ tracepoint_attr_path(VALUE tpval)
return rb_tracearg_path(tp->trace_arg); return rb_tracearg_path(tp->trace_arg);
} }
/*
* Return the name of the method being called
*/
static VALUE static VALUE
tracepoint_attr_method_id(VALUE tpval) tracepoint_attr_method_id(VALUE tpval)
{ {
@ -817,6 +831,9 @@ tracepoint_attr_method_id(VALUE tpval)
return rb_tracearg_method_id(tp->trace_arg); return rb_tracearg_method_id(tp->trace_arg);
} }
/*
* Return class or id from +:class+ event
*/
static VALUE static VALUE
tracepoint_attr_defined_class(VALUE tpval) tracepoint_attr_defined_class(VALUE tpval)
{ {
@ -825,6 +842,9 @@ tracepoint_attr_defined_class(VALUE tpval)
return rb_tracearg_defined_class(tp->trace_arg); return rb_tracearg_defined_class(tp->trace_arg);
} }
/*
* Return the generated binding object from event
*/
static VALUE static VALUE
tracepoint_attr_binding(VALUE tpval) tracepoint_attr_binding(VALUE tpval)
{ {
@ -833,6 +853,12 @@ tracepoint_attr_binding(VALUE tpval)
return rb_tracearg_binding(tp->trace_arg); return rb_tracearg_binding(tp->trace_arg);
} }
/*
* Return the trace object during event
*
* Same as TracePoint#binding:
* trace.binding.eval('self')
*/
static VALUE static VALUE
tracepoint_attr_self(VALUE tpval) tracepoint_attr_self(VALUE tpval)
{ {
@ -841,6 +867,9 @@ tracepoint_attr_self(VALUE tpval)
return rb_tracearg_self(tp->trace_arg); return rb_tracearg_self(tp->trace_arg);
} }
/*
* Return value from +:return+ and +c_return+ event
*/
static VALUE static VALUE
tracepoint_attr_return_value(VALUE tpval) tracepoint_attr_return_value(VALUE tpval)
{ {
@ -849,6 +878,9 @@ tracepoint_attr_return_value(VALUE tpval)
return rb_tracearg_return_value(tp->trace_arg); return rb_tracearg_return_value(tp->trace_arg);
} }
/*
* Value from exception raised on the +:raise+ event
*/
static VALUE static VALUE
tracepoint_attr_raised_exception(VALUE tpval) tracepoint_attr_raised_exception(VALUE tpval)
{ {
@ -916,6 +948,21 @@ rb_tracepoint_disable(VALUE tpval)
return Qundef; return Qundef;
} }
/*
* call-seq:
* trace.enable -> trace
* trace.enable { |obj| block } -> obj
*
* Activates the trace
*
* Will raise a RuntimeError if the trace is already activated
*
* trace.enabled? #=> false
* trace.enable #=> #<TracePoint:0x007fa3fad4aaa8>
* trace.enabled? #=> true
* trace.enable #=> RuntimeError
*
*/
static VALUE static VALUE
tracepoint_enable_m(VALUE tpval) tracepoint_enable_m(VALUE tpval)
{ {
@ -934,6 +981,21 @@ tracepoint_enable_m(VALUE tpval)
} }
} }
/*
* call-seq:
* trace.disable -> trace
* trace.disable { |obj| block } -> obj
*
* Deactivates the trace
*
* Will raise a RuntimeError if the trace is already deactivated
*
* trace.enabled? #=> true
* trace.disable #=> #<TracePoint:0x007fa3fad4aaa8>
* trace.enabled? #=> false
* trace.disable #=> RuntimeError
*
*/
static VALUE static VALUE
tracepoint_disable_m(VALUE tpval) tracepoint_disable_m(VALUE tpval)
{ {
@ -952,6 +1014,12 @@ tracepoint_disable_m(VALUE tpval)
} }
} }
/*
* call-seq:
* trace.enabled? -> true or false
*
* The current status of the trace
*/
VALUE VALUE
rb_tracepoint_enabled_p(VALUE tpval) rb_tracepoint_enabled_p(VALUE tpval)
{ {
@ -985,6 +1053,56 @@ rb_tracepoint_new(VALUE target_thread, rb_event_flag_t events, void (*func)(VALU
return tracepoint_new(rb_cTracePoint, target_th, events, func, data, Qundef); return tracepoint_new(rb_cTracePoint, target_th, events, func, data, Qundef);
} }
/*
* call-seq:
* TracePoint.new(*events) { |obj| block } -> obj
*
* Returns a new TracePoint object, not enabled by default.
*
* Next, in order to activate the trace, you must use TracePoint.enable
*
* trace = TracePoint.new(:call) do |tp|
* p [tp.lineno, tp.defined_class, tp.method_id, tp.event]
* end
* #=> #<TracePoint:0x007f17372cdb20>
*
* trace.enable
* #=> #<TracePoint:0x007f17372cdb20>
*
* puts "Hello, TracePoint!"
* # ...
* # [48, IRB::Notifier::AbstractNotifier, :printf, :call]
* # ...
*
* When you want to deactivate the trace, you must use TracePoint.disable
*
* trace.disable
*
* To filter what is traced, you can pass any of the following as +events+:
*
* +:line+:: execute code on a new line
* +:class+:: start a class or module definition
* +:end+:: finish a class or module definition
* +:call+:: call a Ruby method
* +:return+:: return from a Ruby method
* +:c_call+:: call a C-language routine
* +:c_return+:: return from a C-language routine
* +:raise+:: raise an exception
* +:b_call+:: event hook at block entry
* +:b_return+:: event hook at block ending
* +:thread_begin+:: event hook at thread beginning
* +:thread_end+:: event hook at thread ending
*
* A block must be given, otherwise a ThreadError is raised.
*
* If the trace method isn't included in the given events filter, a
* RuntimeError is raised.
*
* TracePoint.trace(:line) do |tp|
* p tp.raised_exception
* end
* #=> RuntimeError: 'raised_exception' not supported by this event
*/
static VALUE static VALUE
tracepoint_new_s(int argc, VALUE *argv, VALUE self) tracepoint_new_s(int argc, VALUE *argv, VALUE self)
{ {
@ -1024,11 +1142,48 @@ Init_vm_trace(void)
rb_define_method(rb_cThread, "set_trace_func", thread_set_trace_func_m, 1); rb_define_method(rb_cThread, "set_trace_func", thread_set_trace_func_m, 1);
rb_define_method(rb_cThread, "add_trace_func", thread_add_trace_func_m, 1); rb_define_method(rb_cThread, "add_trace_func", thread_add_trace_func_m, 1);
/* TracePoint */ /*
* Document-class: TracePoint
*
* A class that provides the functionality of Kernel#set_trace_func in a
* nice Object-Oriented API.
*
* = Example
*
* We can use TracePoint to gather information specifically for exceptions:
*
* trace = TracePoint.new(:raise) do |tp|
* p [tp.lineno, tp.event, tp.raised_exception]
* end
* #=> #<TracePoint:0x007f786a452448>
*
* trace.enable
* #=> #<TracePoint:0x007f786a452448>
*
* 0 / 0
* #=> [5, :raise, #<ZeroDivisionError: divided by 0>]
*
* See TracePoint.new for possible events.
*
*/
rb_cTracePoint = rb_define_class("TracePoint", rb_cObject); rb_cTracePoint = rb_define_class("TracePoint", rb_cObject);
rb_undef_alloc_func(rb_cTracePoint); rb_undef_alloc_func(rb_cTracePoint);
rb_undef_method(CLASS_OF(rb_cTracePoint), "new"); rb_undef_method(CLASS_OF(rb_cTracePoint), "new");
rb_define_singleton_method(rb_cTracePoint, "new", tracepoint_new_s, -1); rb_define_singleton_method(rb_cTracePoint, "new", tracepoint_new_s, -1);
/*
* Document-method: trace
*
* call-seq:
* TracePoint.trace(*events) { |obj| block } -> obj
*
* A convenience method for TracePoint.new, that activates the trace
* automatically.
*
* trace = TracePoint.trace(:call) { |tp| [tp.lineno, tp.event] }
* #=> #<TracePoint:0x007f786a452448>
*
* trace.enabled? #=> true
*/
rb_define_singleton_method(rb_cTracePoint, "trace", tracepoint_trace_s, -1); rb_define_singleton_method(rb_cTracePoint, "trace", tracepoint_trace_s, -1);
rb_define_method(rb_cTracePoint, "enable", tracepoint_enable_m, 0); rb_define_method(rb_cTracePoint, "enable", tracepoint_enable_m, 0);