[#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-17 18:24:55 UTC
List: ruby-core #11197
Hi,

At Thu, 17 May 2007 23:39:54 +0900,
Paul Brannan wrote in [ruby-core:11196]:
> disasm seems to not like local_table being set to NULL when there are
> dynamic variables.

Indeed.


Index: compile.c
===================================================================
--- compile.c	(revision 12289)
+++ compile.c	(working copy)
@@ -4794,13 +4794,22 @@ 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++) {
+	    VALUE lv = RARRAY_PTR(locals)[i];
+	    tbl[i] = FIXNUM_P(lv) ? FIX2INT(lv) : SYM2ID(lv);
+	}
     }
-    
+    else {
+	iseq->local_table = NULL;
+    }
+
     /* args */
     if (FIXNUM_P(args)) {
Index: iseq.c
===================================================================
--- iseq.c	(revision 12289)
+++ 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];
@@ -1141,5 +1141,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