diff src/keymap.c @ 464:5aa1854ad537 r21-2-47

Import from CVS: tag r21-2-47
author cvs
date Mon, 13 Aug 2007 11:45:51 +0200
parents c33ae14dd6d0
children 4a8bb4aa9740
line wrap: on
line diff
--- a/src/keymap.c	Mon Aug 13 11:44:39 2007 +0200
+++ b/src/keymap.c	Mon Aug 13 11:45:51 2007 +0200
@@ -2990,7 +2990,8 @@
      (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)))
@@ -2999,9 +3000,17 @@
       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;