aboutsummaryrefslogtreecommitdiffstats
path: root/src/keymap.c
diff options
context:
space:
mode:
authorKarl Heuer1999-07-30 14:37:30 +0000
committerKarl Heuer1999-07-30 14:37:30 +0000
commitb1314e15504ca365f79942dfff08591e5ef553d3 (patch)
treef93386ff9b6967a27760839105f41df77882e089 /src/keymap.c
parentcc7e9720375a3e52a5566351ae8c8f84d096ea72 (diff)
downloademacs-b1314e15504ca365f79942dfff08591e5ef553d3.tar.gz
emacs-b1314e15504ca365f79942dfff08591e5ef553d3.zip
(get_keymap_1, get_keyelt): Check the type of OBJECT
before calling indirect_function.
Diffstat (limited to 'src/keymap.c')
-rw-r--r--src/keymap.c104
1 files changed, 60 insertions, 44 deletions
diff --git a/src/keymap.c b/src/keymap.c
index dbbbafbcf7d..1b673384806 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -224,9 +224,16 @@ get_keymap_1 (object, error, autoload)
224 Lisp_Object tem; 224 Lisp_Object tem;
225 225
226 autoload_retry: 226 autoload_retry:
227 tem = indirect_function (object); 227 if (NILP (object))
228 if (CONSP (tem) && EQ (XCONS (tem)->car, Qkeymap)) 228 goto end;
229 return tem; 229 if (CONSP (object) && EQ (XCAR (object), Qkeymap))
230 return object;
231 else
232 {
233 tem = indirect_function (object);
234 if (CONSP (tem) && EQ (XCONS (tem)->car, Qkeymap))
235 return tem;
236 }
230 237
231 /* Should we do an autoload? Autoload forms for keymaps have 238 /* Should we do an autoload? Autoload forms for keymaps have
232 Qkeymap as their fifth element. */ 239 Qkeymap as their fifth element. */
@@ -250,6 +257,7 @@ get_keymap_1 (object, error, autoload)
250 } 257 }
251 } 258 }
252 259
260 end:
253 if (error) 261 if (error)
254 wrong_type_argument (Qkeymapp, object); 262 wrong_type_argument (Qkeymapp, object);
255 else 263 else
@@ -545,68 +553,76 @@ get_keyelt (object, autoload)
545{ 553{
546 while (1) 554 while (1)
547 { 555 {
548 register Lisp_Object map, tem; 556 if (!(CONSP (object)))
557 /* This is really the value. */
558 return object;
549 559
550 /* If the contents are (KEYMAP . ELEMENT), go indirect. */ 560 /* If the keymap contents looks like (keymap ...) or (lambda ...)
551 map = get_keymap_1 (Fcar_safe (object), 0, autoload); 561 then use itself. */
552 tem = Fkeymapp (map); 562 else if (EQ (XCAR (object), Qkeymap) || EQ (XCAR (object), Qlambda))
553 if (!NILP (tem)) 563 return object;
564
565 /* If the keymap contents looks like (menu-item name . DEFN)
566 or (menu-item name DEFN ...) then use DEFN.
567 This is a new format menu item.
568 */
569 else if (EQ (XCAR (object), Qmenu_item))
554 { 570 {
555 Lisp_Object key; 571 if (CONSP (XCDR (object)))
556 key = Fcdr (object);
557 if (INTEGERP (key) && (XINT (key) & meta_modifier))
558 { 572 {
559 object = access_keymap (map, meta_prefix_char, 0, 0); 573 object = XCDR (XCDR (object));
560 map = get_keymap_1 (object, 0, autoload); 574 if (CONSP (object))
561 object = access_keymap (map, 575 object = XCAR (object);
562 make_number (XINT (key) & ~meta_modifier),
563 0, 0);
564 } 576 }
565 else 577 else
566 object = access_keymap (map, key, 0, 0); 578 /* Invalid keymap */
579 return object;
567 } 580 }
568 581
569 else if (!(CONSP (object))) 582 /* If the keymap contents looks like (STRING . DEFN), use DEFN.
570 /* This is really the value. */
571 return object;
572
573 /* If the keymap contents looks like (STRING . DEFN),
574 use DEFN.
575 Keymap alist elements like (CHAR MENUSTRING . DEFN) 583 Keymap alist elements like (CHAR MENUSTRING . DEFN)
576 will be used by HierarKey menus. */ 584 will be used by HierarKey menus. */
577 else if (STRINGP (XCONS (object)->car)) 585 else if (STRINGP (XCAR (object)))
578 { 586 {
579 object = XCONS (object)->cdr; 587 object = XCDR (object);
580 /* Also remove a menu help string, if any, 588 /* Also remove a menu help string, if any,
581 following the menu item name. */ 589 following the menu item name. */
582 if (CONSP (object) && STRINGP (XCONS (object)->car)) 590 if (CONSP (object) && STRINGP (XCAR (object)))
583 object = XCONS (object)->cdr; 591 object = XCDR (object);
584 /* Also remove the sublist that caches key equivalences, if any. */ 592 /* Also remove the sublist that caches key equivalences, if any. */
585 if (CONSP (object) 593 if (CONSP (object) && CONSP (XCAR (object)))
586 && CONSP (XCONS (object)->car))
587 { 594 {
588 Lisp_Object carcar; 595 Lisp_Object carcar;
589 carcar = XCONS (XCONS (object)->car)->car; 596 carcar = XCAR (XCAR (object));
590 if (NILP (carcar) || VECTORP (carcar)) 597 if (NILP (carcar) || VECTORP (carcar))
591 object = XCONS (object)->cdr; 598 object = XCDR (object);
592 } 599 }
593 } 600 }
594 601
595 /* If the keymap contents looks like (menu-item name . DEFN) 602 /* If the contents are (KEYMAP . ELEMENT), go indirect. */
596 or (menu-item name DEFN ...) then use DEFN. 603 else
597 This is a new format menu item.
598 */
599 else if (EQ (XCONS (object)->car, Qmenu_item)
600 && CONSP (XCONS (object)->cdr))
601 { 604 {
602 object = XCONS (XCONS (object)->cdr)->cdr; 605 register Lisp_Object map;
603 if (CONSP (object)) 606 map = get_keymap_1 (Fcar_safe (object), 0, autoload);
604 object = XCONS (object)->car; 607 if (NILP (map))
608 /* Invalid keymap */
609 return object;
610 else
611 {
612 Lisp_Object key;
613 key = Fcdr (object);
614 if (INTEGERP (key) && (XINT (key) & meta_modifier))
615 {
616 object = access_keymap (map, meta_prefix_char, 0, 0);
617 map = get_keymap_1 (object, 0, autoload);
618 object = access_keymap (map, make_number (XINT (key)
619 & ~meta_modifier),
620 0, 0);
621 }
622 else
623 object = access_keymap (map, key, 0, 0);
624 }
605 } 625 }
606
607 else
608 /* Anything else is really the value. */
609 return object;
610 } 626 }
611} 627}
612 628