Fix fields object in embedded struct

We don't set RSTRUCT_GEN_FIELDS when RCLASS_MAX_IV_COUNT(klass) != 0, so
we need to set RSTRUCT_SET_FIELDS_OBJ to 0 otherwise it may have an
invalid value and crash.
This commit is contained in:
Peter Zhu 2025-12-05 17:58:11 -05:00
parent 791acc5697
commit 8f9838476d
Notes: git 2025-12-05 23:41:09 +00:00

View File

@ -826,12 +826,17 @@ struct_alloc(VALUE klass)
}
NEWOBJ_OF(st, struct RStruct, klass, flags, embedded_size, 0);
if (RCLASS_MAX_IV_COUNT(klass) == 0
&& !rb_shape_obj_has_fields((VALUE)st)
&& embedded_size < rb_gc_obj_slot_size((VALUE)st)) {
FL_UNSET_RAW((VALUE)st, RSTRUCT_GEN_FIELDS);
if (RCLASS_MAX_IV_COUNT(klass) == 0) {
if (!rb_shape_obj_has_fields((VALUE)st)
&& embedded_size < rb_gc_obj_slot_size((VALUE)st)) {
FL_UNSET_RAW((VALUE)st, RSTRUCT_GEN_FIELDS);
RSTRUCT_SET_FIELDS_OBJ((VALUE)st, 0);
}
}
else {
RSTRUCT_SET_FIELDS_OBJ((VALUE)st, 0);
}
rb_mem_clear((VALUE *)st->as.ary, n);
return (VALUE)st;