diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-11-19 15:26:41 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-11-19 15:26:41 +0000 |
commit | 595ce95d3c63a40fb3234cba4c59eb6c8f60faf8 (patch) | |
tree | f520078fe0cbff54a683811f8c163a6a74850aeb | |
parent | 3a2d2af0f713c32b51b5b4a31f53829ff4ba8574 (diff) |
parse.y: append directly to delayed content
* parse.y (parser_here_document): append byte sequence directly to
the delayed content instead of creating an intermediate string
object.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48500 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | parse.y | 16 |
2 files changed, 19 insertions, 3 deletions
@@ -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, @@ -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); |