summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debug_counter.h10
-rw-r--r--vm_insnhelper.c5
2 files changed, 15 insertions, 0 deletions
diff --git a/debug_counter.h b/debug_counter.h
index cb2222a869..35ffe08c8d 100644
--- a/debug_counter.h
+++ b/debug_counter.h
@@ -26,6 +26,11 @@
* * mc_cme_complement: callable_method_entry complement counts.
* * mc_cme_complement_hit: callable_method_entry cache hit counts.
* * mc_search_super: search_method() call counts.
+ * * mc_miss_by_nome: inline mc miss by no ment.
+ * * mc_miss_by_distinct: ... by distinct ment.
+ * * mc_miss_by_refine: ... by ment being refined.
+ * * mc_miss_by_visi: ... by visibility change.
+ * * mc_miss_spurious: spurious inline mc misshit.
*/
RB_DEBUG_COUNTER(mc_inline_hit)
RB_DEBUG_COUNTER(mc_inline_miss)
@@ -36,6 +41,11 @@ RB_DEBUG_COUNTER(mc_class_serial_miss)
RB_DEBUG_COUNTER(mc_cme_complement)
RB_DEBUG_COUNTER(mc_cme_complement_hit)
RB_DEBUG_COUNTER(mc_search_super)
+RB_DEBUG_COUNTER(mc_miss_by_nome)
+RB_DEBUG_COUNTER(mc_miss_by_distinct)
+RB_DEBUG_COUNTER(mc_miss_by_refine)
+RB_DEBUG_COUNTER(mc_miss_by_visi)
+RB_DEBUG_COUNTER(mc_miss_spurious)
/*
* call cache fastpath usage
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 127c8c3f9e..f9c825c272 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1386,12 +1386,15 @@ static inline vm_call_handler
calccall(const struct rb_call_info *ci, const struct rb_call_cache *cc, const rb_callable_method_entry_t *me)
{
if (UNLIKELY(!me)) {
+ RB_DEBUG_COUNTER_INC(mc_miss_by_nome);
return vm_call_general; /* vm_call_method_nome() situation */
}
else if (LIKELY(cc->me != me)) {
+ RB_DEBUG_COUNTER_INC(mc_miss_by_distinct);
return vm_call_general; /* normal cases */
}
else if (UNLIKELY(cc->def != me->def)) {
+ RB_DEBUG_COUNTER_INC(mc_miss_by_refine);
return vm_call_general; /* cc->me was refined elsewhere */
}
/* "Calling a formerly-public method, which is now privatised, with an
@@ -1400,9 +1403,11 @@ calccall(const struct rb_call_info *ci, const struct rb_call_cache *cc, const rb
* Calling a private method without specifying a receiver is also safe. */
else if ((METHOD_ENTRY_VISI(cc->me) != METHOD_VISI_PUBLIC) &&
!(ci->flag & VM_CALL_FCALL)) {
+ RB_DEBUG_COUNTER_INC(mc_miss_by_visi);
return vm_call_general;
}
else {
+ RB_DEBUG_COUNTER_INC(mc_miss_spurious);
return cc->call;
}
}