diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2024-06-15 16:40:53 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2024-06-15 16:40:53 -0700 |
commit | 3662537e57df9b1f2e260d25eef17717981b3d45 (patch) | |
tree | e100b8a49f314bdadaa9779ed0cc40a9cfe6fe1d /lib.c | |
parent | 38a76d820decec3c703185b12a0f89bedec7716c (diff) | |
download | txr-3662537e57df9b1f2e260d25eef17717981b3d45.tar.gz txr-3662537e57df9b1f2e260d25eef17717981b3d45.tar.bz2 txr-3662537e57df9b1f2e260d25eef17717981b3d45.zip |
seq_iter: fix inadequate gc marking for some types.
* lib.c (seq_iter_mark_oop, seq_iter_mark_cat): New static
functions.
(si_oop_ops, si_fast_oop_ops): Use seq_iter_mark_oop instead
of the generic one, because we need to mark the next field,
not only the iter.
(si_cat_ops): Use seq_iter_mark_cat, since we need to mark
only the second field, dargs.
* lib.h (seq_iter_ops_init_mark): New macro.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 27 |
1 files changed, 21 insertions, 6 deletions
@@ -764,6 +764,12 @@ static int seq_iter_peek_oop(seq_iter_t *it, val *pval) return 0; } +static void seq_iter_mark_oop(seq_iter_t *it) +{ + gc_mark(it->ui.iter); + gc_mark(it->ul.next); +} + static int seq_iter_get_fast_oop(seq_iter_t *it, val *pval) { val iter = it->ui.iter; @@ -910,6 +916,11 @@ static int seq_iter_peek_cat(seq_iter_t *it, val *pval) } } +static void seq_iter_mark_cat(struct seq_iter *it) +{ + gc_mark(it->ul.dargs); +} + void seq_iter_mark_op(struct seq_iter *it) { gc_mark(it->ui.iter); @@ -968,14 +979,18 @@ struct seq_iter_ops si_chr_ops = seq_iter_ops_init_nomark(seq_iter_get_chr, struct seq_iter_ops si_num_ops = seq_iter_ops_init(seq_iter_get_num, seq_iter_peek_num); -struct seq_iter_ops si_oop_ops = seq_iter_ops_init(seq_iter_get_oop, - seq_iter_peek_oop); +struct seq_iter_ops si_oop_ops = seq_iter_ops_init_mark(seq_iter_get_oop, + seq_iter_peek_oop, + seq_iter_mark_oop); -struct seq_iter_ops si_fast_oop_ops = seq_iter_ops_init(seq_iter_get_fast_oop, - seq_iter_peek_fast_oop); +struct seq_iter_ops si_fast_oop_ops = + seq_iter_ops_init_mark(seq_iter_get_fast_oop, + seq_iter_peek_fast_oop, + seq_iter_mark_oop); -struct seq_iter_ops si_cat_ops = seq_iter_ops_init(seq_iter_get_cat, - seq_iter_peek_cat); +struct seq_iter_ops si_cat_ops = seq_iter_ops_init_mark(seq_iter_get_cat, + seq_iter_peek_cat, + seq_iter_mark_cat); static void seq_iter_clone(seq_iter_t *dit, const seq_iter_t *sit) { |