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: