Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

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

by stevieb (Canon)
on Mar 04, 2017 at 02:33 UTC ( [id://1183620]=note: print w/replies, xml ) Need Help??


in reply to Re: 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

Thanks! I did some initial testing with this (which did work with some trickery upstream), but I believe what I'm going to do is remove all access to the C functions by their original names, and hide all of that so I don't have to do trickery or other things.

If people want to use Perl, I'm thinking they are used to certain idioms, so perl style function calls are best. I don't remember why I offered the original C names anyway, probably because it was my first foray into wrapping C.

I've learned a lot about wrapping libraries and some XS, and am burned by some initial decisions. Thankfully, most of the underlying core of my projects are not used directly, so I can muck with the API without much damage other than (hopefully) people I know are testing/working it.

  • Comment on Re^2: Accessing an XS function from a Perl function of the same name

Replies are listed 'Best First'.
Re^3: Accessing an XS function from a Perl function of the same name
by syphilis (Archbishop) on Mar 04, 2017 at 05:54 UTC
    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

      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
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1183620]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (6)
As of 2024-04-18 09:49 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found