diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 10c635f534..e458c4248c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2010-11-10 Doug Evans + + * value.c (set_value_enclosing_type): Renamed from + value_change_enclosing_type. All callers updated. + * value.h (set_value_enclosing_type): Update. + * valops.c (value_full_object): Always return a copy if we need to + make changes to the input value. + 2010-11-09 Pedro Alves * breakpoint.c (watch_command_1): Get a pointer of the lazy diff --git a/gdb/valops.c b/gdb/valops.c index 9ddf94daf1..932e31166b 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -335,7 +335,7 @@ value_cast_pointers (struct type *type, struct value *arg2) /* No superclass found, just change the pointer type. */ arg2 = value_copy (arg2); deprecated_set_value_type (arg2, type); - arg2 = value_change_enclosing_type (arg2, type); + set_value_enclosing_type (arg2, type); set_value_pointed_to_offset (arg2, 0); /* pai: chk_val */ return arg2; } @@ -569,7 +569,7 @@ value_cast (struct type *type, struct value *arg2) arg2 = value_copy (arg2); deprecated_set_value_type (arg2, type); - arg2 = value_change_enclosing_type (arg2, type); + set_value_enclosing_type (arg2, type); set_value_pointed_to_offset (arg2, 0); /* pai: chk_val */ return arg2; } @@ -1139,11 +1139,9 @@ value_assign (struct value *toval, struct value *fromval) case lval_internalvar: set_internalvar (VALUE_INTERNALVAR (toval), fromval); val = value_copy (fromval); - val = value_change_enclosing_type (val, - value_enclosing_type (fromval)); + set_value_enclosing_type (val, value_enclosing_type (fromval)); set_value_embedded_offset (val, value_embedded_offset (fromval)); - set_value_pointed_to_offset (val, - value_pointed_to_offset (fromval)); + set_value_pointed_to_offset (val, value_pointed_to_offset (fromval)); return val; case lval_internalvar_component: @@ -1334,8 +1332,7 @@ value_assign (struct value *toval, struct value *fromval) memcpy (value_contents_raw (val), value_contents (fromval), TYPE_LENGTH (type)); deprecated_set_value_type (val, type); - val = value_change_enclosing_type (val, - value_enclosing_type (fromval)); + set_value_enclosing_type (val, value_enclosing_type (fromval)); set_value_embedded_offset (val, value_embedded_offset (fromval)); set_value_pointed_to_offset (val, value_pointed_to_offset (fromval)); @@ -1583,7 +1580,8 @@ value_addr (struct value *arg1) /* This may be a pointer to a base subobject; so remember the full derived object's type ... */ - arg2 = value_change_enclosing_type (arg2, lookup_pointer_type (value_enclosing_type (arg1))); + set_value_enclosing_type (arg2, + lookup_pointer_type (value_enclosing_type (arg1))); /* ... and also the relative position of the subobject in the full object. */ set_value_pointed_to_offset (arg2, value_embedded_offset (arg1)); @@ -1644,7 +1642,7 @@ value_ind (struct value *arg1) /* Re-adjust type. */ deprecated_set_value_type (arg2, TYPE_TARGET_TYPE (base_type)); /* Add embedding info. */ - arg2 = value_change_enclosing_type (arg2, enc_type); + set_value_enclosing_type (arg2, enc_type); set_value_embedded_offset (arg2, value_pointed_to_offset (arg1)); /* We may be pointing to an object of some derived type. */ @@ -3413,7 +3411,8 @@ value_full_object (struct value *argp, /* pai: FIXME -- sounds iffy */ if (full) { - argp = value_change_enclosing_type (argp, real_type); + argp = value_copy (argp); + set_value_enclosing_type (argp, real_type); return argp; } diff --git a/gdb/value.c b/gdb/value.c index 381318b987..85cb62af31 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -1933,21 +1933,20 @@ value_static_field (struct type *type, int fieldno) return retval; } -/* Change the enclosing type of a value object VAL to NEW_ENCL_TYPE. - You have to be careful here, since the size of the data area for the value - is set by the length of the enclosing type. So if NEW_ENCL_TYPE is bigger - than the old enclosing type, you have to allocate more space for the data. - The return value is a pointer to the new version of this value structure. */ +/* Change the enclosing type of a value object VAL to NEW_ENCL_TYPE. + You have to be careful here, since the size of the data area for the value + is set by the length of the enclosing type. So if NEW_ENCL_TYPE is bigger + than the old enclosing type, you have to allocate more space for the + data. */ -struct value * -value_change_enclosing_type (struct value *val, struct type *new_encl_type) +void +set_value_enclosing_type (struct value *val, struct type *new_encl_type) { if (TYPE_LENGTH (new_encl_type) > TYPE_LENGTH (value_enclosing_type (val))) val->contents = (gdb_byte *) xrealloc (val->contents, TYPE_LENGTH (new_encl_type)); val->enclosing_type = new_encl_type; - return val; } /* Given a value ARG1 (offset by OFFSET bytes) diff --git a/gdb/value.h b/gdb/value.h index 543290a753..ef2cb4fa1d 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -136,8 +136,9 @@ extern void deprecated_set_value_modifiable (struct value *value, normally. */ extern struct type *value_enclosing_type (struct value *); -extern struct value *value_change_enclosing_type (struct value *val, - struct type *new_type); +extern void set_value_enclosing_type (struct value *val, + struct type *new_type); + extern int value_pointed_to_offset (struct value *value); extern void set_value_pointed_to_offset (struct value *value, int val); extern int value_embedded_offset (struct value *value);