# x86\_64$B4D6-$G(BMarshal.dump$B$NIT6q9g(B

**URL:** <https://www.ruby-forum.com/t/x86-64-b4d6-g-bmarshal-dump-b-nit6q9g-b/147407>\
**Category:** Development\
**Created:** [September 1, 2008, 3:02pm UTC](https://www.ruby-forum.com/t/x86-64-b4d6-g-bmarshal-dump-b-nit6q9g-b/147407 "2008-09-01T15:02:24Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Kouichi\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/54ee81/32.png) [@Kouichi\_U](https://www.ruby-forum.com/u/Kouichi_U)\
**Post date:** [September 1, 2008, 3:02pm UTC](https://www.ruby-forum.com/t/x86-64-b4d6-g-bmarshal-dump-b-nit6q9g-b/147407/1 "2008-09-01T15:02:24Z")

</div>

NTTe$B%l%\>%J%s%H$N5mEg$H?=$7$^$9!#e(B

x86\_64e$B4D6-$Ge(BMarshal.dump/loade$B$,$&$^$/F/$+$J$$8=\>]$KAx6x$7$^$7$?$N$G!"Jse(B  
e$B9p$5$;$F$$$?$@$-$^$9!#e(B

e$B:F8=%3!\<%I$r0J2\<$K\<($7$^$9!#K\MhEy$7$$$O$:$Ne(Bobje$B$He(Bobj1e$B$,Ey$7$/$J$$$HH=Dje(B  
e$B$5$l$F$7$^$$$^$9!#e(B

* * *

obj = Array.new(10000) do  
Time.now.to\_i + (rand \* 10).to\_i  
end

obj1 = Marshal.load(Marshal.dump(obj))  
p obj1 == obj

# ==\> false!

* * *

e$B8D!9$NMWAG$rHf3S$7$F$_$k$H!";d$N4D6-$G$Oe(Bobj1[6449]e$B0J9_$NCM$,68$C$F$7$^$Ce(B  
e$B$F$$$^$9!#e(BArraye$B$ND9$5$,C;$$$H$-$K$OH/@8$7$J$$$H$3$m$r8+$k$H!"$I$&$d$ie(BGC  
e$B$,0-$5$r$7$F$$$k$h$&$G$9!#e(B

e$BAG?M9M$($G$9$,!"e(Bmarshal.ce$B$Ne(Bw\_object()e$B$Ne(BFIXNUMe$B$Ne(Bdumpe$B=hM}$G!"0l;~E\*$K@8@.e(B  
e$B$5$l$?e(BBignume$B%\*%V%8%’%/%H$,e(BMarshal.dumpe$BCf$K2rJ|$5$l$F$7$^$&$N$,LdBj$N$h$&e(B  
e$B$J5$$,$7$^$9!#e(B

* * *

```
else if (FIXNUM_P(obj)) {

```

## #if SIZEOF\_LONG \<= 4 w\_byte(TYPE\_FIXNUM, arg); w\_long(FIX2INT(obj), arg); #else if (RSHIFT((long)obj, 31) == 0 || RSHIFT((long)obj, 31) == -1) { w\_byte(TYPE\_FIXNUM, arg); w\_long(FIX2LONG(obj), arg); } else { w\_object(rb\_int2big(FIX2LONG(obj)), arg, limit); ^^^^^^^^^^^^^^^^^^^^^^^^^ } #endif

e$B3NG’$7$?4D6-$O0J2\<$NDL$j$G$9!#e(B

- Red Hat Enterprise Linux Server release 5.2 (Tikanga)  
Linux host 2.6.18-92.1.6.el5 #1 SMP Fri Jun 20 02:36:06 EDT 2008  
x86\_64 x86\_64 x86\_64 GNU/Linux
- ruby 1.8.6 (2008-08-11 patchlevel 287) [x86\_64-linux]

e$B0J\>e!"$h$m$7$/$\*4j$$$7$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![Kouichi\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/54ee81/32.png) [@Kouichi\_U](https://www.ruby-forum.com/u/Kouichi_U)\
**Post date:** [September 1, 2008, 5:47pm UTC](https://www.ruby-forum.com/t/x86-64-b4d6-g-bmarshal-dump-b-nit6q9g-b/147407/2 "2008-09-01T17:47:53Z")

</div>

e$BA0ED$G$9!#e(B

2008/09/01 21:56 Kouichi U. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> # ==\> false!
> 
> * * *

Solaris/x86\_64e$B$G$b:F8=$7$^$7$?!#e(B  
e$B0J2\<$N%3!\<%I$G$b:F8=$9$k$h$&$G$9!#e(B

obj = [1220278665, 1220278662, 1220278661, 1220278661, 1220278656]

GC.stress = true  
s = Marshal.dump(obj)  
obj1 = Marshal.load(s)  
p obj1 == obj

e$B$I$&$d$ie(Bmarshal.ce$B$Ne(Bw\_object()e$B$N0J2\<$Ne(Bife$BJ8$N\>r7o$,??$K$J$C$F$$$k$h$&$J$N$G$9$,!"e(B

```
if (st_lookup(arg->data, obj, &num)) {
    w_byte(TYPE_LINK, arg);
    w_long((long)num, arg);
    return;
}

```

dumpe$BCf$Ke(BGCe$B$,H/@8$9$k$H!“0l;~E\*$K@8@.$7$?e(BBignume$B%_%V%8%'%/%H$N%"%I%l%9$,e(B  
e$B$?$^$?$^F1$8$K$J$C$F$7$^$&$?$a!"e(Barg-\>datae$B$N8!:w;~$K8m$C$F0JA0$N%_%V%8%‘%/%He(B  
e$B$K%R%C%H$7$F%j%s%/$H$7$F=hM}$5$l$F$7$^$&$h$&$G$9!#e(B  
e$BB\>$K$be(Bdumpe$BCf$K0l;~E\*$K%\*%V%8%’%/%H$r@8@.$7$F$$$kItJ,$,$b$7$”$l$P!"F1$8$h$&e(B  
e$B$JLdBj$,H/@8$7$=$&$G$9$M!#e(B

e$BBP1~$H$7$F$Oe(Barg-\>datae$B$re(BHashe$B$K$9$k$H$+$G$7$g$&$+!#e(B

---

<div class="post-metadata">

**Author:** ![Kouichi\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/54ee81/32.png) [@Kouichi\_U](https://www.ruby-forum.com/u/Kouichi_U)\
**Post date:** [September 1, 2008, 5:59pm UTC](https://www.ruby-forum.com/t/x86-64-b4d6-g-bmarshal-dump-b-nit6q9g-b/147407/3 "2008-09-01T17:59:39Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:36086] Re:  
x86\_64e$B4D6-$Ge(BMarshal.dumpe$B$NIT6q9ge(B”  
on Tue, 2 Sep 2008 00:41:51 +0900, “Shugo M.”  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|e$B$I$&$d$ie(Bmarshal.ce$B$Ne(Bw\_object()e$B$N0J2\<$Ne(Bife$BJ8$N\>r7o$,??$K$J$C$F$$$k$h$&$J$N$G$9$,!"e(B  
|  
| if (st\_lookup(arg-\>data, obj, &num)) {  
| w\_byte(TYPE\_LINK, arg);  
| w\_long((long)num, arg);  
| return;  
| }  
|  
|dumpe$BCf$Ke(BGCe$B$,H/@8$9$k$H!“0l;~E\*$K@8@.$7$?e(BBignume$B%_%V%8%'%/%H$N%"%I%l%9$,e(B  
|e$B$?$^$?$^F1$8$K$J$C$F$7$^$&$?$a!"e(Barg-\>datae$B$N8!:w;~$K8m$C$F0JA0$N%_%V%8%‘%/%He(B  
|e$B$K%R%C%H$7$F%j%s%/$H$7$F=hM}$5$l$F$7$^$&$h$&$G$9!#e(B  
|e$BB\>$K$be(Bdumpe$BCf$K0l;~E\*$K%\*%V%8%’%/%H$r@8@.$7$F$$$kItJ,$,$b$7$”$l$P!"F1$8$h$&e(B  
|e$B$JLdBj$,H/@8$7$=$&$G$9$M!#e(B

e$B$J$k$[$I!#e(B

|e$BBP1~$H$7$F$Oe(Barg-\>datae$B$re(BHashe$B$K$9$k$H$+$G$7$g$&$+!#e(B

e$B$G$O!“$=$N@~$G9T$-$^$7$g$&$+!#Ht9T5!$NCf$G%Q%C%A:n$k2K$,$”$ke(B  
e$B$+$Je(B(e$B$J$5$=$&e(B)e$B!#e(B

---

<div class="post-metadata">

**Author:** ![Kouichi\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/54ee81/32.png) [@Kouichi\_U](https://www.ruby-forum.com/u/Kouichi_U)\
**Post date:** [September 2, 2008, 9:18am UTC](https://www.ruby-forum.com/t/x86-64-b4d6-g-bmarshal-dump-b-nit6q9g-b/147407/4 "2008-09-02T09:18:41Z")

</div>

e$BA0ED$G$9!#e(B

2008/09/02 14:06 Nobuyoshi N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> e$B$=$l$G$O2r7h$7$^$;$s$G$7$?!#e(B
> 
> hashe$B$de(Beql?e$B$N:FDj5A$N1F6A$rHr$1$k$?$a$K$O!“e(Barg-\>datae$B$N%-!\<$re(B  
> VALUEe$B$NCM\<+BNe(B(INT2FIX(obj)e$B$J$Ie(B)e$B$K$7$J$/$F$O$J$j$^$;$s$,!”$=$&$9e(B  
> e$B$k$H%^!\<%/$NBP\>]$G$O$J$/$J$C$F$7$^$$$^$9!#e(B

e$B%-!\<$G$O$J$/$FCM$NJ}$re(Brb\_assoc\_new(e$BHV9fe(B,  
e$B%\*%V%8%'%/%He(B)e$B$N$h$&$J7A$K$9$ke(B  
e$B$3$H$r9M$($F$^$7$?!#$A$g$C$HL5BL$G$9$,!#e(B

> - gc.c (rb\_mark\_set): new function to mark keys.
> 
> - marshal.c (struct dump\_arg, struct load\_arg): added wrappers to mark  
> data entries. backport from trunk r13527,r13528,r13961,r16533.  
> [ruby-dev:36082]

e$B$A$g$&$I:#D+$N0\F0Cf$Ke(Btrunke$B$G$Oe(BT\_DATAe$B$Ge(Bwrape$B$7$F%^!\<%/$7$F$k$3$H$K5$IU$$$?$Ne(B  
e$B$G$9$,!"$3$NJ}?K$,$h$5$=$&$G$9$M!#e(B

e$B$"$H!“3:Ev2U=j$G:n$C$F$$$ke(BBignume$B%_%V%8%'%/%H$OL@$i$+$K8e$G;H$o$l$k$3$H$O$J$$e(B  
e$B$N$G!"e(Bw\_object()e$B$Ke(Barg-\>datae$B$N8!:w!&DI2C$r$d$a$k%_%W%7%g%s$,$”$C$F$b$$$$$+$be(B  
e$B$7$l$J$$$H;W$$$^$7$?!#e(B  
e$B:#2s$\_$?$$$JFC\<l$J%1!\<%9e(B(e$BHyL/$J%5%$%:$Ne(BFixnume$B$r$?$/$5$se(Bdumpe$B$9$ke(B)e$B$G$J$$$He(B  
e$B0UL#$,$J$$$+$b$7$l$^$;$s$,!#e(B

---

<div class="post-metadata">

**Author:** ![Kouichi\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/54ee81/32.png) [@Kouichi\_U](https://www.ruby-forum.com/u/Kouichi_U)\
**Post date:** [September 2, 2008, 3:09pm UTC](https://www.ruby-forum.com/t/x86-64-b4d6-g-bmarshal-dump-b-nit6q9g-b/147407/5 "2008-09-02T15:09:07Z")

</div>

e$B5mEg$G$9!#e(B

> - gc.c (rb\_mark\_set): new function to mark keys.
> 
> - marshal.c (struct dump\_arg, struct load\_arg): added wrappers to mark  
> data entries. backport from trunk r13527,r13528,r13961,r16533.  
> [ruby-dev:36082]

e$B$"$j$,$H$&$4$6$$$^$9!#2r7h$5$l$F$$$k$3$H$r3NG’$7$^$7$?!#e(B

---

<div class="post-metadata">

**Author:** ![Kouichi\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/54ee81/32.png) [@Kouichi\_U](https://www.ruby-forum.com/u/Kouichi_U)\
**Post date:** [September 2, 2008, 7:12am UTC](https://www.ruby-forum.com/t/x86-64-b4d6-g-bmarshal-dump-b-nit6q9g-b/147407/6 "2008-09-02T07:12:12Z")

</div>

e$B$J$+$@$G$9!#e(B

At Tue, 2 Sep 2008 00:41:51 +0900,  
Shugo M. wrote in [ruby-dev:36086]:

> dumpe$BCf$Ke(BGCe$B$,H/@8$9$k$H!“0l;~E\*$K@8@.$7$?e(BBignume$B%_%V%8%’%/%H$N%"%I%l%9$,e(B  
> e$B$?$^$?$^F1$8$K$J$C$F$7$^$&$?$a!"e(Barg-\>datae$B$N8!:w;~$K8m$C$F0JA0$N%_%V%8%’%/%He(B  
> e$B$K%R%C%H$7$F%j%s%/$H$7$F=hM}$5$l$F$7$^$&$h$&$G$9!#e(B  
> e$BB\>$K$be(Bdumpe$BCf$K0l;~E\*$K%\*%V%8%’%/%H$r@8@.$7$F$$$kItJ,$,$b$7$”$l$P!"F1$8$h$&e(B  
> e$B$JLdBj$,H/@8$7$=$&$G$9$M!#e(B
> 
> e$BBP1~$H$7$F$Oe(Barg-\>datae$B$re(BHashe$B$K$9$k$H$+$G$7$g$&$+!#e(B

e$B$=$l$G$O2r7h$7$^$;$s$G$7$?!#e(B

hashe$B$de(Beql?e$B$N:FDj5A$N1F6A$rHr$1$k$?$a$K$O!“e(Barg-\>datae$B$N%-!\<$re(B  
VALUEe$B$NCM\<+BNe(B(INT2FIX(obj)e$B$J$Ie(B)e$B$K$7$J$/$F$O$J$j$^$;$s$,!”$=$&$9e(B  
e$B$k$H%^!\<%/$NBP\>]$G$O$J$/$J$C$F$7$^$$$^$9!#e(B

e$B6qBNE\*$K$O!"e(Btest/ruby/marshaltest.rb:test\_range\_cyclice$B$HN\>N)$5$;e(B  
e$B$k$3$H$OIT2DG=$G$9!#e(B

e$B$b$7$+$7$?$i!"e(B[ruby-dev:34312]e$B$b$3$l$,860x$+$bCN$l$^$;$s$M$’!#e(B

# marshal.ce$B$G$Oe(B r16761

e$B$b%P%C%/%]!\<%H$7$?$[$&$,$$$$$H;W$$$^$9!#e(B

- gc.c (rb\_mark\_set): new function to mark keys.

- marshal.c (struct dump\_arg, struct load\_arg): added wrappers to mark  
data entries. backport from trunk r13527,r13528,r13961,r16533.  
[ruby-dev:36082]

# Index: intern.h

# — intern.h (revision 19063) +++ intern.h (working copy) @@ -258,4 +258,5 @@ char _rb\_source\_filename \_((const char_) void rb\_gc\_mark\_locations \_((VALUE\*, VALUE\*)); void rb\_mark\_tbl \_((struct st\_table\*)); +void rb\_mark\_set \_((struct st\_table\*)); void rb\_mark\_hash \_((struct st\_table\*)); void rb\_gc\_mark\_maybe \_((VALUE)); Index: gc.c

— gc.c (revision 19063)  
+++ gc.c (working copy)  
@@ -735,4 +735,29 @@ rb\_mark\_tbl(tbl)

static int  
+mark\_key(key, value, lev)

- VALUE key, value;
- int lev;  
+{
- gc\_mark(key, lev);
- return ST\_CONTINUE;  
+}
- 

+static void  
+mark\_set(tbl, lev)

- st\_table \*tbl;
- int lev;  
+{
- if (!tbl) return;
- st\_foreach(tbl, mark\_key, lev);  
+}
- 

+void  
+rb\_mark\_set(tbl)

- st\_table \*tbl;  
+{
- mark\_set(tbl, 0);  
+}
- 

# +static int mark\_keyvalue(key, value, lev) VALUE key; Index: marshal.c

— marshal.c (revision 19063)  
+++ marshal.c (working copy)  
@@ -85,14 +85,4 @@ static ID s\_dump\_data, s\_load\_data, s\_al  
static ID s\_getc, s\_read, s\_write, s\_binmode;

-static void  
-reentrant\_check(obj, sym)

- VALUE obj;
- ID sym;  
-{
- if (obj && RBASIC(obj)-\>klass) {
- 

```
   rb_raise(rb_eRuntimeError, "%s reentered", rb_id2name(sym));

```

- }  
-}
- 

struct dump\_arg {  
VALUE obj;  
@@ -101,4 +91,5 @@ struct dump\_arg {  
st\_table \*data;  
int taint;

- VALUE wrapper;  
};

@@ -109,4 +100,25 @@ struct dump\_call\_arg {  
};

+static void  
+check\_dump\_arg(arg, sym)

- struct dump\_arg \*arg;
- ID sym;  
+{
- if (!DATA\_PTR(arg-\>wrapper)) {
- 

```
   rb_raise(rb_eRuntimeError, "Marshal.dump reentered at %s",

```

- 

```
rb_id2name(sym));

```

- }  
+}
- 

+static void  
+mark\_dump\_arg(ptr)

- void \*ptr;  
+{
- struct dump\_arg \*p = ptr;
- if (!ptr)
- 

```
   return;

```

- rb\_mark\_set(p-\>data);  
+}
- 

static VALUE  
class2path(klass)  
@@ -516,5 +528,5 @@ w\_object(obj, arg, limit)

```
   v = rb_funcall(obj, s_mdump, 0, 0);

```

- 

```
 reentrant_check(arg->str, s_mdump);

```

- 

```
 check_dump_arg(arg, s_mdump);
 w_class(TYPE_USRMARSHAL, obj, arg, Qfalse);
 w_object(v, arg, limit);

```

@@ -526,5 +538,5 @@ w\_object(obj, arg, limit)

```
   v = rb_funcall(obj, s_dump, 1, INT2NUM(limit));

```

- 

```
 reentrant_check(arg->str, s_dump);

```

- 

```
 check_dump_arg(arg, s_dump);
 if (TYPE(v) != T_STRING) {

```

rb\_raise(rb\_eTypeError, “\_dump() must return string”);  
@@ -671,5 +683,5 @@ w\_object(obj, arg, limit)  
}  
v = rb\_funcall(obj, s\_dump\_data, 0);

- reentrant\_check(arg-\>str, s\_dump\_data);

- check\_dump\_arg(arg, s\_dump\_data);  
w\_class(TYPE\_DATA, obj, arg, Qtrue);  
w\_object(v, arg, limit);  
@@ -704,7 +716,9 @@ dump\_ensure(arg)  
struct dump\_arg \*arg;  
{

- if (RBASIC(arg-\>str)-\>klass) return 0; /\* ignore reentrant \*/

- if (!DATA\_PTR(arg-\>wrapper)) return 0;  
st\_free\_table(arg-\>symbols);  
st\_free\_table(arg-\>data);
- DATA\_PTR(arg-\>wrapper) = 0;
- arg-\>wrapper = 0;  
if (arg-\>taint) {  
OBJ\_TAINT(arg-\>str);  
@@ -773,5 +787,5 @@ marshal\_dump(argc, argv)  
if (rb\_respond\_to(port, s\_binmode)) {  
rb\_funcall2(port, s\_binmode, 0, 0);

- 

```
 reentrant_check(arg.str, s_dump_data);

```

- 

```
 check_dump_arg(&arg, s_dump_data);

```

}  
}  
@@ -783,4 +797,5 @@ marshal\_dump(argc, argv)  
arg.data = st\_init\_numtable();  
arg.taint = Qfalse;
- arg.wrapper = Data\_Wrap\_Struct(rb\_cData, mark\_dump\_arg, 0, &arg);  
c\_arg.obj = obj;  
c\_arg.arg = &arg;  
@@ -800,9 +815,31 @@ struct load\_arg {  
long offset;  
st\_table \*symbols;

- VALUE data;

- st\_table \*data;  
VALUE proc;  
int taint;
- VALUE wrapper;  
};

+static void  
+check\_load\_arg(arg, sym)

- struct load\_arg \*arg;
- ID sym;  
+{
- if (!DATA\_PTR(arg-\>wrapper)) {
- 

```
   rb_raise(rb_eRuntimeError, "Marshal.load reentered at %s",

```

- 

```
rb_id2name(sym));

```

- }  
+}
- 

+static void  
+mark\_load\_arg(ptr)

- void \*ptr;  
+{
- struct load\_arg \*p = ptr;
- if (!ptr)
- 

```
   return;

```

- rb\_mark\_tbl(p-\>data);  
+}
- 

static VALUE r\_object \_((struct load\_arg \*arg));

@@ -824,5 +861,5 @@ r\_byte(arg)  
VALUE src = arg-\>src;  
VALUE v = rb\_funcall2(src, s\_getc, 0, 0);

- reentrant\_check(arg-\>data, s\_getc);

- check\_load\_arg(arg, s\_getc);  
if (NIL\_P(v)) rb\_eof\_error();  
c = (unsigned char)FIX2INT(v);  
@@ -905,5 +942,5 @@ r\_bytes0(len, arg)  
VALUE n = LONG2NUM(len);  
str = rb\_funcall2(src, s\_read, 1, &n);

- reentrant\_check(arg-\>data, s\_read);

- check\_load\_arg(arg, s\_read);  
if (NIL\_P(str)) goto too\_short;  
StringValue(str);  
@@ -968,5 +1005,5 @@ r\_entry(v, arg)  
struct load\_arg \*arg;  
{

- rb\_hash\_aset(arg-\>data,  
INT2FIX(RHASH(arg-\>data)-\>tbl-\>num\_entries), v);

- st\_insert(arg-\>data, arg-\>data-\>num\_entries, (st\_data\_t)v);  
if (arg-\>taint) OBJ\_TAINT(v);  
return v;  
@@ -1024,12 +1061,13 @@ r\_object0(arg, proc, ivp, extmod)  
int type = r\_byte(arg);  
long id;

- st\_data\_t link;

- v = rb\_hash\_aref(arg-\>data, LONG2FIX(id));
- if (NIL\_P(v)) {

- if (!st\_lookup(arg-\>data, (st\_data\_t)id, &link)) {  
rb\_raise(rb\_eArgError, “dump format error (unlinked)”);  
}
- v = (st\_data\_t)link;  
return v;

@@ -1256,5 +1294,5 @@ r\_object0(arg, proc, ivp, extmod)  
}  
v = rb\_funcall(klass, s\_load, 1, data);

- 

```
 reentrant_check(arg->data, s_load);

```

- 

```
 check_load_arg(arg, s_load);
 r_entry(v, arg);

```

}  
@@ -1280,5 +1318,5 @@ r\_object0(arg, proc, ivp, extmod)  
data = r\_object(arg);  
rb\_funcall(v, s\_mload, 1, data);

- 

```
 reentrant_check(arg->data, s_mload);

```

- 

```
 check_load_arg(arg, s_mload);

```

}  
break;  
@@ -1307,5 +1345,5 @@ r\_object0(arg, proc, ivp, extmod)  
}  
v = rb\_funcall(klass, s\_alloc, 0);

- 

```
    reentrant_check(arg->data, s_alloc);

```

- 

```
    check_load_arg(arg, s_alloc);
      }
else {

```

@@ -1322,5 +1360,5 @@ r\_object0(arg, proc, ivp, extmod)  
}  
rb\_funcall(v, s\_load\_data, 1, r\_object0(arg, 0, 0, extmod));

- 

```
reentrant_check(arg->data, s_load_data);

```

- 

```
check_load_arg(arg, s_load_data);
  }
  break;

```

@@ -1366,5 +1404,5 @@ r\_object0(arg, proc, ivp, extmod)  
if (proc) {  
rb\_funcall(proc, s\_call, 1, v);

- reentrant\_check(arg-\>data, s\_call);

- check\_load\_arg(arg, s\_call);  
}  
return v;  
@@ -1389,6 +1427,9 @@ load\_ensure(arg)  
struct load\_arg \*arg;  
{

- if (RBASIC(arg-\>data)-\>klass) return 0; /\* ignore reentrant \*/

- if (!DATA\_PTR(arg-\>wrapper)) return 0;  
st\_free\_table(arg-\>symbols);
- st\_free\_table(arg-\>data);
- DATA\_PTR(arg-\>wrapper) = 0;
- arg-\>wrapper = 0;  
return 0;  
}  
@@ -1432,5 +1473,8 @@ marshal\_load(argc, argv)  
arg.src = port;  
arg.offset = 0;

- arg.data = 0;

- arg.symbols = st\_init\_numtable();

- arg.data = st\_init\_numtable();

- arg.proc = 0;

- arg.wrapper = Data\_Wrap\_Struct(rb\_cData, mark\_load\_arg, 0, &arg);

- arg.symbols = st\_init\_numtable();
- arg.data = rb\_hash\_new();
- RBASIC(arg.data)-\>klass = 0;
- if (NIL\_P(proc)) arg.proc = 0;
- else arg.proc = proc;

- if (!NIL\_P(proc)) arg.proc = proc;  
v = rb\_ensure(load, (VALUE)&arg, load\_ensure, (VALUE)&arg);  
RBASIC(arg.data)-\>klass = rb\_cHash;  
Index: test/ruby/test\_marshal.rb  
===================================================================  
— test/ruby/test\_marshal.rb (revision 19063)  
+++ test/ruby/test\_marshal.rb (working copy)  
@@ -13,9 +13,15 @@ class TestMarshal \< Test::Unit::TestCase

def encode(o)

- stress, GC.stress = GC.stress, true  
Marshal.dump(o)
- ensure
- GC.stress = stress  
end

def decode(s)

- stress, GC.stress = GC.stress, true  
Marshal.load(s)
- ensure
- GC.stress = stress  
end

# Index: test/ruby/marshaltestlib.rb

— test/ruby/marshaltestlib.rb (revision 19063)  
+++ test/ruby/marshaltestlib.rb (working copy)  
@@ -194,4 +194,10 @@ module MarshalTestLib  
end

- def test\_fixnum\_64bit
- obj = [1220278665, 1220278662, 1220278661, 1220278661, 1220278656]
- 
- marshal\_equal(obj)
- end
- def test\_float  
marshal\_equal(-1.0)
