This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[RFA 4/4] Change funcall_chain to be a std::vector
- From: Tom Tromey <tom at tromey dot com>
- To: gdb-patches at sourceware dot org
- Cc: Tom Tromey <tom at tromey dot com>
- Date: Tue, 5 Sep 2017 23:13:06 -0600
- Subject: [RFA 4/4] Change funcall_chain to be a std::vector
- Authentication-results: sourceware.org; auth=none
- References: <20170906051306.6092-1-tom@tromey.com>
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.
Apparently the old code was leaking funcall_chain here. This is
repaired now.
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.
---
gdb/ChangeLog | 7 +++++++
gdb/parse.c | 46 +++++++---------------------------------------
2 files changed, 14 insertions(+), 39 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index cd7664b..4995887 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 7971f6c..ae2c4d6 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. */
@@ -1152,7 +1122,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;
@@ -1172,8 +1141,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;
@@ -1267,8 +1237,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);
}
--
2.9.4