原です。

新しい、marshal_dump, marshal_load は便利ですね。

で、これは拡張ライブラリからはどう使うのでしょう?例えば、次の
サンプルで mdump, mload は正しくはどう書いたらいいですか?


-----^ foo.c
#include "ruby.h"
struct RFoo
{
  VALUE body;
};

VALUE rb_cFoo;

static void
fin(foo)
     struct RFoo *foo;
{}

static void
mark(foo)
     struct RFoo *foo;
{
    rb_gc_mark(foo->body);
}

static VALUE
foonew(klass, body)
     VALUE klass;
{
    VALUE fo;
    struct RFoo *foo;
    fo = Data_Make_Struct(klass, struct RFoo, mark, fin, foo);
    foo->body = body;
    return fo;
}

static VALUE
getbody(self)
     VALUE self;
{
  struct RFoo *foo;
  Data_Get_Struct(self, struct RFoo, foo);
  return foo->body;
}

static VALUE
setbody(self, x)
     VALUE self, x;
{
  struct RFoo *foo;
  Data_Get_Struct(self, struct RFoo, foo);
  foo->body = x;
  return x;
}

static VALUE
to_s(self)
     VALUE self;
{
  struct RFoo *foo;
  Data_Get_Struct(self, struct RFoo, foo);
  return rb_inspect(foo->body);
};

static VALUE
mdump(self)
     VALUE self;
{
    return getbody(self);
}
    
static VALUE
mload(self, x)
     VALUE self, x;
{
    /* ??? */
    return Qnil;
}

void
Init_foo(void)
{
  rb_cFoo = rb_define_class("Foo", rb_cObject);
  rb_define_singleton_method(rb_cFoo, "new", foonew, 1);
  rb_define_method(rb_cFoo, "to_s", to_s, 0);
  rb_define_method(rb_cFoo, "getbody", getbody, 0);
  rb_define_method(rb_cFoo, "setbody", setbody, 1);
  rb_define_method(rb_cFoo, "marshal_dump", mdump, 0);
  rb_define_method(rb_cFoo, "marshal_load", mload, 1);
}
-----$ foo.c