diff options
author | Daniel Jacobowitz <drow@false.org> | 2002-05-12 02:20:38 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2002-05-12 02:20:38 +0000 |
commit | 4a1970e4a429204b221938e52804b9a2a5ec1001 (patch) | |
tree | b4f26a59a53183d09a033c88a489259470d12820 /gdb/valops.c | |
parent | b2e75d78994bf7899fdb51387a9d95950f09ad9a (diff) | |
download | gdb-4a1970e4a429204b221938e52804b9a2a5ec1001.zip gdb-4a1970e4a429204b221938e52804b9a2a5ec1001.tar.gz gdb-4a1970e4a429204b221938e52804b9a2a5ec1001.tar.bz2 |
2005-05-11 Daniel Jacobowitz <drow@mvista.com>
Peter Schauer <pes@regent.e-technik.tu-muenchen.de>
* Makefile.in: Update dependencies for valops.c.
* valops.c: Include "gdb_assert.h".
(typecmp): Skip THIS parameter to methods.
(find_method_list): Remove static_memfuncp argument,
update callers. Check for stub methods.
(find_value_oload_method_list): Don't set *static_memfuncp.
(find_overload_match): Don't check for stub methods. Assert
that methods are not stubbed. Handle static methods.
(value_find_oload_method_list): Remove static_memfuncp argument.
* gdbtypes.c (check_stub_method): Do not add THIS pointer
to the argument list for static stub methods.
* value.h (value_find_oload_method_list): Update prototype.
Diffstat (limited to 'gdb/valops.c')
-rw-r--r-- | gdb/valops.c | 95 |
1 files changed, 49 insertions, 46 deletions
diff --git a/gdb/valops.c b/gdb/valops.c index 146f1a6..33b28cd 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -36,6 +36,7 @@ #include <errno.h> #include "gdb_string.h" +#include "gdb_assert.h" /* Flag indicating HP compilers were used; needed to correctly handle some value operations with HP aCC code/runtime. */ @@ -66,7 +67,7 @@ static CORE_ADDR allocate_space_in_inferior (int); static struct value *cast_into_complex (struct type *, struct value *); static struct fn_field *find_method_list (struct value ** argp, char *method, - int offset, int *static_memfuncp, + int offset, struct type *type, int *num_fns, struct type **basetype, int *boffset); @@ -1963,10 +1964,13 @@ typecmp (int staticp, struct type *t1[], struct value *t2[]) return t2[1] != 0; if (t1 == 0) return 1; - if (TYPE_CODE (t1[0]) == TYPE_CODE_VOID) - return 0; if (t1[!staticp] == 0) return 0; + if (TYPE_CODE (t1[0]) == TYPE_CODE_VOID) + return 0; + /* Skip ``this'' argument if applicable. T2 will always include THIS. */ + if (staticp) + t2++; for (i = !staticp; t1[i] && TYPE_CODE (t1[i]) != TYPE_CODE_VOID; i++) { struct type *tt1, *tt2; @@ -2520,7 +2524,7 @@ value_struct_elt (struct value **argp, struct value **args, static struct fn_field * find_method_list (struct value **argp, char *method, int offset, - int *static_memfuncp, struct type *type, int *num_fns, + struct type *type, int *num_fns, struct type **basetype, int *boffset) { int i; @@ -2536,10 +2540,22 @@ find_method_list (struct value **argp, char *method, int offset, char *fn_field_name = TYPE_FN_FIELDLIST_NAME (type, i); if (fn_field_name && (strcmp_iw (fn_field_name, method) == 0)) { - *num_fns = TYPE_FN_FIELDLIST_LENGTH (type, i); + /* Resolve any stub methods. */ + int len = TYPE_FN_FIELDLIST_LENGTH (type, i); + struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i); + int j; + + *num_fns = len; *basetype = type; *boffset = offset; - return TYPE_FN_FIELDLIST1 (type, i); + + for (j = 0; j < len; j++) + { + if (TYPE_FN_FIELD_STUB (f, j)) + check_stub_method (type, i, j); + } + + return f; } } @@ -2579,7 +2595,8 @@ find_method_list (struct value **argp, char *method, int offset, base_offset = TYPE_BASECLASS_BITPOS (type, i) / 8; } f = find_method_list (argp, method, base_offset + offset, - static_memfuncp, TYPE_BASECLASS (type, i), num_fns, basetype, boffset); + TYPE_BASECLASS (type, i), num_fns, basetype, + boffset); if (f) return f; } @@ -2597,8 +2614,8 @@ find_method_list (struct value **argp, char *method, int offset, struct fn_field * value_find_oload_method_list (struct value **argp, char *method, int offset, - int *static_memfuncp, int *num_fns, - struct type **basetype, int *boffset) + int *num_fns, struct type **basetype, + int *boffset) { struct type *t; @@ -2621,12 +2638,7 @@ value_find_oload_method_list (struct value **argp, char *method, int offset, && TYPE_CODE (t) != TYPE_CODE_UNION) error ("Attempt to extract a component of a value that is not a struct or union"); - /* Assume it's not static, unless we see that it is. */ - if (static_memfuncp) - *static_memfuncp = 0; - - return find_method_list (argp, method, 0, static_memfuncp, t, num_fns, basetype, boffset); - + return find_method_list (argp, method, 0, t, num_fns, basetype, boffset); } /* Given an array of argument types (ARGTYPES) (which includes an @@ -2685,6 +2697,7 @@ find_overload_match (struct type **arg_types, int nargs, char *name, int method, int boffset; register int jj; register int ix; + int static_offset; char *obj_type_name = NULL; char *func_name = NULL; @@ -2692,9 +2705,6 @@ find_overload_match (struct type **arg_types, int nargs, char *name, int method, /* Get the list of overloaded methods or functions */ if (method) { - int i; - int len; - struct type *domain; obj_type_name = TYPE_NAME (VALUE_TYPE (obj)); /* Hack: evaluate_subexp_standard often passes in a pointer value rather than the object itself, so try again */ @@ -2703,7 +2713,6 @@ find_overload_match (struct type **arg_types, int nargs, char *name, int method, obj_type_name = TYPE_NAME (TYPE_TARGET_TYPE (VALUE_TYPE (obj))); fns_ptr = value_find_oload_method_list (&temp, name, 0, - staticp, &num_fns, &basetype, &boffset); if (!fns_ptr || !num_fns) @@ -2711,26 +2720,10 @@ find_overload_match (struct type **arg_types, int nargs, char *name, int method, obj_type_name, (obj_type_name && *obj_type_name) ? "::" : "", name); - domain = TYPE_DOMAIN_TYPE (fns_ptr[0].type); - len = TYPE_NFN_FIELDS (domain); - /* NOTE: dan/2000-03-10: This stuff is for STABS, which won't - give us the info we need directly in the types. We have to - use the method stub conversion to get it. Be aware that this - is by no means perfect, and if you use STABS, please move to - DWARF-2, or something like it, because trying to improve - overloading using STABS is really a waste of time. */ - for (i = 0; i < len; i++) - { - int j; - struct fn_field *f = TYPE_FN_FIELDLIST1 (domain, i); - int len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i); - - for (j = 0; j < len2; j++) - { - if (TYPE_FN_FIELD_STUB (f, j) && (!strcmp_iw (TYPE_FN_FIELDLIST_NAME (domain,i),name))) - check_stub_method (domain, i, j); - } - } + /* If we are dealing with stub method types, they should have + been resolved by find_method_list via value_find_oload_method_list + above. */ + gdb_assert (TYPE_DOMAIN_TYPE (fns_ptr[0].type) != NULL); } else { @@ -2757,10 +2750,11 @@ find_overload_match (struct type **arg_types, int nargs, char *name, int method, /* Consider each candidate in turn */ for (ix = 0; ix < num_fns; ix++) { + static_offset = 0; if (method) { - /* For static member functions, we won't have a this pointer, but nothing - else seems to handle them right now, so we just pretend ourselves */ + if (TYPE_FN_FIELD_STATIC_P (fns_ptr, ix)) + static_offset = 1; nparms=0; if (TYPE_FN_FIELD_ARGS(fns_ptr,ix)) @@ -2782,8 +2776,10 @@ find_overload_match (struct type **arg_types, int nargs, char *name, int method, ? (TYPE_FN_FIELD_ARGS (fns_ptr, ix)[jj]) : TYPE_FIELD_TYPE (SYMBOL_TYPE (oload_syms[ix]), jj)); - /* Compare parameter types to supplied argument types */ - bv = rank_function (parm_types, nparms, arg_types, nargs); + /* Compare parameter types to supplied argument types. Skip THIS for + static methods. */ + bv = rank_function (parm_types, nparms, arg_types + static_offset, + nargs - static_offset); if (!oload_champ_bv) { @@ -2821,7 +2817,7 @@ find_overload_match (struct type **arg_types, int nargs, char *name, int method, fprintf_filtered (gdb_stderr,"Overloaded method instance %s, # of parms %d\n", fns_ptr[ix].physname, nparms); else fprintf_filtered (gdb_stderr,"Overloaded function instance %s # of parms %d\n", SYMBOL_DEMANGLED_NAME (oload_syms[ix]), nparms); - for (jj = 0; jj < nargs; jj++) + for (jj = 0; jj < nargs - static_offset; jj++) fprintf_filtered (gdb_stderr,"...Badness @ %d : %d\n", jj, bv->rank[jj]); fprintf_filtered (gdb_stderr,"Overload resolution champion is %d, ambiguous? %d\n", oload_champ, oload_ambiguous); } @@ -2844,8 +2840,11 @@ find_overload_match (struct type **arg_types, int nargs, char *name, int method, } #endif - /* Check how bad the best match is */ - for (ix = 1; ix <= nargs; ix++) + /* Check how bad the best match is. */ + static_offset = 0; + if (method && TYPE_FN_FIELD_STATIC_P (fns_ptr, oload_champ)) + static_offset = 1; + for (ix = 1; ix <= nargs - static_offset; ix++) { if (oload_champ_bv->rank[ix] >= 100) oload_incompatible = 1; /* truly mismatched types */ @@ -2878,6 +2877,10 @@ find_overload_match (struct type **arg_types, int nargs, char *name, int method, if (method) { + if (staticp && TYPE_FN_FIELD_STATIC_P (fns_ptr, oload_champ)) + *staticp = 1; + else if (staticp) + *staticp = 0; if (TYPE_FN_FIELD_VIRTUAL_P (fns_ptr, oload_champ)) *valp = value_virtual_fn_field (&temp, fns_ptr, oload_champ, basetype, boffset); else |