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; |