summaryrefslogtreecommitdiff
path: root/libguile/list.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2017-04-17 11:26:17 +0200
committerAndy Wingo <wingo@pobox.com>2017-04-18 21:27:45 +0200
commit6e573a0885d24d9ed36141ddf561c8b8b2e288e9 (patch)
treef3a6b348517b69856194efa2f0fcbec79286c4e6 /libguile/list.c
parentd7778b3d6a5f11ef4744c80e70457193d672aeda (diff)
downloadguile-6e573a0885d24d9ed36141ddf561c8b8b2e288e9.tar.gz
Attempt to mutate residualized literal pair throws exception
* libguile/validate.h (SCM_VALIDATE_MUTABLE_PAIR): * libguile/pairs.h (scm_is_mutable_pair): New internal definitions. * libguile/pairs.c (scm_set_car_x, scm_set_cdr_x): Validate mutable pairs. * libguile/alist.c (scm_assq_set_x, scm_assv_set_x, scm_assoc_set_x): * libguile/list.c (scm_reverse_x, scm_list_set_x, scm_list_cdr_set_x): * libguile/srcprop.c (scm_make_srcprops): * libguile/srfi-1.c (scm_srfi1_append_reverse_x) (scm_srfi1_delete_duplicates_x): * libguile/symbols.c (scm_symbol_fset_x, scm_symbol_pset_x): * libguile/sort.c (scm_merge_list_x): Use scm_set_car_x / scm_set_cdr_x instead of the macros, so as to check for mutable pairs. (SCM_VALIDATE_MUTABLE_LIST): New internal helper macro. (scm_sort_x, scm_stable_sort_x, scm_sort_list_x): Use SCM_VALIDATE_MUTABLE_LIST. * libguile/vm-engine.c (VM_VALIDATE_MUTABLE_PAIR): New definition. (set-car!, set-cdr!): Use VM_VALIDATE_MUTABLE_PAIR. Fix error message for set-cdr!.
Diffstat (limited to 'libguile/list.c')
-rw-r--r--libguile/list.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/libguile/list.c b/libguile/list.c
index e5036ed8d..939631531 100644
--- a/libguile/list.c
+++ b/libguile/list.c
@@ -391,14 +391,14 @@ SCM_DEFINE (scm_reverse_x, "reverse!", 1, 1, 0,
while (scm_is_pair (lst))
{
SCM old_tail = SCM_CDR (lst);
- SCM_SETCDR (lst, tail);
+ scm_set_cdr_x (lst, tail);
tail = lst;
lst = old_tail;
}
if (SCM_LIKELY (SCM_NULL_OR_NIL_P (lst)))
{
- SCM_SETCDR (old_lst, new_tail);
+ scm_set_cdr_x (old_lst, new_tail);
return tail;
}
@@ -454,7 +454,7 @@ SCM_DEFINE (scm_list_set_x, "list-set!", 3, 0, 0,
unsigned long int i = scm_to_ulong (k);
while (scm_is_pair (lst)) {
if (i == 0) {
- SCM_SETCAR (lst, val);
+ scm_set_car_x (lst, val);
return val;
} else {
--i;
@@ -500,7 +500,7 @@ SCM_DEFINE (scm_list_cdr_set_x, "list-cdr-set!", 3, 0, 0,
size_t i = scm_to_size_t (k);
while (scm_is_pair (lst)) {
if (i == 0) {
- SCM_SETCDR (lst, val);
+ scm_set_cdr_x (lst, val);
return val;
} else {
--i;