From 5fe3f3e4633df1ea76ff24a2732d7c73dc983b90 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sun, 22 Jul 2018 10:05:14 -0600 Subject: [PATCH 1/1] 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 * 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. --- gdb/ChangeLog | 12 ++++++++++ gdb/c-exp.y | 43 +++++++++++++++++------------------ gdb/d-exp.y | 62 +++++++++++++++++++++++++-------------------------- gdb/go-exp.y | 24 +++++++++----------- 4 files changed, 74 insertions(+), 67 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1120d8d3a7..3381304573 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2018-08-28 Tom Tromey + + * 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 * parser-defs.h (struct type_stack) : Change type to diff --git a/gdb/c-exp.y b/gdb/c-exp.y index a9ccbdcb65..0326ee090e 100644 --- a/gdb/c-exp.y +++ b/gdb/c-exp.y @@ -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_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, ¤t); + 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, ¤t); + 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, ¤t); + 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 (); diff --git a/gdb/d-exp.y b/gdb/d-exp.y index 74e4b637d0..c09fe7a3f3 100644 --- a/gdb/d-exp.y +++ b/gdb/d-exp.y @@ -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_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, ¤t); + 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, ¤t); + 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, ¤t); - 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, ¤t); + 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 (); diff --git a/gdb/go-exp.y b/gdb/go-exp.y index 47570d5911..7521acc7f5 100644 --- a/gdb/go-exp.y +++ b/gdb/go-exp.y @@ -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_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 (); -- 2.34.1