[前][次][番号順一覧][スレッド一覧]

ruby-changes:52659

From: ko1 <ko1@a...>
Date: Fri, 28 Sep 2018 12:35:22 +0900 (JST)
Subject: [ruby-changes:52659] ko1:r64871 (trunk): add debug counters more.

ko1	2018-09-28 12:35:15 +0900 (Fri, 28 Sep 2018)

  New Revision: 64871

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=64871

  Log:
    add debug counters more.
    
    * debug_counter.h: add debug counters to count frame state transitions:
      * frame_R2R: Ruby frame to Ruby frame
      * frame_R2C: Ruby frame to C frame
      * frame_C2C: C frame to C frame
      * frame_C2R: C frame to Ruby frame
    
    * vm_insnhelper.c (vm_push_frame): ditto.

  Modified files:
    trunk/debug_counter.h
    trunk/vm_insnhelper.c
Index: debug_counter.h
===================================================================
--- debug_counter.h	(revision 64870)
+++ debug_counter.h	(revision 64871)
@@ -41,6 +41,11 @@ RB_DEBUG_COUNTER(mc_search_super) https://github.com/ruby/ruby/blob/trunk/debug_counter.h#L41
  * control frame push counts.
  *
  * * frame_push: frame push counts.
+ * * frame_push_*: frame push counts per each type.
+ * * frame_R2R: Ruby frame to Ruby frame
+ * * frame_R2C: Ruby frame to C frame
+ * * frame_C2C: C frame to C frame
+ * * frame_C2R: C frame to Ruby frame
  */
 RB_DEBUG_COUNTER(frame_push)
 RB_DEBUG_COUNTER(frame_push_method)
@@ -53,6 +58,11 @@ RB_DEBUG_COUNTER(frame_push_eval) https://github.com/ruby/ruby/blob/trunk/debug_counter.h#L58
 RB_DEBUG_COUNTER(frame_push_rescue)
 RB_DEBUG_COUNTER(frame_push_dummy)
 
+RB_DEBUG_COUNTER(frame_R2R)
+RB_DEBUG_COUNTER(frame_R2C)
+RB_DEBUG_COUNTER(frame_C2C)
+RB_DEBUG_COUNTER(frame_C2R)
+
 /* instance variable counts
  *
  * * ivar_get_ic_hit/miss: ivar_get inline cache (ic) hit/miss counts (VM insn)
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 64870)
+++ vm_insnhelper.c	(revision 64871)
@@ -214,21 +214,6 @@ vm_push_frame(rb_execution_context_t *ec https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L214
     rb_control_frame_t *const cfp = ec->cfp - 1;
     int i;
 
-#if USE_DEBUG_COUNTER
-    RB_DEBUG_COUNTER_INC(frame_push);
-    switch (type & VM_FRAME_MAGIC_MASK) {
-      case VM_FRAME_MAGIC_METHOD: RB_DEBUG_COUNTER_INC(frame_push_method); break;
-      case VM_FRAME_MAGIC_BLOCK:  RB_DEBUG_COUNTER_INC(frame_push_block);  break;
-      case VM_FRAME_MAGIC_CLASS:  RB_DEBUG_COUNTER_INC(frame_push_class);  break;
-      case VM_FRAME_MAGIC_TOP:    RB_DEBUG_COUNTER_INC(frame_push_top);    break;
-      case VM_FRAME_MAGIC_CFUNC:  RB_DEBUG_COUNTER_INC(frame_push_cfunc);  break;
-      case VM_FRAME_MAGIC_IFUNC:  RB_DEBUG_COUNTER_INC(frame_push_ifunc);  break;
-      case VM_FRAME_MAGIC_EVAL:   RB_DEBUG_COUNTER_INC(frame_push_eval);   break;
-      case VM_FRAME_MAGIC_RESCUE: RB_DEBUG_COUNTER_INC(frame_push_rescue); break;
-      case VM_FRAME_MAGIC_DUMMY:  RB_DEBUG_COUNTER_INC(frame_push_dummy);  break;
-      default: rb_bug("unreachable");
-    }
-#endif
     vm_check_frame(type, specval, cref_or_me, iseq);
     VM_ASSERT(local_size >= 0);
 
@@ -270,6 +255,33 @@ vm_push_frame(rb_execution_context_t *ec https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L255
 	SDR();
     }
 
+#if USE_DEBUG_COUNTER
+    RB_DEBUG_COUNTER_INC(frame_push);
+    switch (type & VM_FRAME_MAGIC_MASK) {
+      case VM_FRAME_MAGIC_METHOD: RB_DEBUG_COUNTER_INC(frame_push_method); break;
+      case VM_FRAME_MAGIC_BLOCK:  RB_DEBUG_COUNTER_INC(frame_push_block);  break;
+      case VM_FRAME_MAGIC_CLASS:  RB_DEBUG_COUNTER_INC(frame_push_class);  break;
+      case VM_FRAME_MAGIC_TOP:    RB_DEBUG_COUNTER_INC(frame_push_top);    break;
+      case VM_FRAME_MAGIC_CFUNC:  RB_DEBUG_COUNTER_INC(frame_push_cfunc);  break;
+      case VM_FRAME_MAGIC_IFUNC:  RB_DEBUG_COUNTER_INC(frame_push_ifunc);  break;
+      case VM_FRAME_MAGIC_EVAL:   RB_DEBUG_COUNTER_INC(frame_push_eval);   break;
+      case VM_FRAME_MAGIC_RESCUE: RB_DEBUG_COUNTER_INC(frame_push_rescue); break;
+      case VM_FRAME_MAGIC_DUMMY:  RB_DEBUG_COUNTER_INC(frame_push_dummy);  break;
+      default: rb_bug("unreachable");
+    }
+    {
+        rb_control_frame_t *prev_cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
+        int cur_ruby_frame = VM_FRAME_RUBYFRAME_P(cfp);
+        int pre_ruby_frame = VM_FRAME_RUBYFRAME_P(prev_cfp);
+        if (RUBY_VM_END_CONTROL_FRAME(ec) != prev_cfp) {
+            pre_ruby_frame ? (cur_ruby_frame ? RB_DEBUG_COUNTER_INC(frame_R2R) :
+                                               RB_DEBUG_COUNTER_INC(frame_R2C)):
+                             (cur_ruby_frame ? RB_DEBUG_COUNTER_INC(frame_C2R) :
+                                               RB_DEBUG_COUNTER_INC(frame_C2C));
+        }
+    }
+#endif
+
     return cfp;
 }
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]