Feature #12747 » 0001-TracePoint-method_id-should-return-method_id-not-cal.patch
eval.c | ||
---|---|---|
ID mid = me->called_id;
|
||
rb_vm_pop_frame(th);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, self, mid, klass, Qnil);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, self, me->def->original_id, klass, Qnil);
|
||
setup_exception(th, TAG_RAISE, mesg, cause);
|
||
method.h | ||
---|---|---|
void rb_sweep_method_entry(void *vm);
|
||
const rb_method_entry_t *rb_method_entry_clone(const rb_method_entry_t *me);
|
||
const rb_callable_method_entry_t *rb_method_entry_complement_defined_class(const rb_method_entry_t *src_me, VALUE defined_class);
|
||
const rb_callable_method_entry_t *rb_method_entry_complement_defined_class(const rb_method_entry_t *src_me, ID called_id, VALUE defined_class);
|
||
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);
|
proc.c | ||
---|---|---|
else {
|
||
klass = rb_include_class_new(methclass, klass);
|
||
}
|
||
RB_OBJ_WRITE(method, &bound->me, rb_method_entry_complement_defined_class(bound->me, klass));
|
||
RB_OBJ_WRITE(method, &bound->me, rb_method_entry_complement_defined_class(bound->me, bound->me->called_id, klass));
|
||
}
|
||
return method;
|
test/ruby/test_settracefunc.rb | ||
---|---|---|
}
|
||
assert_equal([
|
||
[:call, :size],
|
||
[:c_call, :original_size],
|
||
[:c_return, :original_size],
|
||
[:c_call, :size],
|
||
[:c_return, :size],
|
||
[:return, :size]
|
||
], events, "should use alias method name for tracing c methods")
|
||
end
|
||
... | ... | |
}.enable{
|
||
p 1
|
||
}
|
||
}, %w[:p :inspect 1], [], '[Bug #9940]')
|
||
}, %w[:p :to_s 1], [], '[Bug #9940]')
|
||
end
|
||
def method_prefix event
|
vm.c | ||
---|---|---|
rb_control_frame_t *cfp = th->cfp;
|
||
const rb_callable_method_entry_t *me = rb_vm_frame_method_entry(cfp);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, cfp->self, me->called_id, me->owner, Qnil);
|
||
RUBY_DTRACE_CMETHOD_RETURN_HOOK(th, me->owner, me->called_id);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, cfp->self, me->def->original_id, me->owner, Qnil); /* TODO */
|
||
RUBY_DTRACE_CMETHOD_RETURN_HOOK(th, me->owner, me->def->original_id);
|
||
vm_pop_frame(th, cfp, cfp->ep);
|
||
}
|
||
... | ... | |
th->cfp->sp + arg_size, iseq->body->local_table_size - arg_size,
|
||
iseq->body->stack_max);
|
||
RUBY_DTRACE_METHOD_ENTRY_HOOK(th, me->owner, me->called_id);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_CALL, self, me->called_id, me->owner, Qnil);
|
||
RUBY_DTRACE_METHOD_ENTRY_HOOK(th, me->owner, me->def->original_id);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_CALL, self, me->def->original_id, me->owner, Qnil);
|
||
ret = vm_exec(th);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_RETURN, self, me->called_id, me->owner, ret);
|
||
RUBY_DTRACE_METHOD_RETURN_HOOK(th, me->owner, me->called_id);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_RETURN, self, me->def->original_id, me->owner, ret);
|
||
RUBY_DTRACE_METHOD_RETURN_HOOK(th, me->owner, me->def->original_id);
|
||
return ret;
|
||
}
|
||
... | ... | |
if (!will_finish_vm_exec) {
|
||
/* kick RUBY_EVENT_RETURN at invoke_block_from_c() for bmethod */
|
||
EXEC_EVENT_HOOK_AND_POP_FRAME(th, RUBY_EVENT_RETURN, th->cfp->self,
|
||
rb_vm_frame_method_entry(th->cfp)->called_id,
|
||
rb_vm_frame_method_entry(th->cfp)->def->original_id,
|
||
rb_vm_frame_method_entry(th->cfp)->owner, Qnil);
|
||
}
|
||
}
|
||
... | ... | |
while (th->cfp->pc == 0 || th->cfp->iseq == 0) {
|
||
if (UNLIKELY(VM_FRAME_TYPE(th->cfp) == VM_FRAME_MAGIC_CFUNC)) {
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, th->cfp->self,
|
||
rb_vm_frame_method_entry(th->cfp)->called_id,
|
||
rb_vm_frame_method_entry(th->cfp)->def->original_id,
|
||
rb_vm_frame_method_entry(th->cfp)->owner, Qnil);
|
||
RUBY_DTRACE_CMETHOD_RETURN_HOOK(th,
|
||
rb_vm_frame_method_entry(th->cfp)->owner,
|
||
rb_vm_frame_method_entry(th->cfp)->called_id);
|
||
rb_vm_frame_method_entry(th->cfp)->def->original_id);
|
||
}
|
||
rb_vm_pop_frame(th);
|
||
}
|
vm_eval.c | ||
---|---|---|
VALUE block_handler = calling->block_handler;
|
||
RUBY_DTRACE_CMETHOD_ENTRY_HOOK(th, me->owner, mid);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_CALL, recv, mid, me->owner, Qnil);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_CALL, recv, me->def->original_id, me->owner, Qnil);
|
||
{
|
||
rb_control_frame_t *reg_cfp = th->cfp;
|
||
... | ... | |
VM_PROFILE_UP(C2C_POPF);
|
||
rb_vm_pop_frame(th);
|
||
}
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, recv, mid, me->owner, val);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, recv, me->def->original_id, me->owner, val);
|
||
RUBY_DTRACE_CMETHOD_RETURN_HOOK(th, me->owner, mid);
|
||
return val;
|
vm_insnhelper.c | ||
---|---|---|
VALUE block_handler = calling->block_handler;
|
||
int argc = calling->argc;
|
||
RUBY_DTRACE_CMETHOD_ENTRY_HOOK(th, me->owner, me->called_id);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_CALL, recv, me->called_id, me->owner, Qundef);
|
||
RUBY_DTRACE_CMETHOD_ENTRY_HOOK(th, me->owner, me->def->original_id);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_CALL, recv, me->def->original_id, me->owner, Qundef);
|
||
vm_push_frame(th, NULL, VM_FRAME_MAGIC_CFUNC | VM_FRAME_FLAG_CFRAME | VM_ENV_FLAG_LOCAL, recv,
|
||
block_handler, (VALUE)me,
|
||
... | ... | |
rb_vm_pop_frame(th);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, recv, me->called_id, me->owner, val);
|
||
RUBY_DTRACE_CMETHOD_RETURN_HOOK(th, me->owner, me->called_id);
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, recv, me->def->original_id, me->owner, val);
|
||
RUBY_DTRACE_CMETHOD_RETURN_HOOK(th, me->owner, me->def->original_id);
|
||
return val;
|
||
}
|
||
... | ... | |
if (orig_me->defined_class == 0) {
|
||
VALUE defined_class = find_defined_class_by_owner(me->defined_class, orig_me->owner);
|
||
VM_ASSERT(RB_TYPE_P(orig_me->owner, T_MODULE));
|
||
cme = rb_method_entry_complement_defined_class(orig_me, defined_class);
|
||
cme = rb_method_entry_complement_defined_class(orig_me, me->called_id, defined_class);
|
||
if (me->def->alias_count + me->def->complemented_count == 0) {
|
||
RB_OBJ_WRITE(me, &me->def->body.alias.original_me, cme);
|
vm_method.c | ||
---|---|---|
}
|
||
const rb_callable_method_entry_t *
|
||
rb_method_entry_complement_defined_class(const rb_method_entry_t *src_me, VALUE defined_class)
|
||
rb_method_entry_complement_defined_class(const rb_method_entry_t *src_me, ID called_id, VALUE defined_class)
|
||
{
|
||
rb_method_entry_t *me = rb_method_entry_alloc(src_me->called_id, src_me->owner, defined_class,
|
||
rb_method_entry_t *me = rb_method_entry_alloc(called_id, src_me->owner, defined_class,
|
||
method_definition_addref_complement(src_me->def));
|
||
METHOD_ENTRY_FLAGS_COPY(me, src_me);
|
||
METHOD_ENTRY_COMPLEMENTED_SET(me);
|
||
... | ... | |
VM_ASSERT(callable_method_entry_p(cme));
|
||
}
|
||
else {
|
||
cme = rb_method_entry_complement_defined_class(me, defined_class);
|
||
cme = rb_method_entry_complement_defined_class(me, me->called_id, defined_class);
|
||
rb_id_table_insert(mtbl, id, (VALUE)cme);
|
||
VM_ASSERT(callable_method_entry_p(cme));
|
||
}
|
||
... | ... | |
const rb_method_entry_t *resolved_me = resolve_refined_method(refinements, (const rb_method_entry_t *)me, &defined_class);
|
||
if (resolved_me && resolved_me->defined_class == 0) {
|
||
return rb_method_entry_complement_defined_class(resolved_me, defined_class);
|
||
return rb_method_entry_complement_defined_class(resolved_me, me->called_id, defined_class);
|
||
}
|
||
else {
|
||
return (const rb_callable_method_entry_t *)resolved_me;
|