@@ -2368,6 +2368,13 @@ c_pretty_printer::c_pretty_printer ()
parameter_list = pp_c_parameter_type_list;
}
+/* c_pretty_printer's implementation of pretty_printer::clone vfunc. */
+
+pretty_printer *
+c_pretty_printer::clone () const
+{
+ return new c_pretty_printer (*this);
+}
/* Print the tree T in full, on file FILE. */
@@ -51,6 +51,7 @@ class c_pretty_printer : public pretty_printer
{
public:
c_pretty_printer ();
+ pretty_printer *clone () const OVERRIDE;
// Format string, possibly translated.
void translate_string (const char *);
@@ -3012,3 +3012,11 @@ cxx_pretty_printer::cxx_pretty_printer ()
type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
}
+
+/* cxx_pretty_printer's implementation of pretty_printer::clone vfunc. */
+
+pretty_printer *
+cxx_pretty_printer::clone () const
+{
+ return new cxx_pretty_printer (*this);
+}
@@ -34,6 +34,8 @@ class cxx_pretty_printer : public c_pretty_printer
public:
cxx_pretty_printer ();
+ pretty_printer *clone () const OVERRIDE;
+
void constant (tree);
void id_expression (tree);
void primary_expression (tree);
@@ -143,6 +143,11 @@ class cxx_format_postprocessor : public format_postprocessor
: m_type_a (), m_type_b ()
{}
+ format_postprocessor *clone() const FINAL OVERRIDE
+ {
+ return new cxx_format_postprocessor ();
+ }
+
void handle (pretty_printer *pp) FINAL OVERRIDE;
deferred_printed_type m_type_a;
@@ -1588,6 +1588,32 @@ pretty_printer::pretty_printer (int maximum_length)
pp_set_prefix (this, NULL);
}
+/* Copy constructor for pretty_printer. */
+
+pretty_printer::pretty_printer (const pretty_printer &other)
+: buffer (new (XCNEW (output_buffer)) output_buffer ()),
+ prefix (),
+ padding (other.padding),
+ maximum_length (other.maximum_length),
+ indent_skip (other.indent_skip),
+ wrapping (other.wrapping),
+ format_decoder (other.format_decoder),
+ m_format_postprocessor (NULL),
+ emitted_prefix (other.emitted_prefix),
+ need_newline (other.need_newline),
+ translate_identifiers (other.translate_identifiers),
+ show_color (other.show_color),
+ show_urls (other.show_urls)
+{
+ pp_line_cutoff (this) = maximum_length;
+ /* By default, we emit prefixes once per message. */
+ pp_prefixing_rule (this) = pp_prefixing_rule (&other);
+ pp_set_prefix (this, NULL);
+
+ if (other.m_format_postprocessor)
+ m_format_postprocessor = other.m_format_postprocessor->clone ();
+}
+
pretty_printer::~pretty_printer ()
{
if (m_format_postprocessor)
@@ -1597,6 +1623,14 @@ pretty_printer::~pretty_printer ()
free (prefix);
}
+/* Base class implementation of pretty_printer::clone vfunc. */
+
+pretty_printer *
+pretty_printer::clone () const
+{
+ return new pretty_printer (*this);
+}
+
/* Append a string delimited by START and END to the output area of
PRETTY-PRINTER. No line wrapping is done. However, if beginning a
new line then emit PRETTY-PRINTER's prefix and skip any leading
@@ -192,6 +192,7 @@ class format_postprocessor
{
public:
virtual ~format_postprocessor () {}
+ virtual format_postprocessor *clone() const = 0;
virtual void handle (pretty_printer *) = 0;
};
@@ -221,9 +222,12 @@ public:
/* Default construct a pretty printer with specified
maximum line length cut off limit. */
explicit pretty_printer (int = 0);
+ explicit pretty_printer (const pretty_printer &other);
virtual ~pretty_printer ();
+ virtual pretty_printer *clone () const;
+
/* Where we print external representation of ENTITY. */
output_buffer *buffer;