diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-10-04 06:47:29 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-10-04 06:47:29 +0000 |
commit | 2afb729f57cfc0806e5a7734b53b20263cce2e58 (patch) | |
tree | 1bbaffbea057adc167fba1e465367183c5da9860 /parse.y | |
parent | 3be412834d4f09eb0c2a705073ff10b1fd0d6e93 (diff) |
parse.y: fix var_field
* parse.y (mlhs_node): dispatch var_field as well as lhs.
* parse.y (lhs, var_hs): dispatch var_field before assignable
check so it is inside assign_error at a wrong assignment, as
well as backref_assign_error.
* parse.y (var_field_gen): wrap var_field value with the variable
ID.
* parse.y (assignable_gen, const_decl_gen): return the callback
result on a syntax error.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60116 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 38 |
1 files changed, 18 insertions, 20 deletions
@@ -548,7 +548,8 @@ static VALUE new_xstring_gen(struct parser_params *, VALUE); static VALUE const_decl_gen(struct parser_params *parser, VALUE path); #define const_decl(path) const_decl_gen(parser, path) -#define var_field(n) dispatch1(var_field, (n)) +static VALUE var_field_gen(struct parser_params *parser, VALUE a); +#define var_field(a) var_field_gen(parser, (a)) static VALUE assign_error_gen(struct parser_params *parser, VALUE a); #define assign_error(a) assign_error_gen(parser, (a)) #define backref_assign_error(n, a) assign_error(a) @@ -1711,11 +1712,11 @@ mlhs_post : mlhs_item mlhs_node : user_variable { - $$ = assignable($1, 0); + $$ = assignable(var_field($1), 0); } | keyword_variable { - $$ = assignable($1, 0); + $$ = assignable(var_field($1), 0); } | primary_value '[' opt_call_args rbracket { @@ -1766,20 +1767,18 @@ mlhs_node : user_variable lhs : user_variable { - $$ = assignable($1, 0); + $$ = assignable(var_field($1), 0); /*%%%*/ if (!$$) $$ = NEW_BEGIN(0); /*% - $$ = dispatch1(var_field, $$); %*/ } | keyword_variable { - $$ = assignable($1, 0); + $$ = assignable(var_field($1), 0); /*%%%*/ if (!$$) $$ = NEW_BEGIN(0); /*% - $$ = dispatch1(var_field, $$); %*/ } | primary_value '[' opt_call_args rbracket @@ -4142,19 +4141,11 @@ var_ref : user_variable var_lhs : user_variable { - $$ = assignable($1, 0); - /*%%%*/ - /*% - $$ = dispatch1(var_field, $$); - %*/ + $$ = assignable(var_field($1), 0); } | keyword_variable { - $$ = assignable($1, 0); - /*%%%*/ - /*% - $$ = dispatch1(var_field, $$); - %*/ + $$ = assignable(var_field($1), 0); } ; @@ -9258,8 +9249,8 @@ assignable_gen(struct parser_params *parser, ID id, NODE *val) { #ifdef RIPPER ID id = get_id(lhs); -# define assignable_result(x) get_value(lhs) -# define parser_yyerror(parser, x) assign_error_gen(parser, lhs) +# define assignable_result(x) (lhs) +# define parser_yyerror(parser, x) (lhs = assign_error_gen(parser, lhs)) #else # define assignable_result(x) (x) #endif @@ -10296,7 +10287,8 @@ static VALUE const_decl_gen(struct parser_params *parser, VALUE path) { if (in_def || in_single) { - assign_error(path); + path = dispatch1(assign_error, path); + ripper_error(); } return path; } @@ -10308,6 +10300,12 @@ assign_error_gen(struct parser_params *parser, VALUE a) ripper_error(); return a; } + +static VALUE +var_field_gen(struct parser_params *parser, VALUE a) +{ + return ripper_new_yylval(get_id(a), dispatch1(var_field, a), 0); +} #endif static void |