This is happening because Ripper constructs AST nodes differently than
parse.y normally does. Specifically in this case Ripper is assigning 3 VALUE objects:
The important one is the last one, the struct rb_ary_pattern_info. The
mark function assumed that NODE_ARYPTN have a pointer to struct rb_ary_pattern_info, and used it:
In the case of Ripper, NODE_ARYPTN doesn't point to an rb_ary_pattern_info, so the mark function would SEGV. This commit
changes Ripper so that its NODE_ARYPTN nodes also point at an rb_ary_pattern_info, and the mark function can continue with the same
assumption.
Make NODE_ARYPTN layout consistent between Ripper and AST
We are seeing SEGVs in CI:
http://ci.rvm.jp/results/trunk-gc-asserts@ruby-sky1/2253563
This is happening because Ripper constructs AST nodes differently than
parse.y normally does. Specifically in this case Ripper is assigning 3
VALUE
objects:https://github.com/ruby/ruby/blob/1febb6f4a14f7222c6d30250bfdc252d34238187/parse.y#L757-L761
Where parse.y will normally assign other things:
https://github.com/ruby/ruby/blob/1febb6f4a14f7222c6d30250bfdc252d34238187/parse.y#L11258-L11260
The important one is the last one, the
struct rb_ary_pattern_info
. Themark function assumed that
NODE_ARYPTN
have a pointer tostruct rb_ary_pattern_info
, and used it:https://github.com/ruby/ruby/blob/1febb6f4a14f7222c6d30250bfdc252d34238187/node.c#L1269-L1274
In the case of Ripper,
NODE_ARYPTN
doesn't point to anrb_ary_pattern_info
, so the mark function would SEGV. This commitchanges Ripper so that its
NODE_ARYPTN
nodes also point at anrb_ary_pattern_info
, and the mark function can continue with the sameassumption.