Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^3: Accessing an XS function from a Perl function of the same name

by syphilis (Chancellor)
on Mar 04, 2017 at 05:54 UTC ( #1183630=note: print w/replies, xml ) Need Help??


in reply to Re^2: Accessing an XS function from a Perl function of the same name
in thread Accessing an XS function from a Perl function of the same name

If you want to wrap a library function (let's call it 'foo') in an XS sub, and be able to call that XS sub from perl as 'foo', then you make use of the XS PREFIX option - which allows you to specify a prefix that will be automatically stripped from the XS sub when it is bound to perl.

For example, specify PREFIX as 'wrap_this_', write the XS Sub as:
int wrap_this_foo(int x) { return foo(x); }
Then, when you call foo(16) in perl, wrap_this_foo(16) is executed.

Here's an Inline::C demo that gets a perl function named 'foo' to execute a C function named 'foo', via an XS sub named 'wrap_this_foo' that wraps the C sub 'foo'.
use strict; use warnings; use Inline C => Config => PREFIX => 'wrap_this_', BUILD_NOISY => 1, ; use Inline C => <<'END_C'; typedef int unbind; /* For this demo, we don't want foo * to bind to perl */ unbind foo(int x) { return x * 2; } int wrap_this_foo(int x){ return foo(x); } END_C print foo(16); # Outputs 32
If you comment out the the wrap_this_foo XS sub and re-run the script then you get:
Undefined subroutine &main::foo called at try.pl line 25.
I hope that proves that the original run was, in fact, calling wrap_this_foo and not directly calling the C function foo (which is invisible to perl).
Update: It's invisible to perl because perl's typemap doesn't explain how to deal with the type 'unbind'.

Cheers,
Rob

Replies are listed 'Best First'.
Re^4: Accessing an XS function from a Perl function of the same name
by stevieb (Abbot) on Mar 07, 2017 at 00:40 UTC

    Thank you very much syphilis, this is the exact sort of thing I had in mind, but clearly didn't quite make the connection while reading the docs.

    Cheers,

    -stevieb

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1183630]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (3)
As of 2017-12-14 23:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    What programming language do you hate the most?




















    Results (414 votes). Check out past polls.

    Notices?