[#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-17 14:14:35 UTC
List: ruby-core #11195
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

In This Thread