Skip to content

Commit bcddc56

Browse files
rwstaunerjhawthorn
authored andcommitted
vm: avoid allocator lookup for singleton class initialize methods
This fixes a SIGABRT of Assertion Failed: RCLASS_ALLOCATOR:!RCLASS_SINGLETON_P(klass)
1 parent 0364a61 commit bcddc56

2 files changed

Lines changed: 13 additions & 1 deletion

File tree

test/ruby/test_class.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,16 @@ class C; end
888888
end;
889889
end
890890

891+
def test_define_singleton_initialize
892+
assert_normal_exit "#{<<~"begin;"}\n#{<<~'end;'}"
893+
begin;
894+
class C
895+
def self.initialize
896+
end
897+
end
898+
end;
899+
end
900+
891901
def test_singleton_cc_invalidation
892902
assert_separately([], "#{<<~"begin;"}\n#{<<~"end;"}")
893903
begin;

vm_insnhelper.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6048,7 +6048,9 @@ vm_define_method(const rb_execution_context_t *ec, VALUE obj, ID id, VALUE iseqv
60486048

60496049
rb_add_method_iseq(klass, id, (const rb_iseq_t *)iseqval, cref, visi);
60506050
// Set max_iv_count on klasses based on number of ivar sets that are in the initialize method
6051-
if (id == idInitialize && klass != rb_cObject && RB_TYPE_P(klass, T_CLASS) && (rb_get_alloc_func(klass) == rb_class_allocate_instance)) {
6051+
if (id == idInitialize && klass != rb_cObject && RB_TYPE_P(klass, T_CLASS) &&
6052+
!RCLASS_SINGLETON_P(klass) &&
6053+
(rb_get_alloc_func(klass) == rb_class_allocate_instance)) {
60526054
RCLASS_SET_MAX_IV_COUNT(klass, rb_estimate_iv_count(klass, (const rb_iseq_t *)iseqval));
60536055
}
60546056

0 commit comments

Comments
 (0)