summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--parse.y16
2 files changed, 19 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index d9cb1c7596..7229834519 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Thu Nov 20 00:26:37 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_here_document): append byte sequence directly to
+ the delayed content instead of creating an intermediate string
+ object.
+
Wed Nov 19 21:11:01 2014 NARUSE, Yui <naruse@ruby-lang.org>
* common.mk (ext/json/parser/parser.c): don't touch parse.c,
diff --git a/parse.y b/parse.y
index d8a07d06bf..8dc8dbebfd 100644
--- a/parse.y
+++ b/parse.y
@@ -6588,11 +6588,21 @@ parser_here_document(struct parser_params *parser, NODE *here)
ripper_dispatch_scan_event(parser, tSTRING_CONTENT);
}
else {
- if (str ||
- ((len = lex_p - parser->tokp) > 0 &&
- (str = STR_NEW3(parser->tokp, len, enc, func), 1))) {
+ if (str) {
rb_str_append(parser->delayed, str);
}
+ else if ((len = lex_p - parser->tokp) > 0) {
+ if (!(func & STR_FUNC_REGEXP) && rb_enc_asciicompat(enc)) {
+ int cr = ENC_CODERANGE_UNKNOWN;
+ rb_str_coderange_scan_restartable(parser->tokp, lex_p, enc, &cr);
+ if (cr != ENC_CODERANGE_7BIT &&
+ current_enc == rb_usascii_encoding() &&
+ enc != rb_utf8_encoding()) {
+ enc = rb_ascii8bit_encoding();
+ }
+ }
+ rb_enc_str_buf_cat(parser->delayed, parser->tokp, len, enc);
+ }
ripper_dispatch_delayed_token(parser, tSTRING_CONTENT);
}
lex_goto_eol(parser);