ruby-changes:36593
From: nobu <ko1@a...>
Date: Tue, 2 Dec 2014 06:32:12 +0900 (JST)
Subject: [ruby-changes:36593] nobu:r48674 (trunk): parse.y: preserve tSTRING_CONTENT results
nobu 2014-12-02 06:32:04 +0900 (Tue, 02 Dec 2014) New Revision: 48674 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=48674 Log: parse.y: preserve tSTRING_CONTENT results * parse.y (ripper_flush_string_content): preserve the dispatched results at tSTRING_CONTENT. [ruby-dev:48714] [Bug #10437] Modified files: trunk/ChangeLog trunk/parse.y trunk/test/ripper/test_sexp.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 48673) +++ ChangeLog (revision 48674) @@ -1,4 +1,7 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 -Tue Dec 2 06:31:31 2014 Nobuyoshi Nakada <nobu@r...> +Tue Dec 2 06:32:02 2014 Nobuyoshi Nakada <nobu@r...> + + * parse.y (ripper_flush_string_content): preserve the dispatched + results at tSTRING_CONTENT. [ruby-dev:48714] [Bug #10437] * parse.y (regexp_contents): check in ripper only if the whole content is a single regexp without interpolation. Index: parse.y =================================================================== --- parse.y (revision 48673) +++ parse.y (revision 48674) @@ -6302,6 +6302,8 @@ static void https://github.com/ruby/ruby/blob/trunk/parse.y#L6302 ripper_flush_string_content(struct parser_params *parser, rb_encoding *enc) { VALUE content = yylval.val; + if (!ripper_is_node_yylval(content)) + content = ripper_new_yylval(0, 0, content); if (!NIL_P(parser->delayed)) { ptrdiff_t len = lex_p - parser->tokp; if (len > 0) { @@ -6309,11 +6311,12 @@ ripper_flush_string_content(struct parse https://github.com/ruby/ruby/blob/trunk/parse.y#L6311 } ripper_dispatch_delayed_token(parser, tSTRING_CONTENT); parser->tokp = lex_p; + RNODE(content)->nd_rval = yylval.val; } - if (!ripper_is_node_yylval(content)) - content = ripper_new_yylval(0, 0, content); - yylval.val = content; ripper_dispatch_scan_event(parser, tSTRING_CONTENT); + if (yylval.val != content) + RNODE(content)->nd_rval = yylval.val; + yylval.val = content; } #define flush_string_content(enc) ripper_flush_string_content(parser, (enc)) Index: test/ripper/test_sexp.rb =================================================================== --- test/ripper/test_sexp.rb (revision 48673) +++ test/ripper/test_sexp.rb (revision 48674) @@ -26,6 +26,9 @@ class TestRipper::Sexp < Test::Unit::Tes https://github.com/ruby/ruby/blob/trunk/test/ripper/test_sexp.rb#L26 sexp = Ripper.sexp('/foo/') assert_equal 'foo', search_sexp(:@tstring_content, search_sexp(:regexp_literal, sexp))[1] + sexp = Ripper.sexp("/foo\nbar/") + assert_equal "foo\nbar", search_sexp(:@tstring_content, search_sexp(:regexp_literal, sexp))[1] + sexp = Ripper.sexp('/(?<n>a(b|\g<n>))/') assert_equal '(?<n>a(b|\g<n>))', search_sexp(:@tstring_content, search_sexp(:regexp_literal, sexp))[1] end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/