summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2019-10-07 17:41:26 -0700
committerAaron Patterson <tenderlove@ruby-lang.org>2019-10-28 11:18:56 -0700
commitaec16b754055f5436b2770695ce6f579ed2fc248 (patch)
tree2b5e830566601e2bf79411ed25688f222be595c8 /gc.c
parent6e0b40af3da4941b618f018b2c04cee0110ce50c (diff)
Marshal is calling functions that should pin things
Diffstat (limited to 'gc.c')
-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