新井です。

In message "[ruby-ext:02202] marshal_load の書き方(Re: 質問です。)"
  on 04 Aug 2003 15:48:37 +0900,
  Shin-ichiro HARA <sinara / blade.nagaokaut.ac.jp> wrote:
> 原です。
> 
> 新しい、marshal_dump, marshal_load は便利ですね。
> 
> で、これは拡張ライブラリからはどう使うのでしょう?例えば、次の
> サンプルで mdump, mload は正しくはどう書いたらいいですか?

こうではないですかね?拡張ライブラリひさしぶりなので
細部に自信はないのですが、

ポイントしては、

marshal_dump/marshal_load は、allocation framework に乗って
るので allocate を適切に定義する必要がある。

marshal_load は普通 initialize と同じになるだろう
(引数は一個なので Arrayとかでくるむ必要はあるかもしれない)

ってとこでしょうか。


#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 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 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_alloc_func(rb_cFoo, s_alloc); rb_define_method(rb_cFoo, "initialize", setbody, 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", getbody, 0); rb_define_method(rb_cFoo, "marshal_load", setbody, 1); } /* ruby -rmkmf.rb -e 'create_makefile("foo")' make ruby -x foo.c #! ruby require 'foo.so' p Marshal.load(Marshal.dump(Foo.new("foo"))) __END__ */