mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-03 21:34:46 +08:00
C++-ify parser_state
This mildly C++-ifies parser_state and stap_parse_info -- just enough to remove some cleanups. This version includes the changes implemented by Simon. Regression tested by the buildbot. gdb/ChangeLog 2017-12-30 Tom Tromey <tom@tromey.com> Simon Marchi <simon.marchi@ericsson.com> * stap-probe.h (struct stap_parse_info): Add constructor, destructor. * stap-probe.c (stap_parse_argument): Update. * rust-exp.y (rust_lex_tests): Update. * parser-defs.h (struct parser_state): Add constructor, destructor, release method. <expout>: Change type to expression_up. (null_post_parser): Change type. (initialize_expout, reallocate_expout): Remove. * parse.c (parser_state::parser_state): Rename from initialize_expout. (parser_state::release): Rename from reallocate_expout. (write_exp_elt, parse_exp_in_context_1, increase_expout_size): Update. (null_post_parser): Change type of "exp". * dtrace-probe.c (dtrace_probe::build_arg_exprs): Update. * ada-lang.c (resolve, resolve_subexp) (replace_operator_with_call): Change type of "expp". * language.h (struct language_defn) <la_post_parser>: Change type of "expp".
This commit is contained in:
77
gdb/parse.c
77
gdb/parse.c
@ -152,34 +152,32 @@ end_arglist (void)
|
||||
|
||||
/* See definition in parser-defs.h. */
|
||||
|
||||
void
|
||||
initialize_expout (struct parser_state *ps, size_t initial_size,
|
||||
const struct language_defn *lang,
|
||||
struct gdbarch *gdbarch)
|
||||
parser_state::parser_state (size_t initial_size,
|
||||
const struct language_defn *lang,
|
||||
struct gdbarch *gdbarch)
|
||||
: expout_size (initial_size),
|
||||
expout (XNEWVAR (expression,
|
||||
(sizeof (expression)
|
||||
+ EXP_ELEM_TO_BYTES (expout_size)))),
|
||||
expout_ptr (0)
|
||||
{
|
||||
ps->expout_size = initial_size;
|
||||
ps->expout_ptr = 0;
|
||||
ps->expout
|
||||
= (struct expression *) xmalloc (sizeof (struct expression)
|
||||
+ EXP_ELEM_TO_BYTES (ps->expout_size));
|
||||
ps->expout->language_defn = lang;
|
||||
ps->expout->gdbarch = gdbarch;
|
||||
expout->language_defn = lang;
|
||||
expout->gdbarch = gdbarch;
|
||||
}
|
||||
|
||||
/* See definition in parser-defs.h. */
|
||||
|
||||
void
|
||||
reallocate_expout (struct parser_state *ps)
|
||||
expression_up
|
||||
parser_state::release ()
|
||||
{
|
||||
/* Record the actual number of expression elements, and then
|
||||
reallocate the expression memory so that we free up any
|
||||
excess elements. */
|
||||
|
||||
ps->expout->nelts = ps->expout_ptr;
|
||||
ps->expout = (struct expression *)
|
||||
xrealloc (ps->expout,
|
||||
sizeof (struct expression)
|
||||
+ EXP_ELEM_TO_BYTES (ps->expout_ptr));
|
||||
expout->nelts = expout_ptr;
|
||||
expout.reset (XRESIZEVAR (expression, expout.release (),
|
||||
(sizeof (expression)
|
||||
+ EXP_ELEM_TO_BYTES (expout_ptr))));
|
||||
|
||||
return std::move (expout);
|
||||
}
|
||||
|
||||
/* This page contains the functions for adding data to the struct expression
|
||||
@ -196,9 +194,9 @@ write_exp_elt (struct parser_state *ps, const union exp_element *expelt)
|
||||
if (ps->expout_ptr >= ps->expout_size)
|
||||
{
|
||||
ps->expout_size *= 2;
|
||||
ps->expout = (struct expression *)
|
||||
xrealloc (ps->expout, sizeof (struct expression)
|
||||
+ EXP_ELEM_TO_BYTES (ps->expout_size));
|
||||
ps->expout.reset (XRESIZEVAR (expression, ps->expout.release (),
|
||||
(sizeof (expression)
|
||||
+ EXP_ELEM_TO_BYTES (ps->expout_size))));
|
||||
}
|
||||
ps->expout->elts[ps->expout_ptr++] = *expelt;
|
||||
}
|
||||
@ -1116,7 +1114,6 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc,
|
||||
int comma, int void_context_p, int *out_subexp)
|
||||
{
|
||||
const struct language_defn *lang = NULL;
|
||||
struct parser_state ps;
|
||||
int subexp;
|
||||
|
||||
lexptr = *stringptr;
|
||||
@ -1192,7 +1189,7 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc,
|
||||
and others called from *.y) ensure CURRENT_LANGUAGE gets restored
|
||||
to the value matching SELECTED_FRAME as set by get_current_arch. */
|
||||
|
||||
initialize_expout (&ps, 10, lang, get_current_arch ());
|
||||
parser_state ps (10, lang, get_current_arch ());
|
||||
|
||||
scoped_restore_current_language lang_saver;
|
||||
set_language (lang->la_language);
|
||||
@ -1205,33 +1202,32 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc,
|
||||
CATCH (except, RETURN_MASK_ALL)
|
||||
{
|
||||
if (! parse_completion)
|
||||
{
|
||||
xfree (ps.expout);
|
||||
throw_exception (except);
|
||||
}
|
||||
throw_exception (except);
|
||||
}
|
||||
END_CATCH
|
||||
|
||||
reallocate_expout (&ps);
|
||||
/* We have to operate on an "expression *", due to la_post_parser,
|
||||
which explains this funny-looking double release. */
|
||||
expression_up result = ps.release ();
|
||||
|
||||
/* Convert expression from postfix form as generated by yacc
|
||||
parser, to a prefix form. */
|
||||
|
||||
if (expressiondebug)
|
||||
dump_raw_expression (ps.expout, gdb_stdlog,
|
||||
dump_raw_expression (result.get (), gdb_stdlog,
|
||||
"before conversion to prefix form");
|
||||
|
||||
subexp = prefixify_expression (ps.expout);
|
||||
subexp = prefixify_expression (result.get ());
|
||||
if (out_subexp)
|
||||
*out_subexp = subexp;
|
||||
|
||||
lang->la_post_parser (&ps.expout, void_context_p);
|
||||
lang->la_post_parser (&result, void_context_p);
|
||||
|
||||
if (expressiondebug)
|
||||
dump_prefix_expression (ps.expout, gdb_stdlog);
|
||||
dump_prefix_expression (result.get (), gdb_stdlog);
|
||||
|
||||
*stringptr = lexptr;
|
||||
return expression_up (ps.expout);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Parse STRING as an expression, and complain if this fails
|
||||
@ -1320,7 +1316,7 @@ parse_expression_for_completion (const char *string, char **name,
|
||||
/* A post-parser that does nothing. */
|
||||
|
||||
void
|
||||
null_post_parser (struct expression **exp, int void_context_p)
|
||||
null_post_parser (expression_up *exp, int void_context_p)
|
||||
{
|
||||
}
|
||||
|
||||
@ -1866,10 +1862,11 @@ increase_expout_size (struct parser_state *ps, size_t lenelt)
|
||||
if ((ps->expout_ptr + lenelt) >= ps->expout_size)
|
||||
{
|
||||
ps->expout_size = std::max (ps->expout_size * 2,
|
||||
ps->expout_ptr + lenelt + 10);
|
||||
ps->expout = (struct expression *)
|
||||
xrealloc (ps->expout, (sizeof (struct expression)
|
||||
+ EXP_ELEM_TO_BYTES (ps->expout_size)));
|
||||
ps->expout_ptr + lenelt + 10);
|
||||
ps->expout.reset (XRESIZEVAR (expression,
|
||||
ps->expout.release (),
|
||||
(sizeof (struct expression)
|
||||
+ EXP_ELEM_TO_BYTES (ps->expout_size))));
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user