diff --git a/ChangeLog b/ChangeLog index 5e423d37cc..4c1bbe7215 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Wed Dec 17 10:18:42 2014 Koichi Sasada + + * compile.c (iseq_compile_each): check + iseq->compile_data->option->specialized_instruction for opt_* insn. + + * test/ruby/test_iseq.rb: check no specialized_instructions option. + Wed Dec 17 09:48:57 2014 Eric Wong * compile.c (iseq_compile_each): only emit opt_str_freeze, diff --git a/compile.c b/compile.c index 8672c0e980..393590e00d 100644 --- a/compile.c +++ b/compile.c @@ -4406,8 +4406,8 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) */ if (node->nd_recv && nd_type(node->nd_recv) == NODE_STR && node->nd_mid == idFreeze && node->nd_args == NULL && - iseq->compile_data->current_block == Qfalse) - { + iseq->compile_data->current_block == Qfalse && + iseq->compile_data->option->specialized_instruction) { VALUE str = rb_fstring(node->nd_recv->nd_lit); iseq_add_mark_object(iseq, str); ADD_INSN1(ret, line, opt_str_freeze, str); @@ -4422,8 +4422,8 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) if (node->nd_mid == idAREF && !private_recv_p(node) && node->nd_args && nd_type(node->nd_args) == NODE_ARRAY && node->nd_args->nd_alen == 1 && nd_type(node->nd_args->nd_head) == NODE_STR && - iseq->compile_data->current_block == Qfalse) - { + iseq->compile_data->current_block == Qfalse && + iseq->compile_data->option->specialized_instruction) { VALUE str = rb_fstring(node->nd_args->nd_head->nd_lit); node->nd_args->nd_head->nd_lit = str; COMPILE(ret, "recv", node->nd_recv); @@ -5419,7 +5419,8 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) if (node->nd_mid == idASET && !private_recv_p(node) && node->nd_args && nd_type(node->nd_args) == NODE_ARRAY && node->nd_args->nd_alen == 2 && nd_type(node->nd_args->nd_head) == NODE_STR && - iseq->compile_data->current_block == Qfalse) + iseq->compile_data->current_block == Qfalse && + iseq->compile_data->option->specialized_instruction) { VALUE str = rb_fstring(node->nd_args->nd_head->nd_lit); node->nd_args->nd_head->nd_lit = str; diff --git a/test/ruby/test_iseq.rb b/test/ruby/test_iseq.rb index d7d15c7703..ede333fd14 100644 --- a/test/ruby/test_iseq.rb +++ b/test/ruby/test_iseq.rb @@ -124,4 +124,14 @@ class TestISeq < Test::Unit::TestCase ISeq.of(c.instance_method(:foobar)).label assert_same a, b end + + def test_diable_opt + src = "a['foo'] = a['bar']; 'a'.freeze" + _,_,_,_,_,_,_,_,_,_,_,_,_,body= RubyVM::InstructionSequence.compile(src, __FILE__, __FILE__, __LINE__, false).to_a + body.each{|insn| + next if Integer === insn + op = insn.first + assert(!op.to_s.match(/^opt_/), "#{op}") + } + end end