&& EQ (XCAR (tem), Qautoload)
&& EQ (Fcar (Fcdr (Fcdr (Fcdr (Fcdr (tem))))), Qkeymap))
{
- struct gcpro gcpro1, gcpro2;
- GCPRO2 (tem, object);
+ /* do_autoload GCPROs both arguments */
do_autoload (tem, object);
- UNGCPRO;
}
else if (errorp)
object = wrong_type_argument (Qkeymapp, object);
returned_value->modifiers = 0;
if (modifiers_sans_meta == XEMACS_MOD_CONTROL)
{
- if EQ (keysym, QKspace)
+ if (EQ (keysym, QKspace))
MACROLET (make_char ('@'), modifiers);
else if (!CHARP (keysym))
return;
(function, keymap, sort_first))
{
/* This function can GC */
- struct gcpro gcpro1, gcpro2;
+ struct gcpro gcpro1, gcpro2, gcpro3;
+ Lisp_Object table = Qnil;
/* tolerate obviously transposed args */
if (!NILP (Fkeymapp (function)))
function = keymap;
keymap = tmp;
}
- GCPRO2 (function, keymap);
+
+ GCPRO3 (function, keymap, table);
keymap = get_keymap (keymap, 1, 1);
- map_keymap (XKEYMAP (keymap)->table, !NILP (sort_first),
+
+ /* elisp_maphash does not allow mapping functions to modify the hash
+ table being mapped over. Since map-keymap explicitly allows a
+ mapping function to modify KEYMAP, we map over a copy of the hash
+ table instead. */
+ table = Fcopy_hash_table (XKEYMAP (keymap)->table);
+
+ map_keymap (table, !NILP (sort_first),
map_keymap_mapper, LISP_TO_VOID (function));
UNGCPRO;
return Qnil;