原です。

>まつもと ゆきひろです

>  * allocation frameworkを使ってください。つまり、
>
>      rb_define_alloc_func(クラス, 関数);
>
>    を呼んでください。newを再定義するタイプのクラスではCレベ
>    ルではmarshal_dumpは使えません。

わかりました。

>  * mloadはallocateされてinitializeされる前のオブジェクトに
>    対して呼び出されます。ですから、allocateで構造体を割り当
>    てていれば、
>
>      ((struct RFoo*)RDATA(self)->data)->body = x;
>
>    になるでしょうし、そうでなければ
>
>      RDATA(self)->data)->body = foo = ALLOC(struct RFoo);
>      foo->body = x;
>
>    になるでしょう。

「そうでなければ」というのは、allocate で構造体を割り当てない
場合ということですが、そういう流儀ってあるんでしょうか?その
場合は initialize で構造体を割り当てるのかな。


ところで、initialize を呼びたくないけど、marshal_dump/load したい
とき、次のように allocation framework に半乗りしてみたんですけど、
これって気持ち悪いですかね。

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

VALUE rb_cFoo;

static VALUE setbody(VALUE self, VALUE x);

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

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

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

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);
};

void
Init_foo(void)
{
  rb_cFoo = rb_define_class("Foo", rb_cObject);
  rb_define_singleton_method(rb_cFoo, "new", foonew, 1);
  rb_define_alloc_func(rb_cFoo, s_alloc);

  rb_define_method(rb_cFoo, "to_s", to_s, 0);
  rb_define_method(rb_cFoo, "marshal_dump", getbody, 0);
  rb_define_method(rb_cFoo, "marshal_load", setbody, 1);
}
-----$ foo1.c