in reply to Ellipsis in perl XS
That's exactly right.
If you want to pass a list of objects (let's say pointers of type foo*) that require a typemap you usually create a typemap that simply calls a function (let's say SvFoo()) to convert a foo pointer to an SV:
TYPEMAP foo* T_FOO INPUT T_FOO $var = ($type)SvFoo($var);
And in your XS code do:
void my_xsub(...) PREINIT: int i; foo **foos = NULL; CODE: foos = (foo**)malloc(sizeof(foo*) * items); for (i = 0; i < items; i++) { foos[i] = SvFoo(ST(i)); } # do something with foos
Now the only thing you need to do is to define a SvFoo function which might look like that:
foo* SvFoo(SV* foo) { SV* ret; IV tmp = SvIV((SV*)SvRV(foo)); ret = INT2PTR(foo*, tmp); }
Cheers, Flo
|
|---|