* value.c (value_virtual_fn_field): Handle the situation where
authorMark Alexander <marka@cygnus>
Thu, 31 Dec 1998 01:29:30 +0000 (01:29 +0000)
committerMark Alexander <marka@cygnus>
Thu, 31 Dec 1998 01:29:30 +0000 (01:29 +0000)
vtbl is a pointer to a structure instead of a pointer to an array.

gdb/ChangeLog
gdb/values.c

index ae56d9200193fde95c32b130c9fb9156213f2c2b..e6347c990d6965186f663683817f7ebba298d5ed 100644 (file)
@@ -1,3 +1,8 @@
+Wed Dec 30 17:23:14 1998  Mark Alexander  <marka@cygnus.com>
+
+       * value.c (value_virtual_fn_field): Handle the situation where
+       vtbl is a pointer to a structure instead of a pointer to an array.
+
 Mon Dec 28 17:43:36 1998  David Taylor  <taylor@texas.cygnus.com>
 
        The following changes were made by Jim Blandy <jimb@cygnus.com>,
index ecc11fec2b18e1a2cd2973410ffae857ef8c3a60..7b6dd6b9e7de3b10f0e5759f74ad8f56d769b7e0 100644 (file)
@@ -1040,15 +1040,31 @@ value_virtual_fn_field (arg1p, f, j, type, offset)
 
       /* The virtual function table is now an array of structures
          which have the form { int16 offset, delta; void *pfn; }.  */
-      vtbl = value_ind (value_primitive_field (arg1, 0, 
-                                               TYPE_VPTR_FIELDNO (context),
-                                               TYPE_VPTR_BASETYPE (context)));
-
-      /* Index into the virtual function table.  This is hard-coded because
-         looking up a field is not cheap, and it may be important to save
-         time, e.g. if the user has set a conditional breakpoint calling
-         a virtual function.  */
-      entry = value_subscript (vtbl, vi);
+      vtbl = value_primitive_field (arg1, 0, TYPE_VPTR_FIELDNO (context),
+                                   TYPE_VPTR_BASETYPE (context));
+      
+      /* With older versions of g++, the vtbl field pointed to an array
+        of structures.  Nowadays it points directly to the structure. */
+      if (TYPE_CODE (VALUE_TYPE (vtbl)) == TYPE_CODE_PTR
+         && TYPE_CODE (TYPE_TARGET_TYPE (VALUE_TYPE (vtbl))) == TYPE_CODE_ARRAY)
+       {
+         /* Handle the case where the vtbl field points to an
+            array of structures. */
+         vtbl = value_ind (vtbl);
+
+         /* Index into the virtual function table.  This is hard-coded because
+            looking up a field is not cheap, and it may be important to save
+            time, e.g. if the user has set a conditional breakpoint calling
+            a virtual function.  */
+         entry = value_subscript (vtbl, vi);
+       }
+      else
+       {
+         /* Handle the case where the vtbl field points directly to a structure. */
+         vtbl = value_add (vtbl, vi);
+         entry = value_ind (vtbl);
+       }
+
       entry_type = check_typedef (VALUE_TYPE (entry));
 
       if (TYPE_CODE (entry_type) == TYPE_CODE_STRUCT)