This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Move arglist_len et al to parser_state


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=43476f0b1b628352ad8e3064e50128cb3461d3d0

commit 43476f0b1b628352ad8e3064e50128cb3461d3d0
Author: Tom Tromey <tom@tromey.com>
Date:   Sun Mar 24 21:38:40 2019 -0600

    Move arglist_len et al to parser_state
    
    This moves arglist_len, start_arglist, and end_arglist to
    parser_state.
    
    gdb/ChangeLog
    2019-04-04  Tom Tromey  <tom@tromey.com>
    
    	* parser-defs.h (struct parser_state) <start_arglist,
    	end_arglist>: New methods.
    	<arglist_len, m_funcall_chain>: New members.
    	(arglist_len, start_arglist, end_arglist): Don't declare.
    	* parse.c (arglist_len, funcall_chain): Remove global.
    	(start_arglist, end_arglist): Remove functions.
    	(parse_exp_in_context): Update.
    	* p-exp.y: Update rules.
    	* m2-exp.y: Update rules.
    	* go-exp.y: Update rules.
    	* f-exp.y: Update rules.
    	* d-exp.y: Update rules.
    	* c-exp.y: Update rules.

Diff:
---
 gdb/ChangeLog     | 16 ++++++++++++++++
 gdb/c-exp.y       | 20 ++++++++++----------
 gdb/d-exp.y       | 16 ++++++++--------
 gdb/f-exp.y       | 10 +++++-----
 gdb/go-exp.y      | 12 ++++++------
 gdb/m2-exp.y      | 16 ++++++++--------
 gdb/p-exp.y       |  8 ++++----
 gdb/parse.c       | 32 --------------------------------
 gdb/parser-defs.h | 39 ++++++++++++++++++++++++++++++++-------
 9 files changed, 89 insertions(+), 80 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 629e555..7fc73d2 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,21 @@
 2019-04-04  Tom Tromey  <tom@tromey.com>
 
+	* parser-defs.h (struct parser_state) <start_arglist,
+	end_arglist>: New methods.
+	<arglist_len, m_funcall_chain>: New members.
+	(arglist_len, start_arglist, end_arglist): Don't declare.
+	* parse.c (arglist_len, funcall_chain): Remove global.
+	(start_arglist, end_arglist): Remove functions.
+	(parse_exp_in_context): Update.
+	* p-exp.y: Update rules.
+	* m2-exp.y: Update rules.
+	* go-exp.y: Update rules.
+	* f-exp.y: Update rules.
+	* d-exp.y: Update rules.
+	* c-exp.y: Update rules.
+
+2019-04-04  Tom Tromey  <tom@tromey.com>
+
 	* rust-exp.y (struct rust_parser) <lex_hex, lex_escape,
 	lex_operator, push_back>: New methods.
 	Update all rules.
diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index c85bb31..cab5cd5 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -534,11 +534,11 @@ msgarg	:	name ':' exp
 exp	:	exp '('
 			/* This is to save the value of arglist_len
 			   being accumulated by an outer function call.  */
-			{ start_arglist (); }
+			{ pstate->start_arglist (); }
 		arglist ')'	%prec ARROW
 			{ write_exp_elt_opcode (pstate, OP_FUNCALL);
 			  write_exp_elt_longcst (pstate,
-						 (LONGEST) end_arglist ());
+						 pstate->end_arglist ());
 			  write_exp_elt_opcode (pstate, OP_FUNCALL); }
 	;
 
@@ -546,10 +546,10 @@ exp	:	exp '('
    "func()::static_var" further below, which uses
    function_method_void.  */
 exp	:	exp '(' ')' %prec ARROW
-			{ start_arglist ();
+			{ pstate->start_arglist ();
 			  write_exp_elt_opcode (pstate, OP_FUNCALL);
 			  write_exp_elt_longcst (pstate,
-						 (LONGEST) end_arglist ());
+						 pstate->end_arglist ());
 			  write_exp_elt_opcode (pstate, OP_FUNCALL); }
 	;
 
@@ -569,30 +569,30 @@ exp	:	UNKNOWN_CPP_NAME '('
 			/* This is to save the value of arglist_len
 			   being accumulated by an outer function call.  */
 
-			  start_arglist ();
+			  pstate->start_arglist ();
 			}
 		arglist ')'	%prec ARROW
 			{
 			  write_exp_elt_opcode (pstate, OP_FUNCALL);
 			  write_exp_elt_longcst (pstate,
-						 (LONGEST) end_arglist ());
+						 pstate->end_arglist ());
 			  write_exp_elt_opcode (pstate, OP_FUNCALL);
 			}
 	;
 
 lcurly	:	'{'
