[#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-10 07:51:18 UTC
List: ruby-core #11142
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