зеркало из https://github.com/github/ruby.git
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:
Родитель
2505c27fdf
Коммит
9ad175c1ee
32
numeric.c
32
numeric.c
|
@ -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);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче