summaryrefslogtreecommitdiff
path: root/compile.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-10-16 23:38:58 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-10-16 23:38:58 +0000
commit49371b5420619c0729154939b13e02aceb471611 (patch)
tree4342e5189cc73791f7b76f3cd47702821041ef0d /compile.c
parent8addee964963725695f59184281810b7d6956713 (diff)
* compile.c (compile_dstr_fragments): use `putobject' instead of
`putstring' for all of strings used by NODE_DSTR because ruby users can not grab this string. For example, the string object of "baz" in "foo#{bar}baz" is located by `putobject' (users can not touch "baz" object directly). This change reduces GC pressure. This improvement is suggested by Aaron Patterson. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37235 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/compile.c b/compile.c
index 9dc5a8dd5a..f6b35672d1 100644
--- a/compile.c
+++ b/compile.c
@@ -2215,10 +2215,8 @@ iseq_set_sequence_stackcaching(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
return COMPILE_OK;
}
-
-
static int
-compile_dstr_fragments(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int *cntp)
+compile_dstr_fragments(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, int *cntp)
{
NODE *list = node->nd_next;
VALUE lit = node->nd_lit;
@@ -2232,7 +2230,14 @@ compile_dstr_fragments(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int *cntp
}
while (list) {
- COMPILE(ret, "each string", list->nd_head);
+ node = list->nd_head;
+ if (nd_type(node) == NODE_STR) {
+ hide_obj(node->nd_lit);
+ ADD_INSN1(ret, nd_line(node), putobject, node->nd_lit);
+ }
+ else {
+ COMPILE(ret, "each string", node);
+ }
cnt++;
list = list->nd_next;
}