[#11073] segfault printing instruction sequence for iterator — <noreply@...>

Bugs item #10527, was opened at 2007-05-02 14:42

14 messages 2007/05/02
[#11142] Re: [ ruby-Bugs-10527 ] segfault printing instruction sequence for iterator — Nobuyoshi Nakada <nobu@...> 2007/05/10

Hi,

[#11188] Re: [ ruby-Bugs-10527 ] segfault printing instruction sequence for iterator — Paul Brannan <pbrannan@...> 2007/05/16

On Thu, May 10, 2007 at 04:51:18PM +0900, Nobuyoshi Nakada wrote:

[#11234] Planning to release 1.8.6 errata — Urabe Shyouhei <shyouhei@...>

Hi all.

17 messages 2007/05/25

Re: [ ruby-Bugs-10527 ] segfault printing instruction sequence for iterator

From: Paul Brannan <pbrannan@...>
Date: 2007-05-10 20:29:11 UTC
List: ruby-core #11151
Yes, this seems to fix it, thanks.

Paul

On Thu, May 10, 2007 at 04:51:18PM +0900, Nobuyoshi Nakada wrote:
> 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

In This Thread