I'm using h2xs
to make glue code for a C library to a module. Imagine this scenario in the C header:
struct foo; struct foo * new_foo(); void set_foo_member(struct foo * f, int value); int get_foo_member(const struct foo * f);
When I run
h2xs -x
on this I get something like this in the .xs file:struct foo * new_foo() int get_foo_member(f) const struct foo * f void set_foo_member(f, value) struct foo * f int value
and in the
typemap
:const struct foo * T_PTROBJ struct foo * T_PTROBJ
This builds fine, however, when I go to actually use the code like this:
my $foo = new_foo(); $foo->set_foo_member(123); print "Foo member is: " . $foo->get_foo_member();
I get an error like the following:
get_foo_member: Expected f to be of type const struct FooPtr; got struct FooPtr=SCALAR(0x2ecd9c2dd768) instead at ...
Right, so, that's the backstory. XS checks the type of incoming objects and makes sure they match the expected type from the C header, and if they differ, it throws an error. But it seems to be considering
struct foo *
and const struct foo *
to be two different types, even though they're not (really). Perl shouldn't care about this at all.What's the solution here? Do I remove all const
keywords in my XS code? Is there some switch or setting to make xsubpp
treat both as the same type? Something else?
submitted by /u/greg_kennedy
[link] [comments]