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
parent 2505c27fdf
commit 9ad175c1ee

View File

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