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