static struct block_symbol cp_lookup_symbol_in_namespace (const char *the_namespace, const char *name, const struct block *block, const domain_enum domain, int search) { char *concatenated_name = NULL; int is_in_anonymous; unsigned int prefix_len; struct block_symbol sym; if (the_namespace[0] != '\0') { concatenated_name = (char *) alloca (strlen (the_namespace) + 2 + strlen (name) + 1); strcpy (concatenated_name, the_namespace); strcat (concatenated_name, "::"); strcat (concatenated_name, name); name = concatenated_name; } prefix_len = cp_entire_prefix_len (name); if (prefix_len == 0) return cp_lookup_bare_symbol (NULL, name, block, domain, search); /* This would be simpler if we just called cp_lookup_nested_symbol at this point. But that would require first looking up the containing class/namespace. Since we're only searching static and global blocks there's often no need to first do that lookup. */ is_in_anonymous = the_namespace[0] != '\0' && cp_is_in_anonymous (the_namespace); sym = cp_basic_lookup_symbol (name, block, domain, is_in_anonymous); if (sym.symbol != NULL) return sym; if (search) sym = cp_search_static_and_baseclasses (name, block, domain, prefix_len, is_in_anonymous); return sym; }
void cp_set_block_scope (const struct symbol *symbol, struct block *block, struct obstack *obstack) { /* Make sure that the name was originally mangled: if not, there certainly isn't any namespace information to worry about! */ if (SYMBOL_CPLUS_DEMANGLED_NAME (symbol) != NULL) { if (processing_has_namespace_info) { block_set_scope (block, obsavestring (processing_current_prefix, strlen (processing_current_prefix), obstack), obstack); } else { /* Try to figure out the appropriate namespace from the demangled name. */ /* FIXME: carlton/2003-04-15: If the function in question is a method of a class, the name will actually include the name of the class as well. This should be harmless, but is a little unfortunate. */ const char *name = SYMBOL_CPLUS_DEMANGLED_NAME (symbol); unsigned int prefix_len = cp_entire_prefix_len (name); block_set_scope (block, obsavestring (name, prefix_len, obstack), obstack); } } }
struct block_symbol cp_lookup_symbol_imports_or_template (const char *scope, const char *name, const struct block *block, const domain_enum domain) { struct symbol *function = BLOCK_FUNCTION (block); struct block_symbol result; if (symbol_lookup_debug) { fprintf_unfiltered (gdb_stdlog, "cp_lookup_symbol_imports_or_template" " (%s, %s, %s, %s)\n", scope, name, host_address_to_string (block), domain_name (domain)); } if (function != NULL && SYMBOL_LANGUAGE (function) == language_cplus) { /* Search the function's template parameters. */ if (SYMBOL_IS_CPLUS_TEMPLATE_FUNCTION (function)) { struct template_symbol *templ = (struct template_symbol *) function; struct symbol *sym = search_symbol_list (name, templ->n_template_arguments, templ->template_arguments); if (sym != NULL) { if (symbol_lookup_debug) { fprintf_unfiltered (gdb_stdlog, "cp_lookup_symbol_imports_or_template" " (...) = %s\n", host_address_to_string (sym)); } return (struct block_symbol) {sym, block}; } } /* Search the template parameters of the function's defining context. */ if (SYMBOL_NATURAL_NAME (function)) { struct type *context; char *name_copy = xstrdup (SYMBOL_NATURAL_NAME (function)); struct cleanup *cleanups = make_cleanup (xfree, name_copy); const struct language_defn *lang = language_def (language_cplus); struct gdbarch *arch = symbol_arch (function); const struct block *parent = BLOCK_SUPERBLOCK (block); struct symbol *sym; while (1) { unsigned int prefix_len = cp_entire_prefix_len (name_copy); if (prefix_len == 0) context = NULL; else { name_copy[prefix_len] = '\0'; context = lookup_typename (lang, arch, name_copy, parent, 1); } if (context == NULL) break; sym = search_symbol_list (name, TYPE_N_TEMPLATE_ARGUMENTS (context), TYPE_TEMPLATE_ARGUMENTS (context)); if (sym != NULL) { do_cleanups (cleanups); if (symbol_lookup_debug) { fprintf_unfiltered (gdb_stdlog, "cp_lookup_symbol_imports_or_template (...) = %s\n", host_address_to_string (sym)); } return (struct block_symbol) {sym, parent}; } } do_cleanups (cleanups); } }