aboutsummaryrefslogtreecommitdiffstats
path: root/vm_insnhelper.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-09-28 03:35:15 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-09-28 03:35:15 +0000
commitb27a3bfecefc70fb6e81eb9c14bd1929c0abff00 (patch)
treeb6aea9d677d54eaa4fbedeb77faa61284e4f5304 /vm_insnhelper.c
parent5451f72706e1778a76c98c8b78dca5b8e08fca50 (diff)
downloadruby-b27a3bfecefc70fb6e81eb9c14bd1929c0abff00.tar.gz
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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64871 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r--vm_insnhelper.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 54940ea2e3..37c5d3dab0 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -214,21 +214,6 @@ vm_push_frame(rb_execution_context_t *ec,
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,
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;
}