[#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: Nobuyoshi Nakada <nobu@...>
Date: 2007-05-22 21:37:20 UTC
List: ruby-core #11225
Hi,

At Fri, 18 May 2007 22:17:34 +0900,
Paul Brannan wrote in [ruby-core:11203]:
> I reapplied the patch and rebuilt, and now I get the same disasm output
> as you.  However, I still get the warning from valgrind (invalid read of
> size 4 at iseq.c:763).
> 
> Also, if you dump to array and reload:
> 
> i = VM::InstructionSequence.new('for a in []; end')
> puts i.disasm
> a = i.to_a
> i2 = VM::InstructionSequence.load(a)
> puts i2.disasm
> 
> do you see the order of the table entries change?

Yes, and found line numbers disappear in the result of disasm.
I'll talk ko1 about it.


Index: compile.c
===================================================================
--- compile.c	(revision 12338)
+++ compile.c	(working copy)
@@ -4826,11 +4826,20 @@ 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_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;
+	tbl = iseq->local_table;
     
     for (i=0; i<RARRAY_LEN(locals); i++) {
-	tbl[i] = SYM2ID(RARRAY_PTR(locals)[i]);
+	    VALUE lv = RARRAY_PTR(locals)[i];
+	    tbl[i] = FIXNUM_P(lv) ? FIX2INT(lv) : SYM2ID(lv);
+	}
+	if (opt) {
+	    tbl[i] = (ID)-1;
+	}
+    }
+    else {
+	iseq->local_table = NULL;
     }
     
Index: iseq.c
===================================================================
--- iseq.c	(revision 12338)
+++ iseq.c	(working copy)
@@ -765,5 +765,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];
@@ -1146,5 +1146,5 @@ iseq_data_to_ary(rb_iseq_t *iseq)
 	ID lid = iseq->local_table[i];
 	if (lid) {
-	    if (rb_id2str(lid)) rb_ary_push(locals, ID2SYM(lid));
+	    rb_ary_push(locals, rb_id2str(lid) ? ID2SYM(lid) : INT2FIX(lid));
 	}
 	else {


-- 
Nobu Nakada

In This Thread

Prev Next