ruby-changes:50689
From: nobu <ko1@a...>
Date: Tue, 20 Mar 2018 17:36:46 +0900 (JST)
Subject: [ruby-changes:50689] nobu:r62856 (trunk): compile.c: fix ibf_load_code
nobu 2018-03-20 17:36:42 +0900 (Tue, 20 Mar 2018) New Revision: 62856 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=62856 Log: compile.c: fix ibf_load_code * compile.c (ibf_load_iseq_each): manage iseq_size to point loaded objects in iseq_encoded. now marking iseq scans iseq_encoded directly. * test/ruby/test_iseq.rb (test_to_binary_with_objects): skip for now, but fix argument order of assert_equal. Modified files: trunk/compile.c trunk/iseq.c trunk/test/ruby/test_iseq.rb Index: compile.c =================================================================== --- compile.c (revision 62855) +++ compile.c (revision 62856) @@ -8442,11 +8442,14 @@ ibf_load_code(const struct ibf_load *loa https://github.com/ruby/ruby/blob/trunk/compile.c#L8442 int code_index; VALUE *code = IBF_R(body->iseq_encoded, VALUE, iseq_size); + struct rb_iseq_constant_body *load_body = iseq->body; struct rb_call_info *ci_entries = iseq->body->ci_entries; struct rb_call_info_with_kwarg *ci_kw_entries = (struct rb_call_info_with_kwarg *)&iseq->body->ci_entries[iseq->body->ci_size]; struct rb_call_cache *cc_entries = iseq->body->cc_entries; union iseq_inline_storage_entry *is_entries = iseq->body->is_entries; + load_body->iseq_encoded = code; + load_body->iseq_size = 0; for (code_index=0; code_index<iseq_size;) { const VALUE insn = code[code_index++]; const char *types = insn_op_types(insn); @@ -8487,14 +8490,15 @@ ibf_load_code(const struct ibf_load *loa https://github.com/ruby/ruby/blob/trunk/compile.c#L8490 break; default: /* code[code_index] = op; */ - break; + continue; } + load_body->iseq_size = code_index + 1; } if (insn_len(insn) != op_index+1) { rb_raise(rb_eRuntimeError, "operand size mismatch"); } } - + load_body->iseq_size = code_index; return code; } @@ -8793,7 +8797,6 @@ ibf_load_iseq_each(const struct ibf_load https://github.com/ruby/ruby/blob/trunk/compile.c#L8797 /* memcpy(load_body, load->buff + offset, sizeof(*load_body)); */ load_body->type = body->type; load_body->stack_max = body->stack_max; - load_body->iseq_size = body->iseq_size; load_body->param = body->param; load_body->local_table_size = body->local_table_size; load_body->is_size = body->is_size; @@ -8852,7 +8855,7 @@ ibf_load_iseq_each(const struct ibf_load https://github.com/ruby/ruby/blob/trunk/compile.c#L8855 load_body->parent_iseq = ibf_load_iseq(load, body->parent_iseq); load_body->local_iseq = ibf_load_iseq(load, body->local_iseq); - load_body->iseq_encoded = ibf_load_code(load, iseq, body); + ibf_load_code(load, iseq, body); rb_iseq_translate_threaded_code(iseq); } Index: test/ruby/test_iseq.rb =================================================================== --- test/ruby/test_iseq.rb (revision 62855) +++ test/ruby/test_iseq.rb (revision 62856) @@ -407,6 +407,7 @@ class TestISeq < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_iseq.rb#L407 raise end iseq2 = RubyVM::InstructionSequence.load_from_binary(bin) - assert_equal(iseq2.to_a, iseq.to_a) + skip "trace events does not load correctly since r62851" + assert_equal(iseq.to_a, iseq2.to_a) end end Index: iseq.c =================================================================== --- iseq.c (revision 62855) +++ iseq.c (revision 62856) @@ -217,7 +217,7 @@ rb_iseq_mark(const rb_iseq_t *iseq) https://github.com/ruby/ruby/blob/trunk/iseq.c#L217 if (iseq->body) { const struct rb_iseq_constant_body *body = iseq->body; - if(FL_TEST(iseq, ISEQ_MARKABLE_ISEQ)) { + if (FL_TEST(iseq, ISEQ_MARKABLE_ISEQ)) { rb_iseq_each_value(iseq, each_insn_value, NULL); } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/