diff options
author | Tom Tromey <tromey@redhat.com> | 2011-12-22 19:51:10 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2011-12-22 19:51:10 +0000 |
commit | e848a8a515f6a2a2b036933ed430c0aa6dbc2fde (patch) | |
tree | f9a9baa6df49f8417c91191f17e933c9a05d996e /gdb/value.c | |
parent | 87784a4754fe23d02ee8392357a8291ff2b6ed79 (diff) | |
download | gdb-e848a8a515f6a2a2b036933ed430c0aa6dbc2fde.zip gdb-e848a8a515f6a2a2b036933ed430c0aa6dbc2fde.tar.gz gdb-e848a8a515f6a2a2b036933ed430c0aa6dbc2fde.tar.bz2 |
PR python/12533:
* value.h (release_value_or_incref): Declare.
* value.c (struct value) <released>: New field.
(free_all_values, release_value, value_release_to_mark): Update
'released'.
(release_value_or_incref): New function.
* python/py-value.c (valpy_new): Use release_value_or_incref.
(value_to_value_object): Likewise.
* varobj.c (install_new_value): Move value_incref earlier.
Diffstat (limited to 'gdb/value.c')
-rw-r--r-- | gdb/value.c | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/gdb/value.c b/gdb/value.c index b0aa415..d02bc27 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -208,6 +208,9 @@ struct value used instead of read_memory to enable extra caching. */ unsigned int stack : 1; + /* If the value has been released. */ + unsigned int released : 1; + /* Location of value (if lval). */ union { @@ -1210,6 +1213,7 @@ value_free_to_mark (struct value *mark) for (val = all_values; val && val != mark; val = next) { next = val->next; + val->released = 1; value_free (val); } all_values = val; @@ -1228,6 +1232,7 @@ free_all_values (void) for (val = all_values; val; val = next) { next = val->next; + val->released = 1; value_free (val); } @@ -1260,6 +1265,7 @@ release_value (struct value *val) { all_values = val->next; val->next = NULL; + val->released = 1; return; } @@ -1269,11 +1275,26 @@ release_value (struct value *val) { v->next = val->next; val->next = NULL; + val->released = 1; break; } } } +/* If the value is not already released, release it. + If the value is already released, increment its reference count. + That is, this function ensures that the value is released from the + value chain and that the caller owns a reference to it. */ + +void +release_value_or_incref (struct value *val) +{ + if (val->released) + value_incref (val); + else + release_value (val); +} + /* Release all values up to mark */ struct value * value_release_to_mark (struct value *mark) @@ -1282,12 +1303,15 @@ value_release_to_mark (struct value *mark) struct value *next; for (val = next = all_values; next; next = next->next) - if (next->next == mark) - { - all_values = next->next; - next->next = NULL; - return val; - } + { + if (next->next == mark) + { + all_values = next->next; + next->next = NULL; + return val; + } + next->released = 1; + } all_values = 0; return val; } |