diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2024-06-15 15:01:16 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2024-06-15 15:01:16 -0700 |
commit | 38a76d820decec3c703185b12a0f89bedec7716c (patch) | |
tree | b4a0dea1deb5004adbbf6d1cc88f90a550c2d4d7 /lib.c | |
parent | 08eef02fb98856550fdd6a2cdccfdb65dc0cfec8 (diff) | |
download | txr-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.c | 23 |
1 files changed, 15 insertions, 8 deletions
@@ -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) { |