X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fgo-exp.y;h=1b9b6ea7e90558127fda92aff6f9e975b140ca4c;hb=c76d61da4a65eaadca861bf6c77d579a5cc3f422;hp=0084b2f7eb6fe6f56cc780be552e7cdcd690b7f1;hpb=699bd4cfa8895d0767d491a3e44ac09d3f4d1801;p=binutils-gdb.git diff --git a/gdb/go-exp.y b/gdb/go-exp.y index 0084b2f7eb6..1b9b6ea7e90 100644 --- a/gdb/go-exp.y +++ b/gdb/go-exp.y @@ -1,6 +1,6 @@ /* YACC parser for Go expressions, for GDB. - Copyright (C) 2012-2019 Free Software Foundation, Inc. + Copyright (C) 2012-2022 Free Software Foundation, Inc. This file is part of GDB. @@ -64,6 +64,7 @@ #include "objfiles.h" /* For have_full_symbols and have_partial_symbols */ #include "charset.h" #include "block.h" +#include "expop.h" #define parse_type(ps) builtin_type (ps->gdbarch ()) @@ -115,6 +116,8 @@ static void yyerror (const char *); /* YYSTYPE gets defined by %union. */ static int parse_number (struct parser_state *, const char *, int, int, YYSTYPE *); + +using namespace expr; %} %type exp exp1 type_exp start variable lcurly @@ -193,77 +196,78 @@ start : exp1 ; type_exp: type - { write_exp_elt_opcode (pstate, OP_TYPE); - write_exp_elt_type (pstate, $1); - write_exp_elt_opcode (pstate, OP_TYPE); } + { pstate->push_new ($1); } ; /* Expressions, including the comma operator. */ exp1 : exp | exp1 ',' exp - { write_exp_elt_opcode (pstate, BINOP_COMMA); } + { pstate->wrap2 (); } ; /* Expressions, not including the comma operator. */ exp : '*' exp %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_IND); } + { pstate->wrap (); } ; exp : '&' exp %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_ADDR); } + { pstate->wrap (); } ; exp : '-' exp %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_NEG); } + { pstate->wrap (); } ; exp : '+' exp %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_PLUS); } + { pstate->wrap (); } ; exp : '!' exp %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_LOGICAL_NOT); } + { pstate->wrap (); } ; exp : '^' exp %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_COMPLEMENT); } + { pstate->wrap (); } ; exp : exp INCREMENT %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_POSTINCREMENT); } + { pstate->wrap (); } ; exp : exp DECREMENT %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_POSTDECREMENT); } + { pstate->wrap (); } ; /* foo->bar is not in Go. May want as a gdb extension. Later. */ exp : exp '.' name_not_typename - { write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); - write_exp_string (pstate, $3.stoken); - write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); } + { + pstate->push_new + (pstate->pop (), copy_name ($3.stoken)); + } ; exp : exp '.' name_not_typename COMPLETE - { pstate->mark_struct_expression (); - write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); - write_exp_string (pstate, $3.stoken); - write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); } + { + structop_base_operation *op + = new structop_operation (pstate->pop (), + copy_name ($3.stoken)); + pstate->mark_struct_expression (op); + pstate->push (operation_up (op)); + } ; exp : exp '.' COMPLETE - { struct stoken s; - pstate->mark_struct_expression (); - write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); - s.ptr = ""; - s.length = 0; - write_exp_string (pstate, s); - write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); } + { + structop_base_operation *op + = new structop_operation (pstate->pop (), ""); + pstate->mark_struct_expression (op); + pstate->push (operation_up (op)); + } ; exp : exp '[' exp1 ']' - { write_exp_elt_opcode (pstate, BINOP_SUBSCRIPT); } + { pstate->wrap2 (); } ; exp : exp '(' @@ -271,10 +275,12 @@ exp : exp '(' being accumulated by an outer function call. */ { pstate->start_arglist (); } arglist ')' %prec LEFT_ARROW - { write_exp_elt_opcode (pstate, OP_FUNCALL); - write_exp_elt_longcst (pstate, - pstate->end_arglist ()); - write_exp_elt_opcode (pstate, OP_FUNCALL); } + { + std::vector args + = pstate->pop_vector (pstate->end_arglist ()); + pstate->push_new + (pstate->pop (), std::move (args)); + } ; lcurly : '{' @@ -297,15 +303,17 @@ rcurly : '}' ; exp : lcurly type rcurly exp %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_MEMVAL); - write_exp_elt_type (pstate, $2); - write_exp_elt_opcode (pstate, UNOP_MEMVAL); } + { + pstate->push_new + (pstate->pop (), $2); + } ; exp : type '(' exp ')' %prec UNARY - { write_exp_elt_opcode (pstate, UNOP_CAST); - write_exp_elt_type (pstate, $1); - write_exp_elt_opcode (pstate, UNOP_CAST); } + { + pstate->push_new + (pstate->pop (), $1); + } ; exp : '(' exp1 ')' @@ -315,100 +323,110 @@ exp : '(' exp1 ')' /* Binary operators in order of decreasing precedence. */ exp : exp '@' exp - { write_exp_elt_opcode (pstate, BINOP_REPEAT); } + { pstate->wrap2 (); } ; exp : exp '*' exp - { write_exp_elt_opcode (pstate, BINOP_MUL); } + { pstate->wrap2 (); } ; exp : exp '/' exp - { write_exp_elt_opcode (pstate, BINOP_DIV); } + { pstate->wrap2 (); } ; exp : exp '%' exp - { write_exp_elt_opcode (pstate, BINOP_REM); } + { pstate->wrap2 (); } ; exp : exp '+' exp - { write_exp_elt_opcode (pstate, BINOP_ADD); } + { pstate->wrap2 (); } ; exp : exp '-' exp - { write_exp_elt_opcode (pstate, BINOP_SUB); } + { pstate->wrap2 (); } ; exp : exp LSH exp - { write_exp_elt_opcode (pstate, BINOP_LSH); } + { pstate->wrap2 (); } ; exp : exp RSH exp - { write_exp_elt_opcode (pstate, BINOP_RSH); } + { pstate->wrap2 (); } ; exp : exp EQUAL exp - { write_exp_elt_opcode (pstate, BINOP_EQUAL); } + { pstate->wrap2 (); } ; exp : exp NOTEQUAL exp - { write_exp_elt_opcode (pstate, BINOP_NOTEQUAL); } + { pstate->wrap2 (); } ; exp : exp LEQ exp - { write_exp_elt_opcode (pstate, BINOP_LEQ); } + { pstate->wrap2 (); } ; exp : exp GEQ exp - { write_exp_elt_opcode (pstate, BINOP_GEQ); } + { pstate->wrap2 (); } ; exp : exp '<' exp - { write_exp_elt_opcode (pstate, BINOP_LESS); } + { pstate->wrap2 (); } ; exp : exp '>' exp - { write_exp_elt_opcode (pstate, BINOP_GTR); } + { pstate->wrap2 (); } ; exp : exp '&' exp - { write_exp_elt_opcode (pstate, BINOP_BITWISE_AND); } + { pstate->wrap2 (); } ; exp : exp '^' exp - { write_exp_elt_opcode (pstate, BINOP_BITWISE_XOR); } + { pstate->wrap2 (); } ; exp : exp '|' exp - { write_exp_elt_opcode (pstate, BINOP_BITWISE_IOR); } + { pstate->wrap2 (); } ; exp : exp ANDAND exp - { write_exp_elt_opcode (pstate, BINOP_LOGICAL_AND); } + { pstate->wrap2 (); } ; exp : exp OROR exp - { write_exp_elt_opcode (pstate, BINOP_LOGICAL_OR); } + { pstate->wrap2 (); } ; exp : exp '?' exp ':' exp %prec '?' - { write_exp_elt_opcode (pstate, TERNOP_COND); } + { + operation_up last = pstate->pop (); + operation_up mid = pstate->pop (); + operation_up first = pstate->pop (); + pstate->push_new + (std::move (first), std::move (mid), + std::move (last)); + } ; exp : exp '=' exp - { write_exp_elt_opcode (pstate, BINOP_ASSIGN); } + { pstate->wrap2 (); } ; exp : exp ASSIGN_MODIFY exp - { write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY); - write_exp_elt_opcode (pstate, $2); - write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY); } + { + operation_up rhs = pstate->pop (); + operation_up lhs = pstate->pop (); + pstate->push_new + ($2, std::move (lhs), std::move (rhs)); + } ; exp : INT - { write_exp_elt_opcode (pstate, OP_LONG); - write_exp_elt_type (pstate, $1.type); - write_exp_elt_longcst (pstate, (LONGEST)($1.val)); - write_exp_elt_opcode (pstate, OP_LONG); } + { + pstate->push_new + ($1.type, $1.val); + } ; exp : CHAR @@ -416,7 +434,7 @@ exp : CHAR struct stoken_vector vec; vec.len = 1; vec.tokens = &$1; - write_exp_string_vector (pstate, $1.type, &vec); + pstate->push_c_string ($1.type, &vec); } ; @@ -424,20 +442,20 @@ exp : NAME_OR_INT { YYSTYPE val; parse_number (pstate, $1.stoken.ptr, $1.stoken.length, 0, &val); - write_exp_elt_opcode (pstate, OP_LONG); - write_exp_elt_type (pstate, val.typed_val_int.type); - write_exp_elt_longcst (pstate, (LONGEST) - val.typed_val_int.val); - write_exp_elt_opcode (pstate, OP_LONG); + pstate->push_new + (val.typed_val_int.type, + val.typed_val_int.val); } ; exp : FLOAT - { write_exp_elt_opcode (pstate, OP_FLOAT); - write_exp_elt_type (pstate, $1.type); - write_exp_elt_floatcst (pstate, $1.val); - write_exp_elt_opcode (pstate, OP_FLOAT); } + { + float_data data; + std::copy (std::begin ($1.val), std::end ($1.val), + std::begin (data)); + pstate->push_new ($1.type, data); + } ; exp : variable @@ -445,29 +463,26 @@ exp : variable exp : DOLLAR_VARIABLE { - write_dollar_variable (pstate, $1); + pstate->push_dollar ($1); } ; exp : SIZEOF_KEYWORD '(' type ')' %prec UNARY { /* TODO(dje): Go objects in structs. */ - write_exp_elt_opcode (pstate, OP_LONG); /* TODO(dje): What's the right type here? */ - write_exp_elt_type - (pstate, - parse_type (pstate)->builtin_unsigned_int); + struct type *size_type + = parse_type (pstate)->builtin_unsigned_int; $3 = check_typedef ($3); - write_exp_elt_longcst (pstate, - (LONGEST) TYPE_LENGTH ($3)); - write_exp_elt_opcode (pstate, OP_LONG); + pstate->push_new + (size_type, (LONGEST) TYPE_LENGTH ($3)); } ; exp : SIZEOF_KEYWORD '(' exp ')' %prec UNARY { /* TODO(dje): Go objects in structs. */ - write_exp_elt_opcode (pstate, UNOP_SIZEOF); + pstate->wrap (); } string_exp: @@ -510,8 +525,8 @@ exp : string_exp %prec ABOVE_COMMA { int i; - write_exp_string_vector (pstate, 0 /*always utf8*/, - &$1); + /* Always utf8. */ + pstate->push_c_string (0, &$1); for (i = 0; i < $1.len; ++i) free ($1.tokens[i].ptr); free ($1.tokens); @@ -519,30 +534,24 @@ exp : string_exp %prec ABOVE_COMMA ; exp : TRUE_KEYWORD - { write_exp_elt_opcode (pstate, OP_BOOL); - write_exp_elt_longcst (pstate, (LONGEST) $1); - write_exp_elt_opcode (pstate, OP_BOOL); } + { pstate->push_new ($1); } ; exp : FALSE_KEYWORD - { write_exp_elt_opcode (pstate, OP_BOOL); - write_exp_elt_longcst (pstate, (LONGEST) $1); - write_exp_elt_opcode (pstate, OP_BOOL); } + { pstate->push_new ($1); } ; variable: name_not_typename ENTRY { struct symbol *sym = $1.sym.symbol; if (sym == NULL - || !SYMBOL_IS_ARGUMENT (sym) + || !sym->is_argument () || !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); - write_exp_elt_opcode (pstate, OP_VAR_ENTRY_VALUE); + pstate->push_new (sym); } ; @@ -554,10 +563,7 @@ variable: name_not_typename if (symbol_read_needs_frame (sym.symbol)) pstate->block_tracker->update (sym); - write_exp_elt_opcode (pstate, OP_VAR_VALUE); - write_exp_elt_block (pstate, sym.block); - write_exp_elt_sym (pstate, sym.symbol); - write_exp_elt_opcode (pstate, OP_VAR_VALUE); + pstate->push_new (sym); } else if ($1.is_a_field_of_this) { @@ -568,19 +574,20 @@ 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); + pstate->push_new + (msymbol); else if (!have_full_symbols () && !have_partial_symbols ()) error (_("No symbol table is loaded. " "Use the \"file\" command.")); else error (_("No symbol \"%s\" in current context."), - copy_name ($1.stoken)); + arg.c_str ()); } } ; @@ -640,10 +647,8 @@ static int parse_number (struct parser_state *par_state, const char *p, int len, int parsed_float, YYSTYPE *putithere) { - /* FIXME: Shouldn't these be unsigned? We don't deal with negative values - here, and we do kind of silly things like cast to unsigned. */ - LONGEST n = 0; - LONGEST prevn = 0; + ULONGEST n = 0; + ULONGEST prevn = 0; ULONGEST un; int i = 0; @@ -682,20 +687,20 @@ parse_number (struct parser_state *par_state, } /* Default type for floating-point literals is float64. */ else - { + { putithere->typed_val_float.type = builtin_go_types->builtin_float64; - } + } if (!parse_float (p, len, putithere->typed_val_float.type, putithere->typed_val_float.val)) - return ERROR; + return ERROR; return FLOAT; } /* Handle base-switching prefixes 0x, 0t, 0d, 0. */ - if (p[0] == '0') + if (p[0] == '0' && len > 1) switch (p[1]) { case 'x': @@ -783,7 +788,7 @@ parse_number (struct parser_state *par_state, on 0x123456789 when LONGEST is 32 bits. */ if (c != 'l' && c != 'u' && n != 0) { - if ((unsigned_p && (ULONGEST) prevn >= (ULONGEST) n)) + if ((unsigned_p && prevn >= n)) error (_("Numeric constant too large.")); } prevn = n; @@ -801,12 +806,12 @@ parse_number (struct parser_state *par_state, the case where it is we just always shift the value more than once, with fewer bits each time. */ - un = (ULONGEST)n >> 2; + un = n >> 2; if (long_p == 0 && (un >> (gdbarch_int_bit (par_state->gdbarch ()) - 2)) == 0) { high_bit - = ((ULONGEST)1) << (gdbarch_int_bit (par_state->gdbarch ()) - 1); + = ((ULONGEST)1) << (gdbarch_int_bit (par_state->gdbarch ()) - 1); /* A large decimal (not hex or octal) constant (between INT_MAX and UINT_MAX) is a long or unsigned long, according to ANSI, @@ -924,7 +929,7 @@ parse_string_or_char (const char *tokptr, const char **outptr, } ++tokptr; - value->type = C_STRING | (quote == '\'' ? C_CHAR : 0); /*FIXME*/ + value->type = (int) C_STRING | (quote == '\'' ? C_CHAR : 0); /*FIXME*/ value->ptr = (char *) obstack_base (&tempbuf); value->length = obstack_object_size (&tempbuf); @@ -958,19 +963,19 @@ static const struct token tokentab2[] = {"|=", ASSIGN_MODIFY, BINOP_BITWISE_IOR}, {"&=", ASSIGN_MODIFY, BINOP_BITWISE_AND}, {"^=", ASSIGN_MODIFY, BINOP_BITWISE_XOR}, - {"++", INCREMENT, BINOP_END}, - {"--", DECREMENT, BINOP_END}, - /*{"->", RIGHT_ARROW, BINOP_END}, Doesn't exist in Go. */ - {"<-", LEFT_ARROW, BINOP_END}, - {"&&", ANDAND, BINOP_END}, - {"||", OROR, BINOP_END}, - {"<<", LSH, BINOP_END}, - {">>", RSH, BINOP_END}, - {"==", EQUAL, BINOP_END}, - {"!=", NOTEQUAL, BINOP_END}, - {"<=", LEQ, BINOP_END}, - {">=", GEQ, BINOP_END}, - /*{"&^", ANDNOT, BINOP_END}, TODO */ + {"++", INCREMENT, OP_NULL}, + {"--", DECREMENT, OP_NULL}, + /*{"->", RIGHT_ARROW, OP_NULL}, Doesn't exist in Go. */ + {"<-", LEFT_ARROW, OP_NULL}, + {"&&", ANDAND, OP_NULL}, + {"||", OROR, OP_NULL}, + {"<<", LSH, OP_NULL}, + {">>", RSH, OP_NULL}, + {"==", EQUAL, OP_NULL}, + {"!=", NOTEQUAL, OP_NULL}, + {"<=", LEQ, OP_NULL}, + {">=", GEQ, OP_NULL}, + /*{"&^", ANDNOT, OP_NULL}, TODO */ }; /* Identifier-like tokens. */ @@ -1011,10 +1016,8 @@ lex_one_token (struct parser_state *par_state) { int c; int namelen; - unsigned int i; const char *tokstart; int saw_structop = last_was_structop; - char *copy; last_was_structop = 0; @@ -1024,23 +1027,23 @@ lex_one_token (struct parser_state *par_state) 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) + for (const auto &token : tokentab3) + if (strncmp (tokstart, token.oper, 3) == 0) { par_state->lexptr += 3; - yylval.opcode = tokentab3[i].opcode; - return tokentab3[i].token; + yylval.opcode = token.opcode; + return token.token; } /* See if it is a special token of length 2. */ - for (i = 0; i < sizeof (tokentab2) / sizeof (tokentab2[0]); i++) - if (strncmp (tokstart, tokentab2[i].oper, 2) == 0) + for (const auto &token : tokentab2) + if (strncmp (tokstart, token.oper, 2) == 0) { par_state->lexptr += 2; - yylval.opcode = tokentab2[i].opcode; + yylval.opcode = token.opcode; /* NOTE: -> doesn't exist in Go, so we don't need to watch for setting last_was_structop here. */ - return tokentab2[i].token; + return token.token; } switch (c = *tokstart) @@ -1054,7 +1057,7 @@ lex_one_token (struct parser_state *par_state) else if (saw_structop) return COMPLETE; else - return 0; + return 0; case ' ': case '\t': @@ -1078,7 +1081,7 @@ lex_one_token (struct parser_state *par_state) case ',': if (pstate->comma_terminates - && paren_depth == 0) + && paren_depth == 0) return 0; par_state->lexptr++; return c; @@ -1140,7 +1143,7 @@ lex_one_token (struct parser_state *par_state) } toktype = parse_number (par_state, tokstart, p - tokstart, got_dot|got_e, &yylval); - if (toktype == ERROR) + if (toktype == ERROR) { char *err_copy = (char *) alloca (p - tokstart + 1); @@ -1263,14 +1266,14 @@ lex_one_token (struct parser_state *par_state) yylval.sval.length = namelen; /* Catch specific keywords. */ - 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) + std::string copy = copy_name (yylval.sval); + for (const auto &token : ident_tokens) + if (copy == token.oper) { /* It is ok to always set this, even though we don't always strictly need to. */ - yylval.opcode = ident_tokens[i].opcode; - return ident_tokens[i].token; + yylval.opcode = token.opcode; + return token.token; } if (*tokstart == '$') @@ -1333,8 +1336,8 @@ package_name_p (const char *name, const struct block *block) sym = lookup_symbol (name, block, STRUCT_DOMAIN, &is_a_field_of_this).symbol; if (sym - && SYMBOL_CLASS (sym) == LOC_TYPEDEF - && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_MODULE) + && sym->aclass () == LOC_TYPEDEF + && sym->type ()->code () == TYPE_CODE_MODULE) return 1; return 0; @@ -1347,15 +1350,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 +1370,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 +1399,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 +1418,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 +1440,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 +1462,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 +1522,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, @@ -1555,8 +1554,10 @@ yylex (void) return classify_name (pstate, pstate->expression_context_block); } +/* See language.h. */ + int -go_parse (struct parser_state *par_state) +go_language::parser (struct parser_state *par_state) const { /* Setting up the parser state. */ scoped_restore pstate_restore = make_scoped_restore (&pstate); @@ -1575,7 +1576,10 @@ go_parse (struct parser_state *par_state) popping = 0; name_obstack.clear (); - return yyparse (); + int result = yyparse (); + if (!result) + pstate->set_operation (pstate->pop ()); + return result; } static void