I couldn't figure out how to post a patch to reviews.llvm.org, so here it is per email, with the hope that someone adopts it :)

Basically it's just moving the `bool print_oneline` out of the execution path, if no children are

printed, since this value is then never used. This may not seem like a big deal, but solves a big

problem in my debugger :)



```

void ValueObjectPrinter::PrintChildrenIfNeeded(bool value_printed,
                                               bool summary_printed) {
  // this flag controls whether we tried to display a description for this
  // object and failed if that happens, we want to display the children, if any
  bool is_failed_description =
      !PrintObjectDescriptionIfNeeded(value_printed, summary_printed);

  auto curr_ptr_depth = m_ptr_depth;
  bool print_children =
      ShouldPrintChildren(is_failed_description, curr_ptr_depth);

  //
  // DataVisualization::ShouldPrintAsOneLiner is often called for
  // print_oneline (see below) and it is very expensive, so use an
  // early exit, if we are not printing children (also easier to read)
  //
  if (!print_children) {
    if (m_curr_depth >= m_options.m_max_depth && IsAggregate() &&
               ShouldPrintValueObject()) {
      m_stream->PutCString("{...}\n");
    } else
      m_stream->EOL();
    return;
  }

  //
  // TODO: maybe move the bool print_oneline line to #1#, but its unclear to   // me if DataVisualization::ShouldPrintAsOneLiner can modify *m_valobj or not
  //
  bool print_oneline =
      (curr_ptr_depth.CanAllowExpansion() || m_options.m_show_types ||
       !m_options.m_allow_oneliner_mode || m_options.m_flat_output ||
       (m_options.m_pointer_as_array) || m_options.m_show_location)
          ? false
          : DataVisualization::ShouldPrintAsOneLiner(*m_valobj);

  bool is_instance_ptr = IsInstancePointer();
  uint64_t instance_ptr_value = LLDB_INVALID_ADDRESS;

  if (is_instance_ptr) {
    instance_ptr_value = m_valobj->GetValueAsUnsigned(0);
    if (m_printed_instance_pointers->count(instance_ptr_value)) {
      // we already printed this instance-is-pointer thing, so don't expand it
      m_stream->PutCString(" {...}\n");

      // we're done here - get out fast
      return;
    } else
      m_printed_instance_pointers->emplace(
          instance_ptr_value); // remember this guy for future reference
  }

  // #1#
  if (print_oneline) {
    m_stream->PutChar(' ');
    PrintChildrenOneLiner(false);
    m_stream->EOL();
  } else
    PrintChildren(value_printed, summary_printed, curr_ptr_depth);
}

```


Ciao

   Nat!

_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to