From d88376b1352ad96e35bfc08f2bfce885ed6d72ca Mon Sep 17 00:00:00 2001 From: matz Date: Thu, 20 Feb 2003 03:35:44 +0000 Subject: * parse.y (clhs): allow "Foo::Bar = x". * parse.y (primary): "self[n]=x" can be legal even when "[]=" is private. changes submitted in [ruby-talk:63982] * parse.y (aryset): ditto. * parse.y (attrset): "self.foo=x" can be legal even when "foo=" is private. * eval.c (is_defined): private "[]=" and "foo=" support. * eval.c (rb_eval): ditto. * eval.c (assign): ditto. * eval.c (rb_eval): "foo=" should not always be public. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3509 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- parse.y | 60 ++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 18 deletions(-) (limited to 'parse.y') diff --git a/parse.y b/parse.y index 2d0682f929..b848fe71e7 100644 --- a/parse.y +++ b/parse.y @@ -240,7 +240,7 @@ static void top_local_setup(); %type singleton strings string string1 xstring regexp %type string_contents xstring_contents string_content %type words qwords word_list qword_list word -%type literal numeric dsym cbase cpath +%type literal numeric dsym cpath clhs %type bodystmt compstmt stmts stmt expr arg primary command command_call method_call %type expr_value arg_value primary_value %type if_tail opt_else case_body cases opt_rescue exc_list exc_var opt_ensure @@ -483,6 +483,10 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem $1->nd_value = NEW_RESTARY($3); $$ = $1; } + | clhs '=' command_call + { + $$ = node_assign($1, $3); + } | var_lhs tOP_ASGN command_call { value_expr($3); @@ -570,6 +574,10 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem { $$ = node_assign($1, NEW_SVALUE($3)); } + | clhs '=' mrhs + { + $$ = node_assign($1, NEW_SVALUE($3)); + } | mlhs '=' arg_value { $1->nd_value = $3; @@ -580,6 +588,10 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem $1->nd_value = $3; $$ = $1; } + | clhs '=' arg + { + $$ = node_assign($1, $3); + } | expr ; @@ -830,6 +842,14 @@ lhs : variable } ; +clhs : primary_value tCOLON2 tCONSTANT + { + if (in_def || in_single) + yyerror("dynamic constant assignment"); + $$ = NEW_CDECL(0, 0, NEW_COLON2($1, $3)); + } + ; + cname : tIDENTIFIER { yyerror("class/module name must be CONSTANT"); @@ -837,27 +857,20 @@ cname : tIDENTIFIER | tCONSTANT ; -cbase : tCOLON3 cname +cpath : tCOLON3 cname { $$ = NEW_COLON3($2); } | cname { - $$ = NEW_CONST($1); + $$ = NEW_COLON2(0, $$); } - | cbase tCOLON2 cname + | primary_value tCOLON2 cname { $$ = NEW_COLON2($1, $3); } ; -cpath : cbase - { - if (nd_type($$ = $1) == NODE_CONST) - $$ = NEW_COLON2(0, $$->nd_vid); - } - ; - fname : tIDENTIFIER | tCONSTANT | tFID @@ -1423,7 +1436,10 @@ primary : literal } | primary_value '[' aref_args ']' { - $$ = NEW_CALL($1, tAREF, $3); + if (nd_type($1) == NODE_SELF) + $$ = NEW_FCALL(tAREF, $3); + else + $$ = NEW_CALL($1, tAREF, $3); } | tLBRACK aref_args ']' { @@ -1612,7 +1628,6 @@ primary : literal kEND { $$ = NEW_DEFN($2, $4, $5, NOEX_PRIVATE); - if (is_attrset_id($2)) $$->nd_noex = NOEX_PUBLIC; fixpos($$, $4); local_pop(); in_def--; @@ -4648,9 +4663,12 @@ call_op(recv, id, narg, arg1) value_expr(recv); if (narg == 1) { value_expr(arg1); + arg1 = NEW_LIST(arg1); } - - return NEW_CALL(recv, id, narg==1?NEW_LIST(arg1):0); + else { + arg1 = 0; + } + return NEW_CALL(recv, id, arg1); } static NODE* @@ -4788,7 +4806,7 @@ assignable(id, val) else if (is_const_id(id)) { if (in_def || in_single) yyerror("dynamic constant assignment"); - return NEW_CDECL(id, val); + return NEW_CDECL(id, val, 0); } else if (is_class_id(id)) { if (in_def || in_single) return NEW_CVASGN(id, val); @@ -4804,7 +4822,10 @@ static NODE * aryset(recv, idx) NODE *recv, *idx; { - value_expr(recv); + if (recv && nd_type(recv) == NODE_SELF) + recv = (NODE *)1; + else + value_expr(recv); return NEW_ATTRASGN(recv, tASET, idx); } @@ -4822,7 +4843,10 @@ attrset(recv, id) NODE *recv; ID id; { - value_expr(recv); + if (recv && nd_type(recv) == NODE_SELF) + recv = (NODE *)1; + else + value_expr(recv); return NEW_ATTRASGN(recv, rb_id_attrset(id), 0); } -- cgit v1.2.3