aboutsummaryrefslogtreecommitdiff
path: root/gdb/value.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2018-04-03 18:23:30 -0600
committerTom Tromey <tom@tromey.com>2018-04-06 15:44:48 -0600
commit4d0266a0e0d9e9b615b04ff209a73d3725495835 (patch)
treebd4acd354a7b730e37714dc08f6ead506e2a6b56 /gdb/value.c
parentb4d61099ba840824fd0aac9800403f6278476347 (diff)
downloadgdb-4d0266a0e0d9e9b615b04ff209a73d3725495835.zip
gdb-4d0266a0e0d9e9b615b04ff209a73d3725495835.tar.gz
gdb-4d0266a0e0d9e9b615b04ff209a73d3725495835.tar.bz2
Change value history to use value_ref_ptr
This simplifies the value history implementation by replacing the current data structure with a std::vector, and by making the value history simply hold a reference to each value. gdb/ChangeLog 2018-04-06 Tom Tromey <tom@tromey.com> * value.c (VALUE_HISTORY_CHUNK, struct value_history_chunk) (value_history_chain, value_history_count): Remove. (value_history): New global. (record_latest_value, access_value_history, show_values) (preserve_values): Update.
Diffstat (limited to 'gdb/value.c')
-rw-r--r--gdb/value.c66
1 files changed, 12 insertions, 54 deletions
diff --git a/gdb/value.c b/gdb/value.c
index 013fcfe..677ec42 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -881,25 +881,10 @@ value_contents_eq (const struct value *val1, LONGEST offset1,
}
-/* The value-history records all the values printed
- by print commands during this session. Each chunk
- records 60 consecutive values. The first chunk on
- the chain records the most recent values.
- The total number of values is in value_history_count. */
+/* The value-history records all the values printed by print commands
+ during this session. */
-#define VALUE_HISTORY_CHUNK 60
-
-struct value_history_chunk
- {
- struct value_history_chunk *next;
- struct value *values[VALUE_HISTORY_CHUNK];
- };
-
-/* Chain of chunks now in use. */
-
-static struct value_history_chunk *value_history_chain;
-
-static int value_history_count; /* Abs number of last entry stored. */
+static std::vector<value_ref_ptr> value_history;
/* List of all value objects currently allocated
@@ -1898,24 +1883,9 @@ record_latest_value (struct value *val)
but the current contents of that location. c'est la vie... */
val->modifiable = 0;
- /* Here we treat value_history_count as origin-zero
- and applying to the value being stored now. */
-
- i = value_history_count % VALUE_HISTORY_CHUNK;
- if (i == 0)
- {
- struct value_history_chunk *newobj = XCNEW (struct value_history_chunk);
+ value_history.push_back (release_value (val));
- newobj->next = value_history_chain;
- value_history_chain = newobj;
- }
-
- value_history_chain->values[i] = release_value (val).release ();
-
- /* Now we regard value_history_count as origin-one
- and applying to the value just stored. */
-
- return ++value_history_count;
+ return value_history.size ();
}
/* Return a copy of the value in the history with sequence number NUM. */
@@ -1923,12 +1893,11 @@ record_latest_value (struct value *val)
struct value *
access_value_history (int num)
{
- struct value_history_chunk *chunk;
int i;
int absnum = num;
if (absnum <= 0)
- absnum += value_history_count;
+ absnum += value_history.size ();
if (absnum <= 0)
{
@@ -1939,20 +1908,12 @@ access_value_history (int num)
else
error (_("History does not go back to $$%d."), -num);
}
- if (absnum > value_history_count)
+ if (absnum > value_history.size ())
error (_("History has not yet reached $%d."), absnum);
absnum--;
- /* Now absnum is always absolute and origin zero. */
-
- chunk = value_history_chain;
- for (i = (value_history_count - 1) / VALUE_HISTORY_CHUNK
- - absnum / VALUE_HISTORY_CHUNK;
- i > 0; i--)
- chunk = chunk->next;
-
- return value_copy (chunk->values[absnum % VALUE_HISTORY_CHUNK]);
+ return value_copy (value_history[absnum].get ());
}
static void
@@ -1972,13 +1933,13 @@ show_values (const char *num_exp, int from_tty)
else
{
/* "show values" means print the last 10 values. */
- num = value_history_count - 9;
+ num = value_history.size () - 9;
}
if (num <= 0)
num = 1;
- for (i = num; i < num + 10 && i <= value_history_count; i++)
+ for (i = num; i < num + 10 && i <= value_history.size (); i++)
{
struct value_print_options opts;
@@ -2626,7 +2587,6 @@ void
preserve_values (struct objfile *objfile)
{
htab_t copied_types;
- struct value_history_chunk *cur;
struct internalvar *var;
int i;
@@ -2634,10 +2594,8 @@ preserve_values (struct objfile *objfile)
it is soon to be deleted. */
copied_types = create_copied_types_hash (objfile);
- for (cur = value_history_chain; cur; cur = cur->next)
- for (i = 0; i < VALUE_HISTORY_CHUNK; i++)
- if (cur->values[i])
- preserve_one_value (cur->values[i], objfile, copied_types);
+ for (const value_ref_ptr &item : value_history)
+ preserve_one_value (item.get (), objfile, copied_types);
for (var = internalvars; var; var = var->next)
preserve_one_internalvar (var, objfile, copied_types);