summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-06-03 05:10:41 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-06-03 05:10:41 +0000
commitcd0fec37281a72d402981894b764d27ab7d1fb39 ()
tree7798f0f28cbf31b54fd44887585c878c35277a76
parent25d1891899be492dc64bb6852741d4f112feba64 (diff)
Add TracePoint#parameters
It can be used to get the parameters' information of method and block. There was no way to get block parameters. It was possible but ineffective to get method parameters via Method object: `tp.defined_class.method(tp.method_id).parameters` TracePoint#parameters allows us to get the information easily. [Feature #14694] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63562 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--method.h2
-rw-r--r--proc.c8
-rw-r--r--spec/ruby/core/tracepoint/parameters_spec.rb21
-rw-r--r--test/ruby/test_settracefunc.rb39
-rw-r--r--vm_trace.c49
5 files changed, 115 insertions, 4 deletions
@@ -218,4 +218,6 @@ void rb_method_entry_copy(rb_method_entry_t *dst, const rb_method_entry_t *src);
void rb_scope_visibility_set(rb_method_visibility_t);
#endif /* RUBY_METHOD_H */
@@ -1148,8 +1148,8 @@ rb_proc_location(VALUE self)
return iseq_location(rb_proc_get_iseq(self, 0));
}
-static VALUE
-unnamed_parameters(int arity)
{
VALUE a, param = rb_ary_new2((arity < 0) ? -arity : arity);
int n = (arity < 0) ? ~arity : arity;
@@ -1183,7 +1183,7 @@ rb_proc_parameters(VALUE self)
int is_proc;
const rb_iseq_t *iseq = rb_proc_get_iseq(self, &is_proc);
if (!iseq) {
- return unnamed_parameters(rb_proc_arity(self));
}
return rb_iseq_parameters(iseq, is_proc);
}
@@ -2567,7 +2567,7 @@ rb_method_parameters(VALUE method)
{
const rb_iseq_t *iseq = rb_method_iseq(method);
if (!iseq) {
- return unnamed_parameters(method_arity(method));
}
return rb_iseq_parameters(iseq, 0);
}
@@ -0,0 +1,21 @@
@@ -703,6 +703,45 @@ class TestSetTraceFunc < Test::Unit::TestCase
assert_equal(false, trace.enabled?)
end
def method_test_tracepoint_return_value obj
obj
end
@@ -805,6 +805,45 @@ fill_id_and_klass(rb_trace_arg_t *trace_arg)
}
VALUE
rb_tracearg_method_id(rb_trace_arg_t *trace_arg)
{
fill_id_and_klass(trace_arg);
@@ -920,6 +959,15 @@ tracepoint_attr_path(VALUE tpval)
}
/*
* Return the name at the definition of the method being called
*/
static VALUE
@@ -1502,6 +1550,7 @@ Init_vm_trace(void)
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);
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);