-			{ start_arglist (); }
+			{ pstate->start_arglist (); }
 	;
 
 arglist	:
 	;
 
 arglist	:	exp
-			{ arglist_len = 1; }
+			{ pstate->arglist_len = 1; }
 	;
 
 arglist	:	arglist ',' exp   %prec ABOVE_COMMA
-			{ arglist_len++; }
+			{ pstate->arglist_len++; }
 	;
 
 function_method:       exp '(' parameter_typelist ')' const_or_volatile
@@ -645,7 +645,7 @@ exp     :       function_method_void_or_typelist COLONCOLON name
 	;
 
 rcurly	:	'}'
-			{ $$ = end_arglist () - 1; }
+			{ $$ = pstate->end_arglist () - 1; }
 	;
 exp	:	lcurly arglist rcurly	%prec ARROW
 			{ write_exp_elt_opcode (pstate, OP_ARRAY);
diff --git a/gdb/d-exp.y b/gdb/d-exp.y
index 9addf6c..c14c2d6 100644
--- a/gdb/d-exp.y
+++ b/gdb/d-exp.y
@@ -366,32 +366,32 @@ PostfixExpression:
 
 ArgumentList:
 	AssignExpression
-		{ arglist_len = 1; }
+		{ pstate->arglist_len = 1; }
 |	ArgumentList ',' AssignExpression
-		{ arglist_len++; }
+		{ pstate->arglist_len++; }
 ;
 
 ArgumentList_opt:
 	/* EMPTY */
-		{ arglist_len = 0; }
+		{ pstate->arglist_len = 0; }
 |	ArgumentList
 ;
 
 CallExpression:
 	PostfixExpression '('
-		{ start_arglist (); }
+		{ pstate->start_arglist (); }
 	ArgumentList_opt ')'
 		{ write_exp_elt_opcode (pstate, OP_FUNCALL);
-		  write_exp_elt_longcst (pstate, (LONGEST) end_arglist ());
+		  write_exp_elt_longcst (pstate, pstate->end_arglist ());
 		  write_exp_elt_opcode (pstate, OP_FUNCALL); }
 ;
 
 IndexExpression:
 	PostfixExpression '[' ArgumentList ']'
-		{ if (arglist_len > 0)
+		{ if (pstate->arglist_len > 0)
 		    {
 		      write_exp_elt_opcode (pstate, MULTI_SUBSCRIPT);
-		      write_exp_elt_longcst (pstate, (LONGEST) arglist_len);
+		      write_exp_elt_longcst (pstate, pstate->arglist_len);
 		      write_exp_elt_opcode (pstate, MULTI_SUBSCRIPT);
 		    }
 		  else
@@ -558,7 +558,7 @@ PrimaryExpression:
 
 ArrayLiteral:
 	'[' ArgumentList_opt ']'
-		{ $$ = arglist_len; }
+		{ $$ = pstate->arglist_len; }
 ;
 
 IdentifierExp:
diff --git a/gdb/f-exp.y b/gdb/f-exp.y
index fce90b4..da47322 100644
--- a/gdb/f-exp.y
+++ b/gdb/f-exp.y
@@ -245,12 +245,12 @@ exp	:	KIND '(' exp ')'       %prec UNARY
    later in eval.c.  */
 
 exp	:	exp '(' 
-			{ start_arglist (); }
+			{ pstate->start_arglist (); }
 		arglist ')'	
 			{ write_exp_elt_opcode (pstate,
 						OP_F77_UNDETERMINED_ARGLIST);
 			  write_exp_elt_longcst (pstate,
-						 (LONGEST) end_arglist ());
+						 pstate->end_arglist ());
 			  write_exp_elt_opcode (pstate,
 					      OP_F77_UNDETERMINED_ARGLIST); }
 	;
@@ -263,15 +263,15 @@ arglist	:
 	;
 
 arglist	:	exp
-			{ arglist_len = 1; }
+			{ pstate->arglist_len = 1; }
 	;
 
 arglist :	subrange
-			{ arglist_len = 1; }
+			{ pstate->arglist_len = 1; }
 	;
    
 arglist	:	arglist ',' exp   %prec ABOVE_COMMA
-			{ arglist_len++; }
+			{ pstate->arglist_len++; }
 	;
 
 /* There are four sorts of subrange types in F90.  */
diff --git a/gdb/go-exp.y b/gdb/go-exp.y
index 6754d52..358fd53 100644
--- a/gdb/go-exp.y
+++ b/gdb/go-exp.y
@@ -269,31 +269,31 @@ exp	:	exp '[' exp1 ']'
 exp	:	exp '('
 			/* This is to save the value of arglist_len
 			   being accumulated by an outer function call.  */
-			{ start_arglist (); }
+			{ pstate->start_arglist (); }
 		arglist ')'	%prec LEFT_ARROW
 			{ write_exp_elt_opcode (pstate, OP_FUNCALL);
 			  write_exp_elt_longcst (pstate,
-						 (LONGEST) end_arglist ());
+						 pstate->end_arglist ());
 			  write_exp_elt_opcode (pstate, OP_FUNCALL); }
 	;
 
 lcurly	:	'{'
-			{ start_arglist (); }
+			{ pstate->start_arglist (); }
 	;
 
 arglist	:
 	;
 
 arglist	:	exp
-			{ arglist_len = 1; }
+			{ pstate->arglist_len = 1; }
 	;
 
 arglist	:	arglist ',' exp   %prec ABOVE_COMMA
-			{ arglist_len++; }
+			{ pstate->arglist_len++; }
 	;
 
 rcurly	:	'}'
-			{ $$ = end_arglist () - 1; }
+			{ $$ = pstate->end_arglist () - 1; }
 	;
 
 exp	:	lcurly type rcurly exp  %prec UNARY
diff --git a/gdb/m2-exp.y b/gdb/m2-exp.y
index 6ba8eaf..3e4bc07 100644
--- a/gdb/m2-exp.y
+++ b/gdb/m2-exp.y
@@ -298,11 +298,11 @@ exp     :       exp '['
                         /* This function just saves the number of arguments
 			   that follow in the list.  It is *not* specific to
 			   function types */
-                        { start_arglist(); }
+                        { pstate->start_arglist(); }
                 non_empty_arglist ']'  %prec DOT
                         { write_exp_elt_opcode (pstate, MULTI_SUBSCRIPT);
 			  write_exp_elt_longcst (pstate,
-						 (LONGEST) end_arglist());
+						 pstate->end_arglist());
 			  write_exp_elt_opcode (pstate, MULTI_SUBSCRIPT); }
         ;
 
