aboutsummaryrefslogtreecommitdiffstats
path: root/compile.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-09-29 07:37:40 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-09-29 07:37:40 +0000
commita9df34cd05d9f88466c52364780f0e40c13a3e45 (patch)
tree837ac0d60faec356052202d2724a233ad5407ed6 /compile.c
parentf400cde0a07d83d690380f9d1aa2d6be5ec68b67 (diff)
downloadruby-a9df34cd05d9f88466c52364780f0e40c13a3e45.tar.gz
compile.c: fix performance of strconcat
* compile.c (compile_dstr_fragments): fix performance by omitting the first empty string only for keeping literal encoding if other literals are too. [ruby-core:70930] [Bug #11556] * string.c (rb_str_append_literal): append but keep encoding non US-ASCII. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51970 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/compile.c b/compile.c
index 9928aaa44c..9c59b595d7 100644
--- a/compile.c
+++ b/compile.c
@@ -788,6 +788,12 @@ FIRST_ELEMENT(LINK_ANCHOR *anchor)
}
static LINK_ELEMENT *
+LAST_ELEMENT(LINK_ANCHOR *anchor)
+{
+ return anchor->last;
+}
+
+static LINK_ELEMENT *
POP_ELEMENT(ISEQ_ARG_DECLARE LINK_ANCHOR *anchor)
{
LINK_ELEMENT *elem = anchor->last;
@@ -2329,6 +2335,7 @@ compile_dstr_fragments(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, int *cntp)
{
NODE *list = node->nd_next;
VALUE lit = node->nd_lit;
+ LINK_ELEMENT *first_lit = 0;
int cnt = 0;
debugp_param("nd_lit", lit);
@@ -2337,6 +2344,7 @@ compile_dstr_fragments(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, int *cntp)
if (RB_TYPE_P(lit, T_STRING))
lit = node->nd_lit = rb_fstring(node->nd_lit);
ADD_INSN1(ret, nd_line(node), putobject, lit);
+ if (RSTRING_LEN(lit) == 0) first_lit = LAST_ELEMENT(ret);
}
while (list) {
@@ -2344,6 +2352,7 @@ compile_dstr_fragments(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, int *cntp)
if (nd_type(node) == NODE_STR) {
node->nd_lit = rb_fstring(node->nd_lit);
ADD_INSN1(ret, nd_line(node), putobject, node->nd_lit);
+ lit = Qnil;
}
else {
COMPILE(ret, "each string", node);
@@ -2351,6 +2360,10 @@ compile_dstr_fragments(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, int *cntp)
cnt++;
list = list->nd_next;
}
+ if (NIL_P(lit) && first_lit) {
+ REMOVE_ELEM(first_lit);
+ --cnt;
+ }
*cntp = cnt;
return COMPILE_OK;