X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fd-exp.y;h=b5265754ed0468537105ecc8ac486e551a54b3e6;hb=21122961ecea30b3be7c788e09179d297e3233f0;hp=e23a0aaeeaec07876a12befb9096d2394b979fa8;hpb=c0fe2ae7064c4f927034aca87913bc28920721d9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/d-exp.y b/gdb/d-exp.y index e23a0aaeea..b5265754ed 100644 --- a/gdb/d-exp.y +++ b/gdb/d-exp.y @@ -1,6 +1,6 @@ /* YACC parser for D expressions, for GDB. - Copyright (C) 2014-2015 Free Software Foundation, Inc. + Copyright (C) 2014-2017 Free Software Foundation, Inc. This file is part of GDB. @@ -55,65 +55,10 @@ #define parse_type(ps) builtin_type (parse_gdbarch (ps)) #define parse_d_type(ps) builtin_d_type (parse_gdbarch (ps)) -/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc), - as well as gratuitiously global symbol names, so we can have multiple - yacc generated parsers in gdb. Note that these are only the variables - produced by yacc. If other parser generators (bison, byacc, etc) produce - additional global names that conflict at link time, then those parser - generators need to be fixed instead of adding those names to this list. */ - -#define yymaxdepth d_maxdepth -#define yyparse d_parse_internal -#define yylex d_lex -#define yyerror d_error -#define yylval d_lval -#define yychar d_char -#define yydebug d_debug -#define yypact d_pact -#define yyr1 d_r1 -#define yyr2 d_r2 -#define yydef d_def -#define yychk d_chk -#define yypgo d_pgo -#define yyact d_act -#define yyexca d_exca -#define yyerrflag d_errflag -#define yynerrs d_nerrs -#define yyps d_ps -#define yypv d_pv -#define yys d_s -#define yy_yys d_yys -#define yystate d_state -#define yytmp d_tmp -#define yyv d_v -#define yy_yyv d_yyv -#define yyval d_val -#define yylloc d_lloc -#define yyreds d_reds /* With YYDEBUG defined */ -#define yytoks d_toks /* With YYDEBUG defined */ -#define yyname d_name /* With YYDEBUG defined */ -#define yyrule d_rule /* With YYDEBUG defined */ -#define yylhs d_yylhs -#define yylen d_yylen -#define yydefre d_yydefred -#define yydgoto d_yydgoto -#define yysindex d_yysindex -#define yyrindex d_yyrindex -#define yygindex d_yygindex -#define yytable d_yytable -#define yycheck d_yycheck -#define yyss d_yyss -#define yysslim d_yysslim -#define yyssp d_yyssp -#define yystacksize d_yystacksize -#define yyvs d_yyvs -#define yyvsp d_yyvsp - -#ifndef YYDEBUG -#define YYDEBUG 1 /* Default to yydebug support */ -#endif - -#define YYFPRINTF parser_fprintf +/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, + etc). */ +#define GDB_YY_REMAP_PREFIX d_ +#include "yy-remap.h" /* The state of the parser, used internally when we are parsing the expression. */ @@ -126,6 +71,8 @@ static int yylex (void); void yyerror (char *); +static int type_aggregate_p (struct type *); + %} /* Although the yacc "value" of an expression is not used, @@ -366,21 +313,20 @@ UnaryExpression: { write_exp_elt_opcode (pstate, UNOP_LOGICAL_NOT); } | '~' UnaryExpression { write_exp_elt_opcode (pstate, UNOP_COMPLEMENT); } +| TypeExp '.' SIZEOF_KEYWORD + { write_exp_elt_opcode (pstate, UNOP_SIZEOF); } | CastExpression | PowExpression ; CastExpression: CAST_KEYWORD '(' TypeExp ')' UnaryExpression - { write_exp_elt_opcode (pstate, UNOP_CAST); - write_exp_elt_type (pstate, $3); - write_exp_elt_opcode (pstate, UNOP_CAST); } + { write_exp_elt_opcode (pstate, UNOP_CAST_TYPE); } /* C style cast is illegal D, but is still recognised in the grammar, so we keep this around for convenience. */ | '(' TypeExp ')' UnaryExpression - { write_exp_elt_opcode (pstate, UNOP_CAST); - write_exp_elt_type (pstate, $2); - write_exp_elt_opcode (pstate, UNOP_CAST); } + { write_exp_elt_opcode (pstate, UNOP_CAST_TYPE); } + ; PowExpression: @@ -408,6 +354,8 @@ PostfixExpression: write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); write_exp_string (pstate, $3); write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); } +| PostfixExpression '.' SIZEOF_KEYWORD + { write_exp_elt_opcode (pstate, UNOP_SIZEOF); } | PostfixExpression INCREMENT { write_exp_elt_opcode (pstate, UNOP_POSTINCREMENT); } | PostfixExpression DECREMENT @@ -481,9 +429,7 @@ PrimaryExpression: } write_exp_elt_opcode (pstate, OP_VAR_VALUE); - /* We want to use the selected frame, not another more inner frame - which happens to be in the same block. */ - write_exp_elt_block (pstate, NULL); + write_exp_elt_block (pstate, sym.block); write_exp_elt_sym (pstate, sym.symbol); write_exp_elt_opcode (pstate, OP_VAR_VALUE); } @@ -522,12 +468,12 @@ PrimaryExpression: { struct bound_minimal_symbol msymbol; struct block_symbol sym; - const char *typename = TYPE_SAFE_NAME (type); - int typename_len = strlen (typename); + const char *type_name = TYPE_SAFE_NAME (type); + int type_name_len = strlen (type_name); char *name; name = xstrprintf ("%.*s.%.*s", - typename_len, typename, + type_name_len, type_name, $3.length, $3.ptr); make_cleanup (xfree, name); @@ -554,9 +500,7 @@ PrimaryExpression: /* Check if the qualified name resolves as a member of an aggregate or an enum type. */ - if (!(TYPE_CODE (type) == TYPE_CODE_STRUCT - || TYPE_CODE (type) == TYPE_CODE_UNION - || TYPE_CODE (type) == TYPE_CODE_ENUM)) + if (!type_aggregate_p (type)) error (_("`%s' is not defined as an aggregate type."), TYPE_SAFE_NAME (type)); @@ -616,6 +560,8 @@ PrimaryExpression: write_exp_elt_longcst (pstate, (LONGEST) 0); write_exp_elt_longcst (pstate, (LONGEST) $1 - 1); write_exp_elt_opcode (pstate, OP_ARRAY); } +| TYPEOF_KEYWORD '(' Expression ')' + { write_exp_elt_opcode (pstate, OP_TYPEOF); } ; ArrayLiteral: @@ -640,7 +586,7 @@ StringExp: vec->type = $1.type; vec->length = $1.length; - vec->ptr = malloc ($1.length + 1); + vec->ptr = (char *) malloc ($1.length + 1); memcpy (vec->ptr, $1.ptr, $1.length + 1); } | StringExp STRING_LITERAL @@ -648,10 +594,10 @@ StringExp: for convenience. */ char *p; ++$$.len; - $$.tokens = realloc ($$.tokens, - $$.len * sizeof (struct typed_stoken)); + $$.tokens + = XRESIZEVEC (struct typed_stoken, $$.tokens, $$.len); - p = malloc ($2.length + 1); + p = (char *) malloc ($2.length + 1); memcpy (p, $2.ptr, $2.length + 1); $$.tokens[$$.len - 1].type = $2.type; @@ -695,6 +641,17 @@ BasicType: %% +/* Return true if the type is aggregate-like. */ + +static int +type_aggregate_p (struct type *type) +{ + return (TYPE_CODE (type) == TYPE_CODE_STRUCT + || TYPE_CODE (type) == TYPE_CODE_UNION + || (TYPE_CODE (type) == TYPE_CODE_ENUM + && TYPE_DECLARED_CLASS (type))); +} + /* Take care of parsing a number (anything that starts with a digit). Set yylval and return the token type; update lexptr. LEN is the number of characters in it. */ @@ -724,7 +681,6 @@ parse_number (struct parser_state *ps, const char *p, if (parsed_float) { - const struct builtin_d_type *builtin_d_types; const char *suffix; int suffix_len; char *s, *sp; @@ -990,7 +946,7 @@ parse_string_or_char (const char *tokptr, const char **outptr, else value->type = C_STRING; - value->ptr = obstack_base (&tempbuf); + value->ptr = (char *) obstack_base (&tempbuf); value->length = obstack_object_size (&tempbuf); *outptr = tokptr; @@ -1440,6 +1396,8 @@ classify_inner_name (struct parser_state *par_state, return classify_name (par_state, block); type = check_typedef (context); + if (!type_aggregate_p (type)) + return ERROR; copy = copy_name (yylval.ssym.stoken); yylval.ssym.sym = d_lookup_nested_symbol (type, copy, block); @@ -1541,7 +1499,7 @@ yylex (void) obstack_grow (&name_obstack, next->value.sval.ptr, next->value.sval.length); - yylval.sval.ptr = obstack_base (&name_obstack); + yylval.sval.ptr = (char *) obstack_base (&name_obstack); yylval.sval.length = obstack_object_size (&name_obstack); current.token = classify_name (pstate, expression_context_block); @@ -1621,7 +1579,7 @@ yylex (void) obstack_grow (&name_obstack, next->value.sval.ptr, next->value.sval.length); - yylval.sval.ptr = obstack_base (&name_obstack); + yylval.sval.ptr = (char *) obstack_base (&name_obstack); yylval.sval.length = obstack_object_size (&name_obstack); current.value = yylval; current.token = classification;