| Index: gdb/objc-lang.c
|
| diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
|
| index 15bf792bc34f7bc14fa20b4ea9289a60467b9846..90c589dc196f07c279016a5befddbbc3db400359 100644
|
| --- a/gdb/objc-lang.c
|
| +++ b/gdb/objc-lang.c
|
| @@ -1,6 +1,6 @@
|
| /* Objective-C language support routines for GDB, the GNU debugger.
|
|
|
| - Copyright (C) 2002-2005, 2007-2012 Free Software Foundation, Inc.
|
| + Copyright (C) 2002-2013 Free Software Foundation, Inc.
|
|
|
| Contributed by Apple Computer, Inc.
|
| Written by Michael Snyder.
|
| @@ -26,6 +26,7 @@
|
| #include "expression.h"
|
| #include "parser-defs.h"
|
| #include "language.h"
|
| +#include "varobj.h"
|
| #include "c-lang.h"
|
| #include "objc-lang.h"
|
| #include "exceptions.h"
|
| @@ -33,7 +34,7 @@
|
| #include "value.h"
|
| #include "symfile.h"
|
| #include "objfiles.h"
|
| -#include "gdb_string.h" /* for strchr */
|
| +#include <string.h> /* for strchr */
|
| #include "target.h" /* for target_has_execution */
|
| #include "gdbcore.h"
|
| #include "gdbcmd.h"
|
| @@ -44,6 +45,7 @@
|
| #include "infcall.h"
|
| #include "valprint.h"
|
| #include "gdb_assert.h"
|
| +#include "cli/cli-utils.h"
|
|
|
| #include <ctype.h>
|
|
|
| @@ -82,7 +84,7 @@ static const struct objfile_data *objc_objfile_data;
|
| suitably defined. */
|
|
|
| struct symbol *
|
| -lookup_struct_typedef (char *name, struct block *block, int noerr)
|
| +lookup_struct_typedef (char *name, const struct block *block, int noerr)
|
| {
|
| struct symbol *sym;
|
|
|
| @@ -282,160 +284,6 @@ objc_demangle (const char *mangled, int options)
|
| return NULL; /* Not an objc mangled name. */
|
| }
|
|
|
| -/* Print the character C on STREAM as part of the contents of a
|
| - literal string whose delimiter is QUOTER. Note that that format
|
| - for printing characters and strings is language specific. */
|
| -
|
| -static void
|
| -objc_emit_char (int c, struct type *type, struct ui_file *stream, int quoter)
|
| -{
|
| - c &= 0xFF; /* Avoid sign bit follies. */
|
| -
|
| - if (PRINT_LITERAL_FORM (c))
|
| - {
|
| - if (c == '\\' || c == quoter)
|
| - {
|
| - fputs_filtered ("\\", stream);
|
| - }
|
| - fprintf_filtered (stream, "%c", c);
|
| - }
|
| - else
|
| - {
|
| - switch (c)
|
| - {
|
| - case '\n':
|
| - fputs_filtered ("\\n", stream);
|
| - break;
|
| - case '\b':
|
| - fputs_filtered ("\\b", stream);
|
| - break;
|
| - case '\t':
|
| - fputs_filtered ("\\t", stream);
|
| - break;
|
| - case '\f':
|
| - fputs_filtered ("\\f", stream);
|
| - break;
|
| - case '\r':
|
| - fputs_filtered ("\\r", stream);
|
| - break;
|
| - case '\033':
|
| - fputs_filtered ("\\e", stream);
|
| - break;
|
| - case '\007':
|
| - fputs_filtered ("\\a", stream);
|
| - break;
|
| - default:
|
| - fprintf_filtered (stream, "\\%.3o", (unsigned int) c);
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -
|
| -static void
|
| -objc_printchar (int c, struct type *type, struct ui_file *stream)
|
| -{
|
| - fputs_filtered ("'", stream);
|
| - objc_emit_char (c, type, stream, '\'');
|
| - fputs_filtered ("'", stream);
|
| -}
|
| -
|
| -/* Print the character string STRING, printing at most LENGTH
|
| - characters. Printing stops early if the number hits print_max;
|
| - repeat counts are printed as appropriate. Print ellipses at the
|
| - end if we had to stop before printing LENGTH characters, or if
|
| - FORCE_ELLIPSES. */
|
| -
|
| -static void
|
| -objc_printstr (struct ui_file *stream, struct type *type,
|
| - const gdb_byte *string, unsigned int length,
|
| - const char *encoding, int force_ellipses,
|
| - const struct value_print_options *options)
|
| -{
|
| - unsigned int i;
|
| - unsigned int things_printed = 0;
|
| - int in_quotes = 0;
|
| - int need_comma = 0;
|
| -
|
| - /* If the string was not truncated due to `set print elements', and
|
| - the last byte of it is a null, we don't print that, in
|
| - traditional C style. */
|
| - if ((!force_ellipses) && length > 0 && string[length-1] == '\0')
|
| - length--;
|
| -
|
| - if (length == 0)
|
| - {
|
| - fputs_filtered ("\"\"", stream);
|
| - return;
|
| - }
|
| -
|
| - for (i = 0; i < length && things_printed < options->print_max; ++i)
|
| - {
|
| - /* Position of the character we are examining to see whether it
|
| - is repeated. */
|
| - unsigned int rep1;
|
| - /* Number of repetitions we have detected so far. */
|
| - unsigned int reps;
|
| -
|
| - QUIT;
|
| -
|
| - if (need_comma)
|
| - {
|
| - fputs_filtered (", ", stream);
|
| - need_comma = 0;
|
| - }
|
| -
|
| - rep1 = i + 1;
|
| - reps = 1;
|
| - while (rep1 < length && string[rep1] == string[i])
|
| - {
|
| - ++rep1;
|
| - ++reps;
|
| - }
|
| -
|
| - if (reps > options->repeat_count_threshold)
|
| - {
|
| - if (in_quotes)
|
| - {
|
| - if (options->inspect_it)
|
| - fputs_filtered ("\\\", ", stream);
|
| - else
|
| - fputs_filtered ("\", ", stream);
|
| - in_quotes = 0;
|
| - }
|
| - objc_printchar (string[i], type, stream);
|
| - fprintf_filtered (stream, " <repeats %u times>", reps);
|
| - i = rep1 - 1;
|
| - things_printed += options->repeat_count_threshold;
|
| - need_comma = 1;
|
| - }
|
| - else
|
| - {
|
| - if (!in_quotes)
|
| - {
|
| - if (options->inspect_it)
|
| - fputs_filtered ("\\\"", stream);
|
| - else
|
| - fputs_filtered ("\"", stream);
|
| - in_quotes = 1;
|
| - }
|
| - objc_emit_char (string[i], type, stream, '"');
|
| - ++things_printed;
|
| - }
|
| - }
|
| -
|
| - /* Terminate the quotes if necessary. */
|
| - if (in_quotes)
|
| - {
|
| - if (options->inspect_it)
|
| - fputs_filtered ("\\\"", stream);
|
| - else
|
| - fputs_filtered ("\"", stream);
|
| - }
|
| -
|
| - if (force_ellipses || i < length)
|
| - fputs_filtered ("...", stream);
|
| -}
|
| -
|
| /* Determine if we are currently in the Objective-C dispatch function.
|
| If so, get the address of the method function that the dispatcher
|
| would call and use that as the function to step into instead. Also
|
| @@ -507,19 +355,19 @@ static const struct op_print objc_op_print_tab[] =
|
|
|
| const struct language_defn objc_language_defn = {
|
| "objective-c", /* Language name */
|
| + "Objective-C",
|
| language_objc,
|
| range_check_off,
|
| - type_check_off,
|
| case_sensitive_on,
|
| array_row_major,
|
| macro_expansion_c,
|
| &exp_descriptor_standard,
|
| - objc_parse,
|
| - objc_error,
|
| + c_parse,
|
| + c_error,
|
| null_post_parser,
|
| - objc_printchar, /* Print a character constant */
|
| - objc_printstr, /* Function to print string constant */
|
| - objc_emit_char,
|
| + c_printchar, /* Print a character constant */
|
| + c_printstr, /* Function to print string constant */
|
| + c_emit_char,
|
| c_print_type, /* Print a type using appropriate syntax */
|
| c_print_typedef, /* Print a typedef using appropriate syntax */
|
| c_val_print, /* Print a value using appropriate syntax */
|
| @@ -543,6 +391,7 @@ const struct language_defn objc_language_defn = {
|
| default_get_string,
|
| NULL, /* la_get_symbol_name_cmp */
|
| iterate_over_symbols,
|
| + &default_varobj_ops,
|
| LANG_MAGIC
|
| };
|
|
|
| @@ -580,7 +429,8 @@ start_msglist(void)
|
| void
|
| add_msglist(struct stoken *str, int addcolon)
|
| {
|
| - char *s, *p;
|
| + char *s;
|
| + const char *p;
|
| int len, plen;
|
|
|
| if (str == 0) /* Unnamed arg, or... */
|
| @@ -967,15 +817,13 @@ parse_selector (char *method, char **selector)
|
|
|
| s1 = method;
|
|
|
| - while (isspace (*s1))
|
| - s1++;
|
| + s1 = skip_spaces (s1);
|
| if (*s1 == '\'')
|
| {
|
| found_quote = 1;
|
| s1++;
|
| }
|
| - while (isspace (*s1))
|
| - s1++;
|
| + s1 = skip_spaces (s1);
|
|
|
| nselector = s1;
|
| s2 = s1;
|
| @@ -994,14 +842,12 @@ parse_selector (char *method, char **selector)
|
| }
|
| *s1++ = '\0';
|
|
|
| - while (isspace (*s2))
|
| - s2++;
|
| + s2 = skip_spaces (s2);
|
| if (found_quote)
|
| {
|
| if (*s2 == '\'')
|
| s2++;
|
| - while (isspace (*s2))
|
| - s2++;
|
| + s2 = skip_spaces (s2);
|
| }
|
|
|
| if (selector != NULL)
|
| @@ -1030,21 +876,18 @@ parse_method (char *method, char *type, char **class,
|
|
|
| s1 = method;
|
|
|
| - while (isspace (*s1))
|
| - s1++;
|
| + s1 = skip_spaces (s1);
|
| if (*s1 == '\'')
|
| {
|
| found_quote = 1;
|
| s1++;
|
| }
|
| - while (isspace (*s1))
|
| - s1++;
|
| + s1 = skip_spaces (s1);
|
|
|
| if ((s1[0] == '+') || (s1[0] == '-'))
|
| ntype = *s1++;
|
|
|
| - while (isspace (*s1))
|
| - s1++;
|
| + s1 = skip_spaces (s1);
|
|
|
| if (*s1 != '[')
|
| return NULL;
|
| @@ -1055,14 +898,12 @@ parse_method (char *method, char *type, char **class,
|
| s1++;
|
|
|
| s2 = s1;
|
| - while (isspace (*s2))
|
| - s2++;
|
| + s2 = skip_spaces (s2);
|
|
|
| if (*s2 == '(')
|
| {
|
| s2++;
|
| - while (isspace (*s2))
|
| - s2++;
|
| + s2 = skip_spaces (s2);
|
| ncategory = s2;
|
| while (isalnum (*s2) || (*s2 == '_'))
|
| s2++;
|
| @@ -1090,15 +931,13 @@ parse_method (char *method, char *type, char **class,
|
| *s1++ = '\0';
|
| s2++;
|
|
|
| - while (isspace (*s2))
|
| - s2++;
|
| + s2 = skip_spaces (s2);
|
| if (found_quote)
|
| {
|
| if (*s2 != '\'')
|
| return NULL;
|
| s2++;
|
| - while (isspace (*s2))
|
| - s2++;
|
| + s2 = skip_spaces (s2);
|
| }
|
|
|
| if (type != NULL)
|
| @@ -1151,8 +990,6 @@ find_methods (char type, const char *class, const char *category,
|
|
|
| ALL_OBJFILE_MSYMBOLS (objfile, msymbol)
|
| {
|
| - struct gdbarch *gdbarch = get_objfile_arch (objfile);
|
| -
|
| QUIT;
|
|
|
| /* Check the symbol name first as this can be done entirely without
|
| @@ -1219,6 +1056,11 @@ uniquify_strings (VEC (const_char_ptr) **strings)
|
| const char *elem, *last = NULL;
|
| int out;
|
|
|
| + /* If the vector is empty, there's nothing to do. This explicit
|
| + check is needed to avoid invoking qsort with NULL. */
|
| + if (VEC_empty (const_char_ptr, *strings))
|
| + return;
|
| +
|
| qsort (VEC_address (const_char_ptr, *strings),
|
| VEC_length (const_char_ptr, *strings),
|
| sizeof (const_char_ptr),
|
| @@ -1238,7 +1080,7 @@ uniquify_strings (VEC (const_char_ptr) **strings)
|
| }
|
|
|
| /*
|
| - * Function: find_imps (char *selector, struct symbol **sym_arr)
|
| + * Function: find_imps (const char *selector, struct symbol **sym_arr)
|
| *
|
| * Input: a string representing a selector
|
| * a pointer to an array of symbol pointers
|
| @@ -1267,8 +1109,8 @@ uniquify_strings (VEC (const_char_ptr) **strings)
|
| * be the index of the first non-debuggable one).
|
| */
|
|
|
| -char *
|
| -find_imps (char *method, VEC (const_char_ptr) **symbol_names)
|
| +const char *
|
| +find_imps (const char *method, VEC (const_char_ptr) **symbol_names)
|
| {
|
| char type = '\0';
|
| char *class = NULL;
|
|
|