X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgo-exp.y;h=ad174119abb57cc4da35241c9fbf830d48a2b4d9;hb=7d8062de98203eeec70d4439ab460b9ef50a2e0f;hp=ea1487cb0082439a80a5aa2825207cb8ab84850a;hpb=8621b685bfdcb8773b8177fb2b89e45499902868;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/go-exp.y b/gdb/go-exp.y index ea1487cb00..ad174119ab 100644 --- a/gdb/go-exp.y +++ b/gdb/go-exp.y @@ -246,7 +246,7 @@ exp : exp '.' name_not_typename ; exp : exp '.' name_not_typename COMPLETE - { mark_struct_expression (pstate); + { pstate->mark_struct_expression (); write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); write_exp_string (pstate, $3.stoken); write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); } @@ -254,7 +254,7 @@ exp : exp '.' name_not_typename COMPLETE exp : exp '.' COMPLETE { struct stoken s; - mark_struct_expression (pstate); + pstate->mark_struct_expression (); write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); s.ptr = ""; s.length = 0; @@ -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 @@ -538,7 +538,7 @@ variable: name_not_typename ENTRY || !symbol_read_needs_frame (sym)) error (_("@entry can be used only for function " "parameters, not for \"%s\""), - copy_name ($1.stoken)); + copy_name ($1.stoken).c_str ()); write_exp_elt_opcode (pstate, OP_VAR_ENTRY_VALUE); write_exp_elt_sym (pstate, sym); @@ -552,7 +552,7 @@ variable: name_not_typename if (sym.symbol) { if (symbol_read_needs_frame (sym.symbol)) - innermost_block.update (sym); + pstate->block_tracker->update (sym); write_exp_elt_opcode (pstate, OP_VAR_VALUE); write_exp_elt_block (pstate, sym.block); @@ -568,10 +568,10 @@ variable: name_not_typename else { struct bound_minimal_symbol msymbol; - char *arg = copy_name ($1.stoken); + std::string arg = copy_name ($1.stoken); msymbol = - lookup_bound_minimal_symbol (arg); + lookup_bound_minimal_symbol (arg.c_str ()); if (msymbol.minsym != NULL) write_exp_msymbol (pstate, msymbol); else if (!have_full_symbols () @@ -580,7 +580,7 @@ variable: name_not_typename "Use the \"file\" command.")); else error (_("No symbol \"%s\" in current context."), - copy_name ($1.stoken)); + arg.c_str ()); } } ; @@ -1014,20 +1014,19 @@ lex_one_token (struct parser_state *par_state) unsigned int i; const char *tokstart; int saw_structop = last_was_structop; - char *copy; last_was_structop = 0; retry: - prev_lexptr = lexptr; + par_state->prev_lexptr = par_state->lexptr; - tokstart = lexptr; + tokstart = par_state->lexptr; /* See if it is a special token of length 3. */ for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++) if (strncmp (tokstart, tokentab3[i].oper, 3) == 0) { - lexptr += 3; + par_state->lexptr += 3; yylval.opcode = tokentab3[i].opcode; return tokentab3[i].token; } @@ -1036,7 +1035,7 @@ lex_one_token (struct parser_state *par_state) for (i = 0; i < sizeof (tokentab2) / sizeof (tokentab2[0]); i++) if (strncmp (tokstart, tokentab2[i].oper, 2) == 0) { - lexptr += 2; + par_state->lexptr += 2; yylval.opcode = tokentab2[i].opcode; /* NOTE: -> doesn't exist in Go, so we don't need to watch for setting last_was_structop here. */ @@ -1059,13 +1058,13 @@ lex_one_token (struct parser_state *par_state) case ' ': case '\t': case '\n': - lexptr++; + par_state->lexptr++; goto retry; case '[': case '(': paren_depth++; - lexptr++; + par_state->lexptr++; return c; case ']': @@ -1073,21 +1072,21 @@ lex_one_token (struct parser_state *par_state) if (paren_depth == 0) return 0; paren_depth--; - lexptr++; + par_state->lexptr++; return c; case ',': if (pstate->comma_terminates && paren_depth == 0) return 0; - lexptr++; + par_state->lexptr++; return c; case '.': /* Might be a floating point number. */ - if (lexptr[1] < '0' || lexptr[1] > '9') + if (par_state->lexptr[1] < '0' || par_state->lexptr[1] > '9') { - if (parse_completion) + if (pstate->parse_completion) last_was_structop = 1; goto symbol; /* Nope, must be a symbol. */ } @@ -1148,7 +1147,7 @@ lex_one_token (struct parser_state *par_state) err_copy[p - tokstart] = 0; error (_("Invalid number \"%s\"."), err_copy); } - lexptr = p; + par_state->lexptr = p; return toktype; } @@ -1162,7 +1161,7 @@ lex_one_token (struct parser_state *par_state) if (strncmp (p, "entry", len) == 0 && !isalnum (p[len]) && p[len] != '_') { - lexptr = &p[len]; + par_state->lexptr = &p[len]; return ENTRY; } } @@ -1185,7 +1184,7 @@ lex_one_token (struct parser_state *par_state) case '{': case '}': symbol: - lexptr++; + par_state->lexptr++; return c; case '\'': @@ -1193,8 +1192,8 @@ lex_one_token (struct parser_state *par_state) case '`': { int host_len; - int result = parse_string_or_char (tokstart, &lexptr, &yylval.tsval, - &host_len); + int result = parse_string_or_char (tokstart, &par_state->lexptr, + &yylval.tsval, &host_len); if (result == CHAR) { if (host_len == 0) @@ -1202,7 +1201,7 @@ lex_one_token (struct parser_state *par_state) else if (host_len > 2 && c == '\'') { ++tokstart; - namelen = lexptr - tokstart - 1; + namelen = par_state->lexptr - tokstart - 1; goto tryname; } else if (host_len > 1) @@ -1255,7 +1254,7 @@ lex_one_token (struct parser_state *par_state) return 0; } - lexptr += namelen; + par_state->lexptr += namelen; tryname: @@ -1263,9 +1262,9 @@ lex_one_token (struct parser_state *par_state) yylval.sval.length = namelen; /* Catch specific keywords. */ - copy = copy_name (yylval.sval); + std::string copy = copy_name (yylval.sval); for (i = 0; i < sizeof (ident_tokens) / sizeof (ident_tokens[0]); i++) - if (strcmp (copy, ident_tokens[i].oper) == 0) + if (copy == ident_tokens[i].oper) { /* It is ok to always set this, even though we don't always strictly need to. */ @@ -1276,7 +1275,7 @@ lex_one_token (struct parser_state *par_state) if (*tokstart == '$') return DOLLAR_VARIABLE; - if (parse_completion && *lexptr == '\0') + if (pstate->parse_completion && *par_state->lexptr == '\0') saw_name_at_eof = 1; return NAME; } @@ -1347,15 +1346,15 @@ package_name_p (const char *name, const struct block *block) static int classify_unsafe_function (struct stoken function_name) { - char *copy = copy_name (function_name); + std::string copy = copy_name (function_name); - if (strcmp (copy, "Sizeof") == 0) + if (copy == "Sizeof") { yylval.sval = function_name; return SIZEOF_KEYWORD; } - error (_("Unknown function in `unsafe' package: %s"), copy); + error (_("Unknown function in `unsafe' package: %s"), copy.c_str ()); } /* Classify token(s) "name1.name2" where name1 is known to be a package. @@ -1367,13 +1366,12 @@ classify_unsafe_function (struct stoken function_name) static int classify_packaged_name (const struct block *block) { - char *copy; struct block_symbol sym; struct field_of_this_result is_a_field_of_this; - copy = copy_name (yylval.sval); + std::string copy = copy_name (yylval.sval); - sym = lookup_symbol (copy, block, VAR_DOMAIN, &is_a_field_of_this); + sym = lookup_symbol (copy.c_str (), block, VAR_DOMAIN, &is_a_field_of_this); if (sym.symbol) { @@ -1397,15 +1395,14 @@ classify_name (struct parser_state *par_state, const struct block *block) { struct type *type; struct block_symbol sym; - char *copy; struct field_of_this_result is_a_field_of_this; - copy = copy_name (yylval.sval); + std::string copy = copy_name (yylval.sval); /* Try primitive types first so they win over bad/weird debug info. */ type = language_lookup_primitive_type (par_state->language (), par_state->gdbarch (), - copy); + copy.c_str ()); if (type != NULL) { /* NOTE: We take advantage of the fact that yylval coming in was a @@ -1417,7 +1414,7 @@ classify_name (struct parser_state *par_state, const struct block *block) /* TODO: What about other types? */ - sym = lookup_symbol (copy, block, VAR_DOMAIN, &is_a_field_of_this); + sym = lookup_symbol (copy.c_str (), block, VAR_DOMAIN, &is_a_field_of_this); if (sym.symbol) { @@ -1439,7 +1436,7 @@ classify_name (struct parser_state *par_state, const struct block *block) struct stoken sval = build_packaged_name (current_package_name, strlen (current_package_name), - copy, strlen (copy)); + copy.c_str (), copy.size ()); xfree (current_package_name); sym = lookup_symbol (sval.ptr, block, VAR_DOMAIN, @@ -1461,8 +1458,8 @@ classify_name (struct parser_state *par_state, const struct block *block) || (copy[0] >= 'A' && copy[0] < 'A' + input_radix - 10)) { YYSTYPE newlval; /* Its value is ignored. */ - int hextype = parse_number (par_state, copy, yylval.sval.length, - 0, &newlval); + int hextype = parse_number (par_state, copy.c_str (), + yylval.sval.length, 0, &newlval); if (hextype == INT) { yylval.ssym.sym.symbol = NULL; @@ -1521,17 +1518,15 @@ yylex (void) if (name2.token == NAME) { /* Ok, we have "name1 . name2". */ - char *copy; + std::string copy = copy_name (current.value.sval); - copy = copy_name (current.value.sval); - - if (strcmp (copy, "unsafe") == 0) + if (copy == "unsafe") { popping = 1; return classify_unsafe_function (name2.value.sval); } - if (package_name_p (copy, pstate->expression_context_block)) + if (package_name_p (copy.c_str (), pstate->expression_context_block)) { popping = 1; yylval.sval = build_packaged_name (current.value.sval.ptr, @@ -1581,8 +1576,8 @@ go_parse (struct parser_state *par_state) static void yyerror (const char *msg) { - if (prev_lexptr) - lexptr = prev_lexptr; + if (pstate->prev_lexptr) + pstate->lexptr = pstate->prev_lexptr; - error (_("A %s in expression, near `%s'."), msg, lexptr); + error (_("A %s in expression, near `%s'."), msg, pstate->lexptr); }