XS::Object::Magic をつかって Magic なオブジェクトをあつかうの法
マルチスレッドで云々とかかんがえないでよいケースでは、XS::Object::Magic をつかうと楽にできる。
xs/typemap というファイルに以下の内容をコピペする。
TYPEMAP MyStruct * T_PTROBJ_MG INPUT T_PTROBJ_MG $var = ($type)xs_object_magic_get_struct_rv_pretty(aTHX_ $arg, \"$var\");
xs_object_magic.h を http://frepan.64p.org/src/NUFFIN/XS-Object-Magic-0.02/xs_object_magic.h このへんとかからとってきて、おく。
あとは、普通に XS をかけばいい。magic まわりの諸々は隠蔽されているので、気にする必要がない。
#include "xshelper.h" #include "xs_object_magic.h" typedef struct { int i; } MyStruct; MyStruct * my_new() { MyStruct *self; Newxz(self, 1, MyStruct); return self; } void my_destroy(MyStruct *self) { Safefree(self); } int my_incr(MyStruct * self) { return self->i++; } MODULE = XSSample PACKAGE = XSSample PREFIX=my_ SV* new(const char *class) CODE: RETVAL = xs_object_magic_create(aTHX_ (void *)my_new(), gv_stashpv(class, 0)); OUTPUT: RETVAL int my_incr(MyStruct *self) void DESTROY(MyStruct * self) CODE: my_destroy(self);
ちょっとしたバインディングをかくときなどには、これは非常に便利だとおもう。