Eliminate 'is_ancestor' redundant code. 2010-10-08 Sami Wagiaalla * gdbtypes.c (do_is_ancestor): New function. (is_ancestor): Use do_is_ancestor. (is_public_ancestor): Use do_is_ancestor. diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index c35adbb..e2a8a62 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -1871,13 +1871,12 @@ class_types_same_p (const struct type *a, const struct type *b) } /* Check whether BASE is an ancestor or base class or DCLASS - Return 1 if so, and 0 if not. - Note: callers may want to check for identity of the types before - calling this function -- identical types are considered to satisfy - the ancestor relationship even if they're identical. */ + Return 1 if so, and 0 if not. If PUBLIC is 1 then only public + ancestors ancestors are considered, and the function returns 1 only + if BASE is a public ancestor of DCLASS. */ -int -is_ancestor (struct type *base, struct type *dclass) +static int +do_is_ancestor (struct type *base, struct type *dclass, int public) { int i; @@ -1889,6 +1888,9 @@ is_ancestor (struct type *base, struct type *dclass) for (i = 0; i < TYPE_N_BASECLASSES (dclass); i++) { + if (public && ! BASETYPE_VIA_PUBLIC (dclass, i)) + continue; + if (is_ancestor (base, TYPE_BASECLASS (dclass, i))) return 1; } @@ -1896,29 +1898,25 @@ is_ancestor (struct type *base, struct type *dclass) return 0; } +/* Check whether BASE is an ancestor or base class or DCLASS + Return 1 if so, and 0 if not. + Note: callers may want to check for identity of the types before + calling this function -- identical types are considered to satisfy + the ancestor relationship even if they're identical. */ + +int +is_ancestor (struct type *base, struct type *dclass) +{ + return do_is_ancestor (base, dclass, 0); +} + /* Like is_ancestor, but only returns true when BASE is a public ancestor of DCLASS. */ int is_public_ancestor (struct type *base, struct type *dclass) { - int i; - - CHECK_TYPEDEF (base); - CHECK_TYPEDEF (dclass); - - if (class_types_same_p (base, dclass)) - return 1; - - for (i = 0; i < TYPE_N_BASECLASSES (dclass); ++i) - { - if (! BASETYPE_VIA_PUBLIC (dclass, i)) - continue; - if (is_public_ancestor (base, TYPE_BASECLASS (dclass, i))) - return 1; - } - - return 0; + return do_is_ancestor (base, dclass, 1); } /* A helper function for is_unique_ancestor. */