summaryrefslogtreecommitdiff
path: root/compile.c
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-10 03:11:52 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-10 03:11:52 +0000
commitb88daae7ecd3853f4c56d9bb74e0e06ea2a0a939 (patch)
tree2b028afaf6647111ef99b97ef9036216e95623f2 /compile.c
parentb0f115da1a8952e2328e3ef872bb2903c45ed96f (diff)
* 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
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c9
1 files changed, 8 insertions, 1 deletions
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);