aboutsummaryrefslogtreecommitdiff
path: root/gdb/cli
diff options
context:
space:
mode:
authorMichael Snyder <msnyder@vmware.com>2011-02-27 20:57:16 +0000
committerMichael Snyder <msnyder@vmware.com>2011-02-27 20:57:16 +0000
commit3bd0f5efd1910d53733ff9962deee99d7e45d1de (patch)
treef3f77fd22027a884f5bc951c09d9988eae80f4a3 /gdb/cli
parentaf62414197efc46568bd459473b4a22da42d2132 (diff)
downloadgdb-3bd0f5efd1910d53733ff9962deee99d7e45d1de.zip
gdb-3bd0f5efd1910d53733ff9962deee99d7e45d1de.tar.gz
gdb-3bd0f5efd1910d53733ff9962deee99d7e45d1de.tar.bz2
2011-02-24 Michael Snyder <msnyder@vmware.com>
* value.c (value_from_history_ref): New function. * value.h (value_from_history_ref): Export. * cli/cli-utils.c (get_number_trailer): Use value_from_history_ref to parse value history references. * cli/cli-utils.h (get_number_trailer): Update comment. 2011-02-24 Michael Snyder <msnyder@vmware.com> * gdb.base/break.exp: Add tests for delete breakpoints using convenience variables and value history references.
Diffstat (limited to 'gdb/cli')
-rw-r--r--gdb/cli/cli-utils.c54
-rw-r--r--gdb/cli/cli-utils.h4
2 files changed, 37 insertions, 21 deletions
diff --git a/gdb/cli/cli-utils.c b/gdb/cli/cli-utils.c
index 34c368b..133ac53 100644
--- a/gdb/cli/cli-utils.c
+++ b/gdb/cli/cli-utils.c
@@ -21,14 +21,15 @@
#include "cli/cli-utils.h"
#include "gdb_string.h"
#include "value.h"
+#include "gdb_assert.h"
#include <ctype.h>
/* *PP is a string denoting a number. Get the number of the. Advance
*PP after the string and any trailing whitespace.
- Currently the string can either be a number or "$" followed by the
- name of a convenience variable.
+ Currently the string can either be a number, or "$" followed by the
+ name of a convenience variable, or ("$" or "$$") followed by digits.
TRAILER is a character which can be found after the number; most
commonly this is `-'. If you don't want a trailer, use \0. */
@@ -41,24 +42,39 @@ get_number_trailer (char **pp, int trailer)
if (*p == '$')
{
- /* Make a copy of the name, so we can null-terminate it
- to pass to lookup_internalvar(). */
- char *varname;
- char *start = ++p;
- LONGEST val;
-
- while (isalnum (*p) || *p == '_')
- p++;
- varname = (char *) alloca (p - start + 1);
- strncpy (varname, start, p - start);
- varname[p - start] = '\0';
- if (get_internalvar_integer (lookup_internalvar (varname), &val))
- retval = (int) val;
- else
+ struct value *val = value_from_history_ref (p, &p);
+
+ if (val) /* Value history reference */
{
- printf_filtered (_("Convenience variable must "
- "have integer value.\n"));
- retval = 0;
+ if (TYPE_CODE (value_type (val)) == TYPE_CODE_INT)
+ retval = value_as_long (val);
+ else
+ {
+ printf_filtered (_("History value must have integer type."));
+ retval = 0;
+ }
+ }
+ else /* Convenience variable */
+ {
+ /* Internal variable. Make a copy of the name, so we can
+ null-terminate it to pass to lookup_internalvar(). */
+ char *varname;
+ char *start = ++p;
+ LONGEST val;
+
+ while (isalnum (*p) || *p == '_')
+ p++;
+ varname = (char *) alloca (p - start + 1);
+ strncpy (varname, start, p - start);
+ varname[p - start] = '\0';
+ if (get_internalvar_integer (lookup_internalvar (varname), &val))
+ retval = (int) val;
+ else
+ {
+ printf_filtered (_("Convenience variable must "
+ "have integer value.\n"));
+ retval = 0;
+ }
}
}
else
diff --git a/gdb/cli/cli-utils.h b/gdb/cli/cli-utils.h
index 6158999..09240d0 100644
--- a/gdb/cli/cli-utils.h
+++ b/gdb/cli/cli-utils.h
@@ -23,8 +23,8 @@
/* *PP is a string denoting a number. Get the number of the. Advance
*PP after the string and any trailing whitespace.
- Currently the string can either be a number or "$" followed by the
- name of a convenience variable. */
+ Currently the string can either be a number, or "$" followed by the
+ name of a convenience variable, or ("$" or "$$") followed by digits. */
extern int get_number (char **);