diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-11-26 12:36:43 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-11-26 12:36:43 +0000 |
commit | 778f32a153a9e419592146bd82300b6f158940f9 (patch) | |
tree | d4dbe7c0bb8f49f9878895e840ce272f3228c4df | |
parent | a3ddead9914b77b105dd0030817a20db75d93af9 (diff) | |
download | ruby-778f32a153a9e419592146bd82300b6f158940f9.tar.gz |
compile.c: tailcall opt for indexers
* compile.c (iseq_peephole_optimize): enable tail call
optimization for specialized indexers.
* compile.c (iseq_compile_each): blockiseq should be NULL, but not
Qnil.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52759 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | compile.c | 7 |
2 files changed, 12 insertions, 3 deletions
@@ -1,3 +1,11 @@ +Thu Nov 26 21:36:40 2015 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * compile.c (iseq_peephole_optimize): enable tail call + optimization for specialized indexers. + + * compile.c (iseq_compile_each): blockiseq should be NULL, but not + Qnil. + Thu Nov 26 17:22:53 2015 NARUSE, Yui <naruse@ruby-lang.org> * regcomp.c, regenc.c, regexec.c, regint.h, enc/unicode.c: @@ -2148,6 +2148,8 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal if (do_tailcallopt && (iobj->insn_id == BIN(send) || + iobj->insn_id == BIN(opt_aref_with) || + iobj->insn_id == BIN(opt_aset_with) || iobj->insn_id == BIN(invokesuper))) { /* * send ... @@ -4770,8 +4772,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) COMPILE(ret, "recv", node->nd_recv); ADD_INSN3(ret, line, opt_aref_with, new_callinfo(iseq, idAREF, 1, 0, NULL, FALSE), - Qnil, /* CALL_CACHE */ - str); + NULL/* CALL_CACHE */, str); if (poped) { ADD_INSN(ret, line, pop); } @@ -5808,7 +5809,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) } ADD_INSN3(ret, line, opt_aset_with, new_callinfo(iseq, idASET, 2, 0, NULL, FALSE), - Qnil/* CALL_CACHE */, str); + NULL/* CALL_CACHE */, str); ADD_INSN(ret, line, pop); break; } |