mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-28 20:43:45 +08:00
Change funcall_chain to be a std::vector
This simplifies the handling of funcall_chain, by changing it to be a std::vector<int> and then fixing the users. This allows the removal of a cleanup. It would be even cleaner to replace this with better logic in the parsers; but a baby step seemed ok. gdb/ChangeLog 2017-09-05 Tom Tromey <tom@tromey.com> * parse.c (funcall_chain): Now a std::vector. (start_arglist, end_arglist): Simplify. (free_funcalls): Remove. (parse_exp_in_context_1): Remove cleanup.
This commit is contained in:
parent
fef704bfec
commit
69c1e056df
@ -1,3 +1,10 @@
|
||||
2017-09-05 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* parse.c (funcall_chain): Now a std::vector.
|
||||
(start_arglist, end_arglist): Simplify.
|
||||
(free_funcalls): Remove.
|
||||
(parse_exp_in_context_1): Remove cleanup.
|
||||
|
||||
2017-09-05 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* go-exp.y (go_parse): Don't create a cleanup.
|
||||
|
46
gdb/parse.c
46
gdb/parse.c
@ -111,8 +111,6 @@ show_parserdebug (struct ui_file *file, int from_tty,
|
||||
}
|
||||
|
||||
|
||||
static void free_funcalls (void *ignore);
|
||||
|
||||
static int prefixify_subexp (struct expression *, struct expression *, int,
|
||||
int);
|
||||
|
||||
@ -128,13 +126,7 @@ void _initialize_parse (void);
|
||||
/* Data structure for saving values of arglist_len for function calls whose
|
||||
arguments contain other function calls. */
|
||||
|
||||
struct funcall
|
||||
{
|
||||
struct funcall *next;
|
||||
int arglist_len;
|
||||
};
|
||||
|
||||
static struct funcall *funcall_chain;
|
||||
static std::vector<int> *funcall_chain;
|
||||
|
||||
/* Begin counting arguments for a function call,
|
||||
saving the data about any containing call. */
|
||||
@ -142,13 +134,8 @@ static struct funcall *funcall_chain;
|
||||
void
|
||||
start_arglist (void)
|
||||
{
|
||||
struct funcall *newobj;
|
||||
|
||||
newobj = XNEW (struct funcall);
|
||||
newobj->next = funcall_chain;
|
||||
newobj->arglist_len = arglist_len;
|
||||
funcall_chain->push_back (arglist_len);
|
||||
arglist_len = 0;
|
||||
funcall_chain = newobj;
|
||||
}
|
||||
|
||||
/* Return the number of arguments in a function call just terminated,
|
||||
@ -158,28 +145,11 @@ int
|
||||
end_arglist (void)
|
||||
{
|
||||
int val = arglist_len;
|
||||
struct funcall *call = funcall_chain;
|
||||
|
||||
funcall_chain = call->next;
|
||||
arglist_len = call->arglist_len;
|
||||
xfree (call);
|
||||
arglist_len = funcall_chain->back ();
|
||||
funcall_chain->pop_back ();
|
||||
return val;
|
||||
}
|
||||
|
||||
/* Free everything in the funcall chain.
|
||||
Used when there is an error inside parsing. */
|
||||
|
||||
static void
|
||||
free_funcalls (void *ignore)
|
||||
{
|
||||
struct funcall *call, *next;
|
||||
|
||||
for (call = funcall_chain; call; call = next)
|
||||
{
|
||||
next = call->next;
|
||||
xfree (call);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* See definition in parser-defs.h. */
|
||||
@ -1160,7 +1130,6 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc,
|
||||
const struct block *block,
|
||||
int comma, int void_context_p, int *out_subexp)
|
||||
{
|
||||
struct cleanup *old_chain;
|
||||
const struct language_defn *lang = NULL;
|
||||
struct parser_state ps;
|
||||
int subexp;
|
||||
@ -1180,8 +1149,9 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc,
|
||||
if (lexptr == 0 || *lexptr == 0)
|
||||
error_no_arg (_("expression to compute"));
|
||||
|
||||
old_chain = make_cleanup (free_funcalls, 0 /*ignore*/);
|
||||
funcall_chain = 0;
|
||||
std::vector<int> funcalls;
|
||||
scoped_restore save_funcall_chain = make_scoped_restore (&funcall_chain,
|
||||
&funcalls);
|
||||
|
||||
expression_context_block = block;
|
||||
|
||||
@ -1275,8 +1245,6 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc,
|
||||
if (expressiondebug)
|
||||
dump_prefix_expression (ps.expout, gdb_stdlog);
|
||||
|
||||
discard_cleanups (old_chain);
|
||||
|
||||
*stringptr = lexptr;
|
||||
return expression_up (ps.expout);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user