From: Michael Edgar Date: 2011-09-09T23:38:33+09:00 Subject: [ruby-core:39429] [Ruby 1.9 - Bug #5303][Open] parse.y relies on $$ = $1 before action routines [PATCH] Issue #5303 has been reported by Michael Edgar. ---------------------------------------- Bug #5303: parse.y relies on $$ = $1 before action routines [PATCH] http://redmine.ruby-lang.org/issues/5303 Author: Michael Edgar Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: ruby 1.9.3dev (2011-08-21 revision 33020) [x86_64-darwin11.1.0] In perusing parse.y, I came across this pair of action routines: bv_decls : bvar /*%c%*/ /*%c { $$ = rb_ary_new3(1, $1); } %*/ | bv_decls ',' bvar /*%c%*/ /*%c { rb_ary_push($$, $3); } %*/ ; Here, the call to rb_ary_push($$, $3) is relying on the fact that yacc/bison prefaces each routine's execution with $$=$1. It does so in order to implement the default behavior for rules that have no action routine (the implicit $$ = $1 rule), and while I doubt that will ever change, I don't think it should be relied upon. At the very least, it's a bit confusing at first glance (using $$ before it is set). Notably, other instances of this idiom (undef_list -> fitem | undef_list ',' fitem; f_arg -> f_arg_item | f_arg ',' f_arg_item; f_block_optarg; f_optarg....) use this approach. It is corrected by simply replacing $$ with $1. A patch is included. No behavior changes, so no test is included. -- http://redmine.ruby-lang.org