Backport #2232 [ruby-core:26163]

Ripper Handling of multiple left hand side [PATCH]

Added by Andy Keep 147 days ago. Updated 100 days ago.

Status :Closed Start :10/20/2009
Priority :Normal Due date :
Assigned to :Yuki Sonoda % Done :

100%

Category :-
Target version :-

Description

Right now ripper doesn't properly handling multiple assignment when a variable follows a starred variable in a multiple assignment.

For instance say I have:
>> a, *b, c = [1, 2, 3, 4]
=> [1, 2, 3, 4]
>> a
=> 1
>> b
=> [2, 3]
>> c
=> 4
>> 

Unfortunately Ripper parses "a, *b, c = [1, 2, 3, 4]" as:

>> Ripper.sexp "a, *b, c = [1, 2, 3, 4]"
=> [:program, [[:massign, [:mlhs_add_star, [[:ident, "a", [1, 0]]], [:ident, "b", [1, 4]]], [:array, [[:int, "1", [1, 12]], [:int, "2", [1, 15]], [:int, "3", [1, 18]], [:int, "4", [1, 21]]]]]]]

Note that "c" is completely missing above.

The cuprit seems to be:

		| mlhs_head tSTAR mlhs_node ',' mlhs_post
		    {
		    /*%%%*/
			$$ = NEW_MASGN($1, NEW_POSTARG($3,$5));
		    /*%
			$$ = mlhs_add_star($1, $3);
		    %*/
		    }

Where the mlhs_post is ignored.

I've got a patch that adds the line:

			$$ = mlhs_add($1, $5);

(and changes the line above to $1 = mlhs_add_star($1, $3))

With this change we get a, b and c, but I'm not sure if my approach is the right one.

Anyway, see included patch.

parse.y.mlhs_star_patch - Patch to fix Ripper handling of multiple left hand side with a * on a middle term (363 Bytes) Andy Keep, 10/20/2009 12:23 AM

Associated revisions

Revision 25404
Added by nobu 146 days ago

  • parse.y (mlhs_basic): fixed handling splat in middle of mlhs. a patch from Andy Keep in [ruby-core:26163]

Revision 26012
Added by yugui 100 days ago

merges r25404 from trunk into ruby_1_9_1. fixes the backport task #2232. --

  • parse.y (mlhs_basic): fixed handling splat in middle of mlhs. a patch from Andy Keep in [ruby-core:26163]

Revision 26496
Added by yugui 44 days ago

merges r25402,r25404,r25405,r25406 and r25407 from trunk into ruby_1_9_1. --

  • parse.y (parser_here_document): dispatch delayed heredoc contents. based on a patch from Andy Keep in [ruby-core:24855].

--

  • parse.y (mlhs_basic): fixed handling splat in middle of mlhs. a patch from Andy Keep in [ruby-core:26163]

--

  • parse.y (method_call): dispatch symbols. a patch from Andy Keep in [ruby-core:26169]. [ruby-core:26165]

--

  • test/ripper/test_*.rb: fixed indent.

--

  • parse.y (ripper_intern): enable literal optimization.

History

10/20/2009 03:17 PM - Nobuyoshi Nakada

  • Status changed from Open to Closed
  • % Done changed from 0 to 100
This issue was solved with changeset r25404.
Andy, thank you for your reporting of the issue.
You have greatfully contributed toward Ruby.
May Ruby be with you.

12/01/2009 07:22 AM - Nobuyoshi Nakada

  • Status changed from Closed to Assigned
  • Assigned to set to Yuki Sonoda

12/05/2009 06:47 PM - Yuki Sonoda

  • Status changed from Assigned to Closed
This issue was solved with changeset r26012.
Andy, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

Also available in: Atom PDF