On Wed, 31 Aug 2022 at 20:33, François Dumont <frs.dum...@gmail.com> wrote:
>
> On 31/08/22 12:11, Jonathan Wakely wrote:
> > On Wed, 31 Aug 2022 at 06:05, François Dumont <frs.dum...@gmail.com> wrote:
> >> After a second thought here is an even cleaner version. No more function
> >> rename, current pretty_print is fine.
> >>
> >>       libstdc++: [_GLIBCXX_DEBUG] Add backtrace generation on demand
> >>
> >>         Add _GLIBCXX_DEBUG_BACKTRACE macro to activate backtrace
> >> generation on
> >>       _GLIBCXX_DEBUG assertions. Prerequisite is to have configure the
> >> lib with:
> >>
> >>       --enable-libstdcxx-backtrace=yes
> >>
> >>       libstdc++-v3/ChangeLog:
> >>
> >>               * include/debug/formatter.h
> >>               [_GLIBCXX_HAVE_STACKTRACE](__glibcxx_backtrace_state): 
> >> Declare.
> >> [_GLIBCXX_HAVE_STACKTRACE](__glibcxx_backtrace_create_state): Declare.
> >> [_GLIBCXX_HAVE_STACKTRACE](__glibcxx_backtrace_full_callback): Define.
> >> [_GLIBCXX_HAVE_STACKTRACE](__glibcxx_backtrace_error_callback): Define.
> >> [_GLIBCXX_HAVE_STACKTRACE](__glibcxx_backtrace_full_func): Define.
> >>               [_GLIBCXX_HAVE_STACKTRACE](__glibcxx_backtrace_full): 
> >> Declare.
> >> [_GLIBCXX_HAVE_STACKTRACE](_Error_formatter::_M_backtrace_state): New.
> >> [_GLIBCXX_HAVE_STACKTRACE](_Error_formatter::_M_backtrace_full): New.
> >>               * src/c++11/debug.cc
> >> [_GLIBCXX_HAVE_STACKTRACE](print_backtrace): New.
> >>               (_Error_formatter::_M_error()): Adapt.
> >>               * src/libbacktrace/Makefile.am: Add backtrace.c.
> >>               * src/libbacktrace/Makefile.in: Regenerate.
> >>               * src/libbacktrace/backtrace-rename.h (backtrace_full): New.
> >>               *
> >> testsuite/23_containers/vector/debug/assign4_backtrace_neg.cc: New test.
> >>               * doc/xml/manual/debug_mode.xml: Document
> >> _GLIBCXX_DEBUG_BACKTRACE.
> >>               * doc/xml/manual/using.xml: Likewise.
> >> Ok to commit ?
> > OK for trunk, thanks.
> >
> > The small change to print_raw in this patch makes me wonder whether
> > that function is actually useful.
> >
> > It supports two modes, print with max precision, and print without.
> > The only time we use it to print with max precision we pass a string
> > of exactly the right length, so the precision is not needed (but the
> > caller has to get the string length correct: if we increase _S_indent
> > and do not increase the "    " literal passed to print_raw, the
> > effects would be wrong).
> >
> > Wouldn't it be better to just use fprintf directly when we want to
> > print without precision, and use a minimum field width instead of
> > precision for indenting? i.e. ...
> >
> > --- a/libstdc++-v3/src/c++11/debug.cc
> > +++ b/libstdc++-v3/src/c++11/debug.cc
> > @@ -608,15 +608,6 @@ namespace
> >      print_literal(PrintContext& ctx, const char(&word)[Length])
> >      { print_word(ctx, word, Length - 1); }
> >
> > -  void
> > -  print_raw(PrintContext& ctx, const char* str, ptrdiff_t nbc = -1)
> > -  {
> > -    if (nbc >= 0)
> > -      ctx._M_column += fprintf(stderr, "%.*s", (int)nbc, str);
> > -    else
> > -      ctx._M_column += fprintf(stderr, "%s", str);
> > -  }
> > -
> >    void
> >    print_word(PrintContext& ctx, const char* word, ptrdiff_t nbc = -1)
> >    {
> > @@ -643,12 +634,9 @@ namespace
> >         || (ctx._M_column + visual_length < ctx._M_max_length)
> >         || (visual_length >= ctx._M_max_length && ctx._M_column == 1))
> >        {
> > -       // If this isn't the first line, indent
> > +       // If this isn't the first line, indent.
> >         if (ctx._M_column == 1 && !ctx._M_first_line)
> > -         {
> > -           const char spacing[PrintContext::_S_indent + 1] = "    ";
> > -           print_raw(ctx, spacing, PrintContext::_S_indent);
> > -         }
> > +         ctx._M_column += fprintf(stderr, "%*c", PrintContext::_S_indent, 
> > ' ');
> I did not know this syntax, it looks definitely better.
> >
> >         int written = fprintf(stderr, "%.*s", (int)length, word);
> >
> > @@ -1112,7 +1100,7 @@ namespace __gnu_debug
> >      PrintContext ctx;
> >      if (_M_file)
> >        {
> > -       print_raw(ctx, _M_file);
> > +       ctx._M_column += fprintf(stderr, "%s", _M_file);
> >         print_literal(ctx, ":");
> >         go_to_next_line = true;
> >        }
> >
> Do you take care or you prefer I do ?


I can do it.

Reply via email to