1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

parse.y (assignable): Remove macro hell

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61968 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
mame 2018-01-19 17:29:27 +00:00
parent a403faa1b7
commit c4380069b7

120
parse.y
View file

@ -8895,91 +8895,89 @@ rb_parser_set_location(struct parser_params *p, YYLTYPE *yylloc)
} }
#endif /* !RIPPER */ #endif /* !RIPPER */
#ifdef RIPPER static int
static VALUE assignable0(struct parser_params *p, ID id, const char **err)
assignable(struct parser_params *p, VALUE lhs)
#else
static NODE*
assignable(struct parser_params *p, ID id, NODE *val, const YYLTYPE *loc)
#endif
{ {
#ifdef RIPPER if (!id) return -1;
ID id = get_id(lhs);
# define assignable_result(x) (lhs)
# define assignable_error() (lhs)
# define parser_yyerror(p, loc, x) (lhs = assign_error(p, lhs))
#else
# define assignable_result(x) (x)
# define assignable_error() NEW_BEGIN(0, loc)
#endif
if (!id) return assignable_error();
switch (id) { switch (id) {
case keyword_self: case keyword_self:
yyerror1(loc, "Can't change the value of self"); *err = "Can't change the value of self";
goto error; return -1;
case keyword_nil: case keyword_nil:
yyerror1(loc, "Can't assign to nil"); *err = "Can't assign to nil";
goto error; return -1;
case keyword_true: case keyword_true:
yyerror1(loc, "Can't assign to true"); *err = "Can't assign to true";
goto error; return -1;
case keyword_false: case keyword_false:
yyerror1(loc, "Can't assign to false"); *err = "Can't assign to false";
goto error; return -1;
case keyword__FILE__: case keyword__FILE__:
yyerror1(loc, "Can't assign to __FILE__"); *err = "Can't assign to __FILE__";
goto error; return -1;
case keyword__LINE__: case keyword__LINE__:
yyerror1(loc, "Can't assign to __LINE__"); *err = "Can't assign to __LINE__";
goto error; return -1;
case keyword__ENCODING__: case keyword__ENCODING__:
yyerror1(loc, "Can't assign to __ENCODING__"); *err = "Can't assign to __ENCODING__";
goto error; return -1;
} }
switch (id_type(id)) { switch (id_type(id)) {
case ID_LOCAL: case ID_LOCAL:
if (dyna_in_block(p)) { if (dyna_in_block(p)) {
if (dvar_curr(p, id)) { if (dvar_curr(p, id)) return NODE_DASGN_CURR;
return assignable_result(NEW_DASGN_CURR(id, val, loc)); if (dvar_defined(p, id)) return NODE_DASGN;
} if (local_id(p, id)) return NODE_LASGN;
else if (dvar_defined(p, id)) {
return assignable_result(NEW_DASGN(id, val, loc));
}
else if (local_id(p, id)) {
return assignable_result(NEW_LASGN(id, val, loc));
}
else {
dyna_var(p, id); dyna_var(p, id);
return assignable_result(NEW_DASGN_CURR(id, val, loc)); return NODE_DASGN_CURR;
}
} }
else { else {
if (!local_id(p, id)) { if (!local_id(p, id)) local_var(p, id);
local_var(p, id); return NODE_LASGN;
}
return assignable_result(NEW_LASGN(id, val, loc));
} }
break; break;
case ID_GLOBAL: case ID_GLOBAL: return NODE_GASGN;
return assignable_result(NEW_GASGN(id, val, loc)); case ID_INSTANCE: return NODE_IASGN;
case ID_INSTANCE:
return assignable_result(NEW_IASGN(id, val, loc));
case ID_CONST: case ID_CONST:
if (!p->in_def) if (!p->in_def) return NODE_CDECL;
return assignable_result(NEW_CDECL(id, val, 0, loc)); *err = "dynamic constant assignment";
yyerror1(loc, "dynamic constant assignment"); return -1;
break; case ID_CLASS: return NODE_CVASGN;
case ID_CLASS:
return assignable_result(NEW_CVASGN(id, val, loc));
default: default:
compile_error(p, "identifier %"PRIsVALUE" is not valid to set", rb_id2str(id)); compile_error(p, "identifier %"PRIsVALUE" is not valid to set", rb_id2str(id));
} }
error: return -1;
return assignable_error();
#undef assignable_result
#undef parser_yyerror
} }
#ifndef RIPPER
static NODE*
assignable(struct parser_params *p, ID id, NODE *val, const YYLTYPE *loc)
{
const char *err = 0;
int node_type = assignable0(p, id, &err);
switch (node_type) {
case NODE_DASGN_CURR: return NEW_DASGN_CURR(id, val, loc);
case NODE_DASGN: return NEW_DASGN(id, val, loc);
case NODE_LASGN: return NEW_LASGN(id, val, loc);
case NODE_GASGN: return NEW_GASGN(id, val, loc);
case NODE_IASGN: return NEW_IASGN(id, val, loc);
case NODE_CDECL: return NEW_CDECL(id, val, 0, loc);
case NODE_CVASGN: return NEW_CVASGN(id, val, loc);
}
if (err) yyerror1(loc, err);
return NEW_BEGIN(0, loc);
}
#else
static VALUE
assignable(struct parser_params *p, VALUE lhs)
{
const char *err = 0;
assignable0(p, get_id(lhs), &err);
if (err) lhs = assign_error(p, lhs);
return lhs;
}
#endif
static int static int
is_private_local_id(ID name) is_private_local_id(ID name)
{ {