diff options
| author | Karl Heuer | 1999-07-30 14:37:30 +0000 |
|---|---|---|
| committer | Karl Heuer | 1999-07-30 14:37:30 +0000 |
| commit | b1314e15504ca365f79942dfff08591e5ef553d3 (patch) | |
| tree | f93386ff9b6967a27760839105f41df77882e089 /src | |
| parent | cc7e9720375a3e52a5566351ae8c8f84d096ea72 (diff) | |
| download | emacs-b1314e15504ca365f79942dfff08591e5ef553d3.tar.gz emacs-b1314e15504ca365f79942dfff08591e5ef553d3.zip | |
(get_keymap_1, get_keyelt): Check the type of OBJECT
before calling indirect_function.
Diffstat (limited to 'src')
| -rw-r--r-- | src/keymap.c | 104 |
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 | ||