@@ -313,11 +313,11 @@ exp	:	exp '[' exp ']'
 exp	:	exp '('
 			/* This is to save the value of arglist_len
 			   being accumulated by an outer function call.  */
-			{ start_arglist (); }
+			{ pstate->start_arglist (); }
 		arglist ')'	%prec DOT
 			{ write_exp_elt_opcode (pstate, OP_FUNCALL);
 			  write_exp_elt_longcst (pstate,
-						 (LONGEST) end_arglist ());
+						 pstate->end_arglist ());
 			  write_exp_elt_opcode (pstate, OP_FUNCALL); }
 	;
 
@@ -325,21 +325,21 @@ arglist	:
 	;
 
 arglist	:	exp
-			{ arglist_len = 1; }
+			{ pstate->arglist_len = 1; }
 	;
 
 arglist	:	arglist ',' exp   %prec ABOVE_COMMA
-			{ arglist_len++; }
+			{ pstate->arglist_len++; }
 	;
 
 non_empty_arglist
         :       exp
-                        { arglist_len = 1; }
+                        { pstate->arglist_len = 1; }
 	;
 
 non_empty_arglist
         :       non_empty_arglist ',' exp %prec ABOVE_COMMA
-     	       	    	{ arglist_len++; }
+     	       	    	{ pstate->arglist_len++; }
      	;
 
 /* GDB construct */
diff --git a/gdb/p-exp.y b/gdb/p-exp.y
index 4487899..0f78126 100644
--- a/gdb/p-exp.y
+++ b/gdb/p-exp.y
@@ -334,11 +334,11 @@ exp	:	exp '('
 			/* This is to save the value of arglist_len
 			   being accumulated by an outer function call.  */
 			{ push_current_type ();
-			  start_arglist (); }
+			  pstate->start_arglist (); }
 		arglist ')'	%prec ARROW
 			{ write_exp_elt_opcode (pstate, OP_FUNCALL);
 			  write_exp_elt_longcst (pstate,
-						 (LONGEST) end_arglist ());
+						 pstate->end_arglist ());
 			  write_exp_elt_opcode (pstate, OP_FUNCALL);
 			  pop_current_type ();
 			  if (current_type)
