summaryrefslogtreecommitdiff
path: root/numeric.c
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2024-03-26 11:34:28 -0400
committerPeter Zhu <peter@peterzhu.ca>2024-03-27 09:39:23 -0400
commit9ad175c1ee7137321310c4e87d8ce952b95abc8f (patch)
tree39da3d473f8475f33b9bc30af4affe1753349954 /numeric.c
parent2505c27fdfa67c3191f9b5902a30ab3139a8ab6f (diff)
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.
Diffstat (limited to 'numeric.c')
-rw-r--r--numeric.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/numeric.c b/numeric.c
index 41beff0919..f0a0e3c279 100644
--- a/numeric.c
+++ b/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);