* gdbtypes.c (recursive_dump_type): Add dont_print_type_obstack

to inhibit infinite recursion when printing aggregate types.
This commit is contained in:
Peter Schauer 1995-08-19 08:21:23 +00:00
parent 69c626a9aa
commit 2447e9afab
2 changed files with 36 additions and 1 deletions

View file

@ -1,3 +1,8 @@
Sat Aug 19 01:19:34 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
* gdbtypes.c (recursive_dump_type): Add dont_print_type_obstack
to inhibit infinite recursion when printing aggregate types.
Fri Aug 18 17:48:55 1995 steve chamberlain <sac@slash.cygnus.com>
* dcache.c (dcache_write_line): Write dirty lines right.

View file

@ -1,5 +1,5 @@
/* Support routines for manipulating internal types for GDB.
Copyright (C) 1992 Free Software Foundation, Inc.
Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
Contributed by Cygnus Support, using pieces from other GDB modules.
This file is part of GDB.
@ -1335,6 +1335,8 @@ print_cplus_stuff (type, spaces)
}
}
static struct obstack dont_print_type_obstack;
void
recursive_dump_type (type, spaces)
struct type *type;
@ -1342,6 +1344,32 @@ recursive_dump_type (type, spaces)
{
int idx;
if (spaces == 0)
obstack_begin (&dont_print_type_obstack, 0);
if (TYPE_NFIELDS (type) > 0
|| (TYPE_CPLUS_SPECIFIC (type) && TYPE_NFN_FIELDS (type) > 0))
{
struct type **first_dont_print
= (struct type **)obstack_base (&dont_print_type_obstack);
int i = (struct type **)obstack_next_free (&dont_print_type_obstack)
- first_dont_print;
while (--i >= 0)
{
if (type == first_dont_print[i])
{
printfi_filtered (spaces, "type node ");
gdb_print_address (type, gdb_stdout);
printf_filtered (" <same as already seen type>\n");
return;
}
}
obstack_ptr_grow (&dont_print_type_obstack, type);
}
printfi_filtered (spaces, "type node ");
gdb_print_address (type, gdb_stdout);
printf_filtered ("\n");
@ -1508,6 +1536,8 @@ recursive_dump_type (type, spaces)
break;
}
if (spaces == 0)
obstack_free (&dont_print_type_obstack, NULL);
}
#endif /* MAINTENANCE_CMDS */