@@ -348,9 +348,9 @@ exp	:	exp '('
 
 arglist	:
          | exp
-			{ arglist_len = 1; }
+			{ pstate->arglist_len = 1; }
 	 | arglist ',' exp   %prec ABOVE_COMMA
-			{ arglist_len++; }
+			{ pstate->arglist_len++; }
 	;
 
 exp	:	type '(' exp ')' %prec UNARY
diff --git a/gdb/parse.c b/gdb/parse.c
index 5692e23..6ee6157 100644
--- a/gdb/parse.c
+++ b/gdb/parse.c
@@ -67,7 +67,6 @@ const struct exp_descriptor exp_descriptor_standard =
 
 /* Global variables declared in parser-defs.h (and commented there).  */
 innermost_block_tracker innermost_block;
-int arglist_len;
 static struct type_stack type_stack;
 
 /* True if parsing an expression to attempt completion.  */
@@ -128,33 +127,6 @@ innermost_block_tracker::update (const struct block *b,
     m_innermost_block = b;
 }
 
-/* Data structure for saving values of arglist_len for function calls whose
-   arguments contain other function calls.  */
-
-static std::vector<int> *funcall_chain;
-
-/* Begin counting arguments for a function call,
-   saving the data about any containing call.  */
-
-void
-start_arglist (void)
-{
-  funcall_chain->push_back (arglist_len);
-  arglist_len = 0;
-}
-
-/* Return the number of arguments in a function call just terminated,
-   and restore the data for the containing function call.  */
-
-int
-end_arglist (void)
-{
-  int val = arglist_len;
-  arglist_len = funcall_chain->back ();
-  funcall_chain->pop_back ();
-  return val;
-}
-
 
 
 /* See definition in parser-defs.h.  */
@@ -1119,10 +1091,6 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
   if (*stringptr == 0 || **stringptr == 0)
     error_no_arg (_("expression to compute"));
 
-  std::vector<int> funcalls;
-  scoped_restore save_funcall_chain = make_scoped_restore (&funcall_chain,
-							   &funcalls);
-
   const struct block *expression_context_block = block;
   CORE_ADDR expression_context_pc = 0;
 
diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h
index 66828e0..a015115 100644
--- a/gdb/parser-defs.h
+++ b/gdb/parser-defs.h
@@ -101,6 +101,27 @@ struct parser_state : public expr_builder
 
   DISABLE_COPY_AND_ASSIGN (parser_state);
 
+  /* Begin counting arguments for a function call,
+     saving the data about any containing call.  */
+
+  void start_arglist ()
+  {
+    m_funcall_chain.push_back (arglist_len);
+    arglist_len = 0;
+  }
+
+  /* Return the number of arguments in a function call just terminated,
+     and restore the data for the containing function call.  */
+
+  int end_arglist ()
+  {
+    int val = arglist_len;
+    arglist_len = m_funcall_chain.back ();
+    m_funcall_chain.pop_back ();
+    return val;
+  }
+
+
   /* If this is nonzero, this block is used as the lexical context for
      symbol names.  */
 
@@ -125,6 +146,17 @@ struct parser_state : public expr_builder
   /* After a token has been recognized, this variable points to it.
      Currently used only for error reporting.  */
   const char *prev_lexptr = nullptr;
+
+  /* Number of arguments seen so far in innermost function call.  */
+
+  int arglist_len = 0;
+
+private:
+
+  /* Data structure for saving values of arglist_len for function calls whose
+     arguments contain other function calls.  */
+
+  std::vector<int> m_funcall_chain;
 };
 
 /* When parsing expressions we track the innermost block that was
@@ -185,9 +217,6 @@ private:
    once the parse is complete.  */
 extern innermost_block_tracker innermost_block;
 
-/* Number of arguments seen so far in innermost function call.  */
-extern int arglist_len;
-
 /* A string token, either a char-string or bit-string.  Char-strings are
    used, for example, for the names of symbols.  */
 
@@ -311,10 +340,6 @@ extern void mark_struct_expression (struct expr_builder *);
 
 extern const char *find_template_name_end (const char *);
 
-extern void start_arglist (void);
-
-extern int end_arglist (void);
-
 extern char *copy_name (struct stoken);
 
 extern void insert_type (enum type_pieces);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]