[RFA,4/4] Change funcall_chain to be a std::vector

Message ID 20170906051306.6092-5-tom@tromey.com
State New, archived
Headers

Commit Message

Tom Tromey Sept. 6, 2017, 5:13 a.m. UTC
  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(-)
  

Comments

Pedro Alves Sept. 6, 2017, 7:39 p.m. UTC | #1
On 09/06/2017 06:13 AM, Tom Tromey wrote:
> 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.

I guess it might be assuming that end_arglist was called on success.

> 
> 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.

Looks good to me.

Thanks,
Pedro Alves
  

Patch

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);
 }