From: Nobuyoshi Nakada Date: 2007-05-23T06:37:20+09:00 Subject: Re: [ ruby-Bugs-10527 ] segfault printing instruction sequence for iterator Hi, At Fri, 18 May 2007 22:17:34 +0900, Paul Brannan wrote in [ruby-core:11203]: > I reapplied the patch and rebuilt, and now I get the same disasm output > as you. However, I still get the warning from valgrind (invalid read of > size 4 at iseq.c:763). > > Also, if you dump to array and reload: > > i = VM::InstructionSequence.new('for a in []; end') > puts i.disasm > a = i.to_a > i2 = VM::InstructionSequence.load(a) > puts i2.disasm > > do you see the order of the table entries change? Yes, and found line numbers disappear in the result of disasm. I'll talk ko1 about it. Index: compile.c =================================================================== --- compile.c (revision 12338) +++ compile.c (working copy) @@ -4826,11 +4826,20 @@ iseq_build_from_ary(rb_iseq_t *iseq, VAL } - iseq->local_size = opt + RARRAY_LEN(locals); - iseq->local_table_size = iseq->local_size; + iseq->local_table_size = RARRAY_LEN(locals); + iseq->local_size = opt + iseq->local_table_size; + if (iseq->local_table_size) { iseq->local_table = (ID *)ALLOC_N(ID *, iseq->local_size); - tbl = iseq->local_table + opt; + tbl = iseq->local_table; for (i=0; ilocal_table = NULL; } Index: iseq.c =================================================================== --- iseq.c (revision 12338) +++ iseq.c (working copy) @@ -765,5 +765,5 @@ ruby_iseq_disasm(VALUE self) rb_str_cat2(str, buff); - for (i = 0; i < iseqdat->local_table_size; i++) { + for (i = 0; i < iseqdat->local_size; i++) { const char *name = rb_id2name(tbl[i]); char info[0x100]; @@ -1146,5 +1146,5 @@ iseq_data_to_ary(rb_iseq_t *iseq) ID lid = iseq->local_table[i]; if (lid) { - if (rb_id2str(lid)) rb_ary_push(locals, ID2SYM(lid)); + rb_ary_push(locals, rb_id2str(lid) ? ID2SYM(lid) : INT2FIX(lid)); } else { -- Nobu Nakada