diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-03-17 13:19:02 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-03-17 13:19:02 +0000 |
commit | e1ee61bfbdc89968bf9851d0d825d500704ff149 (patch) | |
tree | 9dd0d090ccb115d559f5ea0d11d853185e3d8acd | |
parent | 8472c15440b1aaa4bbb5e5eb5a939ef02612c9b5 (diff) | |
download | ruby-e1ee61bfbdc89968bf9851d0d825d500704ff149.tar.gz |
compile.c: strict condition
* compile.c (iseq_specialized_instruction): specialize only
concatenated newarray and send, no labels and no adjusts.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54157 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | compile.c | 7 |
1 files changed, 4 insertions, 3 deletions
@@ -2283,12 +2283,13 @@ insn_set_specialized_instruction(rb_iseq_t *iseq, INSN *iobj, int insn_id) static int iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj) { - if (iobj->insn_id == BIN(newarray)) { + if (iobj->insn_id == BIN(newarray) && iobj->link.next && + iobj->link.next->type == ISEQ_ELEMENT_INSN) { /* * [a, b, ...].max/min -> a, b, c, opt_newarray_max/min */ - INSN *niobj = (INSN *)get_next_insn(iobj); - if (niobj && niobj->insn_id == BIN(send)) { + INSN *niobj = (INSN *)iobj->link.next; + if (niobj->insn_id == BIN(send)) { struct rb_call_info *ci = (struct rb_call_info *)OPERAND_AT(niobj, 0); if ((ci->flag & VM_CALL_ARGS_SIMPLE) && ci->orig_argc == 0) { switch (ci->mid) { |