From 3662537e57df9b1f2e260d25eef17717981b3d45 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sat, 15 Jun 2024 16:40:53 -0700 Subject: 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. --- lib.c | 27 +++++++++++++++++++++------ lib.h | 1 + 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/lib.c b/lib.c index d3b829ee..7db83d78 100644 --- a/lib.c +++ b/lib.c @@ -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) { diff --git a/lib.h b/lib.h index 04e4f725..95964c04 100644 --- a/lib.h +++ b/lib.h @@ -470,6 +470,7 @@ struct seq_iter_ops { #define seq_iter_ops_init(get, peek) { get, peek, seq_iter_mark_op, 0 } #define seq_iter_ops_init_nomark(get, peek) { get, peek, 0, 0 } +#define seq_iter_ops_init_mark(get, peek, mark) { get, peek, mark, 0 } #define seq_iter_ops_init_clone(get, peek, clone) \ { get, peek, seq_iter_mark_op, clone } -- cgit v1.2.3