comparison src/lisp.h @ 5393:e99b473303e3

Use GC_EXTERNAL_LIST_LOOP_* where appropriate, fns.c src/ChangeLog addition: 2011-04-04 Aidan Kehoe <kehoea@parhasard.net> * lisp.h (GC_EXTERNAL_LIST_LOOP_3, GC_EXTERNAL_LIST_LOOP_4): New. * fns.c (count_with_tail, list_position_cons_before, FassocX): * fns.c (FrassocX, position, FdeleteX, FremoveX): * fns.c (list_delete_duplicates_from_end): * fns.c (Fdelete_duplicates, Fremove_duplicates, Freduce): * fns.c (Fnsubstitute, Fsubstitute, sublis, nsublis, Fnsublis): * fns.c (venn, nvenn, Funion, Fset_exclusive_or, Fnset_exclusive_or): Use GC_EXTERNAL_LIST_LOOP_* in the sequence functions in fns.c where appropriate, there were some corner cases where my old approach was unsafe (mainly if the circularity checking's tortoise lost GCPRO protection. Add GC_EXTERNAL_LIST_LOOP_{3,4}, analogous to GC_EXTERNAL_LIST_LOOP_2.
author Aidan Kehoe <kehoea@parhasard.net>
date Mon, 04 Apr 2011 00:20:09 +0100
parents 4f39e57a82b4
children 248176c74e6b
comparison
equal deleted inserted replaced
5392:25c10648ffba 5393:e99b473303e3
2121 Lisp_Object elt, tail, tortoise_##elt; \ 2121 Lisp_Object elt, tail, tortoise_##elt; \
2122 EMACS_INT len_##elt; \ 2122 EMACS_INT len_##elt; \
2123 PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len_##elt, tail, \ 2123 PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len_##elt, tail, \
2124 tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH) 2124 tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH)
2125 2125
2126 #define GC_EXTERNAL_LIST_LOOP_3(elt, list, tail) \
2127 do { \
2128 XGCDECL3 (elt); \
2129 Lisp_Object elt, tail, tortoise_##elt; \
2130 EMACS_INT len_##elt; \
2131 XGCPRO3 (elt, elt, tail, tortoise_##elt); \
2132 PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len_##elt, tail, \
2133 tortoise_##elt, \
2134 CIRCULAR_LIST_SUSPICION_LENGTH)
2135
2126 #define EXTERNAL_LIST_LOOP_4_NO_DECLARE(elt, list, tail, len) \ 2136 #define EXTERNAL_LIST_LOOP_4_NO_DECLARE(elt, list, tail, len) \
2127 Lisp_Object tortoise_##elt; \ 2137 Lisp_Object tortoise_##elt; \
2128 PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len, tail, \ 2138 PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len, tail, \
2129 tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH) 2139 tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH)
2130 2140
2131 #define EXTERNAL_LIST_LOOP_4(elt, list, tail, len) \ 2141 #define EXTERNAL_LIST_LOOP_4(elt, list, tail, len) \
2132 Lisp_Object elt, tail, tortoise_##elt; \ 2142 Lisp_Object elt, tail, tortoise_##elt; \
2133 EMACS_INT len; \ 2143 EMACS_INT len; \
2134 PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len, tail, \ 2144 PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len, tail, \
2135 tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH) 2145 tortoise_##elt, CIRCULAR_LIST_SUSPICION_LENGTH)
2146
2147 #define GC_EXTERNAL_LIST_LOOP_4(elt, list, tail, len) \
2148 do { \
2149 XGCDECL3 (elt); \
2150 Lisp_Object elt, tail, tortoise_##elt; \
2151 XGCPRO3 (elt, elt, tail, tortoise_##elt); \
2152 PRIVATE_EXTERNAL_LIST_LOOP_6 (elt, list, len, tail, \
2153 tortoise_##elt, \
2154 CIRCULAR_LIST_SUSPICION_LENGTH)
2136 2155
2137 #define PRIVATE_UNVERIFIED_LIST_LOOP_7(elt, list, len, hare, \ 2156 #define PRIVATE_UNVERIFIED_LIST_LOOP_7(elt, list, len, hare, \
2138 tortoise, suspicion_length, \ 2157 tortoise, suspicion_length, \
2139 signalp) \ 2158 signalp) \
2140 for (tortoise = hare = list, len = 0; \ 2159 for (tortoise = hare = list, len = 0; \