2003-01-07 David Carlton <carlton@math.stanford.edu>
* linespec.c (decode_line_1): Move code into decode_dollar. (decode_dollar): New function.
This commit is contained in:
parent
9d3c96e6ec
commit
14e91ac52e
|
@ -1,3 +1,8 @@
|
|||
2003-01-07 David Carlton <carlton@math.stanford.edu>
|
||||
|
||||
* linespec.c (decode_line_1): Move code into decode_dollar.
|
||||
(decode_dollar): New function.
|
||||
|
||||
2003-01-07 Andrew Cagney <cagney@redhat.com>
|
||||
|
||||
* arm-tdep.c (arm_init_extra_frame_info): Use
|
||||
|
|
145
gdb/linespec.c
145
gdb/linespec.c
|
@ -81,6 +81,12 @@ symtabs_and_lines decode_all_digits (char **argptr,
|
|||
struct symtab *s,
|
||||
char *q);
|
||||
|
||||
static struct symtabs_and_lines decode_dollar (char *copy,
|
||||
int funfirstline,
|
||||
struct symtab *default_symtab,
|
||||
char ***canonical,
|
||||
struct symtab *s);
|
||||
|
||||
static struct
|
||||
symtabs_and_lines symbol_found (int funfirstline,
|
||||
char ***canonical,
|
||||
|
@ -548,8 +554,6 @@ struct symtabs_and_lines
|
|||
decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
|
||||
int default_line, char ***canonical)
|
||||
{
|
||||
struct symtabs_and_lines values;
|
||||
struct symtab_and_line val;
|
||||
char *p;
|
||||
char *q;
|
||||
struct symtab *s = NULL;
|
||||
|
@ -570,8 +574,6 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
|
|||
int is_quote_enclosed;
|
||||
char *saved_arg = *argptr;
|
||||
|
||||
init_sal (&val); /* initialize to zeroes */
|
||||
|
||||
/* Defaults have defaults. */
|
||||
|
||||
initialize_defaults (&default_symtab, &default_line);
|
||||
|
@ -705,64 +707,8 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
|
|||
be history value, or it may be a convenience variable */
|
||||
|
||||
if (*copy == '$')
|
||||
{
|
||||
struct value *valx;
|
||||
int index = 0;
|
||||
int need_canonical = 0;
|
||||
|
||||
p = (copy[1] == '$') ? copy + 2 : copy + 1;
|
||||
while (*p >= '0' && *p <= '9')
|
||||
p++;
|
||||
if (!*p) /* reached end of token without hitting non-digit */
|
||||
{
|
||||
/* 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.");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Not all digits -- may be user variable/function or a
|
||||
convenience variable */
|
||||
|
||||
/* Look up entire name as a symbol first */
|
||||
sym = lookup_symbol (copy, 0, VAR_NAMESPACE, 0, &sym_symtab);
|
||||
s = (struct symtab *) 0;
|
||||
need_canonical = 1;
|
||||
/* Symbol was found --> jump to normal symbol processing. */
|
||||
if (sym)
|
||||
return symbol_found (funfirstline, canonical, copy, sym,
|
||||
NULL, sym_symtab);
|
||||
|
||||
/* If symbol was not found, look in minimal symbol tables */
|
||||
msymbol = lookup_minimal_symbol (copy, NULL, NULL);
|
||||
/* Min symbol was found --> jump to minsym processing. */
|
||||
if (msymbol)
|
||||
return minsym_found (funfirstline, msymbol);
|
||||
|
||||
/* Not a user variable or function -- must be convenience variable */
|
||||
need_canonical = (s == 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.");
|
||||
}
|
||||
|
||||
/* Either history value or convenience value from above, in valx */
|
||||
val.symtab = s ? s : default_symtab;
|
||||
val.line = value_as_long (valx);
|
||||
val.pc = 0;
|
||||
|
||||
values.sals = (struct symtab_and_line *) xmalloc (sizeof val);
|
||||
values.sals[0] = val;
|
||||
values.nelts = 1;
|
||||
|
||||
if (need_canonical)
|
||||
build_canonical_line_spec (values.sals, NULL, canonical);
|
||||
|
||||
return values;
|
||||
}
|
||||
|
||||
return decode_dollar (copy, funfirstline, default_symtab,
|
||||
canonical, s);
|
||||
|
||||
/* Look up that token as a variable.
|
||||
If file specified, use that file's per-file block to start with. */
|
||||
|
@ -785,7 +731,6 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
|
|||
error ("No symbol table is loaded. Use the \"file\" command.");
|
||||
|
||||
error ("Function \"%s\" not defined.", copy);
|
||||
return values; /* for lint */
|
||||
}
|
||||
|
||||
|
||||
|
@ -1370,6 +1315,80 @@ decode_all_digits (char **argptr, struct symtab *default_symtab,
|
|||
|
||||
|
||||
|
||||
/* Decode a linespec starting with a dollar sign. */
|
||||
|
||||
static struct symtabs_and_lines
|
||||
decode_dollar (char *copy, int funfirstline, struct symtab *default_symtab,
|
||||
char ***canonical, struct symtab *s)
|
||||
{
|
||||
struct value *valx;
|
||||
int index = 0;
|
||||
int need_canonical = 0;
|
||||
struct symtabs_and_lines values;
|
||||
struct symtab_and_line val;
|
||||
char *p;
|
||||
struct symbol *sym;
|
||||
/* The symtab that SYM was found in. */
|
||||
struct symtab *sym_symtab;
|
||||
struct minimal_symbol *msymbol;
|
||||
|
||||
p = (copy[1] == '$') ? copy + 2 : copy + 1;
|
||||
while (*p >= '0' && *p <= '9')
|
||||
p++;
|
||||
if (!*p) /* reached end of token without hitting non-digit */
|
||||
{
|
||||
/* 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.");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Not all digits -- may be user variable/function or a
|
||||
convenience variable */
|
||||
|
||||
/* Look up entire name as a symbol first */
|
||||
sym = lookup_symbol (copy, 0, VAR_NAMESPACE, 0, &sym_symtab);
|
||||
s = (struct symtab *) 0;
|
||||
need_canonical = 1;
|
||||
/* Symbol was found --> jump to normal symbol processing. */
|
||||
if (sym)
|
||||
return symbol_found (funfirstline, canonical, copy, sym,
|
||||
NULL, sym_symtab);
|
||||
|
||||
/* If symbol was not found, look in minimal symbol tables */
|
||||
msymbol = lookup_minimal_symbol (copy, NULL, NULL);
|
||||
/* Min symbol was found --> jump to minsym processing. */
|
||||
if (msymbol)
|
||||
return minsym_found (funfirstline, msymbol);
|
||||
|
||||
/* Not a user variable or function -- must be convenience variable */
|
||||
need_canonical = (s == 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.");
|
||||
}
|
||||
|
||||
init_sal (&val);
|
||||
|
||||
/* Either history value or convenience value from above, in valx */
|
||||
val.symtab = s ? s : default_symtab;
|
||||
val.line = value_as_long (valx);
|
||||
val.pc = 0;
|
||||
|
||||
values.sals = (struct symtab_and_line *) xmalloc (sizeof val);
|
||||
values.sals[0] = val;
|
||||
values.nelts = 1;
|
||||
|
||||
if (need_canonical)
|
||||
build_canonical_line_spec (values.sals, NULL, canonical);
|
||||
|
||||
return values;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Now come some functions that are called from multiple places within
|
||||
decode_line_1. */
|
||||
|
||||
|
|
Loading…
Reference in New Issue