| Index: gdb/cp-support.c
|
| diff --git a/gdb/cp-support.c b/gdb/cp-support.c
|
| index 8cea2c5ce32594e39084a92f0a01635d2076b3d2..bafdb86cf7a9fdebe47b625b3b675ad912eb6e08 100644
|
| --- a/gdb/cp-support.c
|
| +++ b/gdb/cp-support.c
|
| @@ -34,6 +34,7 @@
|
| #include "exceptions.h"
|
| #include "expression.h"
|
| #include "value.h"
|
| +#include "cp-abi.h"
|
|
|
| #include "safe-ctype.h"
|
|
|
| @@ -72,19 +73,6 @@ struct cmd_list_element *maint_cplus_cmd_list = NULL;
|
| static void maint_cplus_command (char *arg, int from_tty);
|
| static void first_component_command (char *arg, int from_tty);
|
|
|
| -/* Operator validation.
|
| - NOTE: Multi-byte operators (usually the assignment variety
|
| - operator) must appear before the single byte version, i.e., "+="
|
| - before "+". */
|
| -static const char *operator_tokens[] =
|
| - {
|
| - "++", "+=", "+", "->*", "->", "--", "-=", "-", "*=", "*",
|
| - "/=", "/", "%=", "%", "!=", "==", "!", "&&", "<<=", "<<",
|
| - ">>=", ">>", "<=", "<", ">=", ">", "~", "&=", "&", "|=",
|
| - "||", "|", "^=", "^", "=", "()", "[]", ",", "new", "delete"
|
| - /* new[] and delete[] require special whitespace handling */
|
| - };
|
| -
|
| /* A list of typedefs which should not be substituted by replace_typedefs. */
|
| static const char * const ignore_typedefs[] =
|
| {
|
| @@ -528,6 +516,13 @@ cp_canonicalize_string (const char *string)
|
| ret = cp_comp_to_string (info->tree, estimated_len);
|
| cp_demangled_name_parse_free (info);
|
|
|
| + if (ret == NULL)
|
| + {
|
| + warning (_("internal error: string \"%s\" failed to be canonicalized"),
|
| + string);
|
| + return NULL;
|
| + }
|
| +
|
| if (strcmp (string, ret) == 0)
|
| {
|
| xfree (ret);
|
| @@ -1145,14 +1140,12 @@ static void
|
| make_symbol_overload_list_block (const char *name,
|
| const struct block *block)
|
| {
|
| - struct dict_iterator iter;
|
| + struct block_iterator iter;
|
| struct symbol *sym;
|
|
|
| - const struct dictionary *dict = BLOCK_DICT (block);
|
| -
|
| - for (sym = dict_iter_name_first (dict, name, &iter);
|
| + for (sym = block_iter_name_first (block, name, &iter);
|
| sym != NULL;
|
| - sym = dict_iter_name_next (name, &iter))
|
| + sym = block_iter_name_next (name, &iter))
|
| overload_list_add_symbol (sym, name);
|
| }
|
|
|
| @@ -1198,7 +1191,7 @@ make_symbol_overload_list_adl_namespace (struct type *type,
|
| const char *func_name)
|
| {
|
| char *namespace;
|
| - char *type_name;
|
| + const char *type_name;
|
| int i, prefix_len;
|
|
|
| while (TYPE_CODE (type) == TYPE_CODE_PTR
|
| @@ -1327,12 +1320,9 @@ make_symbol_overload_list_using (const char *func_name,
|
| static void
|
| make_symbol_overload_list_qualified (const char *func_name)
|
| {
|
| - struct symbol *sym;
|
| struct symtab *s;
|
| struct objfile *objfile;
|
| const struct block *b, *surrounding_static_block = 0;
|
| - struct dict_iterator iter;
|
| - const struct dictionary *dict;
|
|
|
| /* Look through the partial symtabs for all symbols which begin by
|
| matching FUNC_NAME. Make sure we read that symbol table in. */
|
| @@ -1451,109 +1441,16 @@ first_component_command (char *arg, int from_tty)
|
|
|
| extern initialize_file_ftype _initialize_cp_support; /* -Wmissing-prototypes */
|
|
|
| -#define SKIP_SPACE(P) \
|
| - do \
|
| - { \
|
| - while (*(P) == ' ' || *(P) == '\t') \
|
| - ++(P); \
|
| - } \
|
| - while (0)
|
| -
|
| -/* Returns the length of the operator name or 0 if INPUT does not
|
| - point to a valid C++ operator. INPUT should start with
|
| - "operator". */
|
| -int
|
| -cp_validate_operator (const char *input)
|
| -{
|
| - int i;
|
| - char *copy;
|
| - const char *p;
|
| - struct expression *expr;
|
| - struct value *val;
|
| - struct gdb_exception except;
|
| -
|
| - p = input;
|
| -
|
| - if (strncmp (p, "operator", 8) == 0)
|
| - {
|
| - int valid = 0;
|
| -
|
| - p += 8;
|
| - SKIP_SPACE (p);
|
| - for (i = 0;
|
| - i < sizeof (operator_tokens) / sizeof (operator_tokens[0]);
|
| - ++i)
|
| - {
|
| - int length = strlen (operator_tokens[i]);
|
| -
|
| - /* By using strncmp here, we MUST have operator_tokens
|
| - ordered! See additional notes where operator_tokens is
|
| - defined above. */
|
| - if (strncmp (p, operator_tokens[i], length) == 0)
|
| - {
|
| - const char *op = p;
|
|
|
| - valid = 1;
|
| - p += length;
|
| -
|
| - if (strncmp (op, "new", 3) == 0
|
| - || strncmp (op, "delete", 6) == 0)
|
| - {
|
| +/* Implement "info vtbl". */
|
|
|
| - /* Special case: new[] and delete[]. We must be
|
| - careful to swallow whitespace before/in "[]". */
|
| - SKIP_SPACE (p);
|
| -
|
| - if (*p == '[')
|
| - {
|
| - ++p;
|
| - SKIP_SPACE (p);
|
| - if (*p == ']')
|
| - ++p;
|
| - else
|
| - valid = 0;
|
| - }
|
| - }
|
| -
|
| - if (valid)
|
| - return (p - input);
|
| - }
|
| - }
|
| -
|
| - /* Check input for a conversion operator. */
|
| -
|
| - /* Skip past base typename. */
|
| - while (*p != '*' && *p != '&' && *p != 0 && *p != ' ')
|
| - ++p;
|
| - SKIP_SPACE (p);
|
| -
|
| - /* Add modifiers '*' / '&'. */
|
| - while (*p == '*' || *p == '&')
|
| - {
|
| - ++p;
|
| - SKIP_SPACE (p);
|
| - }
|
| -
|
| - /* Check for valid type. [Remember: input starts with
|
| - "operator".] */
|
| - copy = savestring (input + 8, p - input - 8);
|
| - expr = NULL;
|
| - val = NULL;
|
| - TRY_CATCH (except, RETURN_MASK_ALL)
|
| - {
|
| - expr = parse_expression (copy);
|
| - val = evaluate_type (expr);
|
| - }
|
| -
|
| - xfree (copy);
|
| - if (expr)
|
| - xfree (expr);
|
| -
|
| - if (val != NULL && value_type (val) != NULL)
|
| - return (p - input);
|
| - }
|
| +static void
|
| +info_vtbl_command (char *arg, int from_tty)
|
| +{
|
| + struct value *value;
|
|
|
| - return 0;
|
| + value = parse_and_eval (arg);
|
| + cplus_print_vtable (value);
|
| }
|
|
|
| void
|
| @@ -1574,4 +1471,10 @@ _initialize_cp_support (void)
|
| first_component_command,
|
| _("Print the first class/namespace component of NAME."),
|
| &maint_cplus_cmd_list);
|
| +
|
| + add_info ("vtbl", info_vtbl_command,
|
| + _("Show the virtual function table for a C++ object.\n\
|
| +Usage: info vtbl EXPRESSION\n\
|
| +Evaluate EXPRESSION and display the virtual function table for the\n\
|
| +resulting object."));
|
| }
|
|
|