Remove some uses of VEC from parsers

This changes some uses of VEC in a few parsers to std::vector instead.

Tested by the buildbot.

gdb/ChangeLog
2018-08-28  Tom Tromey  <tom@tromey.com>

	* c-exp.y (struct token_and_value): Remove typedef and DEF_VEC.
	(token_fifo): Now a std::vector.
	(yylex, c_parse): Update.
	* d-exp.y (struct token_and_value): Remove typedef and DEF_VEC.
	(token_fifo): Now a std::vector.
	(yylex, d_parse): Update.
	* go-exp.y (struct token_and_value): Remove typedef and DEF_VEC.
	(token_fifo): Now a std::vector.
	(yylex, go_parse): Update.
This commit is contained in:
Tom Tromey 2018-07-22 10:05:14 -06:00
parent 858d8004b0
commit 5fe3f3e463
4 changed files with 74 additions and 67 deletions

View File

@ -1,3 +1,15 @@
2018-08-28 Tom Tromey <tom@tromey.com>
* c-exp.y (struct token_and_value): Remove typedef and DEF_VEC.
(token_fifo): Now a std::vector.
(yylex, c_parse): Update.
* d-exp.y (struct token_and_value): Remove typedef and DEF_VEC.
(token_fifo): Now a std::vector.
(yylex, d_parse): Update.
* go-exp.y (struct token_and_value): Remove typedef and DEF_VEC.
(token_fifo): Now a std::vector.
(yylex, go_parse): Update.
2018-08-28 Simon Marchi <simon.marchi@ericsson.com>
* parser-defs.h (struct type_stack) <elements>: Change type to

View File

@ -2854,17 +2854,15 @@ lex_one_token (struct parser_state *par_state, bool *is_quoted_name)
}
/* An object of this type is pushed on a FIFO by the "outer" lexer. */
typedef struct
struct token_and_value
{
int token;
YYSTYPE value;
} token_and_value;
DEF_VEC_O (token_and_value);
};
/* A FIFO of tokens that have been read but not yet returned to the
parser. */
static VEC (token_and_value) *token_fifo;
static std::vector<token_and_value> token_fifo;
/* Non-zero if the lexer should return tokens from the FIFO. */
static int popping;
@ -3089,7 +3087,7 @@ yylex (void)
const struct block *search_block;
bool is_quoted_name, last_lex_was_structop;
if (popping && !VEC_empty (token_and_value, token_fifo))
if (popping && !token_fifo.empty ())
goto do_pop;
popping = 0;
@ -3110,7 +3108,7 @@ yylex (void)
/* Read any sequence of alternating "::" and name-like tokens into
the token FIFO. */
current.value = yylval;
VEC_safe_push (token_and_value, token_fifo, &current);
token_fifo.push_back (current);
last_was_coloncolon = current.token == COLONCOLON;
while (1)
{
@ -3120,7 +3118,7 @@ yylex (void)
Subsequent ones do not have any special meaning. */
current.token = lex_one_token (pstate, &ignore);
current.value = yylval;
VEC_safe_push (token_and_value, token_fifo, &current);
token_fifo.push_back (current);
if ((last_was_coloncolon && current.token != NAME)
|| (!last_was_coloncolon && current.token != COLONCOLON))
@ -3131,10 +3129,10 @@ yylex (void)
/* We always read one extra token, so compute the number of tokens
to examine accordingly. */
last_to_examine = VEC_length (token_and_value, token_fifo) - 2;
last_to_examine = token_fifo.size () - 2;
next_to_examine = 0;
current = *VEC_index (token_and_value, token_fifo, next_to_examine);
current = token_fifo[next_to_examine];
++next_to_examine;
name_obstack.clear ();
@ -3158,16 +3156,16 @@ yylex (void)
while (next_to_examine <= last_to_examine)
{
token_and_value *next;
token_and_value next;
next = VEC_index (token_and_value, token_fifo, next_to_examine);
next = token_fifo[next_to_examine];
++next_to_examine;
if (next->token == NAME && last_was_coloncolon)
if (next.token == NAME && last_was_coloncolon)
{
int classification;
yylval = next->value;
yylval = next.value;
classification = classify_inner_name (pstate, search_block,
context_type);
/* We keep going until we either run out of names, or until
@ -3184,8 +3182,8 @@ yylex (void)
/* We don't want to put a leading "::" into the name. */
obstack_grow_str (&name_obstack, "::");
}
obstack_grow (&name_obstack, next->value.sval.ptr,
next->value.sval.length);
obstack_grow (&name_obstack, next.value.sval.ptr,
next.value.sval.length);
yylval.sval.ptr = (const char *) obstack_base (&name_obstack);
yylval.sval.length = obstack_object_size (&name_obstack);
@ -3199,7 +3197,7 @@ yylex (void)
context_type = yylval.tsym.type;
}
else if (next->token == COLONCOLON && !last_was_coloncolon)
else if (next.token == COLONCOLON && !last_was_coloncolon)
last_was_coloncolon = 1;
else
{
@ -3217,14 +3215,15 @@ yylex (void)
current.value.sval.ptr,
current.value.sval.length);
VEC_replace (token_and_value, token_fifo, 0, &current);
token_fifo[0] = current;
if (checkpoint > 1)
VEC_block_remove (token_and_value, token_fifo, 1, checkpoint - 1);
token_fifo.erase (token_fifo.begin () + 1,
token_fifo.begin () + checkpoint);
}
do_pop:
current = *VEC_index (token_and_value, token_fifo, 0);
VEC_ordered_remove (token_and_value, token_fifo, 0);
current = token_fifo[0];
token_fifo.erase (token_fifo.begin ());
yylval = current.value;
return current.token;
}
@ -3266,7 +3265,7 @@ c_parse (struct parser_state *par_state)
last_was_structop = false;
saw_name_at_eof = 0;
VEC_free (token_and_value, token_fifo);
token_fifo.clear ();
popping = 0;
name_obstack.clear ();

