Hi,

At Thu, 3 May 2007 04:42:53 +0900,
Paul Brannan wrote in [ruby-core:11073]:
> The following program segfaults:
> 
> i = VM::InstructionSequence.compile('for a in b; end')
> p i.to_a

Thank you, does this patch fix it?


Index: iseq.c =================================================================== --- iseq.c (revision 12267) +++ iseq.c (working copy) @@ -1140,5 +1140,5 @@ iseq_data_to_ary(rb_iseq_t *iseq) ID lid = iseq->local_table[i]; if (lid) { - rb_ary_push(locals, ID2SYM(lid)); + if (rb_id2str(lid)) rb_ary_push(locals, ID2SYM(lid)); } else { @@ -1181,8 +1181,8 @@ iseq_data_to_ary(rb_iseq_t *iseq) /* body */ for (seq = iseq->iseq; seq < iseq->iseq + iseq->size; ) { - VALUE ary = rb_ary_new(); VALUE insn = *seq++; int j, len = insn_len(insn); VALUE *nseq = seq + len - 1; + VALUE ary = rb_ary_new2(len); rb_ary_push(ary, insn_syms[insn]); Index: parse.y =================================================================== --- parse.y (revision 12268) +++ parse.y (working copy) @@ -388,5 +388,6 @@ static int local_id_gen(struct parser_p static ID *local_tbl_gen(struct parser_params*); #define local_tbl() local_tbl_gen(parser) -static ID internal_id(void); +static ID internal_id_gen(struct parser_params*); +#define internal_id() internal_id_gen(parser) static void dyna_push_gen(struct parser_params*); @@ -8271,7 +8272,8 @@ rb_gc_mark_symbols(void) static ID -internal_id(void) +internal_id_gen(struct parser_params *parser) { - return ID_INTERNAL | (++global_symbols.last_id << ID_SCOPE_SHIFT); + int id = vtable_size(lvtbl->args) + vtable_size(lvtbl->vars); + return ID_INTERNAL | (id << ID_SCOPE_SHIFT); }
-- Nobu Nakada