From 0bd9908d01330dd5369b35e62ea8d8d7ada01e03 Mon Sep 17 00:00:00 2001
From: Michael Snyder <msnyder@vmware.com>
Date: Fri, 17 Aug 2007 23:12:47 +0000
Subject: [PATCH] 2007-08-17  Michael Snyder  <msnyder@access-company.com>

	* gdbtypes.h (virtual_base_list): Remove export decl.
	* gdbtypes.c (virtual_base_list): Make static.  Not called outside.
	(virtual_base_index): Memory leak.
	(virtual_base_index_skip_primaries): Ditto.
---
 gdb/ChangeLog  |  7 +++++++
 gdb/gdbtypes.c | 35 +++++++++++++++--------------------
 gdb/gdbtypes.h |  2 --
 3 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index db010325518..908a3c8727a 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2007-08-17  Michael Snyder  <msnyder@access-company.com>
+
+	* gdbtypes.h (virtual_base_list): Remove export decl.
+	* gdbtypes.c (virtual_base_list): Make static.  Not called outside.
+	(virtual_base_index): Memory leak.
+	(virtual_base_index_skip_primaries): Ditto.
+
 2007-08-17  Maxim Grigoriev  <maxim2405@gmail.com>
 
 	* xtensa-tdep.c (ARG_NOF, ARG_1ST, PS_WOE, PS_EXC, C0_MAXOPDS)
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 672be70fb0b..64964e97d2d 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -2024,7 +2024,7 @@ virtual_base_list_aux (struct type *dclass)
    This routine merely hands off the argument to virtual_base_list_aux()
    and then copies the result into an array to save space.  */
 
-struct type **
+static struct type **
 virtual_base_list (struct type *dclass)
 {
   struct vbase *tmp_vbase;
@@ -2112,7 +2112,6 @@ virtual_base_list_length_skip_primaries (struct type *dclass)
   return i;
 }
 
-
 /* Return the index (position) of type BASE, which is a virtual base
    class of DCLASS, in the latter's virtual base list.  A return of -1
    indicates "not found" or a problem.  */
@@ -2120,27 +2119,24 @@ virtual_base_list_length_skip_primaries (struct type *dclass)
 int
 virtual_base_index (struct type *base, struct type *dclass)
 {
-  struct type *vbase;
+  struct type *vbase, **vbase_list;
   int i;
 
   if ((TYPE_CODE (dclass) != TYPE_CODE_CLASS) 
       || (TYPE_CODE (base) != TYPE_CODE_CLASS))
     return -1;
 
-  i = 0;
-  vbase = virtual_base_list (dclass)[0];
-  while (vbase)
-    {
-      if (vbase == base)
-	break;
-      vbase = virtual_base_list (dclass)[++i];
-    }
+  vbase_list = virtual_base_list (dclass);
+  for (i = 0, vbase = vbase_list[0];
+       vbase != NULL;
+       vbase = vbase_list[++i])
+    if (vbase == base)
+      break;
 
+  xfree (vbase_list);
   return vbase ? i : -1;
 }
 
-
-
 /* Return the index (position) of type BASE, which is a virtual base
    class of DCLASS, in the latter's virtual base list.  Skip over all
    bases that may appear in the virtual base list of the primary base
@@ -2151,7 +2147,7 @@ int
 virtual_base_index_skip_primaries (struct type *base, 
 				   struct type *dclass)
 {
-  struct type *vbase;
+  struct type *vbase, **vbase_list;
   int i, j;
   struct type *primary;
 
@@ -2161,19 +2157,18 @@ virtual_base_index_skip_primaries (struct type *base,
 
   primary = TYPE_RUNTIME_PTR (dclass) ? TYPE_PRIMARY_BASE (dclass) : NULL;
 
-  j = -1;
-  i = 0;
-  vbase = virtual_base_list (dclass)[0];
-  while (vbase)
+  vbase_list = virtual_base_list (dclass);
+  for (i = 0, j = -1, vbase = vbase_list[0];
+       vbase != NULL;
+       vbase = vbase_list[++i])
     {
       if (!primary 
 	  || (virtual_base_index_skip_primaries (vbase, primary) < 0))
 	j++;
       if (vbase == base)
 	break;
-      vbase = virtual_base_list (dclass)[++i];
     }
-
+  xfree (vbase_list);
   return vbase ? j : -1;
 }
 
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
index 8d60894fc41..c397c3204c6 100644
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -1346,8 +1346,6 @@ extern int has_vtable (struct type *);
 
 extern struct type *primary_base_class (struct type *);
 
-extern struct type **virtual_base_list (struct type *);
-
 extern int virtual_base_list_length (struct type *);
 extern int virtual_base_list_length_skip_primaries (struct type *);