Marshal is calling functions that should pin things

This commit is contained in:
Aaron Patterson 2019-10-07 17:41:26 -07:00
parent 6e0b40af3d
commit aec16b7540
No known key found for this signature in database
GPG Key ID: 953170BCB4FFAFC6

14
gc.c
View File

@ -4710,7 +4710,7 @@ static int
mark_key(st_data_t key, st_data_t value, st_data_t data) mark_key(st_data_t key, st_data_t value, st_data_t data)
{ {
rb_objspace_t *objspace = (rb_objspace_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; return ST_CONTINUE;
} }
@ -4744,6 +4744,16 @@ mark_keyvalue(st_data_t key, st_data_t value, st_data_t data)
return ST_CONTINUE; return ST_CONTINUE;
} }
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 static int
pin_key_mark_value(st_data_t key, st_data_t value, st_data_t data) pin_key_mark_value(st_data_t key, st_data_t value, st_data_t data)
{ {
@ -4779,7 +4789,7 @@ static void
mark_st(rb_objspace_t *objspace, st_table *tbl) mark_st(rb_objspace_t *objspace, st_table *tbl)
{ {
if (!tbl) return; if (!tbl) return;
st_foreach(tbl, mark_keyvalue, (st_data_t)objspace); st_foreach(tbl, pin_key_pin_value, (st_data_t)objspace);
} }
void void