gdb: add string_file::release method
authorSimon Marchi <simon.marchi@polymtl.ca>
Tue, 25 Jan 2022 01:00:46 +0000 (20:00 -0500)
committerSimon Marchi <simon.marchi@polymtl.ca>
Wed, 26 Jan 2022 15:01:40 +0000 (10:01 -0500)
A common pattern for string_file is to want to move out the internal
string buffer, because it is the result of the computation that we want
to return.  It is the reason why string_file::string returns a non-const
reference, as explained in the comment.  I think it would make sense to
have a dedicated method for that instead and make string_file::string
return a const reference.

This allows removing the explicit std::move in the typical case.  Note
that compile_program::compute was missing a move, meaning that the
resulting string was copied.  With the new version, it's not possible to
forget to move.

Change-Id: Ieaefa35b73daa7930b2f3a26988b6e3b4121bb79

17 files changed:
gdb/ada-lang.c
gdb/ada-valprint.c
gdb/ada-varobj.c
gdb/c-exp.y
gdb/cli/cli-setshow.c
gdb/compile/compile-c-support.c
gdb/guile/scm-type.c
gdb/location.c
gdb/maint-test-options.c
gdb/remote.c
gdb/tui/tui-disasm.c
gdb/tui/tui-regs.c
gdb/tui/tui-stack.c
gdb/typeprint.c
gdb/ui-file.h
gdb/utils.c
gdb/varobj.c

index 642527e068c38a4f761fb146004c2f0499c67aa2..5a67853455da90ead60294480e87ae3fb6abae9c 100644 (file)
@@ -6915,7 +6915,7 @@ type_as_string (struct type *type)
 
   type_print (type, "", &tmp_stream, -1);
 
-  return std::move (tmp_stream.string ());
+  return tmp_stream.release ();
 }
 
 /* Given a type TYPE, look up the type of the component of type named NAME.
index 269de259332dc59c7714e7147085831e63da9ed7..70e46965c17597bfcd30aa5a6721113bf264df16 100644 (file)
@@ -307,7 +307,7 @@ ada_print_floating (const gdb_byte *valaddr, struct type *type,
 
   print_floating (valaddr, type, &tmp_stream);
 
-  std::string &s = tmp_stream.string ();
+  std::string s = tmp_stream.release ();
   size_t skip_count = 0;
 
   /* Modify for Ada rules.  */
index fae4f872e174c429baf763c2a45697b2e1eed818..3c664687572019c3ebe33dfc3fa6a784c4f3b223 100644 (file)
@@ -82,7 +82,7 @@ ada_varobj_scalar_image (struct type *type, LONGEST val)
   string_file buf;
 
   ada_print_scalar (type, val, &buf);
-  return std::move (buf.string ());
+  return buf.release ();
 }
 
 /* Assuming that the (PARENT_VALUE, PARENT_TYPE) pair designates
@@ -817,7 +817,7 @@ ada_varobj_get_value_image (struct value *value,
   string_file buffer;
 
   common_val_print (value, &buffer, 0, opts, current_language);
-  return std::move (buffer.string ());
+  return buffer.release ();
 }
 
 /* Assuming that the (VALUE, TYPE) pair designates an array varobj,
index 85499de0640d44898c8173ddc4e24cd5e45b5262..464ed44a2297c8e2ad164a11a8b604efe63907c1 100644 (file)
@@ -1780,11 +1780,11 @@ oper:   OPERATOR NEW
        |       OPERATOR OBJC_LBRAC ']'
                        { $$ = operator_stoken ("[]"); }
        |       OPERATOR conversion_type_id
-                       { string_file buf;
-
+                       {
+                         string_file buf;
                          c_print_type ($2, NULL, &buf, -1, 0,
                                        &type_print_raw_options);
-                         std::string name = std::move (buf.string ());
+                         std::string name = buf.release ();
 
                          /* This also needs canonicalization.  */
                          gdb::unique_xmalloc_ptr<char> canon
index 4f563d9e0e1780acf73dca9238b2f456ec3baf0f..99f35eb509201161f785a20744e7d39f72beb89b 100644 (file)
@@ -659,7 +659,7 @@ get_setshow_command_value_string (const setting &var)
       gdb_assert_not_reached ("bad var_type");
     }
 
-  return std::move (stb.string ());
+  return stb.release ();
 }
 
 
index dd0dc914d97b9dac60007254f2cbd94288c8dfef..4d9abfb5e89a35e6ff182c8060f9d0b6f6cd7208 100644 (file)
@@ -635,7 +635,7 @@ public:
       PopUserExpressionPolicy::pop_user_expression (&buf);
 
     AddCodeFooterPolicy::add_code_footer (m_instance->scope (), &buf);
-    return buf.string ();
+    return buf.release ();
   }
 
 private:
index c23305a961ce410ba33f70653b18cdc1e87aa346..987660ceaf98550b06d660ea5cc5eb5cb5205b03 100644 (file)
@@ -109,7 +109,7 @@ tyscm_type_name (struct type *type)
       string_file stb;
 
       LA_PRINT_TYPE (type, "", &stb, -1, 0, &type_print_raw_options);
-      return std::move (stb.string ());
+      return stb.release ();
     }
   catch (const gdb_exception &except)
     {
index d4dfc3b8258ec919eaade8189de608618b3b4100..299ef7ecaddb0064f8004d75f01e0887eeef821b 100644 (file)
@@ -447,7 +447,7 @@ explicit_to_string_internal (bool as_linespec,
                  explicit_loc->line_offset.offset);
     }
 
