/* Parser for linespec for the GNU debugger, GDB.
- Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
- 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+
+ Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+ 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
Free Software Foundation, Inc.
This file is part of GDB.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
#include "defs.h"
#include "symtab.h"
#include "block.h"
#include "objc-lang.h"
#include "linespec.h"
+#include "exceptions.h"
+#include "language.h"
/* We share this one with symtab.c, but it is not exported widely. */
struct symbol *sym_class);
static int collect_methods (char *copy, struct type *t,
+ struct symbol *sym_class,
struct symbol **sym_arr);
static NORETURN void cplusplus_error (const char *name,
static int total_number_of_methods (struct type *type);
-static int find_methods (struct type *, char *, struct symbol **);
+static int find_methods (struct type *, char *,
+ enum language, struct symbol **);
static int add_matching_methods (int method_counter, struct type *t,
+ enum language language,
struct symbol **sym_arr);
static int add_constructors (int method_counter, struct type *t,
+ enum language language,
struct symbol **sym_arr);
static void build_canonical_line_spec (struct symtab_and_line *,
Note that this function is g++ specific. */
static int
-find_methods (struct type *t, char *name, struct symbol **sym_arr)
+find_methods (struct type *t, char *name, enum language language,
+ struct symbol **sym_arr)
{
int i1 = 0;
int ibase;
unless we figure out how to get the physname without the name of
the class, then the loop can't do any good. */
if (class_name
- && (lookup_symbol (class_name, (struct block *) NULL,
- STRUCT_DOMAIN, (int *) NULL,
+ && (lookup_symbol_in_language (class_name, (struct block *) NULL,
+ STRUCT_DOMAIN, language, (int *) NULL,
(struct symtab **) NULL)))
{
int method_counter;
if (strcmp_iw (name, method_name) == 0)
/* Find all the overloaded methods with that name. */
- i1 += add_matching_methods (method_counter, t,
+ i1 += add_matching_methods (method_counter, t, language,
sym_arr + i1);
else if (strncmp (class_name, name, name_len) == 0
&& (class_name[name_len] == '\0'
|| class_name[name_len] == '<'))
- i1 += add_constructors (method_counter, t,
+ i1 += add_constructors (method_counter, t, language,
sym_arr + i1);
}
}
if (i1 == 0)
for (ibase = 0; ibase < TYPE_N_BASECLASSES (t); ibase++)
- i1 += find_methods (TYPE_BASECLASS (t, ibase), name, sym_arr + i1);
+ i1 += find_methods (TYPE_BASECLASS (t, ibase), name,
+ language, sym_arr + i1);
return i1;
}
static int
add_matching_methods (int method_counter, struct type *t,
- struct symbol **sym_arr)
+ enum language language, struct symbol **sym_arr)
{
int field_counter;
int i1 = 0;
}
else
phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
-
+
/* Destructor is handled by caller, don't add it to
the list. */
if (is_destructor_name (phys_name) != 0)
continue;
- sym_arr[i1] = lookup_symbol (phys_name,
+ sym_arr[i1] = lookup_symbol_in_language (phys_name,
NULL, VAR_DOMAIN,
+ language,
(int *) NULL,
(struct symtab **) NULL);
if (sym_arr[i1])
static int
add_constructors (int method_counter, struct type *t,
- struct symbol **sym_arr)
+ enum language language, struct symbol **sym_arr)
{
int field_counter;
int i1 = 0;
{
struct fn_field *f;
char *phys_name;
-
+
f = TYPE_FN_FIELDLIST1 (t, method_counter);
/* GCC 3.x will never produce stabs stub methods, so
/* If this method is actually defined, include it in the
list. */
- sym_arr[i1] = lookup_symbol (phys_name,
+ sym_arr[i1] = lookup_symbol_in_language (phys_name,
NULL, VAR_DOMAIN,
+ language,
(int *) NULL,
(struct symtab **) NULL);
if (sym_arr[i1])
}
i = 0;
- printf_unfiltered ("[0] cancel\n[1] all\n");
+ printf_unfiltered (_("[0] cancel\n[1] all\n"));
while (i < nelts)
{
init_sal (&return_values.sals[i]); /* Initialize to zeroes. */
values.sals[i].symtab->filename,
values.sals[i].line);
else
- printf_unfiltered ("[%d] %s at ?FILE:%d [No symtab? Probably broken debug info...]\n",
+ printf_unfiltered (_("[%d] %s at ?FILE:%d [No symtab? Probably broken debug info...]\n"),
(i + 2),
SYMBOL_PRINT_NAME (sym_arr[i]),
values.sals[i].line);
}
else
- printf_unfiltered ("?HERE\n");
+ printf_unfiltered (_("?HERE\n"));
i++;
}
args = command_line_input (prompt, 0, "overload-choice");
if (args == 0 || *args == 0)
- error_no_arg ("one or more choice numbers");
+ error_no_arg (_("one or more choice numbers"));
i = 0;
while (*args)
while (*arg1 >= '0' && *arg1 <= '9')
arg1++;
if (*arg1 && *arg1 != ' ' && *arg1 != '\t')
- error ("Arguments must be choice numbers.");
+ error (_("Arguments must be choice numbers."));
num = atoi (args);
if (num == 0)
- error ("canceled");
+ error (_("canceled"));
else if (num == 1)
{
if (canonical_arr)
if (num >= nelts + 2)
{
- printf_unfiltered ("No choice number %d.\n", num);
+ printf_unfiltered (_("No choice number %d.\n"), num);
}
else
{
}
else
{
- printf_unfiltered ("duplicate request for %d ignored.\n", num);
+ printf_unfiltered (_("duplicate request for %d ignored.\n"), num);
}
}
{
p = skip_quoted (*argptr);
if (p[-1] != '\'')
- error ("Unmatched single quote.");
+ error (_("Unmatched single quote."));
}
else if (is_objc_method)
{
{
char *temp_end = find_template_name_end (p);
if (!temp_end)
- error ("malformed template specification in command");
+ error (_("malformed template specification in command"));
p = temp_end;
}
/* Check for a colon and a plus or minus and a [ (which
struct symbol *sym = NULL;
char *copy = NULL;
struct block *block = NULL;
- int i1 = 0;
- int i2 = 0;
+ unsigned i1 = 0;
+ unsigned i2 = 0;
values.sals = NULL;
values.nelts = 0;
sym = find_pc_function (SYMBOL_VALUE_ADDRESS (sym_arr[0]));
if ((sym != NULL) && strcmp (SYMBOL_LINKAGE_NAME (sym_arr[0]), SYMBOL_LINKAGE_NAME (sym)) != 0)
{
- warning ("debugging symbol \"%s\" does not match selector; ignoring", SYMBOL_LINKAGE_NAME (sym));
+ warning (_("debugging symbol \"%s\" does not match selector; ignoring"), SYMBOL_LINKAGE_NAME (sym));
sym = NULL;
}
}
{
temp_end = find_template_name_end (p);
if (!temp_end)
- error ("malformed template specification in command");
+ error (_("malformed template specification in command"));
p = temp_end;
}
/* Note that, since, at the start of this loop, p would be
/* Find all methods with a matching name, and put them in
sym_arr. */
- i1 = collect_methods (copy, t, sym_arr);
+ i1 = collect_methods (copy, t, sym_class, sym_arr);
if (i1 == 1)
{
}
else
{
+ values.sals = NULL;
values.nelts = 0;
}
return values;
static int
collect_methods (char *copy, struct type *t,
- struct symbol **sym_arr)
+ struct symbol *sym_class, struct symbol **sym_arr)
{
int i1 = 0; /* Counter for the symbol array. */
}
}
else
- i1 = find_methods (t, copy, sym_arr);
+ i1 = find_methods (t, copy, SYMBOL_LANGUAGE (sym_class), sym_arr);
return i1;
}
if (file_symtab == 0)
{
if (!have_full_symbols () && !have_partial_symbols ())
- error ("No symbol table is loaded. Use the \"file\" command.");
+ error (_("No symbol table is loaded. Use the \"file\" command."));
if (not_found_ptr)
- {
- *not_found_ptr = 1;
- /* The caller has indicated that it wishes quiet notification of any
- error where the function or file is not found. A call to
- error_silent causes an error to occur, but it does not issue
- the supplied message. The message can be manually output by
- the caller, if desired. This is used, for example, when
- attempting to set breakpoints for functions in shared libraries
- that have not yet been loaded. */
- error_silent ("No source file named %s.", copy);
- }
- error ("No source file named %s.", copy);
+ *not_found_ptr = 1;
+ throw_error (NOT_FOUND_ERROR, _("No source file named %s."), copy);
}
/* Discard the file name from the arg. */
/* We have a value history reference. */
sscanf ((copy[1] == '$') ? copy + 2 : copy + 1, "%d", &index);
valx = access_value_history ((copy[1] == '$') ? -index : index);
- if (TYPE_CODE (VALUE_TYPE (valx)) != TYPE_CODE_INT)
- error ("History values used in line specs must have integer values.");
+ if (TYPE_CODE (value_type (valx)) != TYPE_CODE_INT)
+ error (_("History values used in line specs must have integer values."));
}
else
{
/* Not a user variable or function -- must be convenience variable. */
need_canonical = (file_symtab == 0) ? 1 : 0;
valx = value_of_internalvar (lookup_internalvar (copy + 1));
- if (TYPE_CODE (VALUE_TYPE (valx)) != TYPE_CODE_INT)
- error ("Convenience variables used in line specs must have integer values.");
+ if (TYPE_CODE (value_type (valx)) != TYPE_CODE_INT)
+ error (_("Convenience variables used in line specs must have integer values."));
}
init_sal (&val);
if (!have_full_symbols () &&
!have_partial_symbols () && !have_minimal_symbols ())
- error ("No symbol table is loaded. Use the \"file\" command.");
+ error (_("No symbol table is loaded. Use the \"file\" command."));
if (not_found_ptr)
- {
- *not_found_ptr = 1;
- /* The caller has indicated that it wishes quiet notification of any
- error where the function or file is not found. A call to
- error_silent causes an error to occur, but it does not issue
- the supplied message. The message can be manually output by
- the caller, if desired. This is used, for example, when
- attempting to set breakpoints for functions in shared libraries
- that have not yet been loaded. */
- error_silent ("Function \"%s\" not defined.", copy);
- }
-
- error ("Function \"%s\" not defined.", copy);
+ *not_found_ptr = 1;
+ throw_error (NOT_FOUND_ERROR, _("Function \"%s\" not defined."), copy);
}
else
{
if (funfirstline)
- error ("\"%s\" is not a function", copy);
+ error (_("\"%s\" is not a function"), copy);
else if (SYMBOL_LINE (sym) != 0)
{
/* We know its line number. */
/* FIXME: Shouldn't we just set .line and .symtab to zero
and return? For example, "info line foo" could print
the address. */
- error ("Line number not known for symbol \"%s\"", copy);
+ error (_("Line number not known for symbol \"%s\""), copy);
}
}
values.sals[0].section = SYMBOL_BFD_SECTION (msymbol);
if (funfirstline)
{
- values.sals[0].pc += FUNCTION_START_OFFSET;
- values.sals[0].pc = SKIP_PROLOGUE (values.sals[0].pc);
+ values.sals[0].pc += DEPRECATED_FUNCTION_START_OFFSET;
+ values.sals[0].pc = gdbarch_skip_prologue
+ (current_gdbarch, values.sals[0].pc);
}
values.nelts = 1;
return values;