From 3fd5f483c19eb3109cead3be412f23bf6a44f36c Mon Sep 17 00:00:00 2001 From: ktsj Date: Sat, 5 Nov 2016 13:15:27 +0000 Subject: * vm_trace.c (tracepoint_attr_callee_id, rb_tracearg_callee_id): add TracePoint#callee_id. [ruby-core:77241] [Feature #12747] * cont.c, eval.c, gc.c, include/ruby/intern.h, insns.def, thread.c, vm.c, vm_backtrace.c, vm_core.h, vm_eval.c, vm_insnhelper.c, vm_trace.c: ditto. * test/ruby/test_settracefunc.rb: tests for above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56593 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- vm_trace.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'vm_trace.c') diff --git a/vm_trace.c b/vm_trace.c index fe14c64918..aca6367b08 100644 --- a/vm_trace.c +++ b/vm_trace.c @@ -616,7 +616,7 @@ call_trace_func(rb_event_flag_t event, VALUE proc, VALUE self, ID id, VALUE klas rb_thread_t *th = GET_THREAD(); if (!klass) { - rb_thread_method_id_and_class(th, &id, &klass); + rb_thread_method_id_and_class(th, &id, 0, &klass); } if (klass) { @@ -781,7 +781,7 @@ fill_id_and_klass(rb_trace_arg_t *trace_arg) { if (!trace_arg->klass_solved) { if (!trace_arg->klass) { - rb_vm_control_frame_id_and_class(trace_arg->cfp, &trace_arg->id, &trace_arg->klass); + rb_vm_control_frame_id_and_class(trace_arg->cfp, &trace_arg->id, &trace_arg->called_id, &trace_arg->klass); } if (trace_arg->klass) { @@ -804,6 +804,13 @@ rb_tracearg_method_id(rb_trace_arg_t *trace_arg) return trace_arg->id ? ID2SYM(trace_arg->id) : Qnil; } +VALUE +rb_tracearg_callee_id(rb_trace_arg_t *trace_arg) +{ + fill_id_and_klass(trace_arg); + return trace_arg->called_id ? ID2SYM(trace_arg->called_id) : Qnil; +} + VALUE rb_tracearg_defined_class(rb_trace_arg_t *trace_arg) { @@ -906,7 +913,7 @@ tracepoint_attr_path(VALUE tpval) } /* - * Return the name of the method being called + * Return the name at the definition of the method being called */ static VALUE tracepoint_attr_method_id(VALUE tpval) @@ -914,6 +921,15 @@ tracepoint_attr_method_id(VALUE tpval) return rb_tracearg_method_id(get_trace_arg()); } +/* + * Return the called name of the method being called + */ +static VALUE +tracepoint_attr_callee_id(VALUE tpval) +{ + return rb_tracearg_callee_id(get_trace_arg()); +} + /* * Return class or module of the method being called. * @@ -1480,6 +1496,7 @@ Init_vm_trace(void) rb_define_method(rb_cTracePoint, "lineno", tracepoint_attr_lineno, 0); rb_define_method(rb_cTracePoint, "path", tracepoint_attr_path, 0); rb_define_method(rb_cTracePoint, "method_id", tracepoint_attr_method_id, 0); + rb_define_method(rb_cTracePoint, "callee_id", tracepoint_attr_callee_id, 0); rb_define_method(rb_cTracePoint, "defined_class", tracepoint_attr_defined_class, 0); rb_define_method(rb_cTracePoint, "binding", tracepoint_attr_binding, 0); rb_define_method(rb_cTracePoint, "self", tracepoint_attr_self, 0); -- cgit v1.2.3