mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-17 16:05:56 +08:00
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 <simon.marchi@efficios.com>
This commit is contained in:
@ -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. */
|
/* Be careful not to make a lazy not_lval value. */
|
||||||
|| (VALUE_LVAL (val) != not_lval
|
|| (VALUE_LVAL (val) != not_lval
|
||||||
&& type->length () > val->type ()->length ()))
|
&& type->length () > val->type ()->length ()))
|
||||||
result = allocate_value_lazy (type);
|
result = value::allocate_lazy (type);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result = allocate_value (type);
|
result = allocate_value (type);
|
||||||
|
@ -294,7 +294,7 @@ value_of_register_lazy (frame_info_ptr frame, int regnum)
|
|||||||
/* We should have a valid next frame. */
|
/* We should have a valid next frame. */
|
||||||
gdb_assert (frame_id_p (get_frame_id (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_LVAL (reg_val) = lval_register;
|
||||||
VALUE_REGNUM (reg_val) = regnum;
|
VALUE_REGNUM (reg_val) = regnum;
|
||||||
VALUE_NEXT_FRAME_ID (reg_val) = get_frame_id (next_frame);
|
VALUE_NEXT_FRAME_ID (reg_val) = get_frame_id (next_frame);
|
||||||
|
@ -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 *elt_type = base->type ()->target_type ();
|
||||||
struct type *array_type = lookup_array_range_type (elt_type, 0,
|
struct type *array_type = lookup_array_range_type (elt_type, 0,
|
||||||
llen - 1);
|
llen - 1);
|
||||||
struct value *array = allocate_value_lazy (array_type);
|
struct value *array = value::allocate_lazy (array_type);
|
||||||
VALUE_LVAL (array) = lval_memory;
|
VALUE_LVAL (array) = lval_memory;
|
||||||
array->set_address (value_as_address (base));
|
array->set_address (value_as_address (base));
|
||||||
value_fetch_lazy (array);
|
value_fetch_lazy (array);
|
||||||
|
@ -4079,7 +4079,7 @@ value_slice (struct value *array, int lowbound, int length)
|
|||||||
slice_type->set_code (array_type->code ());
|
slice_type->set_code (array_type->code ());
|
||||||
|
|
||||||
if (VALUE_LVAL (array) == lval_memory && array->lazy ())
|
if (VALUE_LVAL (array) == lval_memory && array->lazy ())
|
||||||
slice = allocate_value_lazy (slice_type);
|
slice = value::allocate_lazy (slice_type);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
slice = allocate_value (slice_type);
|
slice = allocate_value (slice_type);
|
||||||
|
30
gdb/value.c
30
gdb/value.c
@ -744,12 +744,10 @@ static std::vector<value_ref_ptr> value_history;
|
|||||||
|
|
||||||
static std::vector<value_ref_ptr> all_values;
|
static std::vector<value_ref_ptr> all_values;
|
||||||
|
|
||||||
/* Allocate a lazy value for type TYPE. Its actual content is
|
/* See value.h. */
|
||||||
"lazily" allocated too: the content field of the return value is
|
|
||||||
NULL; it will be allocated when it is fetched from the target. */
|
|
||||||
|
|
||||||
struct value *
|
struct value *
|
||||||
allocate_value_lazy (struct type *type)
|
value::allocate_lazy (struct type *type)
|
||||||
{
|
{
|
||||||
struct value *val;
|
struct value *val;
|
||||||
|
|
||||||
@ -963,7 +961,7 @@ allocate_value_contents (struct value *val, bool check_size)
|
|||||||
static struct value *
|
static struct value *
|
||||||
allocate_value (struct type *type, bool check_size)
|
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);
|
allocate_value_contents (val, check_size);
|
||||||
val->m_lazy = 0;
|
val->m_lazy = 0;
|
||||||
@ -1001,7 +999,7 @@ allocate_computed_value (struct type *type,
|
|||||||
const struct lval_funcs *funcs,
|
const struct lval_funcs *funcs,
|
||||||
void *closure)
|
void *closure)
|
||||||
{
|
{
|
||||||
struct value *v = allocate_value_lazy (type);
|
struct value *v = value::allocate_lazy (type);
|
||||||
|
|
||||||
VALUE_LVAL (v) = lval_computed;
|
VALUE_LVAL (v) = lval_computed;
|
||||||
v->m_location.computed.funcs = funcs;
|
v->m_location.computed.funcs = funcs;
|
||||||
@ -1015,7 +1013,7 @@ allocate_computed_value (struct type *type,
|
|||||||
struct value *
|
struct value *
|
||||||
allocate_optimized_out_value (struct type *type)
|
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 ());
|
mark_value_bytes_optimized_out (retval, 0, type->length ());
|
||||||
retval->set_lazy (0);
|
retval->set_lazy (0);
|
||||||
@ -1545,7 +1543,7 @@ value_copy (const value *arg)
|
|||||||
struct type *encl_type = arg->enclosing_type ();
|
struct type *encl_type = arg->enclosing_type ();
|
||||||
struct value *val;
|
struct value *val;
|
||||||
|
|
||||||
val = allocate_value_lazy (encl_type);
|
val = value::allocate_lazy (encl_type);
|
||||||
val->m_type = arg->m_type;
|
val->m_type = arg->m_type;
|
||||||
VALUE_LVAL (val) = arg->m_lval;
|
VALUE_LVAL (val) = arg->m_lval;
|
||||||
val->m_location = arg->m_location;
|
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 bitpos = arg_type->field (fieldno).loc_bitpos ();
|
||||||
LONGEST container_bitsize = type->length () * 8;
|
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);
|
v->m_bitsize = TYPE_FIELD_BITSIZE (arg_type, fieldno);
|
||||||
if ((bitpos % container_bitsize) + v->m_bitsize <= container_bitsize
|
if ((bitpos % container_bitsize) + v->m_bitsize <= container_bitsize
|
||||||
&& type->length () <= (int) sizeof (LONGEST))
|
&& 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;
|
boffset = arg_type->field (fieldno).loc_bitpos () / 8;
|
||||||
|
|
||||||
if (arg1->lazy ())
|
if (arg1->lazy ())
|
||||||
v = allocate_value_lazy (arg1->enclosing_type ());
|
v = value::allocate_lazy (arg1->enclosing_type ());
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
v = allocate_value (arg1->enclosing_type ());
|
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));
|
gdb_assert (PROP_CONST == TYPE_DATA_LOCATION_KIND (type));
|
||||||
/* For dynamic data types defer memory allocation
|
/* For dynamic data types defer memory allocation
|
||||||
until we actual access the value. */
|
until we actual access the value. */
|
||||||
v = allocate_value_lazy (type);
|
v = value::allocate_lazy (type);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -3021,7 +3019,7 @@ value_primitive_field (struct value *arg1, LONGEST offset,
|
|||||||
value_fetch_lazy (arg1);
|
value_fetch_lazy (arg1);
|
||||||
|
|
||||||
if (arg1->lazy ())
|
if (arg1->lazy ())
|
||||||
v = allocate_value_lazy (type);
|
v = value::allocate_lazy (type);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
v = allocate_value (type);
|
v = allocate_value (type);
|
||||||
@ -3426,7 +3424,7 @@ pack_unsigned_long (gdb_byte *buf, struct type *type, ULONGEST num)
|
|||||||
struct value *
|
struct value *
|
||||||
value_zero (struct type *type, enum lval_type lv)
|
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);
|
VALUE_LVAL (val) = (lv == lval_computed ? not_lval : lv);
|
||||||
val->m_is_zero = true;
|
val->m_is_zero = true;
|
||||||
@ -3500,7 +3498,7 @@ value_from_contents_and_address_unresolved (struct type *type,
|
|||||||
struct value *v;
|
struct value *v;
|
||||||
|
|
||||||
if (valaddr == NULL)
|
if (valaddr == NULL)
|
||||||
v = allocate_value_lazy (type);
|
v = value::allocate_lazy (type);
|
||||||
else
|
else
|
||||||
v = value_from_contents (type, valaddr);
|
v = value_from_contents (type, valaddr);
|
||||||
VALUE_LVAL (v) = lval_memory;
|
VALUE_LVAL (v) = lval_memory;
|
||||||
@ -3526,7 +3524,7 @@ value_from_contents_and_address (struct type *type,
|
|||||||
struct value *v;
|
struct value *v;
|
||||||
|
|
||||||
if (valaddr == NULL)
|
if (valaddr == NULL)
|
||||||
v = allocate_value_lazy (resolved_type);
|
v = value::allocate_lazy (resolved_type);
|
||||||
else
|
else
|
||||||
v = value_from_contents (resolved_type, valaddr);
|
v = value_from_contents (resolved_type, valaddr);
|
||||||
if (TYPE_DATA_LOCATION (resolved_type_no_typedef) != NULL
|
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;
|
struct value *v;
|
||||||
|
|
||||||
if (VALUE_LVAL (whole) == lval_memory && whole->lazy ())
|
if (VALUE_LVAL (whole) == lval_memory && whole->lazy ())
|
||||||
v = allocate_value_lazy (type);
|
v = value::allocate_lazy (type);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
v = allocate_value (type);
|
v = allocate_value (type);
|
||||||
|
12
gdb/value.h
12
gdb/value.h
@ -144,6 +144,9 @@ typedef gdb::ref_ptr<struct value, value_ref_policy> value_ref_ptr;
|
|||||||
|
|
||||||
struct value
|
struct value
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
/* Values can only be created via "static constructors". */
|
||||||
explicit value (struct type *type_)
|
explicit value (struct type *type_)
|
||||||
: m_modifiable (1),
|
: m_modifiable (1),
|
||||||
m_lazy (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 ();
|
~value ();
|
||||||
|
|
||||||
DISABLE_COPY_AND_ASSIGN (value);
|
DISABLE_COPY_AND_ASSIGN (value);
|
||||||
@ -1002,7 +1012,7 @@ extern struct value *read_var_value (struct symbol *var,
|
|||||||
frame_info_ptr frame);
|
frame_info_ptr frame);
|
||||||
|
|
||||||
extern struct value *allocate_value (struct type *type);
|
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,
|
extern void value_contents_copy (struct value *dst, LONGEST dst_offset,
|
||||||
struct value *src, LONGEST src_offset,
|
struct value *src, LONGEST src_offset,
|
||||||
LONGEST length);
|
LONGEST length);
|
||||||
|
Reference in New Issue
Block a user