diff options
author | Chris Moller <cmoller@cygnus> | 2010-02-08 18:04:17 +0000 |
---|---|---|
committer | Chris Moller <cmoller@cygnus> | 2010-02-08 18:04:17 +0000 |
commit | 99903ae39ebb2032c28aa7bb8b24d6d0f901a2f1 (patch) | |
tree | 4c8294d3740d607126be4f34839c0dfd3df153dc /gdb/cp-valprint.c | |
parent | e3e9f5a2912a498fb804786da7afb83bc04c39cf (diff) | |
download | gdb-99903ae39ebb2032c28aa7bb8b24d6d0f901a2f1.zip gdb-99903ae39ebb2032c28aa7bb8b24d6d0f901a2f1.tar.gz gdb-99903ae39ebb2032c28aa7bb8b24d6d0f901a2f1.tar.bz2 |
PR gdb/9067
* cp-valprint.c (cp_print_value_fields) Fix use of obstacks.
cp_print_static_field) Fix use of obstacks.
* gdb.cp/pr9067.exp: New
* gdb.cp/pr9067.cc: New
* gdb.cp/Makefile.in (EXECUTABLES): Add pr9067
Diffstat (limited to 'gdb/cp-valprint.c')
-rw-r--r-- | gdb/cp-valprint.c | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c index 167c6d4..34a1932 100644 --- a/gdb/cp-valprint.c +++ b/gdb/cp-valprint.c @@ -154,10 +154,13 @@ cp_print_value_fields (struct type *type, struct type *real_type, struct type **dont_print_vb, int dont_print_statmem) { int i, len, n_baseclasses; - char *last_dont_print = obstack_next_free (&dont_print_statmem_obstack); int fields_seen = 0; CHECK_TYPEDEF (type); + + if (recurse == 0 + && obstack_object_size (&dont_print_statmem_obstack) > 0) + obstack_free (&dont_print_statmem_obstack, NULL); fprintf_filtered (stream, "{"); len = TYPE_NFIELDS (type); @@ -177,14 +180,13 @@ cp_print_value_fields (struct type *type, struct type *real_type, fprintf_filtered (stream, "<No data fields>"); else { - struct obstack tmp_obstack = dont_print_statmem_obstack; - + void *statmem_obstack_top = NULL; + if (dont_print_statmem == 0) { - /* If we're at top level, carve out a completely fresh - chunk of the obstack and use that until this particular - invocation returns. */ - obstack_finish (&dont_print_statmem_obstack); + /* Set the current printed-statics stack top. */ + statmem_obstack_top + = obstack_next_free (&dont_print_statmem_obstack); } for (i = n_baseclasses; i < len; i++) @@ -305,10 +307,9 @@ cp_print_value_fields (struct type *type, struct type *real_type, if (dont_print_statmem == 0) { - /* Free the space used to deal with the printing - of the members from top level. */ - obstack_free (&dont_print_statmem_obstack, last_dont_print); - dont_print_statmem_obstack = tmp_obstack; + /* In effect, a pop of the printed-statics stack. */ + if (obstack_object_size (&dont_print_statmem_obstack) > 0) + obstack_free (&dont_print_statmem_obstack, statmem_obstack_top); } if (options->pretty) @@ -515,8 +516,8 @@ cp_print_static_field (struct type *type, first_dont_print = (CORE_ADDR *) obstack_base (&dont_print_statmem_obstack); - i = (CORE_ADDR *) obstack_next_free (&dont_print_statmem_obstack) - - first_dont_print; + i = obstack_object_size (&dont_print_statmem_obstack) + / sizeof (CORE_ADDR); while (--i >= 0) { @@ -671,8 +672,6 @@ Show printing of object's derived type based on vtable info."), NULL, show_objectprint, &setprintlist, &showprintlist); + obstack_begin (&dont_print_statmem_obstack, 32 * sizeof (CORE_ADDR)); obstack_begin (&dont_print_vb_obstack, 32 * sizeof (struct type *)); - obstack_specify_allocation (&dont_print_statmem_obstack, - 32 * sizeof (CORE_ADDR), sizeof (CORE_ADDR), - xmalloc, xfree); } |