diff --git a/gc.c b/gc.c index edb78a1923..302b95f664 100644 --- a/gc.c +++ b/gc.c @@ -3192,9 +3192,14 @@ rb_gc_mark_children(void *objspace, VALUE obj) if (fields_count) { VALUE klass = RBASIC_CLASS(obj); - // Increment max_iv_count if applicable, used to determine size pool allocation - if (RCLASS_MAX_IV_COUNT(klass) < fields_count) { - RCLASS_WRITE_MAX_IV_COUNT(klass, fields_count); + // Skip updating max_iv_count if the prime classext is not writable + // because GC context doesn't provide information about namespaces. + if (RCLASS_PRIME_CLASSEXT_WRITABLE_P(klass)) { + VM_ASSERT(rb_shape_obj_too_complex_p(klass)); + // Increment max_iv_count if applicable, used to determine size pool allocation + if (RCLASS_MAX_IV_COUNT(klass) < fields_count) { + RCLASS_SET_MAX_IV_COUNT(klass, fields_count); + } } }