On Jun 17, 2005, at 3:34 AM, nobu.nokada / softhome.net wrote: > Hi, > > At Fri, 17 Jun 2005 19:12:43 +0900, > Shugo Maeda wrote in [ruby-core:05235]: > >> --- add_event_hook_weirdness.rb.orig 2005-06-17 >> 19:10:25.055358488 +0900 >> +++ add_event_hook_weirdness.rb 2005-06-17 19:10:43.776512440 +0900 >> @@ -579,6 +579,14 @@ >> { >> VALUE signature; >> >> + if (klass) { >> + if (TYPE(klass) == T_ICLASS) { >> + klass = RBASIC(klass)->klass; >> + } >> + else if (FL_TEST(klass, FL_SINGLETON)) { >> + klass = self; >> + } >> + } >> signature = rb_ary_new2(2); >> rb_ary_store(signature, 0, klass); >> rb_ary_store(signature, 1, ID2SYM(mid)); >> >> >> Maybe, EXEC_EVENT_HOOK() should do this. >> > > Or rb_call() should rather? Is this suitable and appropriate? (made against ruby_1_8, not HEAD) *** eval.c 16 Jun 2005 22:41:10 -0700 1.616.2.101 --- eval.c 17 Jun 2005 08:54:38 -0700 *************** *** 5591,5596 **** --- 5591,5608 ---- int itr; static int tick; TMP_PROTECT; + VALUE event_hook_klass = klass; + + if (event_hook_klass) { + if (TYPE(event_hook_klass) == T_ICLASS) { + event_hook_klass = RBASIC(event_hook_klass)->klass; + } + else if (FL_TEST(event_hook_klass, FL_SINGLETON)) { + event_hook_klass = (VALUE)ruby_current_node; + } + } + + switch (ruby_iter->iter) { case ITER_PRE: *************** *** 5630,5636 **** int state; EXEC_EVENT_HOOK(RUBY_EVENT_C_CALL, ruby_current_node, ! recv, id, klass); PUSH_TAG(PROT_FUNC); if ((state = EXEC_TAG()) == 0) { result = call_cfunc(body->nd_cfnc, recv, len, argc, argv); --- 5642,5648 ---- int state; EXEC_EVENT_HOOK(RUBY_EVENT_C_CALL, ruby_current_node, ! recv, id, event_hook_klass); PUSH_TAG(PROT_FUNC); if ((state = EXEC_TAG()) == 0) { result = call_cfunc(body->nd_cfnc, recv, len, argc, argv); *************** *** 5638,5644 **** POP_TAG(); ruby_current_node = ruby_frame->node; EXEC_EVENT_HOOK(RUBY_EVENT_C_RETURN, ruby_current_node, ! recv, id, klass); if (state) JUMP_TAG(state); } else { --- 5650,5656 ---- POP_TAG(); ruby_current_node = ruby_frame->node; EXEC_EVENT_HOOK(RUBY_EVENT_C_RETURN, ruby_current_node, ! recv, id, event_hook_klass); if (state) JUMP_TAG(state); } else { *************** *** 5768,5774 **** } if (event_hooks) { ! EXEC_EVENT_HOOK(RUBY_EVENT_CALL, b2, recv, id, klass); } result = rb_eval(recv, body); } --- 5780,5786 ---- } if (event_hooks) { ! EXEC_EVENT_HOOK(RUBY_EVENT_CALL, b2, recv, id, event_hook_klass); } result = rb_eval(recv, body); } *************** *** 5782,5788 **** POP_SCOPE(); ruby_cref = saved_cref; if (event_hooks) { ! EXEC_EVENT_HOOK(RUBY_EVENT_RETURN, body, recv, id, klass); } switch (state) { case 0: --- 5794,5800 ---- POP_SCOPE(); ruby_cref = saved_cref; if (event_hooks) { ! EXEC_EVENT_HOOK(RUBY_EVENT_RETURN, body, recv, id, event_hook_klass); } switch (state) { case 0: