This seems to make valgrind much happier.

I'm seeing a segfault now, though, where I didn't see one before.  It
may be the fault of an extension.  I will see if I can make a small test
case.

Paul

On Thu, May 17, 2007 at 03:54:17PM +0900, Nobuyoshi Nakada wrote:
> Hi,
> 
> At Thu, 17 May 2007 10:39:17 +0900,
> Nobuyoshi Nakada wrote in [ruby-core:11189]:
> > I'm not sure if opts is needed in TOPLEVEL and CLASS types.
> 
> It's necessary for svars, so the patch was wrong.
> 
> 
> Index: compile.c > =================================================================== > --- compile.c (revision 12288) > +++ compile.c (working copy) > @@ -4794,13 +4794,21 @@ 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 = (ID *)ALLOC_N(ID *, iseq->local_size); > - tbl = iseq->local_table + opt; > - > - for (i=0; i<RARRAY_LEN(locals); i++) { > - tbl[i] = SYM2ID(RARRAY_PTR(locals)[i]); > + 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; > + > + if (opt) { > + iseq->local_table[0] = (ID)-1; > + } > + for (i=0; i<RARRAY_LEN(locals); i++) { > + tbl[i] = SYM2ID(RARRAY_PTR(locals)[i]); > + } > } > - > + else { > + iseq->local_table = NULL; > + } > + > /* args */ > if (FIXNUM_P(args)) { > Index: iseq.c > =================================================================== > --- iseq.c (revision 12288) > +++ iseq.c (working copy) > @@ -760,5 +760,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]; >
> > -- > Nobu Nakada