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

ruby-changes:20364

From: nobu <ko1@a...>
Date: Tue, 5 Jul 2011 15:28:15 +0900 (JST)
Subject: [ruby-changes:20364] nobu:r32412 (trunk): * parse.y (parser_here_document): should dispatch heredoc_end

nobu	2011-07-05 15:28:07 +0900 (Tue, 05 Jul 2011)

  New Revision: 32412

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32412

  Log:
    * parse.y (parser_here_document): should dispatch heredoc_end
      scanner event on an empty here document.  fixed Bug#4543.

  Modified files:
    trunk/ChangeLog
    trunk/parse.y
    trunk/test/ripper/test_scanner_events.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32411)
+++ ChangeLog	(revision 32412)
@@ -1,3 +1,8 @@
+Tue Jul  5 15:28:04 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* parse.y (parser_here_document): should dispatch heredoc_end
+	  scanner event on an empty here document.  fixed Bug#4543.
+
 Tue Jul  5 13:49:26 2011  Yusuke Endoh  <mame@t...>
 
 	* addr2line.c: fix r32407 to check HAVE_ALLOCA_H.
Index: parse.y
===================================================================
--- parse.y	(revision 32411)
+++ parse.y	(revision 32412)
@@ -6095,6 +6095,21 @@
     return strncmp(eos, p, len) == 0;
 }
 
+#ifdef RIPPER
+static void
+ripper_dispatch_heredoc_end(struct parser_params *parser)
+{
+    if (!NIL_P(parser->delayed))
+	ripper_dispatch_delayed_token(parser, tSTRING_CONTENT);
+    lex_goto_eol(parser);
+    ripper_dispatch_ignored_scan_event(parser, tHEREDOC_END);
+}
+
+#define dispatch_heredoc_end() ripper_dispatch_heredoc_end(parser)
+#else
+#define dispatch_heredoc_end() ((void)0)
+#endif
+
 static int
 parser_here_document(struct parser_params *parser, NODE *here)
 {
@@ -6131,6 +6146,7 @@
 	return 0;
     }
     if (was_bol() && whole_match_p(eos, len, indent)) {
+	dispatch_heredoc_end();
 	heredoc_restore(lex_strterm);
 	return tSTRING_END;
     }
@@ -6192,12 +6208,7 @@
 	} while (!whole_match_p(eos, len, indent));
 	str = STR_NEW3(tok(), toklen(), enc, func);
     }
-#ifdef RIPPER
-    if (!NIL_P(parser->delayed))
-	ripper_dispatch_delayed_token(parser, tSTRING_CONTENT);
-    lex_goto_eol(parser);
-    ripper_dispatch_ignored_scan_event(parser, tHEREDOC_END);
-#endif
+    dispatch_heredoc_end();
     heredoc_restore(lex_strterm);
     lex_strterm = NEW_STRTERM(-1, 0, 0);
     set_yylval_str(str);
Index: test/ripper/test_scanner_events.rb
===================================================================
--- test/ripper/test_scanner_events.rb	(revision 32411)
+++ test/ripper/test_scanner_events.rb	(revision 32412)
@@ -66,6 +66,11 @@
                   [[2, 0], :on_tstring_content, "heredoc\n"],
                   [[3, 0], :on_heredoc_end, "EOS"]],
                  Ripper.lex("<<EOS\nheredoc\nEOS")
+    assert_equal [[[1, 0], :on_heredoc_beg, "<<EOS"],
+                  [[1, 5], :on_nl, "\n"],
+                  [[2, 0], :on_heredoc_end, "EOS"]],
+                 Ripper.lex("<<EOS\nEOS"),
+                 "bug#4543"
     assert_equal [[[1, 0], :on_regexp_beg, "/"],
                   [[1, 1], :on_tstring_content, "foo\nbar"],
                   [[2, 3], :on_regexp_end, "/"]],
@@ -654,6 +659,9 @@
     assert_equal [],
                  scan('heredoc_end', '')
     assert_equal ["EOS"],
+                 scan('heredoc_end', "<<EOS\nEOS"),
+                 "bug#4543"
+    assert_equal ["EOS"],
                  scan('heredoc_end', "<<EOS\nheredoc\nEOS")
     assert_equal ["EOS\n"],
                  scan('heredoc_end', "<<EOS\nheredoc\nEOS\n")

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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