diff options
author | Tom Tromey <tom@tromey.com> | 2018-04-03 17:45:21 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2018-04-06 15:44:46 -0600 |
commit | 22bc8444e6d377fd016253926c2a2597ff944842 (patch) | |
tree | 6978ec817983a137c65d16cab8bee37f7f45c6d2 /gdb/guile/scm-value.c | |
parent | 7f8a5d38ed00ad4ecc920322c4b852f3cf905a94 (diff) | |
download | gdb-22bc8444e6d377fd016253926c2a2597ff944842.zip gdb-22bc8444e6d377fd016253926c2a2597ff944842.tar.gz gdb-22bc8444e6d377fd016253926c2a2597ff944842.tar.bz2 |
Introduce a gdb_ref_ptr specialization for struct value
struct value is internally reference counted and so, while it also has
some ownership rules unique to it, it makes sense to use a gdb_ref_ptr
when managing it automatically.
This patch removes the existing unique_ptr specialization in favor of
a reference-counted pointer. It also introduces two other
clarifications:
1. Rename value_free to value_decref, which I think is more in line
with what the function actually does; and
2. Change release_value to return a gdb_ref_ptr. This change allows
us to remove the confusing release_value_or_incref function,
primarily by making it much simpler to reason about the result of
release_value.
gdb/ChangeLog
2018-04-06 Tom Tromey <tom@tromey.com>
* varobj.c (varobj_clear_saved_item)
(update_dynamic_varobj_children, install_new_value, ~varobj):
Update.
* value.h (value_incref): Move declaration earlier.
(value_decref): Rename from value_free.
(struct value_ref_policy): New.
(value_ref_ptr): New typedef.
(struct value_deleter): Remove.
(gdb_value_up): Remove typedef.
(release_value): Change return type.
(release_value_or_incref): Remove.
* value.c (set_value_parent): Update.
(value_incref): Change return type.
(value_decref): Rename from value_free.
(value_free_to_mark, free_all_values, free_value_chain): Update.
(release_value): Return value_ref_ptr.
(release_value_or_incref): Remove.
(record_latest_value, set_internalvar, clear_internalvar):
Update.
* stack.c (info_frame_command): Don't call value_free.
* python/py-value.c (valpy_dealloc, valpy_new)
(value_to_value_object): Update.
* printcmd.c (do_examine): Update.
* opencl-lang.c (lval_func_free_closure): Update.
* mi/mi-main.c (register_changed_p): Don't call value_free.
* mep-tdep.c (mep_frame_prev_register): Don't call value_free.
* m88k-tdep.c (m88k_frame_prev_register): Don't call value_free.
* m68hc11-tdep.c (m68hc11_frame_prev_register): Don't call
value_free.
* guile/scm-value.c (vlscm_free_value_smob)
(vlscm_scm_from_value): Update.
* frame.c (frame_register_unwind, frame_unwind_register_signed)
(frame_unwind_register_unsigned, get_frame_register_bytes)
(put_frame_register_bytes): Don't call value_free.
* findvar.c (address_from_register): Don't call value_free.
* dwarf2read.c (dwarf2_compute_name): Don't call value_free.
* dwarf2loc.c (entry_data_value_free_closure)
(value_of_dwarf_reg_entry, free_pieced_value_closure)
(dwarf2_evaluate_loc_desc_full): Update.
* breakpoint.c (update_watchpoint, breakpoint_init_inferior)
(~bpstats, bpstats, bpstat_clear_actions, watchpoint_check)
(~watchpoint, watch_command_1)
(invalidate_bp_value_on_memory_change): Update.
* alpha-tdep.c (alpha_register_to_value): Don't call value_free.
Diffstat (limited to 'gdb/guile/scm-value.c')
-rw-r--r-- | gdb/guile/scm-value.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/gdb/guile/scm-value.c b/gdb/guile/scm-value.c index 5816259..5a28d4d 100644 --- a/gdb/guile/scm-value.c +++ b/gdb/guile/scm-value.c @@ -131,7 +131,7 @@ vlscm_free_value_smob (SCM self) value_smob *v_smob = (value_smob *) SCM_SMOB_DATA (self); vlscm_forget_value_smob (v_smob); - value_free (v_smob->value); + value_decref (v_smob->value); return 0; } @@ -253,8 +253,7 @@ vlscm_scm_from_value (struct value *value) SCM v_scm = vlscm_make_value_smob (); value_smob *v_smob = (value_smob *) SCM_SMOB_DATA (v_scm); - v_smob->value = value; - release_value_or_incref (value); + v_smob->value = release_value (value).release (); vlscm_remember_scheme_value (v_smob); return v_scm; |