salva has asked for the wisdom of the Perl Monks concerning the following question:

I am working on a XS module (Foo), that at some point has to convert an SV returned from a Perl callback to a double and does so with SvNV(). If the callback returns something that is not a number, a warning is printed but it points to the line on my module calling the xsub:
Argument "foo" isn't numeric in subroutine entry at /usr/local/lib/per +l/5.8.4/Foo.pm line 84.

I would like it to point not to my module but to the calling one as Carp::carp would do, and to not print anything unless use warnings had been used on the calling module.

A possible solution for that would be to precheck the SV with looks_like_number() and add some logic to act accordingly, but this seems inelegant to me, so is there any other way of doing it?

Replies are listed 'Best First'.
Re: warnings from API calls on XS
by Roger (Parson) on May 16, 2005 at 13:21 UTC
    I suggest to write a wrapper function, called say, Bar(), that calls your XV function, say, XV_bar, by assigning the return value of XV_bar to a temporary variable:

    package MyBar; ... sub Bar { my $val = XV_bar(@_); return $val; } ... # do the XS imports... # and your code that calls the bar # Foo.pl use strict; use warnings; use MyBar; my $n = 1 + MyBar::Bar(...); # ^ warning will be generated here, not in your module, Bar.pm.

    If the return value is not numeric, your calling code will correctly produce the warning at the calling code, not your module. Also if your calling code does not use warnings, then it will not print any warning messages at all.