[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]