summaryrefslogtreecommitdiff
path: root/vm_trace.c
diff options
context:
space:
mode:
authorktsj <ktsj@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-11-05 13:15:27 +0000
committerktsj <ktsj@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-11-05 13:15:27 +0000
commit9cbd6ee09770be3d73a17ab1195a094c59c9f9ee (patch)
tree57a7c963e85078a2ff5e00ce206d86acee046857 /vm_trace.c
parent8004ad33bcdb7b5bec3f7f077d386563fbcda76a (diff)
* 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
Diffstat (limited to 'vm_trace.c')
-rw-r--r--vm_trace.c23
1 files changed, 20 insertions, 3 deletions
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) {
@@ -805,6 +805,13 @@ rb_tracearg_method_id(rb_trace_arg_t *trace_arg)
}
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)
{
fill_id_and_klass(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)
@@ -915,6 +922,15 @@ tracepoint_attr_method_id(VALUE tpval)
}
/*
+ * 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.
*
* class C; def foo; end; end
@@ -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);