From cbe793af8831a7244de326d6b07c60c197f096a2 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 31 Jan 2023 13:24:00 -0700 Subject: [PATCH] Turn allocate_value_lazy into a static "constructor" This changes allocate_value_lazy to be a static "constructor" of struct value. I considered trying to change value to use ordinary new/delete, but it seems to me that due to reference counting, we may someday want to change these static constructors to return value_ref_ptr instead. Approved-By: Simon Marchi --- gdb/ada-lang.c | 2 +- gdb/findvar.c | 2 +- gdb/rust-lang.c | 2 +- gdb/valops.c | 2 +- gdb/value.c | 30 ++++++++++++++---------------- gdb/value.h | 12 +++++++++++- 6 files changed, 29 insertions(+), 21 deletions(-) diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index e13359a68f6..ae2f4df5332 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -561,7 +561,7 @@ coerce_unspec_val_to_type (struct value *val, struct type *type) /* Be careful not to make a lazy not_lval value. */ || (VALUE_LVAL (val) != not_lval && type->length () > val->type ()->length ())) - result = allocate_value_lazy (type); + result = value::allocate_lazy (type); else { result = allocate_value (type); diff --git a/gdb/findvar.c b/gdb/findvar.c index 9420286e91c..cb4eb758bf2 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -294,7 +294,7 @@ value_of_register_lazy (frame_info_ptr frame, int regnum) /* We should have a valid next frame. */ gdb_assert (frame_id_p (get_frame_id (next_frame))); - reg_val = allocate_value_lazy (register_type (gdbarch, regnum)); + reg_val = value::allocate_lazy (register_type (gdbarch, regnum)); VALUE_LVAL (reg_val) = lval_register; VALUE_REGNUM (reg_val) = regnum; VALUE_NEXT_FRAME_ID (reg_val) = get_frame_id (next_frame); diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index aa1590078dc..8f0953649ae 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -349,7 +349,7 @@ rust_val_print_slice (struct value *val, struct ui_file *stream, int recurse, struct type *elt_type = base->type ()->target_type (); struct type *array_type = lookup_array_range_type (elt_type, 0, llen - 1); - struct value *array = allocate_value_lazy (array_type); + struct value *array = value::allocate_lazy (array_type); VALUE_LVAL (array) = lval_memory; array->set_address (value_as_address (base)); value_fetch_lazy (array); diff --git a/gdb/valops.c b/gdb/valops.c index cea9d3ce593..5e6095db81f 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -4079,7 +4079,7 @@ value_slice (struct value *array, int lowbound, int length) slice_type->set_code (array_type->code ()); if (VALUE_LVAL (array) == lval_memory && array->lazy ()) - slice = allocate_value_lazy (slice_type); + slice = value::allocate_lazy (slice_type); else { slice = allocate_value (slice_type); diff --git a/gdb/value.c b/gdb/value.c index 471a98f277b..0dccb7307d6 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -744,12 +744,10 @@ static std::vector value_history; static std::vector all_values; -/* Allocate a lazy value for type TYPE. Its actual content is - "lazily" allocated too: the content field of the return value is - NULL; it will be allocated when it is fetched from the target. */ +/* See value.h. */ struct value * -allocate_value_lazy (struct type *type) +value::allocate_lazy (struct type *type) { struct value *val; @@ -963,7 +961,7 @@ allocate_value_contents (struct value *val, bool check_size) static struct value * allocate_value (struct type *type, bool check_size) { - struct value *val = allocate_value_lazy (type); + struct value *val = value::allocate_lazy (type); allocate_value_contents (val, check_size); val->m_lazy = 0; @@ -1001,7 +999,7 @@ allocate_computed_value (struct type *type, const struct lval_funcs *funcs, void *closure) { - struct value *v = allocate_value_lazy (type); + struct value *v = value::allocate_lazy (type); VALUE_LVAL (v) = lval_computed; v->m_location.computed.funcs = funcs; @@ -1015,7 +1013,7 @@ allocate_computed_value (struct type *type, struct value * allocate_optimized_out_value (struct type *type) { - struct value *retval = allocate_value_lazy (type); + struct value *retval = value::allocate_lazy (type); mark_value_bytes_optimized_out (retval, 0, type->length ()); retval->set_lazy (0); @@ -1545,7 +1543,7 @@ value_copy (const value *arg) struct type *encl_type = arg->enclosing_type (); struct value *val; - val = allocate_value_lazy (encl_type); + val = value::allocate_lazy (encl_type); val->m_type = arg->m_type; VALUE_LVAL (val) = arg->m_lval; val->m_location = arg->m_location; @@ -2950,7 +2948,7 @@ value_primitive_field (struct value *arg1, LONGEST offset, LONGEST bitpos = arg_type->field (fieldno).loc_bitpos (); LONGEST container_bitsize = type->length () * 8; - v = allocate_value_lazy (type); + v = value::allocate_lazy (type); v->m_bitsize = TYPE_FIELD_BITSIZE (arg_type, fieldno); if ((bitpos % container_bitsize) + v->m_bitsize <= container_bitsize && type->length () <= (int) sizeof (LONGEST)) @@ -2988,7 +2986,7 @@ value_primitive_field (struct value *arg1, LONGEST offset, boffset = arg_type->field (fieldno).loc_bitpos () / 8; if (arg1->lazy ()) - v = allocate_value_lazy (arg1->enclosing_type ()); + v = value::allocate_lazy (arg1->enclosing_type ()); else { v = allocate_value (arg1->enclosing_type ()); @@ -3008,7 +3006,7 @@ value_primitive_field (struct value *arg1, LONGEST offset, gdb_assert (PROP_CONST == TYPE_DATA_LOCATION_KIND (type)); /* For dynamic data types defer memory allocation until we actual access the value. */ - v = allocate_value_lazy (type); + v = value::allocate_lazy (type); } else { @@ -3021,7 +3019,7 @@ value_primitive_field (struct value *arg1, LONGEST offset, value_fetch_lazy (arg1); if (arg1->lazy ()) - v = allocate_value_lazy (type); + v = value::allocate_lazy (type); else { v = allocate_value (type); @@ -3426,7 +3424,7 @@ pack_unsigned_long (gdb_byte *buf, struct type *type, ULONGEST num) struct value * value_zero (struct type *type, enum lval_type lv) { - struct value *val = allocate_value_lazy (type); + struct value *val = value::allocate_lazy (type); VALUE_LVAL (val) = (lv == lval_computed ? not_lval : lv); val->m_is_zero = true; @@ -3500,7 +3498,7 @@ value_from_contents_and_address_unresolved (struct type *type, struct value *v; if (valaddr == NULL) - v = allocate_value_lazy (type); + v = value::allocate_lazy (type); else v = value_from_contents (type, valaddr); VALUE_LVAL (v) = lval_memory; @@ -3526,7 +3524,7 @@ value_from_contents_and_address (struct type *type, struct value *v; if (valaddr == NULL) - v = allocate_value_lazy (resolved_type); + v = value::allocate_lazy (resolved_type); else v = value_from_contents (resolved_type, valaddr); if (TYPE_DATA_LOCATION (resolved_type_no_typedef) != NULL @@ -3622,7 +3620,7 @@ value_from_component (struct value *whole, struct type *type, LONGEST offset) struct value *v; if (VALUE_LVAL (whole) == lval_memory && whole->lazy ()) - v = allocate_value_lazy (type); + v = value::allocate_lazy (type); else { v = allocate_value (type); diff --git a/gdb/value.h b/gdb/value.h index 788a3d8514e..29ed2a8a3ce 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -144,6 +144,9 @@ typedef gdb::ref_ptr value_ref_ptr; struct value { +private: + + /* Values can only be created via "static constructors". */ explicit value (struct type *type_) : m_modifiable (1), m_lazy (1), @@ -156,6 +159,13 @@ struct value { } +public: + + /* Allocate a lazy value for type TYPE. Its actual content is + "lazily" allocated too: the content field of the return value is + NULL; it will be allocated when it is fetched from the target. */ + static struct value *allocate_lazy (struct type *type); + ~value (); DISABLE_COPY_AND_ASSIGN (value); @@ -1002,7 +1012,7 @@ extern struct value *read_var_value (struct symbol *var, frame_info_ptr frame); extern struct value *allocate_value (struct type *type); -extern struct value *allocate_value_lazy (struct type *type); + extern void value_contents_copy (struct value *dst, LONGEST dst_offset, struct value *src, LONGEST src_offset, LONGEST length); -- 2.30.2