summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-12-11 10:17:13 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-12-11 10:17:13 +0000
commit4db3a06d6f18d69879340510b25ddd704a00dff0 (patch)
treee21b3ed74b6bb363af10434837ae29bdf79348e0
parent4a2867abe169c563e463f749923a7dbed640c409 (diff)
merge revision(s) 38235: [Backport #7255]
* parse.y (parser_here_document): flush string content between new line and :string_embexpr. [ruby-core:48703] [Bug #7255] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@38319 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--parse.y32
-rw-r--r--test/ripper/test_scanner_events.rb7
-rw-r--r--version.h2
4 files changed, 34 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 623b00c867..b9795e85fc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Dec 11 19:15:51 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_here_document): flush string content between new
+ line and :string_embexpr. [ruby-core:48703] [Bug #7255]
+
Tue Dec 11 19:01:45 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/erb.rb (ERB#run, ERB#result): eval under isolated bindings for
diff --git a/parse.y b/parse.y
index d36156fc05..a006b56357 100644
--- a/parse.y
+++ b/parse.y
@@ -5985,6 +5985,25 @@ parser_tokadd_string(struct parser_params *parser,
#define NEW_STRTERM(func, term, paren) \
rb_node_newnode(NODE_STRTERM, (func), (term) | ((paren) << (CHAR_BIT * 2)), 0)
+#ifdef RIPPER
+static void
+ripper_flush_string_content(struct parser_params *parser, rb_encoding *enc)
+{
+ if (!NIL_P(parser->delayed)) {
+ ptrdiff_t len = lex_p - parser->tokp;
+ if (len > 0) {
+ rb_enc_str_buf_cat(parser->delayed, parser->tokp, len, enc);
+ }
+ ripper_dispatch_delayed_token(parser, tSTRING_CONTENT);
+ parser->tokp = lex_p;
+ }
+}
+
+#define flush_string_content(enc) ripper_flush_string_content(parser, (enc))
+#else
+#define flush_string_content(enc) ((void)(enc))
+#endif
+
static int
parser_parse_string(struct parser_params *parser, NODE *quote)
{
@@ -6043,17 +6062,7 @@ parser_parse_string(struct parser_params *parser, NODE *quote)
tokfix();
set_yylval_str(STR_NEW3(tok(), toklen(), enc, func));
-
-#ifdef RIPPER
- if (!NIL_P(parser->delayed)) {
- ptrdiff_t len = lex_p - parser->tokp;
- if (len > 0) {
- rb_enc_str_buf_cat(parser->delayed, parser->tokp, len, enc);
- }
- ripper_dispatch_delayed_token(parser, tSTRING_CONTENT);
- parser->tokp = lex_p;
- }
-#endif
+ flush_string_content(enc);
return tSTRING_CONTENT;
}
@@ -6258,6 +6267,7 @@ parser_here_document(struct parser_params *parser, NODE *here)
}
if (c != '\n') {
set_yylval_str(STR_NEW3(tok(), toklen(), enc, func));
+ flush_string_content(enc);
return tSTRING_CONTENT;
}
tokadd(nextc());
diff --git a/test/ripper/test_scanner_events.rb b/test/ripper/test_scanner_events.rb
index e792ca8f4d..c92ec494ed 100644
--- a/test/ripper/test_scanner_events.rb
+++ b/test/ripper/test_scanner_events.rb
@@ -657,6 +657,13 @@ class TestRipper::ScannerEvents < Test::Unit::TestCase
scan('tstring_content', "<<EOS\nhere\ndoc \nEOS \n")
assert_equal ["heredoc\n\tEOS \n"],
scan('tstring_content', "<<-EOS\nheredoc\n\tEOS \n")
+ bug7255 = '[ruby-core:48703]'
+ assert_equal ["there\n""heredoc", "\n"],
+ scan('tstring_content', "<<""EOS\n""there\n""heredoc\#{foo}\nEOS"),
+ bug7255
+ assert_equal ["there\n""heredoc", "\n"],
+ scan('tstring_content', "<<""EOS\n""there\n""heredoc\#@foo\nEOS"),
+ bug7255
end
def test_heredoc_end
diff --git a/version.h b/version.h
index 5049da8dcd..78751c82b0 100644
--- a/version.h
+++ b/version.h
@@ -1,5 +1,5 @@
#define RUBY_VERSION "1.9.3"
-#define RUBY_PATCHLEVEL 337
+#define RUBY_PATCHLEVEL 338
#define RUBY_RELEASE_DATE "2012-12-11"
#define RUBY_RELEASE_YEAR 2012