マルチスレッドで云々とかかんがえないでよいケースでは、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);
ちょっとしたバインディングをかくときなどには、これは非常に便利だとおもう。