* bits/demangle.h
authorCarlo Wood <carlo@gcc.gnu.org>
Wed, 25 Feb 2004 21:31:01 +0000 (21:31 +0000)
committerCarlo Wood <carlo@gcc.gnu.org>
Wed, 25 Feb 2004 21:31:01 +0000 (21:31 +0000)
namespace __gnu_cxx::demangler
(session<Allocator>::qualifier_list_Allocator): Add
(session<Allocator>::M_qualifier_list_alloc): Add
(session<Allocator>::decode_type_with_postfix):
Use M_qualifier_list_alloc instead of calling operator new/delete.

From-SVN: r78457

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/demangle.h

index 7751810..2c16838 100644 (file)
@@ -1,3 +1,12 @@
+2004-02-25  Carlo Wood  <carlo@alinoe.com>
+
+       * bits/demangle.h
+       namespace __gnu_cxx::demangler
+       (session<Allocator>::qualifier_list_Allocator): Add
+       (session<Allocator>::M_qualifier_list_alloc): Add
+       (session<Allocator>::decode_type_with_postfix):
+       Use M_qualifier_list_alloc instead of calling operator new/delete.
+
 2004-02-24  Paolo Carlini  <pcarlini@suse.de>
 
        PR libstdc++/14252
        * docs/html/ext/mt_allocator.html: Change due to that deallocated
        blocks now are added to the front of freelists. The reason to this
        approach is also explained.
-        
+
 2004-02-17  Paolo Carlini  <pcarlini@suse.de>
 
        * include/bits/locale_facets.tcc (num_get<>::_M_extract_float,
 2004-01-29  Stephen M. Webb  <stephen.webb@bregmasoft.com>
 
        * config/local/generic/c_locale.h: Change ::malloc() to new char[].
-       * config/local/gnu/c_locale.h: Change ::malloc() to new char[].
-       * include/bits/stl_tempbuf.h: Convert _Temporary_buffer to use
+       * config/local/gnu/c_locale.h: Change ::malloc() to new char[].
+       * include/bits/stl_tempbuf.h: Convert _Temporary_buffer to use
        std::get_temporary_buffer() instead of duplicating its code.
        Update to C++STYLE conventions.
-       * include/std/std_memory.h (get_temporary_buffer): Use ::operator
+       * include/std/std_memory.h (get_temporary_buffer): Use ::operator
        new() instead of std::malloc().
        (return_temporary_buffer): Use ::operator delete() instead of
        std::free().
index 021276a..68cdabe 100644 (file)
@@ -378,6 +378,9 @@ namespace __gnu_cxx
        int M_template_arg_pos_offset;
        std::vector<substitution_st, subst_Allocator> M_substitutions_pos;
        implementation_details const& M_implementation_details;
+       typedef typename Allocator::template
+           rebind<qualifier_list<Allocator> >::other qualifier_list_Allocator;
+       qualifier_list_Allocator M_qualifier_list_alloc;
 #if _GLIBCXX_DEMANGLER_CWDEBUG
        bool M_inside_add_substitution;
 #endif
@@ -1849,7 +1852,10 @@ namespace __gnu_cxx
        ++M_inside_type;
        bool recursive_template_param_or_substitution_call;
        if (!(recursive_template_param_or_substitution_call = qualifiers))
-           qualifiers = new qualifier_list<Allocator>(*this);
+       {
+          qualifier_list<Allocator>* raw_qualifiers = M_qualifier_list_alloc.allocate(1);
+         qualifiers = new (raw_qualifiers) qualifier_list<Allocator>(*this);
+       }
        // First eat all qualifiers.
        bool failure = false;
        for(;;)         // So we can use 'continue' to eat the next qualifier.
@@ -2181,7 +2187,10 @@ namespace __gnu_cxx
     decode_type_exit:
        --M_inside_type;
        if (!recursive_template_param_or_substitution_call)
-         delete qualifiers;
+       {
+         qualifiers->~qualifier_list<Allocator>();
+         M_qualifier_list_alloc.deallocate(qualifiers, 1);
+       }
        if (failure)
          _GLIBCXX_DEMANGLER_FAILURE;
        _GLIBCXX_DEMANGLER_RETURN2;