Register rb_fix_to_s_static as global right after creating

If a GC runs right during creating a rb_fix_to_s_static, it may cause
the previous ones to become swept by the GC because they have not been
registered by rb_vm_register_global_object.
This commit is contained in:
Peter Zhu 2024-03-26 11:34:28 -04:00
Родитель 2505c27fdf
Коммит 9ad175c1ee
1 изменённых файлов: 19 добавлений и 13 удалений

Просмотреть файл

@ -6251,19 +6251,25 @@ Init_Numeric(void)
rb_define_method(rb_cInteger, "digits", rb_int_digits, -1);
rb_fix_to_s_static[0] = rb_fstring_literal("0");
rb_fix_to_s_static[1] = rb_fstring_literal("1");
rb_fix_to_s_static[2] = rb_fstring_literal("2");
rb_fix_to_s_static[3] = rb_fstring_literal("3");
rb_fix_to_s_static[4] = rb_fstring_literal("4");
rb_fix_to_s_static[5] = rb_fstring_literal("5");
rb_fix_to_s_static[6] = rb_fstring_literal("6");
rb_fix_to_s_static[7] = rb_fstring_literal("7");
rb_fix_to_s_static[8] = rb_fstring_literal("8");
rb_fix_to_s_static[9] = rb_fstring_literal("9");
for(int i = 0; i < 10; i++) {
rb_vm_register_global_object(rb_fix_to_s_static[i]);
}
#define fix_to_s_static(n) do { \
VALUE lit = rb_fstring_literal(#n); \
rb_fix_to_s_static[n] = lit; \
rb_vm_register_global_object(lit); \
RB_GC_GUARD(lit); \
} while (0)
fix_to_s_static(0);
fix_to_s_static(1);
fix_to_s_static(2);
fix_to_s_static(3);
fix_to_s_static(4);
fix_to_s_static(5);
fix_to_s_static(6);
fix_to_s_static(7);
fix_to_s_static(8);
fix_to_s_static(9);
#undef fix_to_s_static
rb_cFloat = rb_define_class("Float", rb_cNumeric);