[#7968] array .{first, last, at} — Kazunori NISHI <kazunori@...>

西@九大です。

25 messages 1999/10/07
[#7969] Re: array .{first, last, at} — nobu.nakada@... 1999/10/07

なかだです。

[#7983] Re: array .{first, last, at} — Kazunori NISHI <kazunori@...> 1999/10/12

西@九大です。

[#7984] Re: array .{first, last, at} — matz@... (Yukihiro Matsumoto) 1999/10/12

まつもと ゆきひろです

[#7985] [patch] Array#delete_at w/ minus value — EGUCHI Osamu <eguchi@...> 1999/10/12

えぐち@エスアンドイーです。

[ruby-dev:8068] Re: Marshal#load segmentation fault

From: matz@... (Yukihiro Matsumoto)
Date: 1999-10-20 06:13:43 UTC
List: ruby-dev #8068
まつもと ゆきひろです

In message "[ruby-dev:8067] Marshal#load segmentation fault"
    on 99/10/20, A.Shigihara <a-shigi@asaka.ne.jp> writes:

|SGmailでMarshal#loadがsegmantation faultで落ちたときのgdbのbacktraceです。

どうもです。このパッチが有効ではないかと思います。
試してみてください。

--- marshal.c	1999/08/24 08:21:53	1.3
+++ marshal.c	1999/10/20 06:12:59
@@ -451,3 +451,3 @@
     st_table *symbol;
-    st_table *data;
+    VALUE data;
     VALUE proc;
@@ -604,3 +604,3 @@
     }
-    st_insert(arg->data, arg->data->num_entries, v);
+    rb_hash_aset(arg->data, INT2FIX(RHASH(arg->data)->tbl->num_entries), v);
     return v;
@@ -614,2 +614,3 @@
     int type = r_byte(arg);
+    long id;
 
@@ -617,3 +618,4 @@
       case TYPE_LINK:
-	if (st_lookup(arg->data, r_long(arg), &v)) {
+	id = r_long(arg);
+	if (v = rb_hash_aref(arg->data, INT2FIX(id))) {
 	    return v;
@@ -621,3 +623,3 @@
 	rb_raise(rb_eArgError, "dump format error (unlinked)");
-	break;
+      break;
 
@@ -813,3 +815,2 @@
     st_free_table(arg->symbol);
-    st_free_table(arg->data);
     return 0;
@@ -848,2 +849,4 @@
     if (major == MARSHAL_MAJOR) {
+	volatile VALUE hash;	/* protect from GC */
+
 	if (r_byte(&arg) != MARSHAL_MINOR) {
@@ -852,3 +855,3 @@
 	arg.symbol = st_init_numtable();
-	arg.data   = st_init_numtable();
+	arg.data   = hash = rb_hash_new();
 	if (NIL_P(proc)) arg.proc = 0;

In This Thread