summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2024-06-15 15:01:16 -0700
committerKaz Kylheku <kaz@kylheku.com>2024-06-15 15:01:16 -0700
commit38a76d820decec3c703185b12a0f89bedec7716c (patch)
treeb4a0dea1deb5004adbbf6d1cc88f90a550c2d4d7 /lib.c
parent08eef02fb98856550fdd6a2cdccfdb65dc0cfec8 (diff)
downloadtxr-38a76d820decec3c703185b12a0f89bedec7716c.tar.gz
txr-38a76d820decec3c703185b12a0f89bedec7716c.tar.bz2
txr-38a76d820decec3c703185b12a0f89bedec7716c.zip
New permi: iterator version of perm.
* eval.c (eval_init): Register permi intrinsic. * combi.c (permi_get, permi_peek, permi_clone): New static functions. (permi_ops): New static structure. (permi_iter): New static function. (permi): New function. * combi.h (permi): Declared. * lib.h (struct seq_iter_ops): New function pointer, clone. (seq_iter_ops_init, seq_iter_ops_init_nomark): Initialize new member. (seq_iter_ops_init_clone): New macro. (seq_iter_cls): Existing external name declared. (seq_iter_cobj_ops, seq_iter_mark_op): Previously internal names declared external. * lib.c (seq_iter_mark_op, seq_iter_cobj_ops): Static variables become extern. (seq_iter_clone): New static function. (seq_iter_init_with_info): Use seq_iter_clone instead of assuming we can trivially clone an iterator state bitwise.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/lib.c b/lib.c
index b4f44a01..d3b829ee 100644
--- a/lib.c
+++ b/lib.c
@@ -910,7 +910,7 @@ static int seq_iter_peek_cat(seq_iter_t *it, val *pval)
}
}
-static void seq_iter_mark_op(struct seq_iter *it)
+void seq_iter_mark_op(struct seq_iter *it)
{
gc_mark(it->ui.iter);
}
@@ -977,6 +977,14 @@ struct seq_iter_ops si_fast_oop_ops = seq_iter_ops_init(seq_iter_get_fast_oop,
struct seq_iter_ops si_cat_ops = seq_iter_ops_init(seq_iter_get_cat,
seq_iter_peek_cat);
+static void seq_iter_clone(seq_iter_t *dit, const seq_iter_t *sit)
+{
+ if (sit->ops->clone)
+ sit->ops->clone(sit, dit);
+ else
+ *dit = *sit;
+}
+
void seq_iter_init_with_info(val self, seq_iter_t *it,
seq_info_t si, int support_rewind)
{
@@ -1128,7 +1136,7 @@ void seq_iter_init_with_info(val self, seq_iter_t *it,
}
if (it->inf.obj->co.cls == seq_iter_cls)
{
- *it = *coerce(struct seq_iter *, it->inf.obj->co.handle);
+ seq_iter_clone(it, coerce(struct seq_iter *, it->inf.obj->co.handle));
break;
}
if (it->inf.obj->co.cls == tree_iter_cls)
@@ -1224,12 +1232,11 @@ static void seq_iter_mark(val seq_iter)
si->ops->mark(si);
}
-static struct cobj_ops
- seq_iter_cobj_ops = cobj_ops_init(eq,
- cobj_print_op,
- cobj_destroy_free_op,
- seq_iter_mark,
- cobj_eq_hash_op);
+struct cobj_ops seq_iter_cobj_ops = cobj_ops_init(eq,
+ cobj_print_op,
+ cobj_destroy_free_op,
+ seq_iter_mark,
+ cobj_eq_hash_op);
val seq_begin(val obj)
{