summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debug_counter.h7
-rw-r--r--gc.c41
2 files changed, 36 insertions, 12 deletions
diff --git a/debug_counter.h b/debug_counter.h
index 3ca784456a..ef35c55e6e 100644
--- a/debug_counter.h
+++ b/debug_counter.h
@@ -217,9 +217,14 @@ RB_DEBUG_COUNTER(obj_ary_shared)
RB_DEBUG_COUNTER(obj_ary_shared_root_occupied)
RB_DEBUG_COUNTER(obj_hash_empty)
-RB_DEBUG_COUNTER(obj_hash_1_4)
+RB_DEBUG_COUNTER(obj_hash_1)
+RB_DEBUG_COUNTER(obj_hash_2)
+RB_DEBUG_COUNTER(obj_hash_3)
+RB_DEBUG_COUNTER(obj_hash_4)
RB_DEBUG_COUNTER(obj_hash_5_8)
RB_DEBUG_COUNTER(obj_hash_g8)
+
+RB_DEBUG_COUNTER(obj_hash_null)
RB_DEBUG_COUNTER(obj_hash_ar)
RB_DEBUG_COUNTER(obj_hash_st)
RB_DEBUG_COUNTER(obj_hash_transient)
diff --git a/gc.c b/gc.c
index fb8fa53911..3684133323 100644
--- a/gc.c
+++ b/gc.c
@@ -2448,21 +2448,40 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
break;
case T_HASH:
#if USE_DEBUG_COUNTER
- if (RHASH_SIZE(obj) > 8) {
- RB_DEBUG_COUNTER_INC(obj_hash_g8);
- }
- else if (RHASH_SIZE(obj) > 4) {
- RB_DEBUG_COUNTER_INC(obj_hash_5_8);
- }
- else if (RHASH_SIZE(obj) > 0) {
- RB_DEBUG_COUNTER_INC(obj_hash_1_4);
- }
- else {
+ switch RHASH_SIZE(obj) {
+ case 0:
RB_DEBUG_COUNTER_INC(obj_hash_empty);
+ break;
+ case 1:
+ RB_DEBUG_COUNTER_INC(obj_hash_1);
+ break;
+ case 2:
+ RB_DEBUG_COUNTER_INC(obj_hash_2);
+ break;
+ case 3:
+ RB_DEBUG_COUNTER_INC(obj_hash_3);
+ break;
+ case 4:
+ RB_DEBUG_COUNTER_INC(obj_hash_4);
+ break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ RB_DEBUG_COUNTER_INC(obj_hash_5_8);
+ break;
+ default:
+ GC_ASSERT(RHASH_SIZE(obj) > 8);
+ RB_DEBUG_COUNTER_INC(obj_hash_g8);
}
if (RHASH_AR_TABLE_P(obj)) {
- RB_DEBUG_COUNTER_INC(obj_hash_ar);
+ if (RHASH_AR_TABLE(obj) == NULL) {
+ RB_DEBUG_COUNTER_INC(obj_hash_null);
+ }
+ else {
+ RB_DEBUG_COUNTER_INC(obj_hash_ar);
+ }
}
else {
RB_DEBUG_COUNTER_INC(obj_hash_st);