summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debug_counter.h5
-rw-r--r--gc.c6
2 files changed, 11 insertions, 0 deletions
diff --git a/debug_counter.h b/debug_counter.h
index faf876a8c4..83ae701524 100644
--- a/debug_counter.h
+++ b/debug_counter.h
@@ -143,6 +143,11 @@ RB_DEBUG_COUNTER(gc_major_shady)
RB_DEBUG_COUNTER(gc_major_force)
RB_DEBUG_COUNTER(gc_major_oldmalloc)
+RB_DEBUG_COUNTER(gc_isptr_trial)
+RB_DEBUG_COUNTER(gc_isptr_range)
+RB_DEBUG_COUNTER(gc_isptr_align)
+RB_DEBUG_COUNTER(gc_isptr_maybe)
+
/* object allocation counts:
*
* * obj_newobj: newobj counts
diff --git a/gc.c b/gc.c
index cf3bb3fac2..5bd0cf75b6 100644
--- a/gc.c
+++ b/gc.c
@@ -2191,8 +2191,13 @@ is_pointer_to_heap(rb_objspace_t *objspace, void *ptr)
register struct heap_page *page;
register size_t hi, lo, mid;
+ RB_DEBUG_COUNTER_INC(gc_isptr_trial);
+
if (p < heap_pages_lomem || p > heap_pages_himem) return FALSE;
+ RB_DEBUG_COUNTER_INC(gc_isptr_range);
+
if ((VALUE)p % sizeof(RVALUE) != 0) return FALSE;
+ RB_DEBUG_COUNTER_INC(gc_isptr_align);
/* check if p looks like a pointer using bsearch*/
lo = 0;
@@ -2202,6 +2207,7 @@ is_pointer_to_heap(rb_objspace_t *objspace, void *ptr)
page = heap_pages_sorted[mid];
if (page->start <= p) {
if (p < page->start + page->total_slots) {
+ RB_DEBUG_COUNTER_INC(gc_isptr_maybe);
return TRUE;
}
lo = mid + 1;