comparison src/lisp.h @ 5241:d579d76f3dcc

Be more careful about side-effects from Lisp code, #'reduce src/ChangeLog addition: 2010-07-24 Aidan Kehoe <kehoea@parhasard.net> * lisp.h (PARSE_KEYWORDS): Always accept a nil :allow-other-keys keyword argument, as described in the ALLOW-OTHER-KEYS-NIL Common Lisp issue writeup, and as necessary for Paul Dietz' tests for #'reduce. * fns.c (mapping_interaction_error): New. (Freduce): Call mapping_interaction_error when KEY or FUNCTION have modified a string SEQUENCE such that the byte length of the string has changed, or such that the current cursor pointer doesn't point to the beginning of a character. Cf. the MAPPING-DESTRUCTIVE-INTERACTION Common Lisp issue writeup. When traversing a list, GCPRO the part of it we still have to traverse, to avoid any crashes if FUNCTION or KEY amputate it behind us and force a garbage collection. tests/ChangeLog addition: 2010-07-24 Aidan Kehoe <kehoea@parhasard.net> * automated/lisp-tests.el: Test a couple of things #'reduce was just made more careful about.
author Aidan Kehoe <kehoea@parhasard.net>
date Sat, 24 Jul 2010 15:56:57 +0100
parents 0b4d355771bd
children 808131ba4a57
comparison
equal deleted inserted replaced
5240:fca0cf0971de 5241:d579d76f3dcc
3575 CHECK_N_KEYWORDS_##keyword_count keywords \ 3575 CHECK_N_KEYWORDS_##keyword_count keywords \
3576 else if (allow_other_keys || pk_allow_other_keys) \ 3576 else if (allow_other_keys || pk_allow_other_keys) \
3577 { \ 3577 { \
3578 continue; \ 3578 continue; \
3579 } \ 3579 } \
3580 else if (!(pk_allow_other_keys \ 3580 else if ((pk_allow_other_keys \
3581 = non_nil_allow_other_keys_p (keywords_offset, \ 3581 = non_nil_allow_other_keys_p (keywords_offset, \
3582 nargs, args))) \ 3582 nargs, args))) \
3583 { \
3584 continue; \
3585 } \
3586 else if (EQ (pk_key, Q_allow_other_keys) && \
3587 NILP (pk_value)) \
3588 { \
3589 continue; \
3590 } \
3591 else \
3583 { \ 3592 { \
3584 invalid_keyword_argument (function, pk_key); \ 3593 invalid_keyword_argument (function, pk_key); \
3585 } \ 3594 } \
3586 } \ 3595 } \
3587 } while (0) 3596 } while (0)