summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2024-06-15 16:40:53 -0700
committerKaz Kylheku <kaz@kylheku.com>2024-06-15 16:40:53 -0700
commit3662537e57df9b1f2e260d25eef17717981b3d45 (patch)
treee100b8a49f314bdadaa9779ed0cc40a9cfe6fe1d /lib.c
parent38a76d820decec3c703185b12a0f89bedec7716c (diff)
downloadtxr-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.c27
1 files changed, 21 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)
{