aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2019-03-24 21:38:40 -0600
committerTom Tromey <tom@tromey.com>2019-04-04 19:55:11 -0600
commit43476f0b1b628352ad8e3064e50128cb3461d3d0 (patch)
tree5d836e9a33199397d2aeba188216a6478688ca94 /gdb
parent5776fca307b8af3d852525b77e9b917a9aa97370 (diff)
downloadgdb-43476f0b1b628352ad8e3064e50128cb3461d3d0.zip
gdb-43476f0b1b628352ad8e3064e50128cb3461d3d0.tar.gz
gdb-43476f0b1b628352ad8e3064e50128cb3461d3d0.tar.bz2
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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog16
-rw-r--r--gdb/c-exp.y20
-rw-r--r--gdb/d-exp.y16
-rw-r--r--gdb/f-exp.y10
-rw-r--r--gdb/go-exp.y12
-rw-r--r--gdb/m2-exp.y16
-rw-r--r--gdb/p-exp.y8
-rw-r--r--gdb/parse.c32
-rw-r--r--gdb/parser-defs.h39
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);