From b88daae7ecd3853f4c56d9bb74e0e06ea2a0a939 Mon Sep 17 00:00:00 2001 From: mame Date: Sun, 10 Jul 2011 03:11:52 +0000 Subject: * compile.c (when_vals): when a string literal is written on when clause, skip string creation to make it faster. [ruby-dev:44068] [Feature #5000] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32484 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ compile.c | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 5f474db4b4..6bc5c5348b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sun Jul 10 12:08:39 2011 Yusuke Endoh + + * compile.c (when_vals): when a string literal is written on when + clause, skip string creation to make it faster. [ruby-dev:44068] + [Feature #5000] + Sun Jul 10 11:35:29 2011 Yusuke Endoh * parse.y (reduce_nodes_gen): NODE_RETURN in rescue body must not be diff --git a/compile.c b/compile.c index 01c99b66e4..53149cafb2 100644 --- a/compile.c +++ b/compile.c @@ -2362,7 +2362,14 @@ when_vals(rb_iseq_t *iseq, LINK_ANCHOR *cond_seq, NODE *vals, LABEL *l1, VALUE s special_literals = Qfalse; } - COMPILE(cond_seq, "when cond", val); + if (nd_type(val) == NODE_STR) { + debugp_param("nd_lit", val->nd_lit); + OBJ_FREEZE(val->nd_lit); + ADD_INSN1(cond_seq, nd_line(val), putobject, val->nd_lit); + } + else { + COMPILE(cond_seq, "when cond", val); + } ADD_INSN1(cond_seq, nd_line(val), topn, INT2FIX(1)); ADD_SEND(cond_seq, nd_line(val), ID2SYM(idEqq), INT2FIX(1)); ADD_INSNL(cond_seq, nd_line(val), branchif, l1); -- cgit v1.2.3