-  return std::move (buf.string ());
+  return buf.release ();
 }
 
 /* See description in location.h.  */
index b9b538d78bbfb87cff6444ae149f3f75bacb72bd..09175c3a3cfcb7c8f88a55396486575de49de2ef 100644 (file)
@@ -295,8 +295,7 @@ save_completion_result (const test_options_opts &opts, bool res,
 
       stream.puts ("1 ");
       opts.dump (&stream, text);
-      maintenance_test_options_command_completion_text
-       = std::move (stream.string ());
+      maintenance_test_options_command_completion_text = stream.release ();
     }
   else
     {
index b093ad866750dbe9c884afa3b07b1800c3129764..bb41a18daf9ee6792789d27b5fead138cb4a8e77 100644 (file)
@@ -9519,7 +9519,7 @@ escape_buffer (const char *buf, int n)
   string_file stb;
 
   stb.putstrn (buf, n, '\\');
-  return std::move (stb.string ());
+  return stb.release ();
 }
 
 int
index f40d4e2e9f1c3f8092ca7e3e693d17ef70416b46..445503a5af9819ddd1c41fd45d2e8a83e012d805 100644 (file)
@@ -130,14 +130,12 @@ tui_disassemble (struct gdbarch *gdbarch,
        }
 
       /* Capture the disassembled instruction.  */
-      tal.insn = std::move (gdb_dis_out.string ());
-      gdb_dis_out.clear ();
+      tal.insn = gdb_dis_out.release ();
 
       /* And capture the address the instruction is at.  */
       tal.addr = orig_pc;
       print_address (gdbarch, orig_pc, &gdb_dis_out);
-      tal.addr_string = std::move (gdb_dis_out.string ());
-      gdb_dis_out.clear ();
+      tal.addr_string = std::move (gdb_dis_out.release ());
 
       if (addr_size != nullptr)
        {
index 16b6c081253343c78350988a08218216b2b361ca..d53ce549fb0878d989568b8c9dc93a2320c96653 100644 (file)
@@ -100,7 +100,7 @@ tui_register_format (struct frame_info *frame, int regnum)
   gdbarch_print_registers_info (gdbarch, &stream, frame, regnum, 1);
 
   /* Remove the possible \n.  */
-  std::string &str = stream.string ();
+  std::string str = stream.release ();
   if (!str.empty () && str.back () == '\n')
     str.resize (str.size () - 1);
 
index 0489a5f32503bc5bf2d9709b97b2cb051e43e798..be8ffbd0c124010053a320f98ace0263476ff488 100644 (file)
@@ -181,12 +181,14 @@ tui_locator_window::make_status_line () const
       string.puts (pc_buf);
     }
 
+  std::string string_val = string.release ();
+
   if (string.size () < status_size)
-    string.puts (n_spaces (status_size - string.size ()));
+    string_val.append (status_size - string.size (), ' ');
   else if (string.size () > status_size)
-    string.string ().erase (status_size, string.size ());
+    string_val.erase (status_size, string.size ());
 
-  return std::move (string.string ());
+  return string_val;
 }
 
 /* Get a printable name for the function at the address.  The symbol
index 158e6d91b3fb8f544a842c852c6375fc27a5acfc..d68970b9d6727824eb2fb64fdcbff4b6f0cb1a0e 100644 (file)
@@ -406,7 +406,7 @@ type_to_string (struct type *type)
       string_file stb;
 
       type_print (type, "", &stb, -1);
-      return std::move (stb.string ());
+      return stb.release ();
     }
   catch (const gdb_exception &except)
     {
index c097abf0c29fff5ff42c23052898e1320f5cec5b..7c7b00d91c6b5a5c33a27c709edbc4a61c5aaf2c 100644 (file)
@@ -160,17 +160,19 @@ public:
   /* string_file-specific public API.  */
 
   /* Accesses the std::string containing the entire output collected
-     so far.
+     so far.  */
+  const std::string &string () { return m_string; }
 
-     Returns a non-const reference so that it's easy to move the
-     string contents out of the string_file.  E.g.:
+  /* Return an std::string containing the entire output collected so far.
 
-      string_file buf;
-      buf.printf (....);
-      buf.printf (....);
-      return std::move (buf.string ());
-  */
-  std::string &string () { return m_string; }
+     The internal buffer is cleared, such that it's ready to build a new
+     string.  */
+  std::string release ()
+  {
+    std::string ret = std::move (m_string);
+    m_string.clear ();
+    return ret;
+  }
 
   /* Provide a few convenience methods with the same API as the
      underlying std::string.  */
index ce7885f79af257cbf34df6ec60ef6c8432252336..92266890de4d2c1903b7958a1696be4e21c9b24a 100644 (file)
@@ -1986,7 +1986,7 @@ vfprintf_unfiltered (struct ui_file *stream, const char *format, va_list args)
       /* Print the message.  */
       string_file sfile;
       cli_ui_out (&sfile, 0).vmessage (ui_file_style (), format, args);
-      std::string linebuffer = std::move (sfile.string ());
+      const std::string &linebuffer = sfile.string ();
       fputs_unfiltered (linebuffer.c_str (), stream);
 
       size_t len = linebuffer.length ();
index 3aec027a5b6b81234ca34970ea070ad2d7fa783d..80216a455e8636e9c7300a0dbcff2ae7c71952aa 100644 (file)
@@ -2242,7 +2242,7 @@ varobj_value_get_print_value (struct value *value,
     /* All other cases.  */
     common_val_print (value, &stb, 0, &opts, current_language);
 
-  return std::move (stb.string ());
+  return stb.release ();
 }
 
 bool