diff options
author | Tom Tromey <tromey@adacore.com> | 2025-04-15 12:29:50 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2025-04-17 09:25:55 -0600 |
commit | 2b4909278a4c664b9f457efbcc475ed288b730ac (patch) | |
tree | cff38301a403690474689dc1e08fd4f412d89f70 | |
parent | 64a6faa2b6ce9a4c8049fe55a5247733b4aa3cfd (diff) | |
download | binutils-2b4909278a4c664b9f457efbcc475ed288b730ac.zip binutils-2b4909278a4c664b9f457efbcc475ed288b730ac.tar.gz binutils-2b4909278a4c664b9f457efbcc475ed288b730ac.tar.bz2 |
Clean up value_struct_elt_bitpos
value_struct_elt_bitpos is weird: it takes an in/out value parameter,
and it takes an error string parameter. However, it only has a single
caller, which never uses the "out" value.
I think it was done this way to mimic value_struct_elt. However,
value_struct_elt is pretty ugly and I don't think it's worth
imitating.
This patch cleans up value_struct_elt_bitpos a bit.
Approved-By: Simon Marchi <simon.marchi@efficios.com>
-rw-r--r-- | gdb/python/py-value.c | 3 | ||||
-rw-r--r-- | gdb/valops.c | 25 | ||||
-rw-r--r-- | gdb/value.h | 5 |
3 files changed, 13 insertions, 20 deletions
diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 3855bde..8a2e263 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -1096,8 +1096,7 @@ valpy_getitem (PyObject *self, PyObject *key) res_val = value_struct_elt (&tmp, {}, field.get (), NULL, "struct/class/union"); else if (bitpos >= 0) - res_val = value_struct_elt_bitpos (&tmp, bitpos, field_type, - "struct/class/union"); + res_val = value_struct_elt_bitpos (tmp, bitpos, field_type); else if (base_class_type != NULL) { struct type *val_type; diff --git a/gdb/valops.c b/gdb/valops.c index 1b63343..94f908d 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -2420,47 +2420,42 @@ value_struct_elt (struct value **argp, return v; } -/* Given *ARGP, a value of type structure or union, or a pointer/reference +/* Given VAL, a value of type structure or union, or a pointer/reference to a structure or union, extract and return its component (field) of type FTYPE at the specified BITPOS. Throw an exception on error. */ struct value * -value_struct_elt_bitpos (struct value **argp, int bitpos, struct type *ftype, - const char *err) +value_struct_elt_bitpos (struct value *val, int bitpos, struct type *ftype) { struct type *t; int i; - *argp = coerce_array (*argp); + val = coerce_array (val); - t = check_typedef ((*argp)->type ()); + t = check_typedef (val->type ()); while (t->is_pointer_or_reference ()) { - *argp = value_ind (*argp); - if (check_typedef ((*argp)->type ())->code () != TYPE_CODE_FUNC) - *argp = coerce_array (*argp); - t = check_typedef ((*argp)->type ()); + val = value_ind (val); + if (check_typedef (val->type ())->code () != TYPE_CODE_FUNC) + val = coerce_array (val); + t = check_typedef (val->type ()); } if (t->code () != TYPE_CODE_STRUCT && t->code () != TYPE_CODE_UNION) - error (_("Attempt to extract a component of a value that is not a %s."), - err); + error (_("Attempt to extract a component of non-aggregate value.")); for (i = TYPE_N_BASECLASSES (t); i < t->num_fields (); i++) { if (!t->field (i).is_static () && bitpos == t->field (i).loc_bitpos () && types_equal (ftype, t->field (i).type ())) - return (*argp)->primitive_field (0, i, t); + return val->primitive_field (0, i, t); } error (_("No field with matching bitpos and type.")); - - /* Never hit. */ - return NULL; } /* Search through the methods of an object (and its bases) to find a diff --git a/gdb/value.h b/gdb/value.h index 0cbcfca..71d0ba1 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -1297,10 +1297,9 @@ extern struct value *value_struct_elt (struct value **argp, const char *name, int *static_memfuncp, const char *err); -extern struct value *value_struct_elt_bitpos (struct value **argp, +extern struct value *value_struct_elt_bitpos (struct value *val, int bitpos, - struct type *field_type, - const char *err); + struct type *field_type); extern struct value *value_aggregate_elt (struct type *curtype, const char *name, |