From 2447e9afab92a5700ccc6e4d90d3cef8f082c009 Mon Sep 17 00:00:00 2001 From: Peter Schauer Date: Sat, 19 Aug 1995 08:21:23 +0000 Subject: * gdbtypes.c (recursive_dump_type): Add dont_print_type_obstack to inhibit infinite recursion when printing aggregate types. --- gdb/ChangeLog | 5 +++++ gdb/gdbtypes.c | 32 +++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 86529b9..6ced582 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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 * dcache.c (dcache_write_line): Write dirty lines right. diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 0fc4ec3..de3de3e 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -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 (" \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 */ -- cgit v1.1