OLD | NEW |
1 /* Objective-C language support routines for GDB, the GNU debugger. | 1 /* Objective-C language support routines for GDB, the GNU debugger. |
2 | 2 |
3 Copyright (C) 2002-2005, 2007-2012 Free Software Foundation, Inc. | 3 Copyright (C) 2002-2005, 2007-2012 Free Software Foundation, Inc. |
4 | 4 |
5 Contributed by Apple Computer, Inc. | 5 Contributed by Apple Computer, Inc. |
6 Written by Michael Snyder. | 6 Written by Michael Snyder. |
7 | 7 |
8 This file is part of GDB. | 8 This file is part of GDB. |
9 | 9 |
10 This program is free software; you can redistribute it and/or modify | 10 This program is free software; you can redistribute it and/or modify |
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 objc_parse, | 517 objc_parse, |
518 objc_error, | 518 objc_error, |
519 null_post_parser, | 519 null_post_parser, |
520 objc_printchar, /* Print a character constant */ | 520 objc_printchar, /* Print a character constant */ |
521 objc_printstr, /* Function to print string constant */ | 521 objc_printstr, /* Function to print string constant */ |
522 objc_emit_char, | 522 objc_emit_char, |
523 c_print_type, /* Print a type using appropriate syntax */ | 523 c_print_type, /* Print a type using appropriate syntax */ |
524 c_print_typedef, /* Print a typedef using appropriate syntax */ | 524 c_print_typedef, /* Print a typedef using appropriate syntax */ |
525 c_val_print, /* Print a value using appropriate syntax */ | 525 c_val_print, /* Print a value using appropriate syntax */ |
526 c_value_print, /* Print a top-level value */ | 526 c_value_print, /* Print a top-level value */ |
| 527 default_read_var_value, /* la_read_var_value */ |
527 objc_skip_trampoline, /* Language specific skip_trampoline */ | 528 objc_skip_trampoline, /* Language specific skip_trampoline */ |
528 "self", /* name_of_this */ | 529 "self", /* name_of_this */ |
529 basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ | 530 basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ |
530 basic_lookup_transparent_type,/* lookup_transparent_type */ | 531 basic_lookup_transparent_type,/* lookup_transparent_type */ |
531 objc_demangle, /* Language specific symbol demangler */ | 532 objc_demangle, /* Language specific symbol demangler */ |
532 NULL, /* Language specific | 533 NULL, /* Language specific |
533 class_name_from_physname */ | 534 class_name_from_physname */ |
534 objc_op_print_tab, /* Expression operators for printing */ | 535 objc_op_print_tab, /* Expression operators for printing */ |
535 1, /* C-style arrays */ | 536 1, /* C-style arrays */ |
536 0, /* String lower bound */ | 537 0, /* String lower bound */ |
537 default_word_break_characters, | 538 default_word_break_characters, |
538 default_make_symbol_completion_list, | 539 default_make_symbol_completion_list, |
539 c_language_arch_info, | 540 c_language_arch_info, |
540 default_print_array_index, | 541 default_print_array_index, |
541 default_pass_by_reference, | 542 default_pass_by_reference, |
542 default_get_string, | 543 default_get_string, |
543 strcmp_iw_ordered, | 544 NULL,»» » » /* la_get_symbol_name_cmp */ |
544 iterate_over_symbols, | 545 iterate_over_symbols, |
545 LANG_MAGIC | 546 LANG_MAGIC |
546 }; | 547 }; |
547 | 548 |
548 /* | 549 /* |
549 * ObjC: | 550 * ObjC: |
550 * Following functions help construct Objective-C message calls. | 551 * Following functions help construct Objective-C message calls. |
551 */ | 552 */ |
552 | 553 |
553 struct selname /* For parsing Objective-C. */ | 554 struct selname /* For parsing Objective-C. */ |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
629 error (_("Can't find selector \"%s\""), p); | 630 error (_("Can't find selector \"%s\""), p); |
630 write_exp_elt_longcst (selid); | 631 write_exp_elt_longcst (selid); |
631 xfree(p); | 632 xfree(p); |
632 write_exp_elt_longcst (val); /* Number of args */ | 633 write_exp_elt_longcst (val); /* Number of args */ |
633 xfree(sel); | 634 xfree(sel); |
634 | 635 |
635 return val; | 636 return val; |
636 } | 637 } |
637 | 638 |
638 /* | 639 /* |
639 * Function: specialcmp (char *a, char *b) | 640 * Function: specialcmp (const char *a, const char *b) |
640 * | 641 * |
641 * Special strcmp: treats ']' and ' ' as end-of-string. | 642 * Special strcmp: treats ']' and ' ' as end-of-string. |
642 * Used for qsorting lists of objc methods (either by class or selector). | 643 * Used for qsorting lists of objc methods (either by class or selector). |
643 */ | 644 */ |
644 | 645 |
645 static int | 646 static int |
646 specialcmp (char *a, char *b) | 647 specialcmp (const char *a, const char *b) |
647 { | 648 { |
648 while (*a && *a != ' ' && *a != ']' && *b && *b != ' ' && *b != ']') | 649 while (*a && *a != ' ' && *a != ']' && *b && *b != ' ' && *b != ']') |
649 { | 650 { |
650 if (*a != *b) | 651 if (*a != *b) |
651 return *a - *b; | 652 return *a - *b; |
652 a++, b++; | 653 a++, b++; |
653 } | 654 } |
654 if (*a && *a != ' ' && *a != ']') | 655 if (*a && *a != ' ' && *a != ']') |
655 return 1; /* a is longer therefore greater. */ | 656 return 1; /* a is longer therefore greater. */ |
656 if (*b && *b != ' ' && *b != ']') | 657 if (*b && *b != ' ' && *b != ']') |
657 return -1; /* a is shorter therefore lesser. */ | 658 return -1; /* a is shorter therefore lesser. */ |
658 return 0; /* a and b are identical. */ | 659 return 0; /* a and b are identical. */ |
659 } | 660 } |
660 | 661 |
661 /* | 662 /* |
662 * Function: compare_selectors (const void *, const void *) | 663 * Function: compare_selectors (const void *, const void *) |
663 * | 664 * |
664 * Comparison function for use with qsort. Arguments are symbols or | 665 * Comparison function for use with qsort. Arguments are symbols or |
665 * msymbols Compares selector part of objc method name alphabetically. | 666 * msymbols Compares selector part of objc method name alphabetically. |
666 */ | 667 */ |
667 | 668 |
668 static int | 669 static int |
669 compare_selectors (const void *a, const void *b) | 670 compare_selectors (const void *a, const void *b) |
670 { | 671 { |
671 char *aname, *bname; | 672 const char *aname, *bname; |
672 | 673 |
673 aname = SYMBOL_PRINT_NAME (*(struct symbol **) a); | 674 aname = SYMBOL_PRINT_NAME (*(struct symbol **) a); |
674 bname = SYMBOL_PRINT_NAME (*(struct symbol **) b); | 675 bname = SYMBOL_PRINT_NAME (*(struct symbol **) b); |
675 if (aname == NULL || bname == NULL) | 676 if (aname == NULL || bname == NULL) |
676 error (_("internal: compare_selectors(1)")); | 677 error (_("internal: compare_selectors(1)")); |
677 | 678 |
678 aname = strchr(aname, ' '); | 679 aname = strchr(aname, ' '); |
679 bname = strchr(bname, ' '); | 680 bname = strchr(bname, ' '); |
680 if (aname == NULL || bname == NULL) | 681 if (aname == NULL || bname == NULL) |
681 error (_("internal: compare_selectors(2)")); | 682 error (_("internal: compare_selectors(2)")); |
682 | 683 |
683 return specialcmp (aname+1, bname+1); | 684 return specialcmp (aname+1, bname+1); |
684 } | 685 } |
685 | 686 |
686 /* | 687 /* |
687 * Function: selectors_info (regexp, from_tty) | 688 * Function: selectors_info (regexp, from_tty) |
688 * | 689 * |
689 * Implements the "Info selectors" command. Takes an optional regexp | 690 * Implements the "Info selectors" command. Takes an optional regexp |
690 * arg. Lists all objective c selectors that match the regexp. Works | 691 * arg. Lists all objective c selectors that match the regexp. Works |
691 * by grepping thru all symbols for objective c methods. Output list | 692 * by grepping thru all symbols for objective c methods. Output list |
692 * is sorted and uniqued. | 693 * is sorted and uniqued. |
693 */ | 694 */ |
694 | 695 |
695 static void | 696 static void |
696 selectors_info (char *regexp, int from_tty) | 697 selectors_info (char *regexp, int from_tty) |
697 { | 698 { |
698 struct objfile *objfile; | 699 struct objfile *objfile; |
699 struct minimal_symbol *msymbol; | 700 struct minimal_symbol *msymbol; |
700 char *name; | 701 const char *name; |
701 char *val; | 702 char *val; |
702 int matches = 0; | 703 int matches = 0; |
703 int maxlen = 0; | 704 int maxlen = 0; |
704 int ix; | 705 int ix; |
705 char myregexp[2048]; | 706 char myregexp[2048]; |
706 char asel[256]; | 707 char asel[256]; |
707 struct symbol **sym_arr; | 708 struct symbol **sym_arr; |
708 int plusminus = 0; | 709 int plusminus = 0; |
709 | 710 |
710 if (regexp == NULL) | 711 if (regexp == NULL) |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
755 name = (char *) strchr (name+2, ' '); | 756 name = (char *) strchr (name+2, ' '); |
756 if (name == NULL) | 757 if (name == NULL) |
757 { | 758 { |
758 complaint (&symfile_complaints, | 759 complaint (&symfile_complaints, |
759 _("Bad method name '%s'"), | 760 _("Bad method name '%s'"), |
760 SYMBOL_NATURAL_NAME (msymbol)); | 761 SYMBOL_NATURAL_NAME (msymbol)); |
761 continue; | 762 continue; |
762 } | 763 } |
763 if (regexp == NULL || re_exec(++name) != 0) | 764 if (regexp == NULL || re_exec(++name) != 0) |
764 { | 765 { |
765 » char *mystart = name; | 766 » const char *mystart = name; |
766 » char *myend = (char *) strchr (mystart, ']'); | 767 » const char *myend = strchr (mystart, ']'); |
767 | 768 |
768 if (myend && (myend - mystart > maxlen)) | 769 if (myend && (myend - mystart > maxlen)) |
769 maxlen = myend - mystart; /* Get longest selector. */ | 770 maxlen = myend - mystart; /* Get longest selector. */ |
770 matches++; | 771 matches++; |
771 } | 772 } |
772 } | 773 } |
773 } | 774 } |
774 if (matches) | 775 if (matches) |
775 { | 776 { |
776 printf_filtered (_("Selectors matching \"%s\":\n\n"), | 777 printf_filtered (_("Selectors matching \"%s\":\n\n"), |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 /* | 828 /* |
828 * Function: compare_classes (const void *, const void *) | 829 * Function: compare_classes (const void *, const void *) |
829 * | 830 * |
830 * Comparison function for use with qsort. Arguments are symbols or | 831 * Comparison function for use with qsort. Arguments are symbols or |
831 * msymbols Compares class part of objc method name alphabetically. | 832 * msymbols Compares class part of objc method name alphabetically. |
832 */ | 833 */ |
833 | 834 |
834 static int | 835 static int |
835 compare_classes (const void *a, const void *b) | 836 compare_classes (const void *a, const void *b) |
836 { | 837 { |
837 char *aname, *bname; | 838 const char *aname, *bname; |
838 | 839 |
839 aname = SYMBOL_PRINT_NAME (*(struct symbol **) a); | 840 aname = SYMBOL_PRINT_NAME (*(struct symbol **) a); |
840 bname = SYMBOL_PRINT_NAME (*(struct symbol **) b); | 841 bname = SYMBOL_PRINT_NAME (*(struct symbol **) b); |
841 if (aname == NULL || bname == NULL) | 842 if (aname == NULL || bname == NULL) |
842 error (_("internal: compare_classes(1)")); | 843 error (_("internal: compare_classes(1)")); |
843 | 844 |
844 return specialcmp (aname+1, bname+1); | 845 return specialcmp (aname+1, bname+1); |
845 } | 846 } |
846 | 847 |
847 /* | 848 /* |
848 * Function: classes_info(regexp, from_tty) | 849 * Function: classes_info(regexp, from_tty) |
849 * | 850 * |
850 * Implements the "info classes" command for objective c classes. | 851 * Implements the "info classes" command for objective c classes. |
851 * Lists all objective c classes that match the optional regexp. | 852 * Lists all objective c classes that match the optional regexp. |
852 * Works by grepping thru the list of objective c methods. List will | 853 * Works by grepping thru the list of objective c methods. List will |
853 * be sorted and uniqued (since one class may have many methods). | 854 * be sorted and uniqued (since one class may have many methods). |
854 * BUGS: will not list a class that has no methods. | 855 * BUGS: will not list a class that has no methods. |
855 */ | 856 */ |
856 | 857 |
857 static void | 858 static void |
858 classes_info (char *regexp, int from_tty) | 859 classes_info (char *regexp, int from_tty) |
859 { | 860 { |
860 struct objfile *objfile; | 861 struct objfile *objfile; |
861 struct minimal_symbol *msymbol; | 862 struct minimal_symbol *msymbol; |
862 char *name; | 863 const char *name; |
863 char *val; | 864 char *val; |
864 int matches = 0; | 865 int matches = 0; |
865 int maxlen = 0; | 866 int maxlen = 0; |
866 int ix; | 867 int ix; |
867 char myregexp[2048]; | 868 char myregexp[2048]; |
868 char aclass[256]; | 869 char aclass[256]; |
869 struct symbol **sym_arr; | 870 struct symbol **sym_arr; |
870 | 871 |
871 if (regexp == NULL) | 872 if (regexp == NULL) |
872 strcpy(myregexp, ".* "); /* Null input: match all objc classes. */ | 873 strcpy(myregexp, ".* "); /* Null input: match all objc classes. */ |
(...skipping 21 matching lines...) Expand all Loading... |
894 ALL_MSYMBOLS (objfile, msymbol) | 895 ALL_MSYMBOLS (objfile, msymbol) |
895 { | 896 { |
896 QUIT; | 897 QUIT; |
897 name = SYMBOL_NATURAL_NAME (msymbol); | 898 name = SYMBOL_NATURAL_NAME (msymbol); |
898 if (name && | 899 if (name && |
899 (name[0] == '-' || name[0] == '+') && | 900 (name[0] == '-' || name[0] == '+') && |
900 name[1] == '[') /* Got a method name. */ | 901 name[1] == '[') /* Got a method name. */ |
901 if (regexp == NULL || re_exec(name+2) != 0) | 902 if (regexp == NULL || re_exec(name+2) != 0) |
902 { | 903 { |
903 /* Compute length of classname part. */ | 904 /* Compute length of classname part. */ |
904 » char *mystart = name + 2; | 905 » const char *mystart = name + 2; |
905 » char *myend = (char *) strchr(mystart, ' '); | 906 » const char *myend = strchr (mystart, ' '); |
906 | 907 |
907 if (myend && (myend - mystart > maxlen)) | 908 if (myend && (myend - mystart > maxlen)) |
908 maxlen = myend - mystart; | 909 maxlen = myend - mystart; |
909 matches++; | 910 matches++; |
910 } | 911 } |
911 } | 912 } |
912 if (matches) | 913 if (matches) |
913 { | 914 { |
914 printf_filtered (_("Classes matching \"%s\":\n\n"), | 915 printf_filtered (_("Classes matching \"%s\":\n\n"), |
915 regexp ? regexp : "*"); | 916 regexp ? regexp : "*"); |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1112 return s2; | 1113 return s2; |
1113 } | 1114 } |
1114 | 1115 |
1115 static void | 1116 static void |
1116 find_methods (char type, const char *class, const char *category, | 1117 find_methods (char type, const char *class, const char *category, |
1117 const char *selector, | 1118 const char *selector, |
1118 VEC (const_char_ptr) **symbol_names) | 1119 VEC (const_char_ptr) **symbol_names) |
1119 { | 1120 { |
1120 struct objfile *objfile = NULL; | 1121 struct objfile *objfile = NULL; |
1121 | 1122 |
1122 char *symname = NULL; | 1123 const char *symname = NULL; |
1123 | 1124 |
1124 char ntype = '\0'; | 1125 char ntype = '\0'; |
1125 char *nclass = NULL; | 1126 char *nclass = NULL; |
1126 char *ncategory = NULL; | 1127 char *ncategory = NULL; |
1127 char *nselector = NULL; | 1128 char *nselector = NULL; |
1128 | 1129 |
1129 static char *tmp = NULL; | 1130 static char *tmp = NULL; |
1130 static unsigned int tmplen = 0; | 1131 static unsigned int tmplen = 0; |
1131 | 1132 |
1132 gdb_assert (symbol_names != NULL); | 1133 gdb_assert (symbol_names != NULL); |
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1759 return 0; | 1760 return 0; |
1760 | 1761 |
1761 res = find_implementation_from_class (gdbarch, sstr.class, sel); | 1762 res = find_implementation_from_class (gdbarch, sstr.class, sel); |
1762 if (new_pc != 0) | 1763 if (new_pc != 0) |
1763 *new_pc = res; | 1764 *new_pc = res; |
1764 if (res == 0) | 1765 if (res == 0) |
1765 return 1; | 1766 return 1; |
1766 return 0; | 1767 return 0; |
1767 } | 1768 } |
1768 | 1769 |
| 1770 /* Provide a prototype to silence -Wmissing-prototypes. */ |
| 1771 extern initialize_file_ftype _initialize_objc_lang; |
| 1772 |
1769 void | 1773 void |
1770 _initialize_objc_lang (void) | 1774 _initialize_objc_lang (void) |
1771 { | 1775 { |
1772 objc_objfile_data = register_objfile_data (); | 1776 objc_objfile_data = register_objfile_data (); |
1773 } | 1777 } |
OLD | NEW |