From 49371b5420619c0729154939b13e02aceb471611 Mon Sep 17 00:00:00 2001 From: ko1 Date: Tue, 16 Oct 2012 23:38:58 +0000 Subject: * 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 --- compile.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'compile.c') 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; } -- cgit v1.2.3