From: Tom Tromey Date: Mon, 4 Sep 2017 03:50:47 +0000 (-0600) Subject: Change funcall_chain to be a std::vector X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=69c1e056df50e931ca9cbb4b5881e574583cf9ab;p=binutils-gdb.git Change funcall_chain to be a std::vector This simplifies the handling of funcall_chain, by changing it to be a std::vector 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 * parse.c (funcall_chain): Now a std::vector. (start_arglist, end_arglist): Simplify. (free_funcalls): Remove. (parse_exp_in_context_1): Remove cleanup. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 32c63795597..322ccbe171c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2017-09-05 Tom Tromey + + * 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 * go-exp.y (go_parse): Don't create a cleanup. diff --git a/gdb/parse.c b/gdb/parse.c index a11689ba7ce..fb0dff2443b 100644 --- a/gdb/parse.c +++ b/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 *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 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); }