Bug #5002 » vcall.breaking.diff
| parse.y (working copy) | ||
|---|---|---|
| #define get_value(val) ripper_get_value(val) | ||
| static VALUE assignable_gen(struct parser_params*,VALUE); | ||
| #define assignable(lhs,node) assignable_gen(parser, (lhs)) | ||
| static int id_is_var_gen(struct parser_params *parser, ID id); | ||
| #define id_is_var(id) id_is_var_gen(parser, (id)) | ||
| #endif /* !RIPPER */ | ||
| static ID formal_argument_gen(struct parser_params*, ID); | ||
| ... | ... | |
| %type <node> lambda f_larglist lambda_body | ||
| %type <node> brace_block cmd_brace_block do_block lhs none fitem | ||
| %type <node> mlhs mlhs_head mlhs_basic mlhs_item mlhs_node mlhs_post mlhs_inner | ||
| %type <id>   fsym variable sym symbol operation operation2 operation3 | ||
| %type <id>   fsym keyword_variable user_variable sym symbol operation operation2 operation3 | ||
| %type <id>   cname fname op f_rest_arg f_block_arg opt_f_block_arg f_norm_arg f_bad_arg | ||
| /*%%%*/ | ||
| /*% | ||
| ... | ... | |
| 		    } | ||
| 		; | ||
| mlhs_node	: variable | ||
| mlhs_node	: user_variable | ||
| 		    { | ||
| 			$$ = assignable($1, 0); | ||
| 		    } | ||
| ... | ... | |
| 		    } | ||
| 		; | ||
| lhs		: variable | ||
| lhs		: user_variable | ||
| 		    { | ||
| 			$$ = assignable($1, 0); | ||
| 		    /*%%%*/ | ||
| ... | ... | |
| 		    } | ||
| 		; | ||
| variable	: tIDENTIFIER | ||
| 		| tIVAR | ||
| 		| tGVAR | ||
| 		| tCONSTANT | ||
| 		| tCVAR | ||
| 		| keyword_nil {ifndef_ripper($$ = keyword_nil);} | ||
| 		| keyword_self {ifndef_ripper($$ = keyword_self);} | ||
| 		| keyword_true {ifndef_ripper($$ = keyword_true);} | ||
| 		| keyword_false {ifndef_ripper($$ = keyword_false);} | ||
| 		| keyword__FILE__ {ifndef_ripper($$ = keyword__FILE__);} | ||
| 		| keyword__LINE__ {ifndef_ripper($$ = keyword__LINE__);} | ||
| 		| keyword__ENCODING__ {ifndef_ripper($$ = keyword__ENCODING__);} | ||
| 		; | ||
| keyword_variable : keyword_nil {ifndef_ripper($$ = keyword_nil);} | ||
| 		 | keyword_self {ifndef_ripper($$ = keyword_self);} | ||
| 		 | keyword_true {ifndef_ripper($$ = keyword_true);} | ||
| 		 | keyword_false {ifndef_ripper($$ = keyword_false);} | ||
| 		 | keyword__FILE__ {ifndef_ripper($$ = keyword__FILE__);} | ||
| 		 | keyword__LINE__ {ifndef_ripper($$ = keyword__LINE__);} | ||
| 		 | keyword__ENCODING__ {ifndef_ripper($$ = keyword__ENCODING__);} | ||
| 		 ; | ||
| var_ref		: variable | ||
| user_variable :	tIDENTIFIER | ||
| 	      | tIVAR | ||
| 	      | tGVAR | ||
| 	      | tCONSTANT | ||
| 	      | tCVAR | ||
| 	      ; | ||
| var_ref		: user_variable | ||
| 		    { | ||
| 		    /*%%%*/ | ||
| 			if (!($$ = gettable($1))) $$ = NEW_BEGIN(0); | ||
| 		    /*% | ||
| 			$$ = dispatch1(var_ref, $1); | ||
| 		        if (id_is_var(get_id($1))) { | ||
| 		          $$ = dispatch1(var_ref, $1); | ||
| 		        } else { | ||
| 		          $$ = dispatch1(vcall, $1); | ||
| 		        } | ||
| 		    %*/ | ||
| 		    } | ||
| 		| keyword_variable | ||
| 		    { | ||
| 		    /*%%%*/ | ||
| 			if (!($$ = gettable($1))) $$ = NEW_BEGIN(0); | ||
| 		    /*% | ||
| 		        $$ = dispatch1(var_ref, $1); | ||
| 		    %*/ | ||
| 		    } | ||
| 		; | ||
| var_lhs		: variable | ||
| var_lhs		: user_variable | ||
| 		    { | ||
| 			$$ = assignable($1, 0); | ||
| 		    /*%%%*/ | ||
| ... | ... | |
|     return t; | ||
| } | ||
| #ifndef RIPPER | ||
| #ifdef RIPPER | ||
| static int | ||
| id_is_var_gen(struct parser_params *parser, ID id) | ||
| { | ||
|     if (is_global_id(id) || is_instance_id(id) || is_const_id(id) || is_class_id(id)) { | ||
| 	return 1; | ||
|     } | ||
|     else if (is_local_id(id)) { | ||
| 	if (dyna_in_block() && dvar_defined(id)) return 1; | ||
| 	if (local_id(id)) return 1; | ||
| 	/* method call without arguments */ | ||
| 	return 0; | ||
|     } | ||
|     compile_error(PARSER_ARG "identifier %s is not valid to get", rb_id2name(id)); | ||
|     return 0; | ||
| } | ||
| #else  /* !RIPPER */ | ||
| static NODE* | ||
| node_newnode(struct parser_params *parser, enum node_type type, VALUE a0, VALUE a1, VALUE a2) | ||
| { | ||