aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSami Wagiaalla <swagiaal@redhat.com>2010-10-12 20:58:17 +0000
committerSami Wagiaalla <swagiaal@redhat.com>2010-10-12 20:58:17 +0000
commit0526b37ab5b8f8ba89f8ea4d4d86522fc4bd807c (patch)
treefc7c6c34f0b33af883deca3990f190b585609e23
parentbb32aa18f665d94c71dbc358f1a39835c86796bf (diff)
downloadgdb-0526b37ab5b8f8ba89f8ea4d4d86522fc4bd807c.zip
gdb-0526b37ab5b8f8ba89f8ea4d4d86522fc4bd807c.tar.gz
gdb-0526b37ab5b8f8ba89f8ea4d4d86522fc4bd807c.tar.bz2
Eliminate 'is_ancestor' redundant code.
2010-10-12 Sami Wagiaalla <swagiaal@redhat.com> * gdbtypes.c (do_is_ancestor): New function. (is_ancestor): Use do_is_ancestor. (is_public_ancestor): Use do_is_ancestor.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/gdbtypes.c48
2 files changed, 29 insertions, 25 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a0765cd..5938dad 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2010-10-12 Sami Wagiaalla <swagiaal@redhat.com>
+
+ * gdbtypes.c (do_is_ancestor): New function.
+ (is_ancestor): Use do_is_ancestor.
+ (is_public_ancestor): Use do_is_ancestor.
+
2010-10-12 Pierre Muller <muller@ics.u-strasbg.fr>
* ser-go32.c (struct dos_ops): Add missing fdopen field.
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index af28ca1..b4f3b77 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -1868,14 +1868,13 @@ class_types_same_p (const struct type *a, const struct type *b)
&& !strcmp (TYPE_NAME (a), TYPE_NAME (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. */
+/* Check whether BASE is an ancestor or base class of DCLASS
+ Return 1 if so, and 0 if not. If PUBLIC is 1 then only public
+ 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;
@@ -1887,36 +1886,35 @@ is_ancestor (struct type *base, struct type *dclass)
for (i = 0; i < TYPE_N_BASECLASSES (dclass); i++)
{
- if (is_ancestor (base, TYPE_BASECLASS (dclass, i)))
+ if (public && ! BASETYPE_VIA_PUBLIC (dclass, i))
+ continue;
+
+ if (do_is_ancestor (base, TYPE_BASECLASS (dclass, i), public))
return 1;
}
return 0;
}
+/* Check whether BASE is an ancestor or base class or DCLASS
+ Return 1 if so, and 0 if not.
+ Note: If BASE and DCLASS are of the same type, this function
+ will return 1. So for some class A, is_ancestor (A, A) will
+ return 1. */
+
+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. */