valops.c: Some more gdb::array_view

This commit replaces some more use of pointer+length pairs in the
overload resolution code with gdb::array_view.

find_oload_champ's interface is simplified/normalized: the xmethods
parameter is converted from std::vector to array pointer, and then the
num_fns parameter is always passed in, no matter the array which is
non-NULL.  I tweaked the formatting of callers a little bit here and
there so that the 3 optional parameters are all in the same line.  (I
tried making the 3 optional array parameters be array_views, but the
resulting code didn't look as nice.)

gdb/ChangeLog:
2018-11-21  Pedro Alves  <palves@redhat.com>

	* valops.c (find_method_list): Replace pointer and length
	parameters with an gdb::array_view.  Adjust.
	(value_find_oload_method_list): Likewise.
	(find_overload_match): Use gdb::array_view for methods list.
	Adjust to find_oload_champ interface change.
	(find_oload_champ): 'xm_worker_vec' parameter now a pointer/array.
	'num_fns' parameter now a size_t.  Eliminate 'fn_count' local.
This commit is contained in:
Pedro Alves
2018-11-21 11:55:14 +00:00
parent 82ceee5014
commit 85cca2bcbc
2 changed files with 57 additions and 54 deletions

View File

@ -1,3 +1,13 @@
2018-11-21 Pedro Alves <palves@redhat.com>
* valops.c (find_method_list): Replace pointer and length
parameters with an gdb::array_view. Adjust.
(value_find_oload_method_list): Likewise.
(find_overload_match): Use gdb::array_view for methods list.
Adjust to find_oload_champ interface change.
(find_oload_champ): 'xm_worker_vec' parameter now a pointer/array.
'num_fns' parameter now a size_t. Eliminate 'fn_count' local.
2018-11-21 Pedro Alves <palves@redhat.com> 2018-11-21 Pedro Alves <palves@redhat.com>
* gdbtypes.c (compare_badness): Change type of parameters to const * gdbtypes.c (compare_badness): Change type of parameters to const

View File

@ -66,10 +66,12 @@ static int find_oload_champ_namespace_loop (gdb::array_view<value *> args,
badness_vector *, int *, badness_vector *, int *,
const int no_adl); const int no_adl);
static int find_oload_champ (gdb::array_view<value *> args, int, static int find_oload_champ (gdb::array_view<value *> args,
struct fn_field *, size_t num_fns,
const std::vector<xmethod_worker_up> *, fn_field *fns_ptr,
struct symbol **, badness_vector *); xmethod_worker_up *xm_worker_vec,
symbol **oload_syms,
badness_vector *oload_champ_bv);
static int oload_method_static_p (struct fn_field *, int); static int oload_method_static_p (struct fn_field *, int);
@ -95,11 +97,6 @@ static CORE_ADDR allocate_space_in_inferior (int);
static struct value *cast_into_complex (struct type *, struct value *); static struct value *cast_into_complex (struct type *, struct value *);
static void find_method_list (struct value **, const char *,
LONGEST, struct type *, struct fn_field **, int *,
std::vector<xmethod_worker_up> *,
struct type **, LONGEST *);
int overload_resolution = 0; int overload_resolution = 0;
static void static void
show_overload_resolution (struct ui_file *file, int from_tty, show_overload_resolution (struct ui_file *file, int from_tty,
@ -2292,7 +2289,7 @@ value_union_variant (struct type *union_type, const gdb_byte *contents)
} }
/* Search through the methods of an object (and its bases) to find a /* Search through the methods of an object (and its bases) to find a
specified method. Return the pointer to the fn_field list FN_LIST of specified method. Return a reference to the fn_field list FN_LIST of
overloaded instances defined in the source language. If available overloaded instances defined in the source language. If available
and matching, a vector of matching xmethods defined in extension and matching, a vector of matching xmethods defined in extension
languages are also returned in XM_WORKER_VEC languages are also returned in XM_WORKER_VEC
@ -2316,7 +2313,7 @@ value_union_variant (struct type *union_type, const gdb_byte *contents)
static void static void
find_method_list (struct value **argp, const char *method, find_method_list (struct value **argp, const char *method,
LONGEST offset, struct type *type, LONGEST offset, struct type *type,
struct fn_field **fn_list, int *num_fns, gdb::array_view<fn_field> *fn_list,
std::vector<xmethod_worker_up> *xm_worker_vec, std::vector<xmethod_worker_up> *xm_worker_vec,
struct type **basetype, LONGEST *boffset) struct type **basetype, LONGEST *boffset)
{ {
@ -2330,7 +2327,7 @@ find_method_list (struct value **argp, const char *method,
This function is called recursively to search through base classes. This function is called recursively to search through base classes.
If there is a source method match found at some stage, then we need not If there is a source method match found at some stage, then we need not
look for source methods in consequent recursive calls. */ look for source methods in consequent recursive calls. */
if ((*fn_list) == NULL) if (fn_list->empty ())
{ {
for (i = TYPE_NFN_FIELDS (type) - 1; i >= 0; i--) for (i = TYPE_NFN_FIELDS (type) - 1; i >= 0; i--)
{ {
@ -2341,9 +2338,8 @@ find_method_list (struct value **argp, const char *method,
{ {
int len = TYPE_FN_FIELDLIST_LENGTH (type, i); int len = TYPE_FN_FIELDLIST_LENGTH (type, i);
f = TYPE_FN_FIELDLIST1 (type, i); f = TYPE_FN_FIELDLIST1 (type, i);
*fn_list = f; *fn_list = gdb::make_array_view (f, len);
*num_fns = len;
*basetype = type; *basetype = type;
*boffset = offset; *boffset = offset;
@ -2385,7 +2381,7 @@ find_method_list (struct value **argp, const char *method,
} }
find_method_list (argp, method, base_offset + offset, find_method_list (argp, method, base_offset + offset,
TYPE_BASECLASS (type, i), fn_list, num_fns, TYPE_BASECLASS (type, i), fn_list,
xm_worker_vec, basetype, boffset); xm_worker_vec, basetype, boffset);
} }
} }
@ -2398,9 +2394,8 @@ find_method_list (struct value **argp, const char *method,
ARGP is a pointer to a pointer to a value (the object). ARGP is a pointer to a pointer to a value (the object).
METHOD is the method name. METHOD is the method name.
OFFSET is the offset within the value contents. OFFSET is the offset within the value contents.
FN_LIST is the pointer to matching overloaded instances defined in FN_LIST is the list of matching overloaded instances defined in
source language. source language.
NUM_FNS is the number of overloaded instances.
XM_WORKER_VEC is the vector of matching xmethod workers defined in XM_WORKER_VEC is the vector of matching xmethod workers defined in
extension languages. extension languages.
BASETYPE is set to the type of the base subobject that defines the BASETYPE is set to the type of the base subobject that defines the
@ -2409,8 +2404,8 @@ find_method_list (struct value **argp, const char *method,
static void static void
value_find_oload_method_list (struct value **argp, const char *method, value_find_oload_method_list (struct value **argp, const char *method,
LONGEST offset, struct fn_field **fn_list, LONGEST offset,
int *num_fns, gdb::array_view<fn_field> *fn_list,
std::vector<xmethod_worker_up> *xm_worker_vec, std::vector<xmethod_worker_up> *xm_worker_vec,
struct type **basetype, LONGEST *boffset) struct type **basetype, LONGEST *boffset)
{ {
@ -2436,11 +2431,10 @@ value_find_oload_method_list (struct value **argp, const char *method,
gdb_assert (fn_list != NULL && xm_worker_vec != NULL); gdb_assert (fn_list != NULL && xm_worker_vec != NULL);
/* Clear the lists. */ /* Clear the lists. */
*fn_list = NULL; *fn_list = {};
*num_fns = 0;
xm_worker_vec->clear (); xm_worker_vec->clear ();
find_method_list (argp, method, 0, t, fn_list, num_fns, xm_worker_vec, find_method_list (argp, method, 0, t, fn_list, xm_worker_vec,
basetype, boffset); basetype, boffset);
} }
@ -2514,13 +2508,11 @@ find_overload_match (gdb::array_view<value *> args,
struct value *temp = obj; struct value *temp = obj;
/* For methods, the list of overloaded methods. */ /* For methods, the list of overloaded methods. */
struct fn_field *fns_ptr = NULL; gdb::array_view<fn_field> fns_list;
/* For non-methods, the list of overloaded function symbols. */ /* For non-methods, the list of overloaded function symbols. */
std::vector<symbol *> oload_syms; std::vector<symbol *> oload_syms;
/* For xmethods, the vector of xmethod workers. */ /* For xmethods, the vector of xmethod workers. */
std::vector<xmethod_worker_up> xm_worker_vec; std::vector<xmethod_worker_up> xm_worker_vec;
/* Number of overloaded instances being considered. */
int num_fns = 0;
struct type *basetype = NULL; struct type *basetype = NULL;
LONGEST boffset; LONGEST boffset;
@ -2560,11 +2552,11 @@ find_overload_match (gdb::array_view<value *> args,
} }
/* Retrieve the list of methods with the name NAME. */ /* Retrieve the list of methods with the name NAME. */
value_find_oload_method_list (&temp, name, 0, &fns_ptr, &num_fns, value_find_oload_method_list (&temp, name, 0, &fns_list,
&xm_worker_vec, &basetype, &boffset); &xm_worker_vec, &basetype, &boffset);
/* If this is a method only search, and no methods were found /* If this is a method only search, and no methods were found
the search has failed. */ the search has failed. */
if (method == METHOD && (!fns_ptr || !num_fns) && xm_worker_vec.empty ()) if (method == METHOD && fns_list.empty () && xm_worker_vec.empty ())
error (_("Couldn't find method %s%s%s"), error (_("Couldn't find method %s%s%s"),
obj_type_name, obj_type_name,
(obj_type_name && *obj_type_name) ? "::" : "", (obj_type_name && *obj_type_name) ? "::" : "",
@ -2572,23 +2564,28 @@ find_overload_match (gdb::array_view<value *> args,
/* If we are dealing with stub method types, they should have /* If we are dealing with stub method types, they should have
been resolved by find_method_list via been resolved by find_method_list via
value_find_oload_method_list above. */ value_find_oload_method_list above. */
if (fns_ptr) if (!fns_list.empty ())
{ {
gdb_assert (TYPE_SELF_TYPE (fns_ptr[0].type) != NULL); gdb_assert (TYPE_SELF_TYPE (fns_list[0].type) != NULL);
src_method_oload_champ = find_oload_champ (args, src_method_oload_champ
num_fns, fns_ptr, NULL, = find_oload_champ (args,
NULL, &src_method_badness); fns_list.size (),
fns_list.data (), NULL, NULL,
&src_method_badness);
src_method_match_quality = classify_oload_match src_method_match_quality = classify_oload_match
(src_method_badness, args.size (), (src_method_badness, args.size (),
oload_method_static_p (fns_ptr, src_method_oload_champ)); oload_method_static_p (fns_list.data (), src_method_oload_champ));
} }
if (!xm_worker_vec.empty ()) if (!xm_worker_vec.empty ())
{ {
ext_method_oload_champ = find_oload_champ (args, 0, NULL, &xm_worker_vec, ext_method_oload_champ
NULL, &ext_method_badness); = find_oload_champ (args,
xm_worker_vec.size (),
NULL, xm_worker_vec.data (), NULL,
&ext_method_badness);
ext_method_match_quality = classify_oload_match (ext_method_badness, ext_method_match_quality = classify_oload_match (ext_method_badness,
args.size (), 0); args.size (), 0);
} }
@ -2787,22 +2784,22 @@ find_overload_match (gdb::array_view<value *> args,
} }
if (staticp != NULL) if (staticp != NULL)
*staticp = oload_method_static_p (fns_ptr, method_oload_champ); *staticp = oload_method_static_p (fns_list.data (), method_oload_champ);
if (method_oload_champ >= 0) if (method_oload_champ >= 0)
{ {
if (src_method_oload_champ >= 0) if (src_method_oload_champ >= 0)
{ {
if (TYPE_FN_FIELD_VIRTUAL_P (fns_ptr, method_oload_champ) if (TYPE_FN_FIELD_VIRTUAL_P (fns_list, method_oload_champ)
&& noside != EVAL_AVOID_SIDE_EFFECTS) && noside != EVAL_AVOID_SIDE_EFFECTS)
{ {
*valp = value_virtual_fn_field (&temp, fns_ptr, *valp = value_virtual_fn_field (&temp, fns_list.data (),
method_oload_champ, basetype, method_oload_champ, basetype,
boffset); boffset);
} }
else else
*valp = value_fn_field (&temp, fns_ptr, method_oload_champ, *valp = value_fn_field (&temp, fns_list.data (),
basetype, boffset); method_oload_champ, basetype, boffset);
} }
else else
*valp = value_from_xmethod *valp = value_from_xmethod
@ -2942,7 +2939,8 @@ find_oload_champ_namespace_loop (gdb::array_view<value *> args,
} }
badness_vector new_oload_champ_bv; badness_vector new_oload_champ_bv;
new_oload_champ = find_oload_champ (args, new_oload_syms.size (), new_oload_champ = find_oload_champ (args,
new_oload_syms.size (),
NULL, NULL, new_oload_syms.data (), NULL, NULL, new_oload_syms.data (),
&new_oload_champ_bv); &new_oload_champ_bv);
@ -2979,20 +2977,20 @@ find_oload_champ_namespace_loop (gdb::array_view<value *> args,
or XM_WORKER_VEC, respectively. One, and only one of FNS_PTR, or XM_WORKER_VEC, respectively. One, and only one of FNS_PTR,
OLOAD_SYMS and XM_WORKER_VEC can be non-NULL. OLOAD_SYMS and XM_WORKER_VEC can be non-NULL.
If XM_WORKER_VEC is NULL, then the length of the arrays FNS_PTR NUM_FNS is the length of the array pointed at by FNS_PTR,
or OLOAD_SYMS (whichever is non-NULL) is specified in NUM_FNS. OLOAD_SYMS or XM_WORKER_VEC, whichever is non-NULL.
Return the index of the best match; store an indication of the Return the index of the best match; store an indication of the
quality of the match in OLOAD_CHAMP_BV. */ quality of the match in OLOAD_CHAMP_BV. */
static int static int
find_oload_champ (gdb::array_view<value *> args, find_oload_champ (gdb::array_view<value *> args,
int num_fns, struct fn_field *fns_ptr, size_t num_fns,
const std::vector<xmethod_worker_up> *xm_worker_vec, fn_field *fns_ptr,
struct symbol **oload_syms, xmethod_worker_up *xm_worker_vec,
symbol **oload_syms,
badness_vector *oload_champ_bv) badness_vector *oload_champ_bv)
{ {
int ix;
/* A measure of how good an overloaded instance is. */ /* A measure of how good an overloaded instance is. */
badness_vector bv; badness_vector bv;
/* Index of best overloaded function. */ /* Index of best overloaded function. */
@ -3007,20 +3005,15 @@ find_oload_champ (gdb::array_view<value *> args,
gdb_assert ((fns_ptr != NULL) + (oload_syms != NULL) + (xm_worker_vec != NULL) gdb_assert ((fns_ptr != NULL) + (oload_syms != NULL) + (xm_worker_vec != NULL)
== 1); == 1);
int fn_count = xm_worker_vec != NULL ? xm_worker_vec->size () : num_fns;
/* Consider each candidate in turn. */ /* Consider each candidate in turn. */
for (ix = 0; ix < fn_count; ix++) for (size_t ix = 0; ix < num_fns; ix++)
{ {
int jj; int jj;
int static_offset = 0; int static_offset = 0;
std::vector<type *> parm_types; std::vector<type *> parm_types;
if (xm_worker_vec != NULL) if (xm_worker_vec != NULL)
{ parm_types = xm_worker_vec[ix]->get_arg_types ();
xmethod_worker *worker = (*xm_worker_vec)[ix].get ();
parm_types = worker->get_arg_types ();
}
else else
{ {
size_t nparms; size_t nparms;