diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2024-02-28 08:08:29 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2024-02-28 08:08:29 -0800 |
commit | c434dabdc79602d8dec2d722a0002704daa8ff5a (patch) | |
tree | b609f044fdaa4d801cc3b350d022ff72dd76fd9e | |
parent | ee9fb41197c8a948144b9f384da273688bdd538c (diff) | |
download | txr-c434dabdc79602d8dec2d722a0002704daa8ff5a.tar.gz txr-c434dabdc79602d8dec2d722a0002704daa8ff5a.tar.bz2 txr-c434dabdc79602d8dec2d722a0002704daa8ff5a.zip |
seq_build: safeguard against adding to finished object.
* lib.c (seq_build_convert_to_finished): New function.
(seq_build_list_finish): call seq_build_convert_to_finished.
(sb_finished_ops): New static struct. All operations
except mark are null pointers so this will crash if
used.
-rw-r--r-- | lib.c | 14 |
1 files changed, 14 insertions, 0 deletions
@@ -1502,6 +1502,8 @@ static void seq_build_list_pend(seq_build_t *bu, val item) seq_build_convert_to_improper(bu, item); } +static void seq_build_convert_to_finished(seq_build_t *bu); + static void seq_build_list_finish(seq_build_t *bu) { val obj = bu->obj; @@ -1511,18 +1513,22 @@ static void seq_build_list_finish(seq_build_t *bu) us_rplacd(obj, nil); bu->obj = head; } + + seq_build_convert_to_finished(bu); } static void seq_build_struct_finish(seq_build_t *bu) { seq_build_list_finish(bu); bu->obj = funcall1(bu->u.from_list_meth, bu->obj); + seq_build_convert_to_finished(bu); } static void seq_build_carray_finish(seq_build_t *bu) { seq_build_list_finish(bu); bu->obj = carray_list(bu->obj, bu->u.carray_type, nil); + seq_build_convert_to_finished(bu); } static void seq_build_improper_add(seq_build_t *bu, val item) @@ -1586,6 +1592,9 @@ static struct seq_build_ops seq_build_improper_finish, seq_build_obj_mark); +static struct seq_build_ops + sb_finished_ops = seq_build_ops_init(0, 0, 0, seq_build_obj_mark); + static void seq_build_convert_to_list(seq_build_t *bu, val list) { if (list) { @@ -1614,6 +1623,11 @@ static void seq_build_convert_to_improper(seq_build_t *bu, val atom) bu->ops = &sb_improper_ops; } +static void seq_build_convert_to_finished(seq_build_t *bu) +{ + bu->ops = &sb_finished_ops; +} + void seq_build_init(val self, seq_build_t *bu, val likeobj) { bu->self = self; |