[#35027] [Ruby 1.9-Bug#4352][Open] [patch] Fix eval(s, b) backtrace; make eval(s, b) consistent with eval(s) — "James M. Lawrence" <redmine@...>

Bug #4352: [patch] Fix eval(s, b) backtrace; make eval(s, b) consistent with eval(s)

16 messages 2011/02/01

[#35114] [Ruby 1.9-Bug#4373][Open] http.rb:677: [BUG] Segmentation fault — Christian Fazzini <redmine@...>

Bug #4373: http.rb:677: [BUG] Segmentation fault

59 messages 2011/02/06

[#35171] [Ruby 1.9-Bug#4386][Open] encoding: directive does not affect regex expressions — mathew murphy <redmine@...>

Bug #4386: encoding: directive does not affect regex expressions

9 messages 2011/02/09

[#35237] [Ruby 1.9-Bug#4400][Open] nested at_exit hooks run in strange order — Suraj Kurapati <redmine@...>

Bug #4400: nested at_exit hooks run in strange order

12 messages 2011/02/15

[ruby-core:35078] [Ruby 1.9-Bug#4364][Open] Ripper loses MLHS variables in the presence of an LHS splat

From: Michael Edgar <redmine@...>
Date: 2011-02-03 21:57:55 UTC
List: ruby-core #35078
Bug #4364: Ripper loses MLHS variables in the presence of an LHS splat
http://redmine.ruby-lang.org/issues/show/4364

Author: Michael Edgar
Status: Open, Priority: Normal
ruby -v: ruby 1.9.3dev (2011-02-04 trunk 30778) [x86_64-darwin10.6.0]

Ripper.sexp currently mis-parses the following LHS forms:

*b, c = ...
*, a = ...
a, *, b = ...

Specifically, in all 3 cases, the variables after the splat are not present in the resulting AST. The cause is simply missing mlhs_add calls in parse.y.

Here is the output of the trunk Ripper.sexp:

>> pp Ripper.sexp('*, b = 1, 2, 3')
[:program,
 [[:massign,
   [:mlhs_add_star, [], nil],
   [:mrhs_new_from_args,
    [[:@int, "1", [1, 7]], [:@int, "2", [1, 10]]],
    [:@int, "3", [1, 13]]]]]]

>> pp Ripper.sexp('*b, c = 1, 2, 3')
[:program,
 [[:massign,
   [:mlhs_add_star, [], [:@ident, "b", [1, 1]]],
   [:mrhs_new_from_args,
    [[:@int, "1", [1, 8]], [:@int, "2", [1, 11]]],
    [:@int, "3", [1, 14]]]]]]

>> pp Ripper.sexp('a, *, c = 1, 2, 3')
[:program,
 [[:massign,
   [:mlhs_add_star, [[:@ident, "a", [1, 0]]], nil],
   [:mrhs_new_from_args,
    [[:@int, "1", [1, 10]], [:@int, "2", [1, 13]]],
    [:@int, "3", [1, 16]]]]]]

And here is it after the patch I am including:

require 'ripper'
require 'pp'
>> pp Ripper.sexp('*, b = 1, 2, 3')
[:program,
 [[:massign,
   [:mlhs_add_star, [], nil, [[:@ident, "b", [1, 3]]]],
   [:mrhs_new_from_args,
    [[:@int, "1", [1, 7]], [:@int, "2", [1, 10]]],
    [:@int, "3", [1, 13]]]]]]

>> pp Ripper.sexp('*b, c = 1, 2, 3, 4')
[:program,
 [[:massign,
   [:mlhs_add_star, [], [:@ident, "b", [1, 1]], [[:@ident, "c", [1, 4]]]],
   [:mrhs_new_from_args,
    [[:@int, "1", [1, 8]], [:@int, "2", [1, 11]], [:@int, "3", [1, 14]]],
    [:@int, "4", [1, 17]]]]]]

>> pp Ripper.sexp('a, *, b, c = 1, 2, 3, 4')
[:program,
 [[:massign,
   [:mlhs_add_star,
    [[:@ident, "a", [1, 0]]],
    nil,
    [[:@ident, "b", [1, 6]], [:@ident, "c", [1, 9]]]],
   [:mrhs_new_from_args,
    [[:@int, "1", [1, 13]], [:@int, "2", [1, 16]], [:@int, "3", [1, 19]]],
    [:@int, "4", [1, 22]]]]]]

I based the new output on the results of the one case that does parse successfully (this is for both versions):

>> pp Ripper.sexp('a, b, *c, d, e = 1, 2, 3, 4, 5, 6')
[:program,
 [[:massign,
   [:mlhs_add_star,
    [[:@ident, "a", [1, 0]], [:@ident, "b", [1, 3]]],
    [:@ident, "c", [1, 7]],
    [[:@ident, "d", [1, 10]], [:@ident, "e", [1, 13]]]],
   [:mrhs_new_from_args,
    [[:@int, "1", [1, 17]],
     [:@int, "2", [1, 20]],
     [:@int, "3", [1, 23]],
     [:@int, "4", [1, 26]],
     [:@int, "5", [1, 29]]],
    [:@int, "6", [1, 32]]]]]]


----------------------------------------
http://redmine.ruby-lang.org

Attachments (1)

ripper.splat.diff (768 Bytes, text/x-diff)
Index: parse.y
===================================================================
--- parse.y	(revision 30778)
+++ parse.y	(working copy)
@@ -1518,7 +1518,8 @@
 		    /*%%%*/
 			$$ = NEW_MASGN($1, NEW_POSTARG(-1, $4));
 		    /*%
-			$$ = mlhs_add_star($1, Qnil);
+			$1 = mlhs_add_star($1, Qnil);
+			$$ = mlhs_add($1, $4);
 		    %*/
 		    }
 		| tSTAR mlhs_node
@@ -1534,7 +1535,8 @@
 		    /*%%%*/
 			$$ = NEW_MASGN(0, NEW_POSTARG($2,$4));
 		    /*%
-			$$ = mlhs_add_star(mlhs_new(), $2);
+			$2 = mlhs_add_star(mlhs_new(), $2);
+			$$ = mlhs_add($2, $4);
 		    %*/
 		    }
 		| tSTAR
@@ -1551,6 +1553,7 @@
 			$$ = NEW_MASGN(0, NEW_POSTARG(-1, $3));
 		    /*%
 			$$ = mlhs_add_star(mlhs_new(), Qnil);
+			$$ = mlhs_add($$, $3);
 		    %*/
 		    }
 		;

In This Thread

Prev Next