diff options
author | Aaron Patterson <tenderlove@ruby-lang.org> | 2019-10-07 17:41:26 -0700 |
---|---|---|
committer | Aaron Patterson <tenderlove@ruby-lang.org> | 2019-10-28 11:18:56 -0700 |
commit | aec16b754055f5436b2770695ce6f579ed2fc248 (patch) | |
tree | 2b5e830566601e2bf79411ed25688f222be595c8 /gc.c | |
parent | 6e0b40af3da4941b618f018b2c04cee0110ce50c (diff) |
Marshal is calling functions that should pin things
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 14 |
1 files changed, 12 insertions, 2 deletions
@@ -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 |