View File

@ -1313,17 +1313,16 @@ lex_one_token (struct parser_state *par_state)
}
/* An object of this type is pushed on a FIFO by the "outer" lexer. */
typedef struct
struct token_and_value
{
int token;
YYSTYPE value;
} token_and_value;
};
DEF_VEC_O (token_and_value);
/* A FIFO of tokens that have been read but not yet returned to the
parser. */
static VEC (token_and_value) *token_fifo;
static std::vector<token_and_value> token_fifo;
/* Non-zero if the lexer should return tokens from the FIFO. */
static int popping;
@ -1419,7 +1418,7 @@ yylex (void)
int last_to_examine, next_to_examine, checkpoint;
const struct block *search_block;
if (popping && !VEC_empty (token_and_value, token_fifo))
if (popping && !token_fifo.empty ())
goto do_pop;
popping = 0;
@ -1431,14 +1430,14 @@ yylex (void)
/* Read any sequence of alternating "." and identifier tokens into
the token FIFO. */
current.value = yylval;
VEC_safe_push (token_and_value, token_fifo, &current);
token_fifo.push_back (current);
last_was_dot = current.token == '.';
while (1)
{
current.token = lex_one_token (pstate);
current.value = yylval;
VEC_safe_push (token_and_value, token_fifo, &current);
token_fifo.push_back (current);
if ((last_was_dot && current.token != IDENTIFIER)
|| (!last_was_dot && current.token != '.'))
@ -1450,10 +1449,10 @@ yylex (void)
/* We always read one extra token, so compute the number of tokens
to examine accordingly. */
last_to_examine = VEC_length (token_and_value, token_fifo) - 2;
last_to_examine = token_fifo.size () - 2;
next_to_examine = 0;
current = *VEC_index (token_and_value, token_fifo, next_to_examine);
current = token_fifo[next_to_examine];
++next_to_examine;
/* If we are not dealing with a typename, now is the time to find out. */
@ -1476,17 +1475,17 @@ yylex (void)
while (next_to_examine <= last_to_examine)
{
token_and_value *next;
token_and_value next;
next = VEC_index (token_and_value, token_fifo, next_to_examine);
next = token_fifo[next_to_examine];
++next_to_examine;
if (next->token == IDENTIFIER && last_was_dot)
if (next.token == IDENTIFIER && last_was_dot)
{
/* Update the partial name we are constructing. */
obstack_grow_str (&name_obstack, ".");
obstack_grow (&name_obstack, next->value.sval.ptr,
next->value.sval.length);
obstack_grow (&name_obstack, next.value.sval.ptr,
next.value.sval.length);
yylval.sval.ptr = (char *) obstack_base (&name_obstack);
yylval.sval.length = obstack_object_size (&name_obstack);
@ -1498,13 +1497,13 @@ yylex (void)
if (current.token == TYPENAME)
{
/* Install it as the first token in the FIFO. */
VEC_replace (token_and_value, token_fifo, 0, &current);
VEC_block_remove (token_and_value, token_fifo, 1,
next_to_examine - 1);
token_fifo[0] = current;
token_fifo.erase (token_fifo.begin () + 1,
token_fifo.begin () + next_to_examine);
break;
}
}
else if (next->token == '.' && !last_was_dot)
else if (next.token == '.' && !last_was_dot)
last_was_dot = 1;
else
{
@ -1515,7 +1514,7 @@ yylex (void)
/* Reset our current token back to the start, if we found nothing
this means that we will just jump to do pop. */
current = *VEC_index (token_and_value, token_fifo, 0);
current = token_fifo[0];
next_to_examine = 1;
}
if (current.token != TYPENAME && current.token != '.')
@ -1539,16 +1538,16 @@ yylex (void)
while (next_to_examine <= last_to_examine)
{
token_and_value *next;
token_and_value next;
next = VEC_index (token_and_value, token_fifo, next_to_examine);
next = token_fifo[next_to_examine];
++next_to_examine;
if (next->token == IDENTIFIER && last_was_dot)
if (next.token == IDENTIFIER && last_was_dot)
{
int classification;
yylval = next->value;
yylval = next.value;
classification = classify_inner_name (pstate, search_block,
context_type);
/* We keep going until we either run out of names, or until
@ -1565,8 +1564,8 @@ yylex (void)
/* We don't want to put a leading "." into the name. */
obstack_grow_str (&name_obstack, ".");
}
obstack_grow (&name_obstack, next->value.sval.ptr,
next->value.sval.length);
obstack_grow (&name_obstack, next.value.sval.ptr,
next.value.sval.length);
yylval.sval.ptr = (char *) obstack_base (&name_obstack);
yylval.sval.length = obstack_object_size (&name_obstack);
@ -1580,7 +1579,7 @@ yylex (void)
context_type = yylval.tsym.type;
}
else if (next->token == '.' && !last_was_dot)
else if (next.token == '.' && !last_was_dot)
last_was_dot = 1;
else
{
@ -1593,14 +1592,15 @@ yylex (void)
the FIFO, and delete the other constituent tokens. */
if (checkpoint > 0)
{
VEC_replace (token_and_value, token_fifo, 0, &current);
token_fifo[0] = current;
if (checkpoint > 1)
VEC_block_remove (token_and_value, token_fifo, 1, checkpoint - 1);
token_fifo.erase (token_fifo.begin () + 1,
token_fifo.begin () + checkpoint);
}
do_pop:
current = *VEC_index (token_and_value, token_fifo, 0);
VEC_ordered_remove (token_and_value, token_fifo, 0);
current = token_fifo[0];
token_fifo.erase (token_fifo.begin ());
yylval = current.value;
return current.token;
}
@ -1620,7 +1620,7 @@ d_parse (struct parser_state *par_state)
last_was_structop = 0;
saw_name_at_eof = 0;
VEC_free (token_and_value, token_fifo);
token_fifo.clear ();
popping = 0;
name_obstack.clear ();

View File

@ -1279,17 +1279,15 @@ lex_one_token (struct parser_state *par_state)
}
/* An object of this type is pushed on a FIFO by the "outer" lexer. */
typedef struct
struct token_and_value
{
int token;
YYSTYPE value;
} token_and_value;
DEF_VEC_O (token_and_value);
};
/* A FIFO of tokens that have been read but not yet returned to the
parser. */
static VEC (token_and_value) *token_fifo;
static std::vector<token_and_value> token_fifo;
/* Non-zero if the lexer should return tokens from the FIFO. */
static int popping;
@ -1485,10 +1483,10 @@ yylex (void)
{
token_and_value current, next;
if (popping && !VEC_empty (token_and_value, token_fifo))
if (popping && !token_fifo.empty ())
{
token_and_value tv = *VEC_index (token_and_value, token_fifo, 0);
VEC_ordered_remove (token_and_value, token_fifo, 0);
token_and_value tv = token_fifo[0];
token_fifo.erase (token_fifo.begin ());
yylval = tv.value;
/* There's no need to fall through to handle package.name
as that can never happen here. In theory. */
@ -1541,13 +1539,11 @@ yylex (void)
}
}
VEC_safe_push (token_and_value, token_fifo, &next);
VEC_safe_push (token_and_value, token_fifo, &name2);
token_fifo.push_back (next);
token_fifo.push_back (name2);
}
else
{
VEC_safe_push (token_and_value, token_fifo, &next);
}
token_fifo.push_back (next);
/* If we arrive here we don't have a package-qualified name. */
@ -1571,7 +1567,7 @@ go_parse (struct parser_state *par_state)
last_was_structop = 0;
saw_name_at_eof = 0;
VEC_free (token_and_value, token_fifo);
token_fifo.clear ();
popping = 0;
name_obstack.clear ();