aboutsummaryrefslogtreecommitdiffstats
path: root/compile.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-03-17 13:19:02 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-03-17 13:19:02 +0000
commite1ee61bfbdc89968bf9851d0d825d500704ff149 (patch)
tree9dd0d090ccb115d559f5ea0d11d853185e3d8acd /compile.c
parent8472c15440b1aaa4bbb5e5eb5a939ef02612c9b5 (diff)
downloadruby-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
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/compile.c b/compile.c
index 2518697eab..be2ab45eb4 100644
--- a/compile.c
+++ b/compile.c
@@ -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) {