aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gc.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/gc.c b/gc.c
index 8317b49858..6fcdf2a53c 100644
--- a/gc.c
+++ b/gc.c
@@ -4710,7 +4710,7 @@ static int
mark_key(st_data_t key, st_data_t value, st_data_t data)
{
rb_objspace_t *objspace = (rb_objspace_t *)data;
- gc_mark(objspace, (VALUE)key);
+ gc_mark_and_pin(objspace, (VALUE)key);
return ST_CONTINUE;
}
@@ -4745,6 +4745,16 @@ mark_keyvalue(st_data_t key, st_data_t value, st_data_t data)
}
static int
+pin_key_pin_value(st_data_t key, st_data_t value, st_data_t data)
+{
+ rb_objspace_t *objspace = (rb_objspace_t *)data;
+
+ gc_mark_and_pin(objspace, (VALUE)key);
+ gc_mark_and_pin(objspace, (VALUE)value);
+ return ST_CONTINUE;
+}
+
+static int
pin_key_mark_value(st_data_t key, st_data_t value, st_data_t data)
{
rb_objspace_t *objspace = (rb_objspace_t *)data;
@@ -4779,7 +4789,7 @@ static void
mark_st(rb_objspace_t *objspace, st_table *tbl)
{
if (!tbl) return;
- st_foreach(tbl, mark_keyvalue, (st_data_t)objspace);
+ st_foreach(tbl, pin_key_pin_value, (st_data_t)objspace);
}
void