summaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2017-09-03 21:50:47 -0600
committerTom Tromey <tom@tromey.com>2017-09-06 15:49:32 -0600
commit69c1e056df50e931ca9cbb4b5881e574583cf9ab (patch)
tree7af3f80887b8c005a61e80fbfce3c3fd90de7bb6 /gdb
parentfef704bfec3fdec29b08fca2bd0a5226a04c3113 (diff)
downloadbinutils-gdb-69c1e056df50e931ca9cbb4b5881e574583cf9ab.tar.gz
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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/parse.c46
2 files changed, 14 insertions, 39 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 32c63795597..322ccbe171c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
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.
2017-09-05 Tom Tromey <tom@tromey.com>
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<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);
}