aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@polymtl.ca>2022-01-24 20:00:46 -0500
committerSimon Marchi <simon.marchi@polymtl.ca>2022-01-26 10:01:40 -0500
commit5d10a2041eb843fd321ce1d850cf3e0df7648bc7 (patch)
treea1bd00ecbd780dc194da8d44b713b09f10446c0a
parentb583c328e71369f90f4042ac7973ce9edfdb44b3 (diff)
downloadgdb-5d10a2041eb843fd321ce1d850cf3e0df7648bc7.zip
gdb-5d10a2041eb843fd321ce1d850cf3e0df7648bc7.tar.gz
gdb-5d10a2041eb843fd321ce1d850cf3e0df7648bc7.tar.bz2
gdb: add string_file::release method
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
-rw-r--r--gdb/ada-lang.c2
-rw-r--r--gdb/ada-valprint.c2
-rw-r--r--gdb/ada-varobj.c4
-rw-r--r--gdb/c-exp.y6
-rw-r--r--gdb/cli/cli-setshow.c2
-rw-r--r--gdb/compile/compile-c-support.c2
-rw-r--r--gdb/guile/scm-type.c2
-rw-r--r--gdb/location.c2
-rw-r--r--gdb/maint-test-options.c3
-rw-r--r--gdb/remote.c2
-rw-r--r--gdb/tui/tui-disasm.c6
-rw-r--r--gdb/tui/tui-regs.c2
-rw-r--r--gdb/tui/tui-stack.c8
-rw-r--r--gdb/typeprint.c2
-rw-r--r--gdb/ui-file.h20
-rw-r--r--gdb/utils.c2
-rw-r--r--gdb/varobj.c2
17 files changed, 35 insertions, 34 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 642527e..5a67853 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -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.
diff --git a/gdb/ada-valprint.c b/gdb/ada-valprint.c
index 269de25..70e4696 100644
--- a/gdb/ada-valprint.c
+++ b/gdb/ada-valprint.c
@@ -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. */
diff --git a/gdb/ada-varobj.c b/gdb/ada-varobj.c
index fae4f87..3c66468 100644
--- a/gdb/ada-varobj.c
+++ b/gdb/ada-varobj.c
@@ -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,
diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index 85499de..464ed44 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -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
diff --git a/gdb/cli/cli-setshow.c b/gdb/cli/cli-setshow.c
index 4f563d9..99f35eb 100644
--- a/gdb/cli/cli-setshow.c
+++ b/gdb/cli/cli-setshow.c
@@ -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 ();
}
diff --git a/gdb/compile/compile-c-support.c b/gdb/compile/compile-c-support.c
index dd0dc91..4d9abfb 100644
--- a/gdb/compile/compile-c-support.c
+++ b/gdb/compile/compile-c-support.c
@@ -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:
diff --git a/gdb/guile/scm-type.c b/gdb/guile/scm-type.c
index c23305a..987660c 100644
--- a/gdb/guile/scm-type.c
+++ b/gdb/guile/scm-type.c
@@ -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)
{
diff --git a/gdb/location.c b/gdb/location.c
index d4dfc3b..299ef7e 100644
--- a/gdb/location.c
+++ b/gdb/location.c
@@ -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. */
diff --git a/gdb/maint-test-options.c b/gdb/maint-test-options.c
index b9b538d..09175c3 100644
--- a/gdb/maint-test-options.c
+++ b/gdb/maint-test-options.c
@@ -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
{
diff --git a/gdb/remote.c b/gdb/remote.c
index b093ad8..bb41a18 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -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
diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c
index f40d4e2..445503a 100644
--- a/gdb/tui/tui-disasm.c
+++ b/gdb/tui/tui-disasm.c
@@ -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)
{
diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c
index 16b6c08..d53ce54 100644
--- a/gdb/tui/tui-regs.c
+++ b/gdb/tui/tui-regs.c
@@ -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);
diff --git a/gdb/tui/tui-stack.c b/gdb/tui/tui-stack.c
index 0489a5f..be8ffbd 100644
--- a/gdb/tui/tui-stack.c
+++ b/gdb/tui/tui-stack.c
@@ -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
diff --git a/gdb/typeprint.c b/gdb/typeprint.c
index 158e6d9..d68970b 100644
--- a/gdb/typeprint.c
+++ b/gdb/typeprint.c
@@ -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)
{
diff --git a/gdb/ui-file.h b/gdb/ui-file.h
index c097abf..7c7b00d 100644
--- a/gdb/ui-file.h
+++ b/gdb/ui-file.h
@@ -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. */
diff --git a/gdb/utils.c b/gdb/utils.c
index ce7885f..9226689 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -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 ();
diff --git a/gdb/varobj.c b/gdb/varobj.c
index 3aec027..80216a4 100644
--- a/gdb/varobj.c
+++ b/gdb/varobj.c
@@ -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