tokuhirom's Blog

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

ちょっとしたバインディングをかくときなどには、これは非常に便利だとおもう。