nagachika と申します。

Debian GNU/Linux で 1.9(trunk) で以下のスクリプトが期待通りに動きません。

$ cat test.rb
t = Time.now
p Marshal.load(Marshal.dump([t, t]))
$ ./ruby-trunk test.rb
[2008-03-28 09:44:03 +0900, "7P"]

正確には Time に限らず、_dump が返す文字列にインスタンス変数が
追加されているような場合におかしくなるようです。
Time は nsec の精度の情報をインスタンス変数に入れていました。

以下はパッチです。ご検討ください。

Index: marshal.c
===================================================================
--- marshal.c   (リビジョン 15844)
+++ marshal.c   (作業コピー)
@@ -574,8 +574,6 @@
     else {
        if (OBJ_TAINTED(obj)) arg->taint = Qtrue;
 
-       st_add_direct(arg->data, obj, arg->data->num_entries);
-
         {
             st_data_t compat_data;
             rb_alloc_func_t allocator =
rb_get_alloc_func(RBASIC(obj)->klass);
@@ -592,6 +590,8 @@
        if (rb_respond_to(obj, s_mdump)) {
            VALUE v;
 
+           st_add_direct(arg->data, obj, arg->data->num_entries);
+
            v = rb_funcall(obj, s_mdump, 0, 0);
            w_class(TYPE_USRMARSHAL, obj, arg, Qfalse);
            w_object(v, arg, limit);
@@ -618,9 +618,13 @@
             else if (hasiv) {
                w_ivar(obj, ivtbl, &c_arg);
            }
+           st_add_direct(arg->data, obj, arg->data->num_entries);
+
            return;
        }
 
+       st_add_direct(arg->data, obj, arg->data->num_entries);
+
        switch (BUILTIN_TYPE(obj)) {
          case T_CLASS:
            if (FL_TEST(obj, FL_SINGLETON)) {



--------------------------------------
Easy + Joy + Powerful = Yahoo! Bookmarks x Toolbar
http://pr.mail.yahoo.co.jp/toolbar/