X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fcp-namespace.c;h=f27783ae5ac48c67d8a61b34dd5fca6f22cb8518;hb=0fc21fd8cf92de78c3c383378e70a2955e2631c3;hp=0f1b452f6510fcd234ba8af44431906e9f62a8db;hpb=41c977aa5c81c04a9fea61bfe0b88e428a4b1839;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c index 0f1b452f65..f27783ae5a 100644 --- a/gdb/cp-namespace.c +++ b/gdb/cp-namespace.c @@ -1,5 +1,5 @@ /* Helper routines for C++ support in GDB. - Copyright (C) 2003-2016 Free Software Foundation, Inc. + Copyright (C) 2003-2017 Free Software Foundation, Inc. Contributed by David Carlton and by Kealia, Inc. @@ -32,6 +32,7 @@ #include "buildsym.h" #include "language.h" #include "namespace.h" +#include static struct block_symbol cp_lookup_nested_symbol_1 (struct type *container_type, @@ -245,50 +246,44 @@ cp_search_static_and_baseclasses (const char *name, unsigned int prefix_len, int is_in_anonymous) { - struct block_symbol sym; - char *klass, *nested; - struct cleanup *cleanup; - struct block_symbol klass_sym; - struct type *klass_type; - /* Check for malformed input. */ if (prefix_len + 2 > strlen (name) || name[prefix_len + 1] != ':') return null_block_symbol; - /* Find the name of the class and the name of the method, variable, etc. */ - - /* The class name is everything up to and including PREFIX_LEN. */ - klass = savestring (name, prefix_len); + /* The class, namespace or function name is everything up to and + including PREFIX_LEN. */ + std::string scope (name, prefix_len); /* The rest of the name is everything else past the initial scope operator. */ - nested = xstrdup (name + prefix_len + 2); - - /* Add cleanups to free memory for these strings. */ - cleanup = make_cleanup (xfree, klass); - make_cleanup (xfree, nested); - - /* Lookup a class named KLASS. If none is found, there is nothing - more that can be done. KLASS could be a namespace, so always look - in VAR_DOMAIN. This works for classes too because of - symbol_matches_domain (which should be replaced with something else, - but it's what we have today). */ - klass_sym = lookup_global_symbol (klass, block, VAR_DOMAIN); - if (klass_sym.symbol == NULL) - { - do_cleanups (cleanup); - return null_block_symbol; - } - klass_type = SYMBOL_TYPE (klass_sym.symbol); + const char *nested = name + prefix_len + 2; + + /* Lookup the scope symbol. If none is found, there is nothing more + that can be done. SCOPE could be a namespace, so always look in + VAR_DOMAIN. This works for classes too because of + symbol_matches_domain (which should be replaced with something + else, but it's what we have today). */ + block_symbol scope_sym = lookup_symbol_in_static_block (scope.c_str (), + block, VAR_DOMAIN); + if (scope_sym.symbol == NULL) + scope_sym = lookup_global_symbol (scope.c_str (), block, VAR_DOMAIN); + if (scope_sym.symbol == NULL) + return null_block_symbol; - /* Look for a symbol named NESTED in this class. + struct type *scope_type = SYMBOL_TYPE (scope_sym.symbol); + + /* If the scope is a function/method, then look up NESTED as a local + static variable. E.g., "print 'function()::static_var'". */ + if (TYPE_CODE (scope_type) == TYPE_CODE_FUNC + || TYPE_CODE (scope_type) == TYPE_CODE_METHOD) + return lookup_symbol (nested, SYMBOL_BLOCK_VALUE (scope_sym.symbol), + VAR_DOMAIN, NULL); + + /* Look for a symbol named NESTED in this class/namespace. The caller is assumed to have already have done a basic lookup of NAME. So we pass zero for BASIC_LOOKUP to cp_lookup_nested_symbol_1 here. */ - sym = cp_lookup_nested_symbol_1 (klass_type, nested, name, block, domain, - 0, is_in_anonymous); - - do_cleanups (cleanup); - return sym; + return cp_lookup_nested_symbol_1 (scope_type, nested, name, + block, domain, 0, is_in_anonymous); } /* Look up NAME in the C++ namespace NAMESPACE. Other arguments are @@ -567,8 +562,7 @@ cp_lookup_symbol_imports_or_template (const char *scope, if (SYMBOL_NATURAL_NAME (function)) { struct type *context; - char *name_copy = xstrdup (SYMBOL_NATURAL_NAME (function)); - struct cleanup *cleanups = make_cleanup (xfree, name_copy); + std::string name_copy (SYMBOL_NATURAL_NAME (function)); const struct language_defn *lang = language_def (language_cplus); struct gdbarch *arch = symbol_arch (function); const struct block *parent = BLOCK_SUPERBLOCK (block); @@ -576,15 +570,16 @@ cp_lookup_symbol_imports_or_template (const char *scope, while (1) { - unsigned int prefix_len = cp_entire_prefix_len (name_copy); + unsigned int prefix_len + = cp_entire_prefix_len (name_copy.c_str ()); if (prefix_len == 0) context = NULL; else { - name_copy[prefix_len] = '\0'; + name_copy.erase (prefix_len); context = lookup_typename (lang, arch, - name_copy, + name_copy.c_str (), parent, 1); } @@ -597,7 +592,6 @@ cp_lookup_symbol_imports_or_template (const char *scope, TYPE_TEMPLATE_ARGUMENTS (context)); if (sym != NULL) { - do_cleanups (cleanups); if (symbol_lookup_debug) { fprintf_unfiltered @@ -608,8 +602,6 @@ cp_lookup_symbol_imports_or_template (const char *scope, return (struct block_symbol) {sym, parent}; } } - - do_cleanups (cleanups); } } @@ -832,34 +824,27 @@ find_symbol_in_baseclass (struct type *parent_type, const char *name, { int i; struct block_symbol sym; - struct cleanup *cleanup; - char *concatenated_name; sym.symbol = NULL; sym.block = NULL; - concatenated_name = NULL; - cleanup = make_cleanup (free_current_contents, &concatenated_name); for (i = 0; i < TYPE_N_BASECLASSES (parent_type); ++i) { - size_t len; struct type *base_type = TYPE_BASECLASS (parent_type, i); const char *base_name = TYPE_BASECLASS_NAME (parent_type, i); if (base_name == NULL) continue; - len = strlen (base_name) + 2 + strlen (name) + 1; - concatenated_name = (char *) xrealloc (concatenated_name, len); - xsnprintf (concatenated_name, len, "%s::%s", base_name, name); + std::string concatenated_name = std::string (base_name) + "::" + name; - sym = cp_lookup_nested_symbol_1 (base_type, name, concatenated_name, + sym = cp_lookup_nested_symbol_1 (base_type, name, + concatenated_name.c_str (), block, domain, 1, is_in_anonymous); if (sym.symbol != NULL) break; } - do_cleanups (cleanup); return sym; } @@ -1097,9 +1082,6 @@ maintenance_cplus_namespace (char *args, int from_tty) printf_unfiltered (_("The `maint namespace' command was removed.\n")); } -/* Provide a prototype to silence -Wmissing-prototypes. */ -extern initialize_file_ftype _initialize_cp_namespace; - void _initialize_cp_namespace (void) {